收藏 分销(赏)

计算机等级考试培训教案主讲夏敏捷.doc

上传人:a199****6536 文档编号:10595419 上传时间:2025-06-04 格式:DOC 页数:13 大小:73.53KB 下载积分:8 金币
下载 相关 举报
计算机等级考试培训教案主讲夏敏捷.doc_第1页
第1页 / 共13页
计算机等级考试培训教案主讲夏敏捷.doc_第2页
第2页 / 共13页


点击查看更多>>
资源描述
计算机等级考试培训教案主讲夏敏捷 计算机等级考试培训教案 主讲:夏敏捷 2009-05-21 上机部分: 第一套 1.填空题 请补充main函数,该函数的功能是:把1~100间的所有素数保存在数组aa中,然后输出这些素数并计算它们的和。 注意:部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在main函数的横线上填入所编写的若干表达式或语句。 试题程序: #include<stdlib.h> #include<stdio.h> void main() { int i,j,k,flag,sum; int aa[50]; sum=0; k=0; system("CLS"); for(i=2;i<100;i++) { 【1】; for(j=2;j<i&&flag;j++) if(i%j==0) { 【2】; } if(flag) { sum+=i; 【3】; } } printf("\n*** prime number ***\n"); for(i=0;i<k;i++) { if(i%10==0) printf("\n"); printf("%4d",aa[i]); } printf("\nsum=%d",sum); 1.填空题 【1】flag=1 【2】flag=0 【3】aa[k++]=i 【解析】填空1:由后面的if语句可以看出,当flag为1时,当前数是素数,所以此处先假设当前数为素数,即置flag为1,再进行判断,如果不是素数,则再将flag清零。填空2:如果一个数能被除了1和其自身之外的数整除,即余数为0,则这个数不是素数。如果当前数不是素数,则将flag清零。填空3:如果当前数是素数,则将它保存在数组bb 2. 改错题 下列给定程序中,函数fun()的功能是:利用插入排序法对字符串中的字符按从小到大的顺序进行排序。插入法的基本方法是:先对字符串中的头两个元素进行排序,然后把第3个字符插入到前两个字符中,插入后前3个字符依然有序;再把第4个字符插入到前3个字符中,待排序的字符串已在主函数中赋予。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include <string.h> #include <stdio.h> #define N 80 void insert(char *aa) { int i, j, n; char ch; n=strlen(aa); for(i=1;i<n;i++) /**********************found***********************/ { c=aa[i]; j=i-1; while((j>=0)&&(ch<aa[j])) { aa[j+1]=aa[j]; j--; } aa[j+1]=ch; } } void main() { char a[N]= "QWERTYUIOPASDFGHJKLMNBVCXZ"; printf("The original string: %s\n",a); insert(a); printf("The string after sorting: %s\n\n",a); } 2. 改错题 错误:c=aa[i]; 正确:ch=aa[i]; 【解析】对长度为n的数组元素进行排列,可先对数组的前m-1项进行排序,之后再对前m项进行排序,如此循环直到数组全部元素完成排序。对前m项的子数列进行排序的方法是,将该子数列的末尾元素及前m-1项的元素相比较,由于前m-1项已经完成排序,可以找到某一位置,使得将该末尾元素插入该位置之后,前m项仍然保持升序。这样循环后,就可以得到全部元素的排序。 3. 编程题 编写函数fun(),它的功能是:计算和输出下列级数的和。 S=1/(1×2)+1/(2×3)+…+1/(n×(n+1)) 例如,当n=10时,函数值为0.909091。 注意:部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序: #include<stdlib.h> #include<conio.h> #include<stdio.h> double fun(int n) { } void main() { system("CLS"); printf("%f\n",fun(10)); } 3. 编程题 double fun(int n) { int i; double s=0.0; for(i=1;i<=n;i++) s=s+1.0/(i*(i+1)); /*求级数的和*/ return s; } 【解析】解决数学序列的问题,我们的思路依然是"数学先行",即先看清楚题目的数学逻辑,然后再根据C语言来"翻译"出来。本题中,每一项的值都是n*(n+1)的倒数。当输入n时,从1开始循环,注意,此处for(i=1;i<=n;i++)中的"="号必须要有,另外,表达式1.0/(i*(i+1))中的两对小括号一个都不能少。若写成1.0/i*(i+1)则相当于(i+1)/i,结果就差之千里。 第二套 1.填空题 请补充main函数,该函数的功能是:从键盘输入两上字符串并分别保存在字符数组str1和str2中,用字符串str2替换字符串str1前面的所有字符,注意,str2的长度不大于str1,否则需要重新输入。 例如,如果输入str1="abced",str2="fk",则输出"fkced"。 注意:部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在main函数的横线上填入所编写的若干表达式或语句。 试题程序: #include<stdlib.h> #include<stdio.h> #include<string.h> void main() { char str1[81],str2[81]; char *p1=str1,*p2=str2; system("CLS"); do { printf(" Input str1 \n"); gets(str1); printf(" Input str2 \n"); gets(str2); }while(【1】); while(【2】) *p1++=*p2++; printf(" Display str1 \n"); puts(【3】); } 1.填空题 【1】strlen(str1)<strlen(str2) 【2】*p2 【3】str1 【解析】填空1:如果字符串str2的长度大于字符串str1的长度,则要重新输入,即继续执行do-while循环。 填空2:如果p2所指的字符不为′ \0′,即还没有执行到str2的最后一个字符,则将这个字符赋给字符串str1的对应字符。填空3:函数puts()的功能是将一个字符串输出到终端设备,由程序可以知道,此时应该输出字符串str1。 2. 改错题 下列给定程序中,函数fun()的功能是:输出M行N列整数方阵,然后求两条对角线上的各元素之和,返回此和数。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include<stdlib.h> #include <conio.h> #include <stdio.h> #define M 5 /**********************found***********************/ int fun(int n,int xx[ ][ ]) { int i, j, sum=0; printf("\nThe %d x %d matrix:\n",M,M); for(i=0;i<M;i++) { for(j=0;j<M;j++) /**********************found***********************/ printf("%4f",xx[i][j]); printf("\n"); } for(i=0;i<n;i++) sum+=xx[i][i]+xx[i][n-i-1]; return(sum); } void main() { int aa[M][M]={{1,2,3,4,5},{4,3,2,1,0},{6,7,8,9,0},{9,8,7,6,5},{3,4,5,6,7}}; system("CLS"); printf("\nThe sum of all elements on 2 diagnals is %d",fun(M,aa)); } 2. 改错题 (1)错误: int fun(int n,int xx[][]) 正确:int fun(int n,int xx[][M]) (2)错误:printf("%4f",xx[i][j]); 正确:printf("%4d",xx[i][j]); 【解析】该题错误比较隐蔽,一般的C语言上机考试很少涉及printf函数中的错误,在这里,我们只要明白"d"和"f"的区别就OK了。格式字符d表示:以带符号的十进制形式输出整数(正整数不输出符号);格式字符f表示:以小数形式输出单、双精度,隐含输出6位小数。 3. 编程题 请编写函数fun(),该函数的功能是:将两个两位数的正整数a,b合并形成一个整数放在c中。合并的方式是:将a数的十位和个位数依次放在c数的十位和千位上,b数的十位和个位数依次放在c数的百位和个位上。 例如,当a=45时,b=12,调用到该函数后,c=5142。 注意:部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序: #include <stdlib.h> #include <stdio.h> #include <conio.h> void fun(int a ,int b,long *c) { } void main() { int a,b; long c; system("CLS"); printf("Input a ,b: "); scanf("%d%d",&a,&b); fun(a,b,&c); printf("The result is :%ld\n",c); } 3. 编程题 void fun(int a ,int b,long *c) { *c=a%10*1000+b/10*100+a/10*10+ b%10; /*将a数的十位和个位数依次放在c 数的十位和千位上,b数的十位和 个位数依次放在c数的百位和个位上*/ } 【解析】本题中主要的问题是怎么取出a和b的个位数和十位数,取出后怎么表示成c中相应的位数。由于a和b都是只有两位的整数,所以分别对它们除10可得到它们的十位数,分别用10对它们求余可得到它们的个位数。如45/10结果为4而不是4.5(这是由于两个数都为整型,所以结果也为整型),45%10结果为5。若a为45,则a/10*10的结果为40而非45。乘1000,乘100和乘10的作用是分别使其前面的数成为*c的千位数、百位数和十位数。注意要使用c时要注意进行指针运算,即*c,不能少了*号。 第三套 1.填空题 请补充main函数,该函数的功能是:从键盘输入若干字符放到一个字符数组中,当按回车键时结束输入,最后输出这个字符数组中的所有字符。 注意:部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在main函数的横线上填入所编写的若干表达式或语句。 试题程序: #include<stdlib.h> #include<stdio.h> #include<ctype.h> void main() { int i=0; char s[81]; char *p=s; system("CLS"); printf(" Input a string \n"); for(i=0;i<80;i++) { s[i]=getchar(); if(s[i]=='\n') 【1】; } s[i]=【2】; printf(" display the string \n"); while(*p) putchar(【3】); } 1.填空题 【1】break 【2】′ \0′ 【3】*p++ 【解析】填空1:当输入的字符是回车符时,使用break语句跳出for循环,结束输入。填空2:结束输入后,在字符串s最后要加上结束标记符′ \0′。填空3:最初指针p指向字符串s的首字符,通过p++逐一指向后面的每个字符,调用putchar()函数输出字符。 2. 改错题 下列给定程序中,函数fun()的功能是:将长整型数中每一位上为偶数的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。例如,当s中的数为87653142时,t中的数为8642。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include<stdlib.h> #include <conio.h> #include <stdio.h> void fun(long s,long *t) /**********************found***********************/ { int d; long s1=1; *t=0; while(s>0) { d=s%10; /**********************found***********************/ if(d%2=0) {*t=d*s1+*t; s1*=10; } /**********************found***********************/ s\=10; } } void main() { long s,t; system("CLS"); printf("\nPlease enter s: "); scanf("%ld",&s); fun(s,&t); printf("The result is :%ld\n",t); } 2. 改错题 (1)错误:int d; 正确:long d; (2)错误:if(d%2=0) 正确:if(d%2==0) (3)错误:s\=10; 正确:s/=10; 【解析】其实,不论取出偶数还是奇数,思路应该是一样的。我们在刚开始学习C语言的时候就学习过强制类型转换以及运算级别的问题,所以,这里的int就没有存在的理由。错误2中的问题是怎么表达一个偶数的问题,归根结底还是"="和"=="的区别问题。 3. 编程题 请编写函数fun(),其功能是:将s所指字符串中下标为偶数的字符删除,串中剩余字符形成的新串放在t所指数组中。 例如,当s所指字符串中的内容为ABCDEFGHIJK,则在t所指数组中的内容应是BDFHJ。 注意:部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序: #include<stdlib.h> #include<conio.h> #include<stdio.h> #include<string.h> void fun(char *s,char t[]) { } void main() { char s[100],t[100]; system("CLS"); printf("\nPlease enter string S: "); scanf("%s ",s); fun(s,t); printf("\nThe result is:%s\n ",t); } 3. 编程题 void fun(char *s,char t[]) { int i,j=0,k=strlen(s); /*k为字符串的长度*/ for(i=1;i<k;i=i+2) /*将s所指字符串中下标为奇数的 字符存入t所指字符串中*/ t[j++]=s[i]; t[j]='\0'; /*在字符串最后加上结束标志*/ } 【解析】本题使用了一种i永远是奇数的循环方法,即for(i=1;i<k;i=i+2),因为开始时i的值为1,当i+2循环时,此值永远是奇数。 第四套 1.填空题 请补充main函数,该函数的功能是:把一个二维字符数组每行字符串最大的字符拷贝到字符数组s中。 例如,如果str[3]={" efjh","efknls","owys"},则s="jsy"。 注意:部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在main函数的横线上填入所编写的若干表达式或语句。 试题程序: #include<stdlib.h> #include<stdio.h> void main() { int i=0; char *str[3]={"efjh","efknls", "owys"}; char **p; char s[8]; system("CLS"); 【1】; for(i=0;i<3;i++) { s[i]=*p[i]; while(*p[i]) { if(s[i]<*p[i]) s[i]=*p[i]; 【2】; } } 【3】; printf(" new string \n"); puts(s); } 1.填空题 【1】p=str 【2】p[i]++ 【3】s[i]= ′ \0′ 【解析】填空1:str是一个大小为3的指针数组,每个指针指向一个字符串,p是指向指针的指针,首先要使指针p指向数组str的首地址。填空2:通过p[i]++使p[i]指向第i个字符串的下一个字符。填空3:将每行字符串的最大字符都拷贝到字符数组s中后,不要忘了在数组s最后加上字符串结束标记符′ \0′。 2. 改错题 下列给定程序中,函数fun()的功能是:判断一个整数m是否是素数,若是返回1,否则返回0。在main()函数中,若fun()返回1则输出YES,若fun()返回0则输出NO! 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include<stdlib.h> #include <conio.h> #include <stdio.h> int fun(int m) { int k=2; while (k<=m&&(m%k)) /**********************found***********************/ k++ /**********************found***********************/ if(m=k) return 1; else return 0; } void main() { int n; system("CLS"); printf("\nPlease enter n: "); scanf("%d",&n); if(fun(n)) printf("YES\n"); else printf("NO!\n"); } 2. 改错题 (1)错误:k++ 正确:k++ ; (2)错误:if(m=k) 正确:if(m= =k) 【解析】函数fun()的功能是判断m是否为素数:m从2开始作为除数,并对m取余,若不存在一个数使得余数为0,则m为素数,程序的错误在于if(m=k)语句中的逻辑表达式写成了赋值表达式。 3. 编程题 请编写函数fun(),该函数的功能是:将s所指字符串中ASCⅡ值为偶数的字符删除,串中剩余字符形成一个新串放在t所指的数组中。 例如,若s所指字符串中的内容为ABCDEFG12345,其中字符B的ASCⅡ码值为偶数、…、字符2的ASCⅡ码值为偶数、…,都应当删除,其他依次类推。最后t所指的数组中的内容应是ACEG135。 注意:部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序: #include <stdlib.h> #include <stdio.h> #include <string.h> #include <conio.h> void fun(char *s, char t[]) { } void main() { char s[100],t[100]; system("CLS"); printf("\nPlease enter string S: "); scanf("%s",s); fun(s,t); printf("\nThe result is :%s\n",t); } 3. 编程题 void fun(char *s, char t[]) { int i=0; for(;*s!='\0';s++) /*找出ASCII值为奇数的字符依次 存入数组t中*/ if(*s%2==1) t[i++]=*s; t[i]='\0'; /*在字符串的末尾加上串结束符*/ } 【解析】要删除ASCII值为偶数的字符,也就是要留下ASCII值为奇数的字符,由于最终是要求求出剩余字符(即ASCII值为奇数)形成的新串,所以本题程序的算法是从原字符串的头到尾扫描并找出ASCII值为奇数的字符依次存入数组t中。此外,还要注意数组t的下标变化和下标的初值(初值必须为0,即i=0),t[i++]的作用是先使用t[i]然后再使i自增1。任何字符串的末尾都要有串结束符。这种算法在很多题中都要用到,学习者可以举一反三地找一些其他相关习题练习一下。 第五套 1.填空题 请补充main函数,该函数的功能是:把一个整数插入到一个已经按从小到大排序的数组中。插入后,数组仍然有序。 例如,在数组bb[N]={12,23,31,44,51,63,71,79,85,95}中插入93,结果为: bb[N]{11,21,31,41,51,61,71,79,81,93,95} 注意:部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在main函数的横线上填入所编写的若干表达式或语句。 试题程序: #include<stdlib.h> #include<stdio.h> #define N 10 void main() { int i,j; int n; int bb[N+1]={12,23,31,44,51,63,71, 79,85,95}; system("CLS"); printf("\nInput n \n"); scanf("%d",&n); printf("\nn=%d ",n); printf("\n*** original list ***\n"); for(i=0;i<N;i++) printf("%4d ",bb[i]); for(i=0;i<N;i++) { if(n<=bb[i]) { for(j=N;【1】;j--) 【2】; bb[j]=n; 【3】; } } if(i==N) bb[i]=n; printf("\n***** new list ******\n"); for(i=0;i<N+1;i++) printf("%4d ",bb[i]); } 1.填空题 【1】j>i 【2】bb[j]=bb[j-1] 【3】break 【解析】填空1:因为原数组是按从小到大排列,所以从第一个元素开始,逐一及待插入的元素进行比较,第一个大于待插入元素n的元素bb[i]的下标i即为插入位置。所以,从bb[i]到bb[N-1]都要依次向后移动一个位置,使待插入元素n存于bb[i]。这里,for循环中j取值从N到i+1。填空2:为了实现从bb[i]到bb[N-1]依次向后移动一个位置,将当前元素赋给下一个元素,要注意,为了不覆盖未经处理的元素,应该从最后一个元素开始移动。填空3:将整数n插入数组后,函数功能已经实现,应使用break语句跳出for循环。 2. 改错题 下列给定程序中,函数fun()的功能是:删除字符串s中所有空白字符(包括Tab字符、回车符及换行符)。输入字符串时用'#'结束输入。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include <string.h> #include <stdio.h> #include <ctype.h> fun(char *p) { int i, t; char c[80]; for(i=0,t=0;p[i];i++) if(!isspace(*(p+i))) c[t++]=p[i]; /**********************found***********************/ c[t]='\0'; strcpy(p,c); } void main() {char c,s[80]; int i=0; printf("Input a string: "); c=getchar(); while(c!='#') { s[i]=c;i++;c=getchar();} s[i]="\0"; fun(s); puts(s); } 2. 改错题 错误:c[t]= "\0"; 正确:c[t]= '\0'; 【解析】注意,该程序的if条件中应用了isspace函数,该函数的功能是检查ch是否空格、跳格符(制表符)或换行符。 3. 编程题 已知学生的记录由学号和学习成绩构成,N名学生的数据已存入a结构体数组中。请编写函数fun(),该函数的功能是:找出成绩最低的学生记录,通过形参返回主函数(规定只有一个最低分)。已给出函数的首部,请完成该函数。 注意:部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序: #include<stdlib.h> #include<stdio.h> #include<string.h> #include<conio.h> #define N 10 typedef struct ss { char num[10]; int s; } STU; fun(STU a[], STU *s) { } void main() { STU a[N]={{ "A01",81},{ "A02",89},{ "A03",66},{ "A04",87},{ "A05",77}, { "A06",90},{ "A07",79},{ "A08",61},{ "A09",80},{ "A10",71}},m; int i; system("CLS"); printf("*****The original data*****"); for(i=0;i<N;i++) printf("No=%s Mark=%d\n", a[i].num,a[i].s); fun(a,&m); printf("*****THE RESULT*****\n"); printf("The lowest :%s, %d\n",m.num,m.s); } 3. 编程题 fun(STU a[], STU *s) { int i; *s=a[0]; /*先认为第1个值最小*/ for(i=0;i<N;i++) /*如果在循环的过程中再发现比第1个 值更小的则赋给*s*/ if(s->s>a[i].s) *s=a[i]; } 【解析】我们先认为第1个值最小,即*s=a[0]语句,如果在循环的过程中再发现比第1个值更小的随即赋给该*s就可以了。另外,还涉及到结构体中的指向运算符,请学习者注意。若要找出最高成绩则if()中的条件改成s->s<a[i].s即可。 13 / 13
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 考试专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服