请教矩阵的输出?条件怎么写
vb吧
全部回复
仅看楼主
level 8
tbzp666 楼主
形成一个N×N的矩阵输出(N可以为奇数,也可以为偶数)
2022年05月19日 09点05分 1
level 15
For x = 1 - N To N - 1 Step 2
For y = 1 - N To N - 1 Step 2
If Abs(x) >= Abs(y) Then Print 1; Else Print 0;
Next y
Print
Next x
碰上这种图形,我就喜欢用几何解法[滑稽]以矩阵中心点为原点构建坐标系,然后可以确定每个数字所在位置的坐标,不过为了配合输出,这里的坐标系纵向是x轴(并且正方向向下),横向是y轴,并且每两个相邻数字的距离为2(如果距离为1,则当N为偶数时所有点的坐标都会出现小数);然后就可以确定条件了,对于点(x,y),如果|x|>=|y|,即“纵坐标”的绝对值大于等于“横坐标”的绝对值,则该点为1,否则为0
于是就得到了上面的代码
2022年05月19日 10点05分 2
请教大侠:“如果距离为1,则当N为偶数时所有点的坐标都会出现小数”是指step值吗?我用1试验了,没有异常。不知道哪里理解不对?
2022年05月20日 00点05分
@璐村惂鐢ㄦ埛_0748V5Z馃惥 如果N是偶数,则我这里构建的坐标系原点不是中间的数字所在的位置,而是中间4个数围成的正方形的中心点,原点位置就没有数字了;如果两个相邻数字的距离为1,则每个点的坐标都应该是(0.5,0.5)这样带小数的形式,其实x和y用小数类型当然没问题,不过还是倾向于用整数
2022年05月20日 00点05分
@初音✨七奈 我试验结果没有异常呀
2022年05月20日 06点05分
@璐村惂鐢ㄦ埛_0748V5Z馃惥 这么说吧,楼主需要可以输出偶数阶矩阵,而我这个代码当变量为整型,并且步长为1时只能输出奇数阶矩阵,比如当N=6时,你输出6阶矩阵了吗?
2022年05月20日 07点05分
level 8
tbzp666 楼主
受教了
2022年05月19日 12点05分 3
level 8
tbzp666 楼主
2022年05月20日 02点05分 5
level 8
tbzp666 楼主
再请教大佬,请大佬解释为什么(1)式子能成立?
1) Print b = 66 < "AB"
结果为true
2)b = 66 < "AB" 类型不匹配
3)true<"AB" 类型不匹配
2022年05月20日 02点05分 7
level 15
回复7楼:
首先你要知道VB里有个类型叫Variant,然后才能解释你问的这些怪现象
这里的变量b估计你是没有定义的,那么它的类型就是默认的Variant
然后,先看非Variant类型的情况,比如66<"AB"这个表达式,比较的是数值和字符串,此时会尝试将字符串转换成数值再比较,如果不能转换,则会报错
再来看Variant类型的情况,比如你先执行b=66,然后比较b<"AB",这时就不会转换了,而是按照类型来比较,数值总是小于字符串,结果为True
具体到你问的三种情况:
第一种,b=66<"AB"整体视为一个表达式,先比较b=66,不论结果是True还是False,都视为数值,并且由于b是Variant类型,因此这个比较结果也是Variant(Boolean)类型;然后再比较是否小于字符串"AB",肯定是小于的,因此结果为True
第二种,视为赋值语句,将表达式66<"AB"的结果赋给b,根据刚才的解释,非Variant的数值和字符串比较时,不能转换就会报错
第三种,同样是非Variant的数值跟字符串比较,因此也会报错
2022年05月20日 03点05分 8
level 8
tbzp666 楼主
7楼第(1)个结果是Flase
1) Print b = 66 < "AB" ···············False
2)b = 66
Print b < "AB" ················True
2022年05月20日 07点05分 9
好吧,我之前是用小写的"ab"来测试的,原来还区分大小写啊[滑稽]那也就是说,第一步的比较b=66得到的结果(无论是True还是False),在第二步与字符串比较时,被转换成字符串来比较了(也就是当成了"True"或者"False"来比较的)
2022年05月20日 08点05分
关键是True和字符字符串没有办法比较,类型不匹配,不懂得什么道理 Print b = 66 < "AB" · 中 b=66为什么是字符串型“Flase”
2022年05月20日 13点05分
@tbzp666 b = 66 < "AB"中,先计算 66 < "AB"的值,然后,判断这个值跟b是否相等。从没有 b=66的结果一说,更不会是字符串型“Flase”
2022年05月20日 13点05分
@璐村惂鐢ㄦ埛_0748V5Z馃惥 是Print 关系表达式不是赋值表达式
2022年05月20日 14点05分
level 15
看来你还是没理解Variant这个类型啊
如果你直接比较True<"AB",那么由于两边都不是Variant类型,会将True视为数值类型,并将字符串型的"AB"尝试转换成数值类型,由于无法转换,因此报错
而在b=66<"AB"这个表达式中,b的类型是Variant,因此按照Variant的规则来比较,先比较b=66,结果无论是True还是False都无所谓,总之是Boolean类型(准确来说是Variant类型下的Boolean子类型),注意现在还不是字符串类型;然后再比较True<"AB"或者False<"AB",由于这个True或者False实际上还是Variant类型,因此会将True或False转换成与"AB"相同的类型,即字符串类型,然后再比较
这就是Variant与其他类型的区别
2022年05月20日 14点05分 10
明白了,谢谢大佬,辛苦打了那么多字
2022年05月20日 14点05分
level 8
tbzp666 楼主
变体类型是不是没有办法比较?
比如:有一个已经排好顺序的数组,要求输入一个数后,按照原顺序将其插入数组中
x为变体类型,就得不到想要的结果,必须声明为数值型
2022年05月22日 05点05分 11
两个变体变量比较大小,vb会按照规则转换为同一类型,然后比较。
2022年05月23日 01点05分
@璐村惂鐢ㄦ埛_0748V5Z馃惥 并不是,如果类型不同,会按照类型比较大小,数值类型小于字符串类型;如果其中一个不是Variant,才会转换成相同类型之后比较
2022年05月23日 01点05分
@初音✨七奈 好的,你说的对
2022年05月23日 02点05分
@初音✨七奈 不过我为啥从没有遇到过这么复杂的问题呢?
2022年05月23日 02点05分
level 15
又是Variant类型的问题[滑稽]
上面已经说到了比较表达式中“两边都不是Variant”和“有一边是Variant”的情况,这次轮到“两边都是Variant”会怎样了
这里的InputBox函数返回的是字符串类型,赋值给x之后,x的类型就是Variant(String),而数组a的元素则是Variant(Integer)类型,两者都是Variant
对于两个Variant,如果子类型相同(都是数值或者都是字符串),才会比较它们的值;而如果类型不同(一个是数值,另一个是字符串),则谁也不向谁转换,数值类型总是小于字符串类型
要解决这个问题,除了将x显式定义为数值类型以外(这也是建议的做法),还可以使用Val函数,将InputBox的返回值转换成数值类型(不过Val的类型是Double,如有需要,可以使用CInt等函数进一步转换类型)
2022年05月22日 06点05分 12
level 8
tbzp666 楼主
多谢了
2022年05月23日 08点05分 15
1