描述
KiKi想知道已经给出的三条边a,b,c能否构成三角形,如果能构成三角形,判断三角形的类型(等边三角形、等腰三角形或普通三角形)。
输入描述:
题目有多组输入数据,每一行输入三个a,b,c(0<a,b,c<1000),作为三角形的三个边,用空格分隔。
输出描述:
针对每组输入数据,输出占一行,如果能构成三角形,等边三角形则输出“Equilateral triangle!”,等腰三角形则输出“Isosceles triangle!”,其余的三角形则输出“Ordinary triangle!”,反之输出“Not a triangle!”。
示例1
输入:2 3 2
3 3 3
输出:Isosceles triangle!
Equilateral triangle!
本人第一次写的代码:
对于题目标示的各类条件,感到无处安放。虽然该代码在编译器上显示并无错误,但是输出结果不准确,有问题。
首先,应该用一个大if将“是三角形”与“不是三角形”区分开。本人将“不是三角形”的打印独立于while循环与if之外,所以"Not a triangle!"是每次都会被打印的。
第二点非常重要的是,题目要求scanf函数是多组输入,而我的代码输入一次就结束了!原因是我在最后多加了break,根本不需要break的,我没有想到应该用大if区分是否为三角形,就慌乱之下用了break结束while循环,却忘记了多组输入的问题。
第三点,当输入的三个数明显无法组成三角形时,却打印了“普通三角形”。“while”里的限制条件不正确,应该是任意两边和大于第三边,逻辑操作符是并且。
经过修改之后,写出了正确的代码:
在vs2022上运行的时候,一切正常。
但是,当在刷题网站上时,却报错
并且,一直在疯狂打印“等边三角形 ”
明明只输入了一组,却一直在自动打印。本人觉得是while里面另一个条件的锅。
我查找得知,在 while(scanf_s("%d", &a)!= EOF) 中, scanf_s 函数用于读取输入,它返回成功读取的参数个数。我们可以在后面添加其它判断条件,但是要加上逻辑操作符&&,才会更加准确。
至于本题while判断条件的意思,即在原来判断 scanf_s 是否读取到文件末尾( EOF )的基础上,又增加了两个条件:一是判断 scanf_s 是否成功读取了3个整数(因为有 %d %d %d 三个格式控制符);二是判断变量 a,b,c 是否满足条件要求的大小关系。当这三个条件(读取成功3个整数、 大小关系 、未遇到 EOF )同时满足时,循环体才会执行。
例如, while( (scanf_s("%d %d %d", &a, &b, &c) == 3) && (a > 0) ) ,这里在原来判断 scanf_s 是否读取到文件末尾( EOF )的基础上,又增加了两个条件:一是判断 scanf_s 是否成功读取了3个整数(因为有 %d %d %d 三个格式控制符);二是判断变量 a 是否大于0。当这三个条件(读取成功3个整数、 a > 0 、未遇到 EOF )同时满足时,循环体才会执行。
加上逻辑与操作符之后果然一切正常。
另外,在这个题目里,对于a,b,c大小的限制,只是对题目里面的数据进行了描述,可以不用管,不加a,b,c在0~1000以内的限制条件也是正确的。
标签:triangle,读取,scanf,while,循环,三角形,输入 From: https://blog.csdn.net/2401_87539581/article/details/143170222