Symmoon 408超有趣
念念不忘,必有回响。
关注数: 40 粉丝数: 76 发帖数: 5,403 关注贴吧数: 55
有一个程序,存疑,望解惑 是谭书第六章的习题 题目:有15个数按由大到小的顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。 谭版的学习辅导给出的例解 #include <stdio.h> #define N 15 int main(void) { int i; int number; int top; int bott; int mid; int loca; int a[N]; int flag = 1; int sign; char c; printf("enter data:\n"); scanf("%d", &a[0]);//输入第1个数 i = 1; while (i < N)//检查数是否已输入完毕 { scanf("%d", &a[i]);//输入下一个数 if (a[i] >= a[i-1])//如果输入的数不小于前一个数 { i++;//使数的序号加1 } else { printf("enter this data again:\n");//要求重新输入此数 } } printf("\n"); for (i=0; i<N; i++) { printf("%5d", a[i]);//输出全部15个数 } printf("\n"); while (flag) { printf("input number to look for:");//问你要查找哪个数 scanf("%d", &number);//输入要查找的数 sign = 0;//sign为0表示尚未找到 top = 0;//top是查找区间的起始位置 bott = N - 1;//bott是查找区间的最末位置 if ((number<a[0]) || (number>a[N-1]))//要查找的数不在查找区间内 { loca = -1;//表示找不到 } while ((!sign) && (top<=bott)) { mid = (bott + top) / 2;//找出中间元素的下表 if (number == a[mid])//如果要查找的数正好等于中间元素 { loca = mid;//记下该下标 printf("Has found %d, its position is %d\n", number, loca + 1);//由于下标从0算起,而人们习惯从1算起,因此输出数的位置要加1 sign = 1;//表示找到了 } else if (number < a[mid])//如果要查找的数小于中间元素的值 { bott = mid - 1;//只需在下标为0~mid-1的元素中找 } else//如果要查找的数不小于中间元素的值 { top = mid + 1;//只需在下标为mid+1~bott的元素中找 } } if (!sign || loca == -1)//sign为0或loca等于-1,意味着找不到 { printf("cannot find %d.\n", number);//输出"找不到" } printf("continue or not(Y/N)?");//问你是否继续查找 scanf(" %c", &c);//不想继续查找输入'N'或'n' if (c == 'N' || c == 'n') { flag = 0;//flag为开关变量,控制程序是否结束运行 } } return 0; } 我自己改了改代码风格。主要想问第70行 那句scanf(" %c", &c); 为什么%c前一定要有一个空格,我发现有无这个空格程序输出结果差别很大。没有那个空格会多输出一句话(语言有点难以描述,可以自行尝试) 范例输入1 3 4 5 6 8 12 23 34 44 45 56 57 58 68(回车) 7(回车) y(回车) 同样的输入,有无那个%c前面的空格会有不同结果。 ps:贴吧排版自动左对齐了。见谅
有一个程序,存疑,望解惑 是谭书第六章的习题 题目:有15个数按由大到小的顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。 谭版的学习辅导给出的例解 #include <stdio.h> #define N 15 int main(void) { int i; int number; int top; int bott; int mid; int loca; int a[N]; int flag = 1; int sign; char c; printf("enter data:\n"); scanf("%d", &a[0]);//输入第1个数 i = 1; while (i < N)//检查数是否已输入完毕 { scanf("%d", &a[i]);//输入下一个数 if (a[i] >= a[i-1])//如果输入的数不小于前一个数 { i++;//使数的序号加1 } else { printf("enter this data again:\n");//要求重新输入此数 } } printf("\n"); for (i=0; i<N; i++) { printf("%5d", a[i]);//输出全部15个数 } printf("\n"); while (flag) { printf("input number to look for:");//问你要查找哪个数 scanf("%d", &number);//输入要查找的数 sign = 0;//sign为0表示尚未找到 top = 0;//top是查找区间的起始位置 bott = N - 1;//bott是查找区间的最末位置 if ((number<a[0]) || (number>a[N-1]))//要查找的数不在查找区间内 { loca = -1;//表示找不到 } while ((!sign) && (top<=bott)) { mid = (bott + top) / 2;//找出中间元素的下表 if (number == a[mid])//如果要查找的数正好等于中间元素 { loca = mid;//记下该下标 printf("Has found %d, its position is %d\n", number, loca + 1);//由于下标从0算起,而人们习惯从1算起,因此输出数的位置要加1 sign = 1;//表示找到了 } else if (number < a[mid])//如果要查找的数小于中间元素的值 { bott = mid - 1;//只需在下标为0~mid-1的元素中找 } else//如果要查找的数不小于中间元素的值 { top = mid + 1;//只需在下标为mid+1~bott的元素中找 } } if (!sign || loca == -1)//sign为0或loca等于-1,意味着找不到 { printf("cannot find %d.\n", number);//输出"找不到" } printf("continue or not(Y/N)?");//问你是否继续查找 scanf(" %c", &c);//不想继续查找输入'N'或'n' if (c == 'N' || c == 'n') { flag = 0;//flag为开关变量,控制程序是否结束运行 } } return 0; } 我自己改了改代码风格。主要想问第70行 那句scanf(" %c", &c); 为什么%c前一定要有一个空格,我发现有无这个空格程序输出结果差别很大。(语言有点难以描述,可以自行尝试) 范例输入1 3 4 5 6 8 12 23 34 44 45 56 57 58 68(回车) 7(回车) y(回车) 同样的输入,有无那个%c前面的空格会有不同结果。
1 下一页