Re: [问题] 数字交换&印出低于平均值学生

楼主: jacky1989   2016-09-10 01:30:01
我想大家都非常的厉害,但是对于新手,我个人是建议
少用函式库,写程式会比较有感觉,等比较厉害了,再来用一些好用的函式库也不迟
先讲问题1.
概论上没错,是要比较数字然后互换
我run一次程式的流程给你看,你应该就会知道自己错在哪里了
input data:8 6 5 7 9
stage 1:
i=0, j=0
if(arr[0]>arr[1]) //if(8>6)这行会互换
结果:6 8 5 7 9
stage 2:
i=0, j=1
if(8>5)
结果:6 5 8 7 9 //看出问题在哪里了吗?
你每次都只有两两比较,但是如果今天一种状况
6 5 1 8 9 //input data
5 6 1 8 9 //stage 1 比较没错
5 1 6 8 9 //stage 2 这比较就错了,因为第一跟第二个数字比较后
不代表第一个数字不会比后面的数字大还是小,所以你应该是固定一个数字
然后全部比较过,并两两互换,这样保证第一个数字才会是最小或是最大的
作者: LPH66 (-6.2598534e+18f)   2016-09-10 01:59:00
推过很多次了, 不要斆 fflush(stdin)教要清除就用一个循环 getchar 到 '\n' 为止即可如果是像原 PO 这个 C++ 的 stream 输入那就改成 cin.get()再者, 原 PO 的排序不是错在这里, 是他的交换没写好两层循环的比较交换排序有两种, 你这种跟他这种你这种叫选择排序, 他那种叫泡沫排序fflush(stdin) 的问题是 fflush 在 input 序列的作用未定义清除法就我说的 while 循环 getchar() 到读到 '\n' 为止因为之所以会"留有字符在输入里"几乎都是前一行没读完那就只要把前一行给读完就好, 而一行结束就是 '\n'差不多, 然后这一小段可以写成一个小函式要用时直接呼叫
作者: Qbsuran (Qbsuran)   2016-09-10 13:41:00
rewind(stdin);
作者: firejox (Tangent)   2016-09-13 13:53:00
scanf("%*[^\n]"); getchar();

Links booklink

Contact Us: admin [ a t ] ucptt.com