到‘9’的个数都保存在数组bb[10]中。*p-'0'实现将字符‘0’的个数保存在bb[0]中,将字符‘1’的个数保存在bb[1]中,依此类推,直到将字符‘9’的个数保存在bb[9]中。【3】由于奇数数字字符的个数存于bb[1]、bb[3]、bb[5]、bb[7]、bb[9]中,所以for循环的目的是将这些元素分别赋给num[0]、nam[1]、num[2]、num[3]、num[4]。
改错题参考答案:错误1:for(i=0;i 分析:错误1:由于题目要求将最小数和次最小数分别与a[0]和a[1]中的数对调,因此这层循环只需循环两次。错误2:赋值语句的执行方向是从右向左,即把右边的值赋给左边的变量。 编程题参考答案: int fun(int score[],int m,int up[]) { int i,j=0; float av=0.0; for(i=0;i av=av+score[i]/m; /*求平均值*/ for(i=0;i if(score[i]>av) /*如果分数高于平均分,则将此分数放入up数组中*/ p[j++]=score[i]; return j; /*返回高于平均分的人数*/ } 分析:该题第1个循环的作用是求出平均分av,第2个循环的作用是找出高于平均分的成绩并存入up数组中。 第7套 填空题参考答案:【1】*p 【2】default:b[10]++; 【3】p++; 分析:【1】根据switch语句中case后面的常量表达式,可以看出,switch后面括号中的表达式应该是字符串str中的各字符,而指针p就是指向字符串str。【2】和各个case后面的常量表达式不匹配的都属于其他字符,保存在b[10]中。【3】指针p指向字符串str,通过p自加1来移动指针,访问字符串中的所有字符。 改错题参考答案:错误1:ifhigh%==0 正确:if(high%j==0) 错误2:if(yes==0) 正确:if(yes) 分析:错误1:if语句的两侧要加括号。错误2:yes为1时,说明被判断的数为素数,要加入总和。 编程题参考答案: void fun(int x,int pp[],int *n) { int i,j=0; for(i=2;i<=x;i=i+2) /*i的初始值为2,步长为2,确保i为偶数*/ if(x%i==0) pp[i++]=i; /*将能整除x的数存入数组pp中*/ *n=j; /*传回满足条件的数的个数*/ } 分析:本题题干信息是:能整除x且不是奇数的所有整数。循环语句中i从2开始且每次增2,所以i始终是偶数。 第8套 填空题参考答案: 【1】\%ld\【2】 n=-n; 【3】\%ld\,n 分析:【1】本题考查对标准输入函数scanf()的调用格式,当输入为长整型数时,格式 控制字符串为“%ld”,输入的长整数存于变量n中。【2】当输入的数是负数时,则取它的相反数,即为它的绝对值。【3】本题考查对标准输出 函数pnntff)的调用格式,当输出为长整型数时,格式控制字符串为“%ld”。 改错题参考答案: 错误1:int fun(char t[]) 正确:void fun(char t[]) 错误2:t[j]=t[i++]; 正确:t[j]=t[i]; 分析:错误1:该函数只是对一个字符串中的元素进行比较大小的操作,并没有具体的返回值,因此,函数的返回值类型应为void 。错误2:本题的思路是利用选择法对数组元素进行比较。所谓选择法,是依次用当前取得的元素和它后面的元素进行比较,在第一个元素和它后面的元素顺次比较时,可以借助中间变量来对两数进行交换,要保证这第一个元素始终存放数组中的最大数,以后依次挑出次大数,这样最终的数组就是有序的。解答本题,只要理解了选择法的思想,找到并改正错误就容易了。 编程题参考答案: void fun(int m,int k,int xx[]) { int i,j,n; for(i=m+1,n=0;n { xx[n++]=i; /*如果不是素数,放入数组MX中*/ break; /*并跳出本层循环,判断下一个数*/ } } 分析:本题只要掌握了判断非素数和素数的算法即不难完成了,其实程序缺少部分也正是这部分。 第9套 填空题参考答案: 【1】\%s\【2】%c 【3】str2 分析:【1】本题考查对标准输入函数scanf()的调用格式,当输入字符串时,格式控制字符串为.“%s”,题目要求输入的字符串保存在str1中,所以地址表列应为字符串的首地址,即为str1。【2】本题考查对标准输出函数printf()的调用格式,当输出为字符型变量时,格式控制字符串为“%c”。【3】题目要求将str1中下标为偶数的字符保存在字符串str2中并输出,所以printf()函数的输出表列是str2。 改错题参考答案:错误1:while(x[i]==0) 正确:while(x[i]!=0) 错误2:sum=sum\\c; 正确:sum=sum/c; 分析:错误1:此处考查的是对循环条件的理解,当被判断的数组元素为0时,说明是数组的最后一个元素,此时要跳出循环。错误2:C语言中的除法运算符是“/”,而不是“\\”。 编程题参考答案: int fun(int *s,int t;int *k) { int i; *k=0; /*k所指的数是数组的下标值*/ for(i=0;i *k=i; /*找到数组的最小元素,把该元素的下标赋给k所指的数*/ return s[*k]; /*返回数组的最小元素*/ } 分析:本题中直接使用指针变量k,但在使用时要注意对k的指针运算,此外,一开始 应让*k的值为数组中的某一下标值,即*k=0。 第10套 填空题参考答案: 【1】\%d\,&n 【2】str2[i]=str1[i]; 【3】str2 分析:【1】本题考查对标准输入函数scanf()的调用格式,由后面的程序可以知道,变量n保存了要截取的字符数,注意在n前面不要忘了取址符‘&’。【2】截取前n个字符,就是将字符串str1的前n个字符依次赋给字符串str2的前n个字符。【3】本题考查对标准输出函数printf()的调用格式,根据题意,应输出截取后的字符串,即字符串str2。 改错题参考答案: 错误1:if((s[i]>='A'&&s[i]<='Z')&&(s[i]>='a'&&s[i]<='z')) 正确:if((s[i]>='A'&&s[i]<='Z') || (s[i]>='a'&&s[i]<='z')) 错误2:s[j]= \; 正确:s[j]='\\0'; 分析:错误1:字母包括小写字母和大写字母,这里是“或”的关系,所以用“||”运算符。错误2:字符串的结束标志符为字符,而不是字符串。 编程题参考答案: int fun(int a[ ][N]) { int i,j; for(i=0;i a[i][j]=0; /*将数组右上半三角元素中的值全部置成0*/ } 分析:本题旨在考查控制数组中右上半三角元素的算法,也就是两个千篇一律的循环语句,希望学习者能够掌握消化。 第11套 填空题参考答案: 【1】n/100%10 【2】\【3】\分析:【1】由程序可以知道,变量g保存了整数的个位数,变量s保存了整数的十位数,所以变量b应该保存整数的百位数。将整数除以100再对10取余,则得到这个整数的百位数。【2】当个位数字和百位数字之和等于十位数字时,则返回,\。【3】当个位数字和百位数字之和不等于十位数字时,则返回\。 改错题参考答案:错误1:for(j=0;j 错误2:a[p]=t; 正确:a[j]=t; 分析:错误1:根据C语言语法,for循环中循环条件后不加分号,除非做空操作。错误2:将两数进行交换的常用语句,借助第三个变量。 编程题参考答案: int fun(int w[ ][N]) { int i,j,k=0; int s=0; for(i=0;i if(i==0||i==N-1||j==0||j==N-1) s=s+w[i][j]*w[i][j]; /*将周边元素求平方和*/ return s; /*返回周边元素的平方和*/ } 分析:该题采用逐一判断的方式,周边元素的下标一定有一个是0或N-1,且只要下标中有一个为0或N-1,则它一定是周边元素。 第12套 填空题参考答案: 【1】n>1 【2】n-1 【3】n==1 分析:【1】求阶乘时采用递归的算法,n>1和n==1这两种情况的处理方法不同,需要分开考虑。【2】阶乘的算法是,当n>1时,n!=n*(n-1)!,即fun(n)=n*fun(n-1)。【3】n==1是递归的终止条件,因为1!=1,所以当n=1时,返回1。 改错题参考答案: 错误:if(('A'<=tt[i]||(tt[i]<='Z')) 正确:if(('A'<=tt[i]&&(tt[i]<='Z')) 分析:从ASCⅡ码表中可以看出,小写字母的ASCⅡ码值比对应大写字母的ASCⅡ码值大32。将字符串中的大写字母改为小写字母的方法是,从字符串第1个字符开始,根据ASCⅡ码值判断该字母是不是大写字母,若是,则ASCⅡ码值加32即可;重复执行以上过程直至字符串尾。本题可利用条件选择语句和循环语句来实现。 编程题参考答案: void fun(char *ss) { int i; for(i=0;ss[i)!='\\0';i++) /*将ss所指字符串中下标为奇数的字母转换为大写*/ if(i%2==1&&ss[i]>='a'&&ss[i]<='z') ss[i]=ss[i]-32; } 分析:从C语言的学习中我们知道,只要将小写字母减去32则转成大写字母,将大写字母加上32则转成小写字母。该程序是用if语句实现该功能转化的。 第13套 填空题参考答案:【1】k=0 【2】(i%2==0)||(i%3==0) 【3】s[k]='\\0' 分析:【1】变量k声明时没有初始化,所以在使用前要对它初始化。因为k用作字符数组的下标,所以初始化为0。【2】如果当前字符的下标能被2或3整除,则不保存这个字符。【3】将所有字符下标能被2或3整除的字符从字符串中删除后,在字符串的最后还要加上结束标记符‘\\0’。 改错题参考答案: 错误:if(i+1%5==0) 正确:if((i+1)%5==0) 分析:本题除了考查循环语句以外,其实就是一道简单的数学题,循环条件if(i+1%5==0)是一个标准的语法错误,这跟题目考查的知识点毫无关系,也就是说,做这样的题,只要读懂了题干意思,问题便可迎刃而解。 编程题参考答案: fun(int a[][M1) { int i,j,max=a[0][0]; for(i=0;i<2;i++) for(j=0;j max=a[i][j]; /*求出二维数组的最大值*/ return max; } 分析:此类求最大值或最小值的C语言问题,我们可以采用逐个比较的方式。要求数组中的所有元素走动一遍,并从中找出最大、最小值,要注意一开始应使max存放数组中的第一个元素的值。可按逐行查找也可按逐列查找的方式,本题采用的是逐行查找的方式。即行下标在外层循环列下标在内层循环,因为在循环的嵌套中越在内层循环,循环变化就越快。 第14套 填空题参考答案:【1】m%k 【2】k 【3】aa 分析:【1】此语句是将十进制的整型数据m转换为k进制数据时,将余数保存在数组aa中。【2】此语句是将十进制的整型数据m转换为k进制数据时,每除一次k后,把商重新赋值给正整数m,以便重复取余。【3】在for循环之后,i即为转换成的k进制数的位数,所以根据题意要求,此语句应该是:"print("%d", aa[i-1]);" 改错题参考答案:错误1:if(p==' ') 正确:if(*p==' ') 错误2:*p=toupper(*(p-1)); 正确:*(p-1)=toupper(*(p-1)); 分析:本题比较简单,重点考查toupper函数的用法,该函数是将ch字符转换成大写字母,该题较多地应用了字符串处理函数。 编程题参考答案: