资源描述
计算机等级考试培训教案主讲夏敏捷
计算机等级考试培训教案
主讲:夏敏捷 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
展开阅读全文