全国计算机等级考试二级C语言练习题(五)
1.程序填空题
给定程序中,函数fun的功能是:计算出形参s所指字符串中包含的单词个数,作为函数值返回。为便于统计,规定各单词之间用空格隔开。
例如,形参s所指的字符串为:This is a C language program.,函数的返回值为6。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
int fun(char *s)
{
int n=0,flag=0;
while(*s!='\0')
{ if(*s!=' ' && flag==0) {
/**********found**********/
___1___; flag=1;}
/**********found**********/
if(*s==' ') flag=___2___;
/**********found**********/
___3___;}
return n;
}
main()
{
char str[81]; int n;
printf("\nEnter a line text:\n");
gets(str);
n=fun(str);
printf("There are %d words in this text.\n",n);
}
【答案】
(1)n++ (2)0 (3)s++
2.程序修改题
给定程序中,函数fun的功能是:先将s所指字符串中的字符按逆序存放到t所指字符串中,然后把s所指串中的字符按正序连接到t所指串的后面。
例如,当s所指的字符串为:“ABCDE”时,则t所指的字符串应为:“EDCBAABCDE”。
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <string.h>
void fun(char*s,char*t)
{
/**********found**********/
int I;
sl=strlen(s);
for(i=0;i<sl;i++)
/**********found**********/
t[i]=s[sl-i];
for(i=0;i<sl;i++)
t[sl+i]=s[i];
t[2*sl]='\0';
}
main()
{
char s[100],t[100];
printf("Please enter string s:");
scanf("%s",s);
fun(s,t);
printf("The result is: %s\n", t);
}
【答案】
(1)将int i; 改为:int i,sl;
(2)将t[i] = s[sl-i]; 改为:
t[i] = s[sl-i-1];
3.程序设计题
函数fun的功能是:将a、b两个两位正整数合并形成一个新的整数放在c中。合并的方式是:将a中的十位和个位数依次放在变量c的百位和个位上,b中的十位和个位数依次放在变量c的千位和十位上。
例如,当a=45、b=12时,调用该函数后c=1425。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
void fun(int a,int b,long *c)
{
}
main()
{
int a,b;
long c;
printf("Input a,b:");
scanf("%d%d",&a,&b);
fun(a,b,&c);
printf("The result is: %ld\n", c);
}
【答案】
void fun(int a,int b,long *c)
{
*c=a/10*100+a%10+b/10*1000+b%10*10;
}
1.程序填空题
给定程序中,函数fun的功能是:找出形参s所指字符串中出现频率最高的字母(不区分大小写),并统计出其出现的次数。
例如,形参s所指的字符串为:abcAbsmaxless,程序执行后的输出结果为:
letter 'a' :3 times
letter 's' :3 times
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <string.h>
#include <ctype.h>
void fun(char*s)
{
int k[81]={0},n,I,max=0;
char ch;
while(*s)
{
if(isalpha(*s))
{
/**********found**********/
ch=tolower(___1___);
n=ch-'a';
/**********found**********/
k[n]+=___2___;
}
s++;
/**********found**********/
if(max<k[n]) max=___3___;
}
printf("After count :\n");
for(i=0;i<26;i++)
if(k[i]==max)
printf("letter \'%c\': %d times\n",i+'a',k[i]);
}
main()
{
char s[81];
printf("Enter a string:\n\n");
gets(s);
fun(s);
}
【答案】
(1)*s (2)1 (3)k[n]
2.程序修改题
给定程序中函数fun的功能是:判断一个整数是否是素数,若是返回1,否则返回0。在main()函数中,若fun返回1输出YES,若fun返回0输出NO!。
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数。不得增行或删行,也不得更改程序的结构!
#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;
}
main()
{
int n;
printf("\nPlease enter n: ");
scanf( "%d", &n );
if(fun(n)) printf( "YES\n" );
else printf("NO!\n");
}
【答案】
(1)将k++ 改为:k++;
(2)将if(m = k ) 改为:if(m == k)
3.程序设计题
数组a[N]保存着一组3位数的无符号正整数,其元素的个数通过变量len传入fun函数。请补充fun函数,该函数的功能是:从数组a中找出个位和百位数字相等的所有无符号整数,结果保存在数组yy中,其个数由fun函数返回。
例如,当a[6]={111,323,677,456,987,999}时,b[3]={111,323,999}。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的花括号中填入所编写的若干语句。
#include <stdio.h>
#include <conio.h>
#define N 500
int fun(int a[],int bb[],int len)
{
}
main()
{
int a[8]={111,323,677,456,987,999};
int b[N];
int len=0,n=0,i=0;
len=6;
printf("The original data\n ");
for(i=0;i<len;i++)
printf("%u ",a[i]);
printf("\n\n\n");
n=fun(a,b,len);
printf("\nb=");
for(i=0;i<n;i++)
printf("%u ",b[i]);
}
【答案】
int i,n=0;
int g,b;
for(i=0;i<len;i++)
{
g=a[i]%10;
b=a[i]/100;
if(g==b)
bb[n++]=a[i];
}
return n;
1.程序填空题
给定程序中,函数fun的功能是:在形参ss所指字符串数组中,查找含有形参substr所指子串的所有字符串并输出,若没找到则输出相应信息。Ss所指字符串数组中共有N个字符串,且串长小于M。程序中库函数strstr(s1,s2)的功能是在s1串中查找s2子串,若没有,函数值为0;若有,为非0。
请在程序的下划线处填入正确的内容,并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <string.h>
#define N 5
#define M 15
void fun(char (*ss)[M],char *substr)
{
int I,find=0;
/**********found**********/
for(i=0;i<___1___;i++)
/**********found**********/
if(strstr(ss[i],___2___)!=NULL)
{ find=1; puts(ss[i]); printf("\n"); }
/**********found**********/
if(find==___3___)
printf("Don't found!\n");
}
main()
{
char x[N][M]={"BASIC","Clangwage","Java","QBASIC","Access"},str[M];
int I;
printf("The original string\n\n");
for(i=0;i<N;i++) puts(x[i]);
printf("\n");
printf("Enter a string for search : ");
gets(str);
fun(x,str);
}
【答案】
(1)N 或 =N-1 (2)substr (3)0
2.程序修改题
给定程序中函数fun的功能是:统计字符串中各元音字母(即:A、E、I、O、U)的个数。注意,字母不分大、小写。
例如:若输入:THIs is a boot,则输出应该是:1、0、2、2、0。
请改正程序中的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
fun(char *s,int num[5])
{
int k,i=5;
for(k=0;k<I;k++)
/**********found**********/
num[i]=0;
for(;*s;s++)
{
i=-1;
/**********found**********/
switch(s)
{ case 'a': case 'A': {i=0; break;}
case 'e': case 'E': {i=1; break;}
case 'I': case 'I': {i=2; break;}
case 'o': case 'O': {i=3; break;}
case 'u': case 'U': {i=4; break;}
}
if(i>=0) num[i]++;
}
}
main()
{
char s1[81];
int num1[5],I;
printf( "Please enter a string: " );
gets(s1);
fun(s1,num1);
for(i=0;i<5;i++) printf("%d",num1[i]);
printf("\n");
【答案】
(1)将num[i]=0; 改为:num[k]=0;
(2)将switch(s) 改为:switch(*s)
}
3.程序设计题
请编写函数fun,其功能是求出二维数组周边元素之和,该和值作为函数值返回。二维数组中的值在主函数中赋予。
例如:二维数组中的值为
1 3 5 7 9
2 9 9 9 4
6 9 9 9 8
1 3 5 7 0
则函数值为61。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
#include <windows.h>
#define M 4
#define N 5
int fun(int a[M][N])
{
}
main()
{
int aa[M][N]={{1,3,5,7,9},{2,9,9,9,4},
{6,9,9,9,8},{1,3,5,7,0}};
int I,j,y;
system("cls");
printf("The original data is : \n");
for(i=0;i<M; i++)
{
for(j=0;j<N;j++)
printf("%6d",aa[i][j]);
printf("\n");
}
y=fun(aa);
printf("The sum: %d\n",y);
printf("\n");
}
【答案】
int fun(int a[M][N])
{
int k,s=0;
for( k=0; k<N; k++ )
s+=a[0][k]+a[M-1][k];
for( k=1; k<M-1; k++ )
s+=a[k][0]+a[k][N-1];
return s;
}
1.程序填空题
程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。函数fun的功能是对形参b所指结构体变量中的数据进行修改,最后在主函数中输出修改后的数据。
例如:b所指变量t中的学号、姓名、和三门课的成绩依次是:10002、“ZhangQi”、93、85、87,修改后输出t中的数据应为:10004、“LiJie”、93、85、87。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <string.h>
struct student
{long sno;
char name[10];
float score[3];
};
void fun(struct student *b)
{
int I;
/**********found**********/
b___1___=10004;
/**********found**********/
strcpy(b___2___,"LiJie");
}
main()
{
struct student t={10002,"ZhangQi",93,85,87};
int I;
printf("The original data :\n");
printf("No: %ld Name: %s\nscores: ",t.sno, t.name);
for(i=0;i<3;i++)
printf("%6.2f ",t.score[i]);
printf("\n");
/**********found**********/
fun(___3___);
printf("The data after modified :\n");
printf("No:%ld Name: %s\nscores: ",t.sno,t.name);
for(i=0;i<3;i++)
printf("%6.2f ",t.score[i]);
printf("\n");
}
【答案】
(1)->sno (2)->name (3)&t
2.程序修改题
给定程序中,函数fun的功能是:读入一个字符串(长度<20),将该字符串中的所有字符按ASCII码升序排序后输出。例如,若输入:edcba,则应输出:abcde。
请改正程序中的错误,使其能统计出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
void fun(char t[])
{
char c;
int I,j;
/**********found***********/
for(i=strlen(t);I;i--)
for(j=0;j<I;j++)
/**********found***********/
if(t[j]<t[j+1])
{c=t[j];t[j]=t[j+1];t[j+1]=c;}
}
main()
{
char s[81];
printf("Enter a character string:");
gets(s);
printf("Before sorting:\n %s ",s);
fun(s);
printf("After sorting decendingly:\n
%s",s);
}
【答案】
(1)将for( i=strlen(t); i; i--) 改为:
for(i=strlen(t)-1;i;i--)
(2)将if(t[j]< t[j + 1]) 改为:
if(t[j]>t[j + 1])
3.程序设计题
请编写函数fun,其功能是:将ss所指字符串中所有下标为奇数位置上的字母转换为大写(若该位置上不是字母,则不转换)。
例如,若输入“abc4EFg”,则应输出“aBc4EFg”。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
#include <string.h>
void fun(char *ss)
{
}
void main(void)
{
char tt[51];
printf("Please enter an character string
within 50 characters:\n");
gets(tt);
printf("After changing,the string\n
%s",tt);
fun(tt);
printf("becomes\n %s",tt);
}
【答案】
void fun(char *ss)
{
int k;
for(k=1;k<strlen(ss);k+=2)
if(ss[k]>='a'&&ss[k]<='z')
ss[k]=ss[k]-'a'+'A';
}
1.程序填空题
程序通过定义学生结构体数组,存储了若干名学生的学号、姓名和3门课的成绩。函数fun的功能是:将存放学生数据的结构体数组按照姓名的字典序(从小到大)排序。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <string.h>
struct student
{ long sno;
char name[10];
float score[3];
};
void fun(struct student a[],int n)
{
/**********found**********/
___1___t;
int I,j;
/**********found**********/
for(I=0;I<___2___;I++)
for(j=I+1;j<n;j++)
/**********found**********/
if(strcmp(___3___)>0)
{t=a[I];a[I]=a[j];a[j]=t;}
}
main()
{
struct student s[4]={
{10001,"ZhangSan", 95, 80, 88},
{10002,"LiSi", 85, 70, 78},
{10003,"CaoKai", 75, 60, 88},
{10004,"FangFang", 90, 82, 87}};
int I,j;
printf("The original data :\n");
for(j=0;j<4;j++)
{
printf("No: %ld Name: %-8s scores: ",s[j].sno,s[j].name);
for(I=0;I<3;I++)
printf("%6.2f ",s[j].score[I]);
printf("\n");
fun(s,4);
printf("The data after sorting :\n");
for(j=0;j<4;j++)
{
printf("No: %ld Name: %-8s scores: ",s[j].sno,s[j].name);
for(I=0;I<3;I++)
printf("%6.2f ",s[j].score[I]);
printf("\n");
}
}
}
【答案】
(1)struct student
(2)n-1 或 =n-2
(3)a[i].name, a[j].name
2.程序修改题
给定程序中,函数fun的功能是:由形参给定n个实数,输出平均值,并统计在平均值以上(含平均值)的实数个数。
例如,n=8时,输入:193.199、195.673、195.757、196.051、196.092、196.596、196.579、196.763,所得平均值为:195.838745,在平均值以上的实数个数应为:5
请改正程序中的错误,使程序能输出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
int fun(float x[], int n)
{
/**********found**********/
int j,c=0, float xa=0.0;
for(j=0;j<n;j++)
xa+=x[j]/n;
printf("ave=%f\n",xa);
for(j=0;j<n;j++)
/**********found**********/
if(x[j]=>xa)
c++;
return c;
}
main()
{
float x[100]={193.199,195.673,195.757,
196.051,196.092,196.596,196.579,196.763};
printf("%d\n",fun(x,8));
}
【答案】
(1)将int j,c=0,float xa=0.0; 改为:
int j,c=0; float xa=0.0;
(2)将if(x[j]=> xa) 改为:if(x[j]>=xa)
3.程序设计题
编写函数fun,其功能是,根据以下公式求P的值,结果由函数值返回。M与n为两个正整数且要求m > n:
P=m!/(n!*(m-n)!)
例如:m=12、n=8时,运行结果为495.000000。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
float fun(int m,int n)
{
}
main()
{
printf("P=%f\n",fun(12,8));
}
【答案】
float fun(int m,int n)
{
float s=1.0;
int k;
for(k=n+1;k<=m;k++)
s*=k;
for(k=1;k<=(m-n);k++)
s/=k;
return s;
}
1.程序填空题
给定程序中,函数fun的功能是将不带头节点的单向链表结点数据域中的数据从小到大排序。即若原链表结点数据域从头至尾的数据为:10、4、2、8、6,排序后链表结点数据域从头至尾的数据为:2、4、6、8、10。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <stdlib.h>
#define N 6
typedef struct node
{ int data;
struct node *next;
}NODE;
void fun(NODE *h)
{
NODE *p,*q; int t;
p=h;
while(p)
{
/**********found**********/
q=___1___;
/**********found**********/
while(___2___)
{
if(p->data>q->data)
{
t=p->data;
p->data=q->data;
q->data=t;
}
q=q->next;
}
/**********found**********/
p=___3___;
}
}
NODE *creatlist(int a[])
{
NODE *h,*p,*q; int I;
h=NULL;
for(i=0;i<N;i++)
{
q=(NODE *)malloc(sizeof(NODE));
q->data=a[i];
q->next=NULL;
if(h==NULL) h=p=q;
else { p->next=q;p=q; }
}
return h;
}
void outlist(NODE *h)
{
NODE *p;
p=h;
if(p==NULL)
printf("The list is NULL!\n");
else
{
printf("\nHead ");
do
{
printf("->%d",p->data);
p=p->next;
}while(p!=NULL);
printf("->End\n");
}
}
main()
{
NODE *head;
int a[N]={0, 10, 4, 2, 8, 6};
head=creatlist(a);
printf("The original list:\n");
outlist(head);
fun(head);
printf("The list after inverting:\n");
outlist(head);
}
【答案】
(1)p->next
(2)q!=NULL或q
(3)p->next
2.程序修改题
给定程序中,函数fun的功能是:在p所指字符串中找出ASCII码值最大的字符,将其放在第一个位置上;并将该字符前的原字符向后顺序移动。
例如,调用fun函数之前给字符串输入:ABCDeFGH,调用后字符串中的内容为:eABCDFGH。
请改正程序中的错误,使其能得出正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <stdio.h>
fun( char *p )
{
char max,*q; int i=0;
max=p[i];
while(p[i]!=0)
{
if(max<p[i])
{ max=p[i];
/**********found**********/
q=p+i
}
i++;
}
/**********found**********/
While(q>p)
{
*q=*(q-1);
q--;
}
p[0]=max;
}
main()
{
char str[80];
printf("Enter a string: ");
gets(str);
printf("\nThe original string:");
puts(str);
fun(str);
printf("\nThe string after moving: ");
puts(str);
printf("\n\n");
}
【答案】
(1)将q=p+i 改为:q=p+i;
(2)将While(q>p) 改为:while(q<p)
3.程序设计题
学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:把指定分数范围内的学生数据放在b所指的数组中,分数范围内的学生人数由函数值返回。
例如,输入的分数是60、69,则应当把分数在60~69之间的学生数据进行输出,包含60分和69分的学生数据。主函数中将把60放在low中,把69放在heigh中。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
#define N 16
typedef struct
{
char num[10];
int s;
}STREC;
int fun(STREC *a,STREC *b,int l,int h)
{
}
main()
{
STREC s[N]={{"GA005",85},{"GA003",76},
{"GA002",69},{"GA004",85},{"GA001",96},
{"GA007",72},{"GA008",64},{"GA006",87},
{"GA015",85},{"GA013",94},{"GA012",64},
{"GA014",91},{"GA011",90},{"GA017",64},
{"GA018",64},{"GA016",72}};
STREC h[N],tt;FILE *out;
int I,j,n,low,heigh,t;
printf("Enter 2 integer number
low&heigh: ");
scanf("%d%d",&low,&heigh);
if( heigh<low )
{t=heigh;heigh=low;low=t;}
n=fun(s,h,low,heigh);
printf("The student's data between
%d--%d :\n",low,heigh);
for(i=0;i<n;i++)
printf("%s %4d\n",h[i].num,h[i].s);
printf("\n");
out=fopen("out34.dat","w") ;
n=fun(s,h,80,98);
fprintf(out,"%d\n",n);
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(h[i].s>h[j].s)
{ tt=h[i];h[i]=h[j]; h[j]=tt; }
for(i=0;i<n;i++)
fprintf(out,"%4d\n",h[i].s);
fprintf(out,"\n");
fclose(out);
}
【答案】
int fun(STREC *a,STREC *b,int l,int h)
{
int k,n=0;
for(k=0;k<N;k++)
if(a[k].s>=l&&a[k].s<=h)
b[n++]=a[k];
return n;
}
1.程序填空题
给定程序中,函数fun的功能是将参数给定的字符串、整数、浮点数写到文本文件中,再用字符串方式从此文本文件中逐个读入,并调用库函数atoi和atof将字符串转换成相应的整数、浮点数,然后将其显示在屏幕上。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <stdlib.h>
void fun(char *s,int a,double f)
{
/**********found**********/
___1___fp;
char str[100],str1[100],str2[100];
int a1; double f1;
fp=fopen("file1.txt","w");
fprintf(fp,"%s %d %f\n",s,a,f);
/**********found**********/
___2___;
fp=fopen("file1.txt","r");
/**********found**********/
fscanf(___3___,"%s%s%s",str,str1,str2);
fclose(fp);
a1=atoi(str1);
f1=atof(str2);
printf("Result:%s %d %f\n",str,a1,f1);
}
main()
{
char a[10]="Hello!";
int b=12345;
double c=98.76;
fun(a,b,c);
}
【答案】
(1)FILE * (2)fclose(fp) (3)fp
2.程序修改题
给定程序中,函数fun的功能是:将s所指字符串中的字母转换为按字母序列的后续字母(但Z转换为A、z转换为a),其他字符不变。
请改正函数fun中指定位置的错误,使其能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <ctype.h>
void fun(char *s)
{
/**********found***********/
while(*s!='@')
{
if(*s>='A'&&*s<='Z'||*s>='a'&&*s<='z')
{
if(*s=='Z') *s='A';
else if(*s=='z') *s='a';
else *s+=1;
}
/**********found***********/
(*s)++;
}
}
main()
{
char s[80];
printf("Enter a string with length<80.:");
gets(s);
printf("The string : \n ");
puts(s);
fun(s);
printf("The Cords :\n ");
puts(s);
}
【答案】
(1)将while(*s!='@') 改为:while(*s!='\0')
(2)将(*s)++; 改为:s++
3.程序设计题
请编写函数fun,函数的功能是:移动一维数组中的内容;若数组中有n个整数,要求把下标从0~ p(含p,p小于等于n-1)的数组元素平移到数组的最后。
例如,一维数组中的原始内容为:1、2、3、4、5、6、7、8、9、10,p的值为3;移动后一维数组中的内容应为:5、6、7、8、9、10、1、2、3、4。
注意:部分源程序已给出。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include <stdio.h>
#define N 80
void fun(int *w,int p,int n)
{
}
main()
{
int a[N]={1,2,3,4,5,6,7,8,9,10,11,
12,13,14,15};
int I,p,n=15;
printf("The original data:\n");
for(i=0;i<n;i++)
printf("%3d",a[i]);
printf("Enter p: "); scanf("%d",&p);
fun(a,p,n);
printf("The data after moving:\n");
for(i=0;i<n;i++) printf("%3d",a[i]);
printf("\n\n");
}
【答案】
void fun(int *w,int p,int n)
{
int j,k,t=0;
for(j=0;j<=p;j++)
{
t=w[0];
for(k=1;k<n;k++)
w[k-1]=w[k];
w[n-1]=t;
}
}