计算机等级考试强化——上机考试部分1.概述上机考试有两部分组成:改错题和编程体考试时间:70分钟改错题:需要将程序录入并修改出其中的错误,一般错误数3—4编程题:需要编写出一个程序,并得到正确的运行结果2.常见题型和考点改错题:●系统函数的使用:头文件的包含。
函数处CTRL+F1●自定义函数:定义、调用、返回值。
注意数据类型的一致、形实参对应关系的一致、函数的数据类型和返回值类型的一致。
定义和调用对照判断●算法分析:算法模型的理解,重点在元素间的关系,边界情况,初始化是否正确等。
一般算法逻辑思想不会错。
模型要清晰、对象不能错、边界要注意、[计算结果]换算是否对。
考试的重点和难点。
●语法规则:变量定义、输入输出、结构化的语句结构、数组和指针变量初始化。
根据编译判断,注意搜索上下数行。
●逻辑关系:通常在if、while、for语句中出现。
注意逻辑和条件运算符是否正确。
编程题:●主要涉及文件操作、函数定义、数组问题●常见考点有:求满足条件的数、生成一组数、字符和数值的转化、对字符串进行压缩[解压,插入,删除,合并,抽取]●常见算法有:排序、交换两数、分解出整数的每位数字、求素数、反序、数字字符互换[0+‟0‟]、最大公约数、进制的概念、求整数的因子、阶乘、逼近算法3.一点非技术性技巧◆一定要将改错题输入到文件,即使不会改◆一定要检查文件是否存盘◆编程题一定要做,即使只会几个语句,如#include、定义一些变量包括建立文件指令等◆编程题一定要写出自定义函数,即使函数的内容不会写◆如果编程程序无法得到正确结果,可以使用C编辑器直接写出运行结果,在给出文件名时注意扩展名是否正确,不正确在windows下用使用重命名功能来改名◆程序书写时一定要使用缩进格式4.改错题典型例题讲解[改错题]下面的程序能够从键盘上接收一个含有空格的字符串,然后按照字典顺序对所有字符排序,再删除重复出现的字符// gets 排序后面的字符向前移动#include “stdio.h”void main(){char str[100], *p, *q, *r, c;printf(“Input a string:”);scanf(“%s”,str); //gets(str); //输入for(p=str; *p; p++){ // 选择排序法,p当前已排序的位置,q向后搜索,r选取for(q=r=p; *q; q++)if(*r > *q) *r = *q; // 此处用来确定位置,是指针赋值r=q if(r/=p) { c=*r; *r =*p; *p = c;} //交换,排序,q和r不一致交换r!=p }for(p=str; *p; p++){for(q=p; *p = = *q; q++)strcpy(p+1,q); //出现系统函数,看文件头,在此用CTRL+F1 #include”string.h”}printf(“result: %s \n”,str);}对于求n!,当n较大时,会产生溢出。
为完成高精度阶乘运算,可以用一个整数型数组存放一个参加运算的操作数,其中每个数组元素存放十进制表示的正整数的一个数字位。
下列函数fact中,kc表示进位,若当计算至m[MAX-1]时仍有进位,视为溢出,函数返回0,否则返回1# define MAX 200int fact(int n) // int fact(int n,int m[ ]){int i,j,k,kc;m[0]=1; //使用了数组,但未定义for(i=2; i<=n; i++){kc=0;for(j=0;n j<MAX; j++){k = m[j]*i +kc; //计算乘,并加上进位kc = kc/10; //注意kc的值为改变,kc = k/10m[j] = k%10;}}if(kc!=0) return 0;else return 1;}main(){int a[MAX], i, n;printf(“Input n(n>0):”);scanf(“%c”, &n); //输入整数n, scanf(“%d”,&n);for(i=0; i<MAX; i++) a[i]=0;printf(“%d!=”,n); //注意if语句的判定与函数返回值的关系if(fact(n,a)) printf(“overflow \n”); //自定义函数调用,参数不匹配,观察自定义函数else // if(!fact(n,a)){i=MAX-1; //输出while(a[i] = = 0)i--;for(; i>=0 ;i --) printf(“%d”,a[i]);}printf(“\n”);}下面的程序中函数divfun的功能是:对于s指向的一个含有数字字符和非数字字符的字符串(串长不超过80),将其中连续的数字字符转换为一个整数,如果连续的数字字符个数超过4个,则以4个数字字符为一组进行转换。
将转换后生成的整数依次存放到整型数组a 中。
函数返回放入a数组中整数的个数[可以想到函数中a为传入参数]。
例如,若输入的字符串为“c123yz45! 786 * 56abc123456789”则a数组中的数值分别为:(123,45,786,56,1234,5678,9)#include <stdio.h>void divfun(char *s, int a[ ]) // 有返回值,int divfun(char *s, int a[ ]){char *p = s;int i = 0, k,sum;while(*p)if(isdigit(*p)) //出现系统函数,看文件头,在此用CTRL+F1 #include”ctype.h”{sum = *p –…0‟; p++; k = 1;while(isdigit(*p)){k++;if(k< = 4 ) {sum = sum + *p –…0‟; p++;} // sum = sum*10 + *p –…0‟else {a[i++] = sum;k=1; sum = *p –…0‟; p++;}}a[i++] = sum;}else p++;return i-1;}main(){char *str; int i, n, num[40]; //char str[80];gets(str); n = divfun(str,num); //调用没问题puts(str);for(i=0; i<=n; i++) printf(“%6d”, num[i]);printf(“\n”);}5.编程题典型例题讲解[编程题]程序功能:还原被压缩的数据编程要求如下:1.编写函数int restore( int a[ ], int b[ ]),a数组中保存待还原的压缩数据,将还原后的数据保存在b数组中,将还原后全部数据的个数作为函数值返回2.编写主函数main,通过数组初始化将压缩数据放入一维数组x中,调用restore函数进行数据还原,将还原后的全部数据放入一维数组y中,将y数组中全部有效数据写入结果文件myf2.out中。
3.压缩数据格式说明如下:◆a[0]用来存放从a[1]开始存储的压缩数据段的个数值◆从a[1]开始顺序保存若干个压缩数据段。
当数据段的第一个数为正整数n时,表示该数据段只有两个数,还原操作是取该数据段的第二个出现的数重复出现n次;若数据段的第一个数为负整数n时,表示该数据段有|n|+1个数,从第二个数开始的|n|个数不是连续相同的,还原操作是取该数据段的第二个数开始的|n|个数作为还原结果。
例如:压缩数据如下:5 3 2 –5 0 1 2 3 4 5 1 5 0 –4 4 3 2 1还原后的数据如下:2 2 2 0 1 2 3 4 1 1 1 1 1 0 0 0 0 0 4 3 2 1#include <stdio.h>int restore(int a[], int b[]){int m, n, sum=0, i, j, t=1,k=0; // t从数段开始故t=1,b从0位置开始,故k=0n=a[0]; //获取数段的个数,决定第一层循环for(i=0;i<n;i++) //对数段循环{m=a[t++]; //读取每个数段的第一数if(m>0) //判断是否是压缩数据{for(j=0;j<m;j++)b[k++]=a[t]; //解压,注意a[t]不变t++;sum += m;}else{ //处理非压缩数据m = -m; //得到该数段非压缩数据的个数for(j=0;j<m;j++)b[k++]=a[t++]; //抄写非压缩数据,注意a[t]中t后移sum +=m;}}return sum;}main(){FILE *fp2;int i, n=0, x[51]={5,3,2,-5,0,1,2,3,4,5,1,5,0,-4,4,3,2,1}, y[100];fp2=fopen(“myf2.out”,”w”);if(fp2 = = NULL) {printf(“Can‟t open file!”); exit(1);}fprintf(fp2, “\n”);n = restore(x,y); //调用函数for(i=0; i<n;i++) fprintf(fp2,”%d”, y[i]); //输出数组,为在屏幕显示,改为printf(“%d”,y[i])fclose(fp2);}[编程题]已知任何一个正整数n的立方均可以表示成一串连续奇数之和。
例如:13 = 123 = 3 + 533 = 7 + 9 + 1143 = 13 + 15 + 17 + 19……试按下列要求编制程序:1.编制函数int find_odd(ind odd[] , int n),其功能是:找到若干个连续奇数,满足n的立方等于这些连续奇数之和,将这些奇数依次存放在数组odd中,函数返回奇数的个数。
2.编制主函数读入n的值(本题测试数据n = 14),调用函数find_odd,按如下格式将结果写到文件myf2.out中:14^3 = a1 + a2 + ……+ an 其中,a1表示最小奇数,an表示最大奇数#include <stdio.h>int find_odd(int odd[ ], int n){int sum, k,i,j,n3,cnt;n3=n*n*n;for(k=1; ;k+=2) //找连续奇数的开始点{sum=0;cnt=0;for(i=k; sum<n3; i+=2) {sum += i; cnt++;} //连续累加,直至>= n3if(sum = = n3) // 判断是否等于n3{for(j=0; j<cnt; j++) odd[j] = k+j*2; // 将奇数放入数组return cnt;}}}main(){FILE *out;int i,max,n,odd[30];if((out = fopen(“myf2.out”,”w”)) = = NULL){printf(“Open file myf2.out failed! \n”); exit(1); }scanf(“%d”,&n);max = find_odd(odd,n);fprintf(out, “”%d^3 = “, n); printf(“%d^3 = ”,n ); \\注意这种方法for(i=0; i< max; i++){fprintf(out, “%d+”, odd[i]); printf(“%d+”, odd[i]); }fprintf(out, “%d”, odd[max]); printf(“%d”, odd[max]);fclose(out);}[编程题]考生信息字符串中含有准考证号和考生姓名,例如“0412404524 zhang wei qiang”。