
2026 年 3 月 18 日1. 打鱼晒网问题改错Q3801题目描述某人从 1990 年 1 月 1 日起开始三天打鱼两天晒网即工作三天然后再休息两天。问这个人在以后的某一天中是在工作还是在休息。从键盘任意输入某年某月某天编程判断他是在工作还是在休息。如果是在工作则输出He is working如果是在休息则输出He is having a rest如果输入非法字符或者输入的年份小于 1990或者输入的月份和日期不合法则输出Input error!输入提示信息和格式Input year,month,day:%d,%d,%d输出提示信息和格式Input error!\nHe is having a rest\nHe is working\n程序运行结果示例 1Input year,month,day:2014,12,22↙ He is working程序运行结果示例 2Input year,month,day:2014,a,32↙ Input error!程序运行结果示例 3Input year,month,day:2014,3,32↙ Input error!原代码有错误#includestdio.hintmain(){inty,m,d,i;intsum,leap;printf(Input year,month,day:);scanf(%d,%d,%d,y,m,d);if(y1990m1m12d30d1)// 错误 1逻辑运算符错误{printf(Input error!\n);return0;}for(i1990;iy;i)// 错误 2循环条件错误{leap(i%100!0i%40)||(i%4000);// 错误 3赋值运算符应为sumsumleap!0?365:366;// 错误 4sum 未初始化三元运算符优先级错误}for(i1;im;i)// 错误 5循环条件错误{switch(m)// 错误 6应该判断 i 而不是 m{case1:case3:case5:case7:case8:case10:case12:sumsum30;// 错误 7大月天数错误break;case2:leap(y%100!0y%40)||(y%4000);// 错误 8赋值运算符应为sumsumleap!0?365:366;// 错误 9二月天数计算错误break;case4:case6:case9:case11:sumsum31;// 错误 10小月天数错误break;}}sumsum%5;// 错误 11没加天数if(sum4||sum5)// 错误 12赋值运算符应为{printf(He is having a rest\n);}else{printf(He is working\n);}return0;}改正后的代码#includestdio.hintmain(){inty,m,d,i;intsum0,leap;// 修正 1初始化 sumprintf(Input year,month,day:);scanf(%d,%d,%d,y,m,d);// 修正 2使用||逻辑或判断非法输入if(y1990||m1||m12||d31||d1){printf(Input error!\n);return0;}// 修正 3计算从 1990 年到前一年的总天数for(i1990;iy;i)// 修正 4iy 不包括当年{leap(i%100!0i%40)||(i%4000);// 修正 5使用比较sumsum(leap!0?366:365);// 修正 6闰年 366 天平年 365 天}// 修正 7计算当年到前一个月的总天数for(i1;im;i)// 修正 8im 不包括当月{switch(i)// 修正 9判断 i 而不是 m{case1:case3:case5:case7:case8:case10:case12:sumsum31;// 修正 10大月 31 天break;case2:leap(y%100!0y%40)||(y%4000);// 修正 11使用比较sumsum(leap!0?29:28);// 修正 12闰年 2 月 29 天平年 28 天break;case4:case6:case9:case11:sumsum30;// 修正 13小月 30 天break;}}sum(sumd)%5;// 修正 14加上当月天数// 修正 15第 4、5 天休息从 1 开始计数余数为 3、4 时休息if(sum3||sum4)// 修正 16使用比较{printf(He is having a rest\n);}else{printf(He is working\n);}return0;}主要错误总结共 16 处错误判断条件中的应改为||年份循环iy应改为iyi % 4 0应改为i % 4 0比较运算符sum未初始化三元运算符缺少括号优先级错误闰年 366 天平年 365 天原代码写反了月份循环im应改为imswitch 判断的应该是i而不是m大月 31 天不是 30 天二月闰年 29 天平年 28 天不是 365/366小月 30 天不是 31 天计算总天数时要加上 d判断休息日的条件用而不是周期为 5 天第 4、5 天休息对应余数 3、42. 回文字符串判断改错Q303题目描述编程判断输入的一个字符串是否是回文。所谓回文字符串就是左读和右读都一样的字符串。例如abcba就是一个回文字符串。要求先输出Input a string:\n输入字符串然后判断是否回文最后输出This string is a plalindrome.\n或This string is not a plalindrome.\n原代码有错误#includestdio.hintfun(chara[]);main(){chara[80];printf(Input a string:\n);gets(a);if(fun(a)){printf(This string is a plalindrome.\n);}else{printf(This string is not a plalindrome.\n);}}intfun(chara[]);// 错误 1函数定义后不应有分号{inti,j;for(i0;jstrlen(a);ij;i;j--)// 错误 2初始化、条件、更新语句都错误{if(a[i]!a[j]){return0;}}// 错误 3没有返回值}改正后的代码#includestdio.h#includestring.hintfun(chara[]);intmain(){chara[80];printf(Input a string:\n);gets(a);if(fun(a)){printf(This string is a plalindrome.\n);}else{printf(This string is not a plalindrome.\n);}return0;}intfun(chara[])// 修正 1去掉函数定义后的分号{inti,j;// 修正 2正确初始化 i 和 j使用逗号表达式for(i0,jstrlen(a)-1;ij;i,j--){if(a[i]!a[j]){return0;// 不是回文}}return1;// 修正 3添加返回值 1表示是回文}主要错误总结int fun(char a[]);→int fun(char a[])函数定义后不应有分号for (i0;jstrlen(a);ij;i;j--)→for (i 0, j strlen(a) - 1; i j; i, j--)初始化应该用逗号分隔j 应该初始化为strlen(a) - 1最后一个字符的下标更新语句用逗号分隔函数缺少返回值return 1;3. 约瑟夫问题Q382题目描述约瑟夫问题15 个基督教徒和 15 个异教徒在海上遇险必须将一半的人投入海中其余的人才能幸免于难。于是想了个办法30 个人围成一个圆圈从第一个人开始依次报数每数到第 9 个人就将他扔入大海如此循环进行直到仅余 15 个人为止。问怎样排法才能使每次投入大海的都是异教徒。本题示例为 第一个人前无空格每人中间 1 个空格输出格式要求The original circle is (:papandom, :christian);\n%c #includestdio.hintmain(){chararr[30];// 初始化所有人都是基督教徒for(inti0;i30;i){arr[i];}intnum1,count0,i0;// 当被扔下海的人数达到 15 人时停止while(1){if(count15)break;// 数到第 9 个人且这个人还没被扔下海if(num9arr[i]!){arr[i];// 标记为异教徒被扔下海num1;// 重新计数count;// 被扔下海人数加 1}// 如果当前位置的人还在圈内继续报数if(arr[i]!){num;}// 移动到下一个位置循环i(i1)%30;}// 输出初始排列printf(The original circle is (:papandom, :christian);\n);for(inti0;i30;i){printf(%c ,arr[i]);}return0;}算法说明表示基督教徒留在船上表示异教徒被扔下海使用循环数组模拟圆圈每数到 9 就标记当前位置为已经标记为的位置跳过不计数4. 纸张对折问题Q474题目描述假设对折一张厚度为 0.1mm 的纸请问要对折多少次才能使纸的厚度从地球到达月球假设地球到月球的距离为 30 万 km输出格式要求%d#includestdio.hintmain(){floatdist0.1;// 初始厚度 0.1mmintn0;// 对折次数// 当地月距离30 万 km 3×10^8 mm 3×10^10 mm// 注意3*10e10 表示 3×10^11这里应该是 3e10 或 3*10^10while(dist3e10){dist*2;// 每次对折厚度翻倍n;// 对折次数加 1}printf(%d,n);return0;}说明地球到月球距离30 万 km 300,000,000,000 mm 3×10^11 mm每次对折厚度翻倍0.1 → 0.2 → 0.4 → …答案约为 42 次5. 求最大值、最小值和平均值指针参数Q6608题目描述编写一个函数findMinMaxAvg(int arr[], int length, int *max, int *min, float *avg)接受一个整型数组和数组的长度作为参数返回数组中的最大值、最小值和平均值。程序运行结果示例请输入 10 个整数 请输入第 1 个整数1 请输入第 2 个整数2 ... 请输入第 10 个整数10 最大值10最小值1平均值5.50输入提示和格式请输入 10 个整数\n请输入第%2d个整数输出提示和格式最大值%d最小值%d平均值%.2f#includestdio.h// 函数声明通过指针参数返回多个值voidfindMinMaxAvg(intarr[],intlength,int*max,int*min,float*avg);intmain(){intarr[10],min,max;floatavg;printf(请输入 10 个整数\n);// 输入 10 个整数for(inti0;i10;i){printf(请输入第%2d个整数,i1);scanf(%d,arr[i]);}// 调用函数传入地址findMinMaxAvg(arr,10,max,min,avg);// 输出结果printf(最大值%d最小值%d平均值%.2f,max,min,avg);return0;}// 函数实现通过指针参数返回最大值、最小值和平均值voidfindMinMaxAvg(intarr[],intlength,int*max,int*min,float*avg){intsum0;// 初始化最大值和最小值为第一个元素*maxarr[0];*minarr[0];// 遍历数组for(inti0;ilength;i){// 更新最大值if(arr[i]*max)*maxarr[i];// 更新最小值if(arr[i]*min)*minarr[i];// 累加求和sumarr[i];}// 计算平均值*avgsum*1.0/length;}指针参数说明函数通过指针参数可以返回多个值*max、*min、*avg分别指向主函数中的变量修改*max的值实际上是修改主函数中max的值调用时需要传入变量的地址max、min、avg