二级C上机考前冲刺辽宁科技大学黄建mtysoft@163.com2二级C考试包括笔试和上机两部分。只有一门合格的,下次考试合格的一门可以免考,两部分考试均合格者,由教育部颁发合格证书。笔试:每年两次,四月的第一个星期六和九月倒数第二个星期六。上机:从笔试当天下午开始,考点根据考生数量和设备情况安排。2009年笔试时间为:3月28日和9月19日。0.1考试时间3机考形式:90分钟,满分100分。填空,30分,3个空,程序名:Modi1.c;改错,30分,2~3个错,程序名:Blank1.c;编程,40分,1个编程,程序名:Prog1.c。考纲要求:熟悉VC++6.0集成环境,掌握程序设计中简单的数据结构和算法;能够编写简单的C程序,并具有基本的纠错和调试程序的能力。0.2考试内容4二级C上机题型分类30分30分40分填空题改错题编程题51.1填空题注意事项仔细阅读题目要求和功能,尤其是题目给出的输入和输出示例,以便检验填空后程序运行结果是否正确。在VC++6.0环境下调出源程序,读懂程序代码,根据“(数字)”出现的位置和题目要求填写空白内容。在答题过程中,只能在有数字标号的空缺处填写,不要改动程序行的顺序和其余的非空缺行的代码。61.2填空题解题步骤按F7键编译源程序,若发现有语法错误,重新检查或调整答题思路。按Ctrl+F5执行程序,按照试题示例中给出的数据进行测试,如果结果与给出的输出结果相同,该题就完成了;如果测试的结果与给出的结果不同,就需要进一步检查程序的逻辑错误。最后得到正确结果后,一定保存程序,否则不得分。72.1改错题注意事项上机改错的试题中通常包含2~3个错误需要修改。试题中用****found****/来提示在下一行(或第二行)有错。错误的性质基本分语法错误和逻辑错误两种,也有些试题要求把语句添加在下划线处。注意:只能在出错的行上进行修改,不要改动程序行的顺序,更不要自己另编程序。一般来说,改动的地方很小,切忌打破原程序结构,特别不要增删语句(题目中明确指出要增删语句的除外)。82.2改错题解题步骤2-1仔细审题,了解试题要求,看清试题给出的输入输出示例,以便检验程序运行结果。在VC++6.0下调出源程序,审视/*found*/所在函数,理解程序所采用的基本算法。先按F7键,检查程序是否有语法错误,参考编译提示查找并改正错误。当无语法错误时,按Ctrl+F5执行,按照试题给出的数据测试,若输出结果相同,该题就做对了;若结果不同,应进一步检查逻辑错误。92.2改错题解题步骤2-2当程序存在逻辑错误时,应当理解题意、读懂程序的算法,必要时可按步检查数据的流程。例如,题目要求按由小到大排序,而结果是按由大到小排序,问题可能出现在条件判断上。又如,输出的字符串比预期的短,就有可能字符串的结束标志放错了位置。再如,做循环的时候,数组上限下限错误了,下标是从0开始,而不是从1开始。得到正确结果后,修改后的程序一定要存盘。102.3改错题常见错误4-1标识符拼写错误,小写写成了大写如:I=0,应改为i=0运算符书写错误如:a\=10,应改为a/=10a=b/10,应改为a=b%10a=b,应改为a+=bif(a=b),应改为if(a==b)if(a0||b0),应改为if(a0&&b0)a10,应改为a=10112.3改错题常见错误4-2变量初值或类型错误如:intx=1,应改为doublex=0缺少分号或多写了分号,或分号误写成逗号如:switch(a);,应改为switch(a)intf(intn);,应改为intf(intn)for(i=1;i=5;i++;),应改为for(i=1;i=5;i++)关于指针变量的错误如:p++,应改为*p++或(*p)++122.3改错题常见错误4-3赋值运算符左右类型不一致如:实型变量x=1/i,应改为x=1.0/i字符变量c=\0,应改为c='\0'指针变量p=10,应改为*p=10表达式格式错误或次序错误如:if!(xy),应改为if(!(xy))变量1=变量2,如:p=q,应改为q=p交换两个变量的值,如:t=x,y=x,y=t,应改为t=x,x=y,y=t132.3改错题常见错误4-4函数类型或形参类型说明错误intf(inta),应改为doublef(inta)实参是地址(数组名),形参应是指针或数组名intf(intp),应改为intf(int*p)或者改为intf(intp[]);其他错误如:a=c-'o',应改为a=c-'0'scanf(%f,i),应改为scanf(%d,&i)case0;,应改为case0:143.0编程题分类整数分离与合并1四舍五入2数学公式求值3求极值和平均值4矩阵问题5整除和素数问题6回文数7移动数组元素8复制数组元素9统计子串个数10数据分类统计11字符串转换12实现字符串函数13删除指定字符14删除星号15排序问题16在结构体中查找17在链表中求极值1815整数分离与合并163.1整数分离与合并2-1将两个两位的正整数a、b合并形成一个整数放在c中:将a的十位和个位数放在c的千位和十位,b的十位和个位数放在c的百位和个位。例如:若a=45,b=12,使c=4152。voidfun(inta,intb,int*c){*c=a/10*1000+b/10*100+a%10*10+b%10;}main(){intc;fun(45,12,&c);printf(%d,c);}173.1整数分离与合并2-2请编写函数unsignedfun(unsignedw),w是一个大于10的无符号整数,求出w后n-1位的数作为函数值返回。unsignedfun(unsignedw){unsignedt=w,m=1;while(t){t/=10,m*=10;}returnw%(m/10);}18四舍五入193.2四舍五入请编写函数doublefun(doubleh),函数的功能是:对变量h中的值保留2位小数,并对第3位进行四舍五入(规定h中的值为正数)。doublefun(doubleh)//方法一{return(int)(h*100+0.5)/100.0;}doublefun(doubleh)//方法二{return(int)(h*1000+5)/10/100.0;}20数学公式求值213.3数学公式求值3-1编写函数求Fibonacci数列中大于t的最小的一个数,结果由函数返回。其中数列f(n)的定义为:f(0)=0,f(1)=1,f(n)=f(n-1)+f(n-2)intfun(intt){inta=0,b=1,c=0;while(c=t){c=a+b;a=b;b=c;}returnc;}223.3数学公式求值3-2求x值,精度0.0005(某项小于0.0005时停止迭代):x/2=1+1/3+1×2/3×5+1×2×3/3×5×7+1×2×3×4/3×5×7×9+…+1×2×3×…×n/3×5×7×(2n+1),输入0.0005,输出3.14…doublefun(doublee){doublen=1,v=1,s=0;while(v=e){s+=v;v*=n/(2*n+1);n++;}returns*2;}233.3数学公式求值3-3求方程cos(x)-x=0的一个实根。步骤:①x1初值0.0;②x0=x1;③x1=cos(x0);④若x0-x1的绝对值小于0.000001,执行步骤5,否则执行步骤2;⑤x1就是实根,作为函数值返回。doublefun(){doublex1=0.0,x0;do{x0=x1;x1=cos(x0);}while(fabs(x0-x1)=1e-6);returnx1;}24求极值和平均值253.4求极值和平均值2-1编写函数求出s数组t个元素中最大元素在数组中的下标,并存放在k所指的存储单元中。voidfun(int*s,intt,int*k){inti,m=0;for(i=1;it;i++)if(s[i]s[m])m=i;*k=m;}263.4求极值和平均值2-2请编写函数fun,它的功能是:计算a数组中n门课程的平均分,计算结果作为函数值返回。doublefun(int*a,intn){inti;doubles=0;for(i=0;in;i++)s+=a[i];returns/n;}27矩阵问题283.5矩阵问题2-1编写函数fun,求N×N的二维数组周边元素的平均值并作为函数值返回给主函数。doublefun(inta[N][N]){inti,k;doubles=0;for(i=0;iN;i++)for(k=0;kN;k++)if(i==0||k==0||i==N-1||k==N-1)s+=a[i][k];returns/(4*N-4);}293.5矩阵问题2-2矩阵转置,如:输入102030输出104070(即行列互换)405060205080708090306090voidfun(inta[N][N]){inti,k,t;for(i=0;iN;i++)for(k=0;ki;k++){t=a[i][k];a[i][k]=a[k][i];a[k][i]=t;}}30整除和素数问题313.6整除和素数问题4-1请编写函数fun,它的功能是:求n以内(不包括n)同时能被3与7整除的所有自然数之和的平方根,并作为函数值返回。doublefun(intn){inti;doubles=0;for(i=1;in;i++)if(i%3==0&&i%7==0)s+=i;returnsqrt(s);}323.6整除和素数问题4-2请编写函数fun,它的功能是:求出1到m之内(含m)能被7或11整除的所有整数放在数组a中,通过函数返回这些数的个数。intfun(int*a,intm){inti,j=0;for(i=1;i=m;i++)if(i%7==0||i%11==0)a[j++]=i;returnj;}333.6整除和素数问题4-3编写函数求出小于或等于lim的所有素数并放在a数组中,该函数返回所求的素数的个数。intfun(intlim,inta[MAX]){inti,k,j=0;for(i=2;i=lim;i++){for(k=2;ki;k++)if(i%k==0)break;if(k==i)a[j++]=i;}returnj;}343.6整除和素数问题4-4编写函数,将大于整数m且紧靠m的n个素数存入x所指的数组中。voidfun(intm,intn,intx[]){inti,k,j=0;for(i=m+1;jn;i++){for(k=2;ki;k++)if(i%k==0)break;if(k==i)x[j++]=i;}}35回文数363.7回文数判断字符串是否为回文数。若是则函数返回1,否则返回0。回文是指顺读和倒读都是一样的字符串。intfun(char*a){inti,t=1,m=strlen(a);for(i=0;im/2;i++)if(a[i]!=a[m-i-1]){t=0;break;}returnt;}37移动数组元素383.8移动数组元素2-1一维数组中有n个整数,把下标从0到p(p小于等于n-1)的数组元素平移到数组的最后。voidfun(inta[],intp,intn){inti,k,t;for(k=1;k=p;k++){t=a[0];for(i=1;in;i++)a[i-1]=a[i];a[n-1]=t;}}393.8移动数组元素2-2假定输入的字符串中只包含字母和*号,将字符串中的前导*号全部移到字符串的尾部。voidfun(char*a){inti,n=strlen(a);while(a[0]=='*'){for(i=1;in;i++)a[i-1]=a[i];a[n-1]='*';}}40复制数组元素413.9复制数组元素2-1编写函数fun,将M行N列的二维数组中的字符数据,按列的顺序依次放到一个字符串中。voidfun(cha