2026年3月11日收获1.字符串指针数组在赋值之前要申请对应大小的空间使用完之后记得进行释放 (free)。1. 矩阵转置Q6403题目描述用二维数组作为函数参数实现矩阵转置。按如下函数原型编程计算并输出 m×n 阶矩阵的转置矩阵。其中m 和 n 的值由用户从键盘输入。已知 m 和 n 的值都不超过 10。voidTranspose(inta[][N],intat[][M],intm,intn);voidInputMatrix(inta[][N],intm,intn);voidPrintMatrix(intat[][M],intn,intm);输入提示信息Input m, n:Input %d*%d matrix:\n输入格式%d,%d输出提示信息和格式The transposed matrix is:\n输出格式输完矩阵的一行要换行%d\t程序运行示例Input m, n:3,5↙ Input 3*5 matrix: 2 6 7 4 3↙ 5 5 7 9 4↙ 3 3 6 3 3↙ The transposed matrix is: 2 5 3 6 5 3 7 7 6 4 9 3 3 4 3#includestdio.h#defineN10#defineM10// 函数声明voidTranspose(inta[][N],intat[][M],intm,intn);voidInputMatrix(inta[][N],intm,intn);voidPrintMatrix(intat[][M],intn,intm);intmain(){inta[M][N],at[N][M],m,n;printf(Input m, n:);scanf(%d,%d,m,n);printf(Input %d*%d matrix:\n,m,n);// 输入矩阵InputMatrix(a,m,n);// 转置矩阵Transpose(a,at,m,n);// 输出转置后的矩阵printf(The transposed matrix is:\n);PrintMatrix(at,n,m);return0;}// 输入矩阵函数voidInputMatrix(inta[][N],intm,intn){for(inti0;im;i){for(intj0;jn;j){scanf(%d,a[i][j]);}}return;}// 矩阵转置函数将 a[i][j]转置到 at[j][i]voidTranspose(inta[][N],intat[][M],intm,intn){for(inti0;im;i){for(intj0;jn;j){at[j][i]a[i][j];}}return;}// 打印矩阵函数voidPrintMatrix(intat[][M],intn,intm){for(inti0;in;i){for(intj0;jm;j){printf(%d\t,at[i][j]);}printf(\n);}return;}2. 学生成绩统计Q492题目描述输入 10 个学生的 C 语言成绩假设成绩为整数值求最高成绩、最低成绩和平均值。输入格式要求%d提示信息请输入 10 个学生的 C 成绩\n输出格式要求10 个学生的 C 成绩分别为\n%d\t10 个成绩的最后输出一个\n最高成绩是%d是第%d个学生\n最低成绩是%d是第%d个学生\n10 名学生的 C 成绩的平均分为:%.2f\n程序运行示例请输入 10 个学生的 C 成绩 80 90 93 78 83 67 79 60 64 45 10 个学生的 C 成绩分别为 80 90 93 78 83 67 79 60 64 45 最高成绩是 93是第 3 个学生 最低成绩是 45是第 10 个学生 10 名学生的 C 成绩的平均分为:73.90#includestdio.hintmain(){intarr[10],min[2],max[2],sum0;printf(请输入 10 个学生的 C 成绩\n);printf(10 个学生的 C 成绩分别为\n);// 输入成绩并累加for(inti0;i10;i){scanf(%d,arr[i]);printf(%d\t,arr[i]);sumarr[i];}// 初始化最小值和最大值min[0]1,min[1]arr[0];// min[0]:位置min[1]:值max[0]1,max[1]arr[0];// max[0]:位置max[1]:值// 查找最高分和最低分for(inti1;i10;i){if(arr[i]min[1]){min[0]i1;// 记录位置从 1 开始min[1]arr[i];// 记录最小值}if(arr[i]max[1]){max[0]i1;// 记录位置max[1]arr[i];// 记录最大值}}// 输出结果printf(\n最高成绩是%d是第%d个学生\n,max[1],max[0]);printf(最低成绩是%d是第%d个学生\n,min[1],min[0]);printf(10 名学生的 C 成绩的平均分为:%.2f\n,sum*1.0/10);return0;}3. 静态变量计算阶乘Q536题目描述利用静态变量计算 n 的阶乘。输入格式要求%d提示信息Input n:输出格式要求%d! %ld\n程序运行示例Input n:10 1! 1 2! 2 3! 6 4! 24 5! 120 6! 720 7! 5040 8! 40320 9! 362880 10! 3628800#includestdio.hintmain(){intn;longresult1;printf(Input n:);scanf(%d,n);// 循环计算并输出 1!到 n!for(inti1;in;i){result*i;// 累乘计算阶乘printf(%d! %ld\n,i,result);}return0;}4. 简单计算器Q2169题目描述程序模拟简单运算器的工作输入一个算式没有空格遇等号’说明输入结束输出结果。假设计算器只能进行加、减、乘、除运算运算数和结果都是整数4 种运算符的优先级相同按从左到右的顺序计算。例如输入12*10-10/2后输出 10。输出格式要求%d出错提示信息错误的运算符%c程序运行示例12*10-10/2 此行为输入 10 此行为输出#includestdio.h#includestring.hintmain(){charcal[1000];intresult0,i0;scanf(%s,cal);// 输入算式// 解析第一个数字while(cal[i]0cal[i]9){result*10;resultcal[i]-0;i;}// 依次解析运算符和数字while(istrlen(cal)){charnow;intnum0;// 获取运算符if(cal[i]||cal[i]-||cal[i]*||cal[i]/||cal[i]){nowcal[i];i;}else{printf(错误的运算符%c,cal[i]);return0;}// 获取下一个数字while(cal[i]0cal[i]9){num*10;numcal[i]-0;i;}// 执行运算switch(now){case:resultnum;break;case-:result-num;break;case*:result*num;break;case/:result/num;break;case:printf(%d,result);return0;}}return0;}5. 奥运会参赛国排序改错Q6387题目描述请用指针数组编程实现按奥运会参赛国国名在字典中的顺序对其入场次序进行排序。假设参赛国不超过 150 个。下面程序中存在比较隐蔽的错误请通过分析和调试程序发现并改正程序中的错误。注意请将修改正确后的完整源程序拷贝粘贴到答题区内。对于没有错误的语句请不要修改修改原本正确的语句也要扣分。当且仅当错误全部改正且程序运行结果调试正确才给加 5 分。经教师手工核对后如果未用指针数组做函数参数编程那么即使做对也不给分。改错时不能改变程序原有的意图不能改变函数原型。原代码有错误#includestdio.h#defineMAX_LEN10#defineN150voidSortString(char*ptr[],intn);main(){inti,n;char*pStr[N];printf(How many countries?\n);scanf(%d,n);// 错误 1要加 while(getchar()!\n)跳过多余字符printf(Input their names:\n);for(i0;in;i){gets(pStr[i]);// 错误 2未分配内存空间}SortString(pStr[i],n);// 错误 3应该传入 pStr不是 pStr[i]printf(Sorted results:\n);for(i0;in;i){puts(pStr[i]);}}voidSortString(char*ptr[],intn){inti,j;chartemp;// 错误 4没有定义长度for(i0;in-1;i){for(ji1;jn;j){if(ptr[j]ptr[i]);// 错误 5字符串之间的比较要用 strcmp{tempptr[i];// 错误 6字符串之间的复制要用 strcpy多了;ptr[j]ptr[i];// 错误 7i 和 j 的位置要互换ptr[j]temp;// 错误 8要用 strcpy}}}}改正后的代码#includestdio.h#includestdlib.h#includestring.h#defineMAX_LEN10#defineN150voidSortString(char*ptr[],intn);intmain(){inti,n;char*pStr[N];printf(How many countries?\n);scanf(%d,n);while(getchar()!\n);// 修正 1跳过缓冲区的换行符printf(Input their names:\n);for(i0;in;i){pStr[i](char*)malloc(MAX_LEN);// 修正 2为每个指针分配内存gets(pStr[i]);}SortString(pStr,n);// 修正 3传入指针数组 pStrprintf(Sorted results:\n);for(i0;in;i){puts(pStr[i]);free(pStr[i]);// 修正 4释放分配的内存}return0;}voidSortString(char*ptr[],intn){inti,j;chartemp[MAX_LEN];// 修正 5定义足够长度的临时变量for(i0;in-1;i){for(ji1;jn;j){if(strcmp(ptr[j],ptr[i])0)// 修正 6使用 strcmp 比较字符串{strcpy(temp,ptr[i]);// 修正 7使用 strcpy 复制字符串strcpy(ptr[i],ptr[j]);// 修正 8正确交换两个字符串strcpy(ptr[j],temp);}}}}主要错误总结scanf后要加while(getchar()!\n);跳过换行符指针数组使用前要用malloc分配内存空间调用排序函数应传入pStr而不是pStr[i]temp需要定义为数组temp[MAX_LEN]字符串比较要用strcmp()不能用字符串复制要用strcpy()不能用交换逻辑有误应该是三句strcpy使用完后要free释放内存