文档库 最新最全的文档下载
当前位置:文档库 › 全国计算机二级C语言上机考试题库(可直接打印)

全国计算机二级C语言上机考试题库(可直接打印)

全国计算机二级C语言上机考试题库(可直接打印)
全国计算机二级C语言上机考试题库(可直接打印)

2012年9月全国计算机考试上机题库100套

第01套:

给定程序中,函数fun的功能是:将形参n所指变量中,各位上为偶数的数去除,剩余的数按原来从高位到低位的顺序组成一个新的数,并通过形参指针n传回所指变量。

例如,输入一个数:27638496,新的数:为739。请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

void fun(unsigned long *n)

{ unsigned long x=0, i; int t;

i=1;

while(*n)

{ t=*n % __1__;

if(t%2!= __2__)

{ x=x+t*i; i=i*10; }

*n =*n /10;

}

*n=__3__;

}

main()

{ unsigned long n=-1;

while(n>99999999||n<0)

{ printf("Please input(0

printf("\nThe result is: %ld\n",n);

}

解题思路:

第一处:t是通过取模的方式来得到*n的个位数字,所以应填:10。

第二处:判断是否是奇数,所以应填:0。

第三处:最后通形参n来返回新数x,所以应填:x。

给定程序MODI1.C中函数fun 的功能是:计算n!。

例如,给n输入5,则输出120.000000。

请改正程序中的错误,使程序能输出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

double fun ( int n )

{ double result = 1.0 ;

if n = = 0

return 1.0 ;

while( n >1 && n < 170 )

result *= n--

return result ;

}

main ( )

{ int n ;

printf("Input N:") ;

scanf("%d", &n) ;

printf("\n\n%d! =%lf\n\n", n, fun(n)) ;

}

解题思路:

第一处:条件语句书写格式错误,应改为:if (n==0)。

第二处:语句后缺少分号。

*************************************************** 请编写一个函数fun,它的功能是:将一个数字字符串转换为一个整数(不得调用C语言提供的将字符串转换为整数的函数)。例如,若输入字符串"-1234",则函数把它转换为整数值-1234。函数fun中给出的语句仅供参考。

注意: 部分源程序存在文件PROG1.C文件中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

给定源程序:

#include

#include

long fun ( char *p)

{int i, len, t; /* len为串长,t为正负标识*/

long x=0;

len=strlen(p);

if(p[0]=='-')

{ t=-1; len--; p++; }

else t=1;

/* 以下完成数字字符串转换为一个数字*/

return x*t;

}

main() /* 主函数*/

{ char s[6];

long n;

printf("Enter a string:\n") ;

gets(s);

n = fun(s);

printf("%ld\n",n);

NONO ( );

}

NONO ( )

{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。*/

FILE *fp, *wf ;

int i ;

char s[20] ;

long n ;

fp = fopen("c:\\test\\in.dat","r") ;

wf = fopen("c:\\test\\out.dat","w") ;

for(i = 0 ; i < 10 ; i++) {

fscanf(fp, "%s", s) ;

n = fun(s);

fprintf(wf, "%ld\n", n) ;

}

fclose(fp) ;

fclose(wf) ;

}

解题思路:本题是将一个数字字符串转换为一个整数。

参考答案:

#include

#include

long fun ( char *p)

{

int i, len, t; /* len为串长,t为正负标识*/

long x=0;

len=strlen(p);

if(p[0]=='-')

{ t=-1; len--; p++; }

else t=1;

/* 以下完成数字字符串转换为一个数字*/

while(*p) x = x*10-48+(*p++);

return x*t;

}

main() /* 主函数*/

{ char s[6];

long n;

printf("Enter a string:\n") ;

gets(s);

n = fun(s);

printf("%ld\n",n);

NONO ( );

}

NONO ( )

{/* 本函数用于打开文件,输入数据,调用函数,输出数据,

关闭文件。*/

FILE *fp, *wf ;

int i ;

char s[20] ;

long n ;

fp = fopen("c:\\test\\in.dat","r") ;

wf = fopen("c:\\test\\out.dat","w") ;

for(i = 0 ; i < 10 ; i++) {

fscanf(fp, "%s", s) ;

n = fun(s);

fprintf(wf, "%ld\n", n) ;

}

fclose(fp) ;

fclose(wf) ;

}

注意:由于NONO( )这个函数是改卷人用的,与考生没有什

么关系,故下面从第2套试题开始均省略NONO( )

※※※※※※※※※※※※※※※※※※※※※※※※※

第02套:

给定程序中,函数fun的功能是将形参给定的字符串、整数、

浮点数写到文本文件中,再用字符方式从此文本文件中逐

个读入并显示在终端屏幕上。请在程序的下划线处填入正

确的内容并把下划线删除, 使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

void fun(char *s, int a, double f)

{

__1__ fp;

char ch;

fp = fopen("file1.txt", "w");

fprintf(fp, "%s %d %f\n", s, a, f);

fclose(fp);

fp = fopen("file1.txt", "r");

printf("\nThe result :\n\n");

ch = fgetc(fp);

while (!feof(__2__)) {

putchar(__3__); ch = fgetc(fp); }

putchar('\n');

fclose(fp);

}

main()

{ char a[10]="Hello!"; int b=12345;

double c= 98.76;

fun(a,b,c);

}

解题思路:

本题是考察先把给定的数据写入到文本文件中,再从该文件

读出并显示在屏幕上。

第一处:定义文本文件类型变量,所以应填:FILE *。

第二处:判断文件是否结束,所以应填:fp。

第三处:显示读出的字符,所以应填:ch。

***************************************************

给定程序MODI1.C中函数fun的功能是: 依次取出字符串中

所有数字字符, 形成新的字符串, 并取代原字符串。

请改正函数fun中指定部位的错误, 使它能得出正确的结果。

注意: 不要改动main函数, 不得增行或删行, 也不得更改程

序的结构!

给定源程序:

#include

void fun(char *s)

{ int i,j;

for(i=0,j=0; s[i]!='\0'; i++)

if(s[i]>='0' && s[i]<='9')

s[j]=s[i];

s[j]="\0";

}

main()

{ char item[80];

printf("\nEnter a string : ");gets(item);

printf("\n\nThe string is : \"%s\"\n",item);

fun(item);

printf("\n\nThe string of changing is : \"%s\"\n",item );

}

解题思路:

第一处: 要求是取出原字符串中所有数字字符组成一个新的

字符串,程序中是使用变量j

来控制新字符串的位置,所以应改为:s[j++]=s[i];。

第二处: 置新字符串的结束符,所以应改为:s[j]='\0';.

***************************************************

请编写函数fun, 函数的功能是: 将M行N列的二维数组中的

字符数据, 按列的

顺序依次放到一个字符串中。

例如, 二维数组中的数据为:

W W W W

S S S S

H H H H

则字符串中的内容应是: WSHWSHWSH。

注意:部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容, 仅在函数

fun的花括号中填入

你编写的若干语句。

给定源程序:

#include

#define M 3

#define N 4

void fun(char s[][N], char *b)

{

int i,j,n=0;

for(i=0; i < N;i++) /* 请填写相应语句完成其功能*/

{

}

b[n]='\0';

}

main()

{ char

a[100],w[M][N]={{'W','W','W','W'},{'S','S','S','S'},{'H','H','H','H'

}};

int i,j;

printf("The matrix:\n");

for(i=0; i

{ for(j=0;j

printf("\n");

}

fun(w,a);

printf("The A string:\n");puts(a);

printf("\n\n");

NONO();

}

解题思路:

本题是把二维数组中的字符数据按列存放到一个字符串中。

1. 计算存放到一维数组中的位置。

2. 取出二维数组中的字符存放到一维数组(已计算出的位

置)中。

参考答案:

void fun(char s[][N], char *b)

{

int i,j,n=0;

for(i=0; i < N;i++) /* 请填写相应语句完成其功能*/

{

for(j = 0 ; j < M ; j++) {

b[n] = s[j][i] ;

n = i * M + j + 1;

}

}

b[n]='\0';

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第03套:

程序通过定义学生结构体变量,存储了学生的学号、姓名和

3门课的成绩。所有学生数据均以二进制方式输出到文件中。

函数fun的功能是重写形参filename所指文件中最后一个学

生的数据,即用新的学生数据覆盖该学生原来的数据,其它学

生的数据不变。

请在程序的下划线处填入正确的内容并把下划线删除, 使程

序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#define N 5

typedef struct student {

long sno;

char name[10];

float score[3];

} STU;

void fun(char *filename, STU n)

{ FILE *fp;

fp = fopen(__1__, "rb+");

fseek(__2__, -1L*sizeof(STU), SEEK_END);

fwrite(&n, sizeof(STU), 1, __3__);

fclose(fp);

}

main()

{ STU t[N]={ {10001,"MaChao", 91, 92, 77}, {10002,"CaoKai",

75, 60, 88},

{10003,"LiSi", 85, 70, 78}, {10004,"FangFang", 90, 82, 87},

{10005,"ZhangSan", 95, 80, 88}};

STU n={10006,"ZhaoSi", 55, 70, 68}, ss[N];

int i,j; FILE *fp;

fp = fopen("student.dat", "wb");

fwrite(t, sizeof(STU), N, fp);

fclose(fp);

fp = fopen("student.dat", "rb");

fread(ss, sizeof(STU), N, fp);

fclose(fp);

printf("\nThe original data :\n\n");

for (j=0; j

{ printf("\nNo: %ld Name: %-8s Scores: ",ss[j].sno, ss[j].name);

for (i=0; i<3; i++) printf("%6.2f ", ss[j].score[i]);

printf("\n");

}

fun("student.dat", n);

printf("\nThe data after modifing :\n\n");

fp = fopen("student.dat", "rb");

fread(ss, sizeof(STU), N, fp);

fclose(fp);

for (j=0; j

{ printf("\nNo: %ld Name: %-8s Scores: ",ss[j].sno, ss[j].name); for (i=0; i<3; i++) printf("%6.2f ", ss[j].score[i]);

printf("\n");

}

}

解题思路:

本题是考察如何从文件中读出数据,再把结构中的数据写入文件中。

第一处:从指定的文件中读出数据,所以应填:filename。第二处:读取文件fp的最后一条记录,所以应填:fp。

第三处:再把读出的记录,写入文件fp指定的位置上,所以应填:fp。

*************************************************** 给定程序MODI1.C中的函数Creatlink的功能是创建带头结点的单向链表, 并为各结点数据域赋0到m-1的值。

请改正函数Creatlink中指定部位的错误, 使它能得出正确的结果。

注意: 不要改动main函数, 不得增行或删行, 也不得更改程序的结构!

给定源程序:

#include

#include

typedef struct aa

{ int data;

struct aa *next;

} NODE;

NODE *Creatlink(int n, int m)

{ NODE *h=NULL, *p, *s;

int i;

p=(NODE )malloc(sizeof(NODE));

h=p;

p->next=NULL;

for(i=1; i<=n; i++)

{ s=(NODE *)malloc(sizeof(NODE));

s->data=rand()%m; s->next=p->next;

p->next=s; p=p->next;

}

return p;

}

outlink(NODE *h)

{ NODE *p;

p=h->next;

printf("\n\nTHE LIST :\n\n HEAD ");

while(p)

{ printf("->%d ",p->data);

p=p->next;

}

printf("\n");

}

main()

{ NODE *head;

head=Creatlink(8,22);

outlink(head);

}

解题思路:

第一处: 指向刚分配的结构指针,所以应改为:p=(NODE *)malloc(sizeof(NODE));

第二处: 在动态分配内存的下一行语句是,使用临时结构指针变量h保存p指针的初始位置,最后返回不能使用p,是因为p的位置已经发生了变化,所以应改为返回h。

*************************************************** 请编写函数fun, 函数的功能是:统计一行字符串中单词的个数,作为函数值返回。一行字符串在主函数中输入, 规定所有单词由小写字母组成,单词之间由若干个空格隔开, 一行的开始没有空格。

注意:部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容, 仅在函数fun的花括号中填入你编写的若干语句。

给定源程序:

#include

#include

#define N 80

int fun( char *s)

{

}

main()

{ char line[N]; int num=0;

printf("Enter a string :\n"); gets(line);

num=fun( line );

printf("The number of word is : %d\n\n",num);

NONO();

}

解题思路:

本题是统计字符串中的单词数。

1. 利用while循环语句和指针变量,当字符为空格时,则单词数k加1。

2. 循环结束返回k。

参考答案:

int fun( char *s)

{

int k = 1 ;

while(*s) {

if(*s == ' ') k++ ;

s++ ;

}

return k ;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第04套:

程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。所有学生数据均以二进制方式输出到文件中。函数fun的功能是从形参filename所指的文件中读入学生数据,并按照学号从小到大排序后,再用二进制方式把排序后的学生数据输出到filename所指的文件中,覆盖原来的文件内容。

请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#define N 5

typedef struct student {

long sno;

char name[10];

float score[3];

} STU;

void fun(char *filename)

{ FILE *fp; int i, j;

STU s[N], t;

fp = fopen(filename, __1__);

fread(s, sizeof(STU), N, fp);

fclose(fp);

for (i=0; i

for (j=i+1; j

if (s[i].sno __2__ s[j].sno)

{ t = s[i]; s[i] = s[j]; s[j] = t; }

fp = fopen(filename, "wb");

__3__(s, sizeof(STU), N, fp); /* 二进制输出*/

fclose(fp);

}

main()

{ STU t[N]={ {10005,"ZhangSan", 95, 80, 88}, {10003,"LiSi",

85, 70, 78},

{10002,"CaoKai", 75, 60, 88}, {10004,"FangFang", 90, 82, 87},

{10001,"MaChao", 91, 92, 77}}, ss[N];

int i,j; FILE *fp;

fp = fopen("student.dat", "wb");

fwrite(t, sizeof(STU), 5, fp);

fclose(fp);

printf("\n\nThe original data :\n\n");

for (j=0; j

{ printf("\nNo: %ld Name: %-8s Scores: ",t[j].sno, t[j].name);

for (i=0; i<3; i++) printf("%6.2f ", t[j].score[i]);

printf("\n");

}

fun("student.dat");

printf("\n\nThe data after sorting :\n\n");

fp = fopen("student.dat", "rb");

fread(ss, sizeof(STU), 5, fp);

fclose(fp);

for (j=0; j

{ printf("\nNo: %ld Name: %-8s Scores: ",ss[j].sno, ss[j].name);

for (i=0; i<3; i++) printf("%6.2f ", ss[j].score[i]);

printf("\n");

}

}

解题思路:

本题是考察把结构中的数据写入文件。

第一处:建立文件的类型,考虑到是把结构中的数据(结构

中的数据包含不打印的字符)

从文件中读出,所以应填:"rb"。

第二处:判断当前学号是否大于刚读出的学号进行相比,如

果大于,则进行交换,所以应填:>。

第三处:把已排序的结构数据,重新写入文件,所以应填:

fwrite。

***************************************************

给定程序MODI1.C中函数fun的功能是: 在字符串的最前端

加入n个*号, 形成新串, 并且覆盖原串。

注意: 字符串的长度最长允许为79。

请改正函数fun中指定部位的错误, 使它能得出正确的结果。

注意: 不要改动main函数, 不得增行或删行, 也不得更改程

序的结构!

给定源程序:

#include

#include

void fun ( char s[], int n )

{

char a[80] , *p;

int i;

s=p;

for(i=0; i

do

{ a[i]=*p;

i++;

}

while(*p++)

a[i]=0;

strcpy(s,a);

}

main()

{ int n; char s[80];

printf("\nEnter a string : "); gets(s);

printf("\nThe string \"%s\"\n",s);

printf("\nEnter n ( number of * ) : "); scanf("%d",&n);

fun(s,n);

printf("\nThe string after insert : \"%s\" \n" ,s);

}

解题思路:

第一处: 指针p应指向s,所以应改为:p=s;。

第二处: 死循环,当do while循环执行一次,临时变量p应该

指向字符串的下一位置,所以应改为:while(*p++);。

***************************************************

请编写函数fun,函数的功能是:统计各年龄段的人数。N个年

龄通过调用随机

函数获得,并放在主函数的age数组中;要求函数把0至9岁年

龄段的人数放在d[0]

中,把10至19岁年龄段的人数放在d[1]中,把20至29岁年龄段

的人数放在d[2]中,

其余依此类推, 把100岁(含100)以上年龄的人数都放在d[10]

中。结果在主函数中输出。

注意:部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun

的花括号中填入你编写的若干语句。

给定源程序:

#include

#define N 50

#define M 11

void fun( int *a, int *b)

{

}

double rnd()

{ static t=29,c=217,m=1024,r=0;

r=(r*t+c)%m; return((double)r/m);

}

main()

{ int age[N], i, d[M];

for(i=0; i

printf("The original data :\n");

for(i=0;i

printf("\n\n");

fun( age, d);

for(i=0;i<10;i++)printf("%4d---%4d : %4d\n",i*10,i*10+9,d[i]);

printf(" Over 100 : %4d\n",d[10]);

NONO(d);

}

解题思路:

本题是统计各年龄段的人数。

1. 初始化各年龄段人数为0。

2. 使用for循环以及求出各年龄的十位数字作为存放人数的

地址,如果大于值大于10,则

存入d[10]中(大于110岁的人)。

参考答案:

void fun( int *a, int *b)

{

int i, j ;

for(i = 0 ; i < M ; i++) b[i] = 0 ;

for(i = 0 ; i < N ; i++) {

j = a[i] / 10 ;

if(j > 10) b[M - 1]++ ; else b[j]++ ;

}

}

double rnd()

{ static t=29,c=217,m=1024,r=0;

r=(r*t+c)%m; return((double)r/m);

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第05套:

给定程序中,函数fun的功能是将参数给定的字符串、整数、

浮点数写到文本

文件中,再用字符串方式从此文本文件中逐个读入,并调用

库函数atoi和atof将

字符串转换成相应的整数、浮点数,然后将其显示在屏幕上。

请在程序的下划线处填入正确的内容并把下划线删除, 使程

序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

void fun(char *s, int a, double f)

{

__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);

__2__ ;

fp = fopen("file1.txt", "r");

fscanf(__3__,"%s%s%s", str, str1, str2);

fclose(fp);

a1 = atoi(str1);

f1 = atof(str2);

printf("\nThe result :\n\n%s %d %f\n", str, a1, f1);

}

main()

{ char a[10]="Hello!"; int b=12345;

double c= 98.76;

fun(a,b,c);

}

解题思路:

本题是考察先把给定的数据写入到文本文件中,再从该文件

读出并转换成相应的整数、浮点数显示在屏幕上。

第一处:定义文本文件类型变量,所以应填:FILE *。

第二处:关闭刚写入的文件,所以应填:fclose(fp)。

第三处:从文件中读出数据,所以应填:fp。

***************************************************

给定程序MODI1.C中函数fun的功能是: 对N名学生的学习成

绩,按从高到低的顺序找出前m(m≤10)名学生来, 并将这些

学生数据存放在一个动态分配的连续存储区中, 此存储区的

首地址作为函数值返回。

请改正函数fun中指定部位的错误, 使它能得出正确的结果。

注意: 不要改动main函数, 不得增行或删行, 也不得更改程

序的结构!

给定源程序:

#include

#include

#include

#define N 10

typedef struct ss

{ char num[10];

int s;

} STU;

STU *fun(STU a[], int m)

{ STU b[N], *t;

int i,j,k;

t=(STU *)calloc(sizeof(STU),m)

for(i=0; i

for(k=0; k

{ for(i=j=0; i

if(b[i].s > b[j].s) j=i;

t(k)=b(j);

b[j].s=0;

}

return t;

}

outresult(STU a[], FILE *pf)

{ int i;

for(i=0; i

fprintf(pf,"No = %s Mark = %d\n", a[i].num,a[i].s);

fprintf(pf,"\n\n");

}

main()

{ STU a[N]={ {"A01",81},{"A02",89},{"A03",66},{"A04",87},{"A05 ",77},

{"A06",90},{"A07",79},{"A08",61},{"A09",80},{"A10",71} }; STU *pOrder;

int i, m;

printf("***** The Original data *****\n");

outresult(a, stdout);

printf("\nGive the number of the students who have better score: ");

scanf("%d",&m);

while( m>10 )

{ printf("\nGive the number of the students who have better score: ");

scanf("%d",&m);

}

pOrder=fun(a,m);

printf("***** THE RESULT *****\n");

printf("The top :\n");

for(i=0; i

printf(" %s %d\n",pOrder[i].num , pOrder[i].s);

free(pOrder);

}

解题思路:

第一处: 语句最后缺少分号。

第二处: 应该使用方括号,而不是圆括号。

像此类,使用编译,即可发现。

*************************************************** 请编写函数fun, 函数的功能是: 删去一维数组中所有相同的数, 使之只剩一个。数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。

例如, 一维数组中的数据是: 2 2 2 3 4 4 5 6 6 6 6 7 7 8 9 9 10 10 10。

删除后,数组中的内容应该是: 2 3 4 5 6 7 8 9 10。

注意:部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容, 仅在函数fun的花括号中填入你编写的若干语句。

给定源程序:

#include

#define N 80

int fun(int a[], int n)

{

}

main()

{ int a[N]={2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10},i,n=20; printf("The original data :\n");

for(i=0; i

n=fun(a,n);

printf("\n\nThe data after deleted :\n");

for(i=0;i

NONO();

}

解题思路:

本题是删除已排序过数组中的相同数。

1. 取出数组中的第1个数存放在临时变量k中,再利用for循环来依次判断所有的数。

2. 如果取出的数和k相比,如果不相同,则仍存放在原数组中,其中存放的位置由j来控制,接着把这个数重新存入k。如果相同,则取下一数。

参考答案:

int fun(int a[], int n)

{

int i, j = 1, k = a[0] ;

for(i = 1 ; i < n ; i++)

if(k != a[i]) {

a[j++]=a[i] ;

k = a[i] ;

}

a[j] = 0 ;

return j ;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第06套:

给定程序中,函数fun的功能是根据形参i的值返回某个函数的值。当调用正确时, 程序输出:

x1=5.000000, x2=3.000000, x1*x1+x1*x2=40.000000

请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

double f1(double x)

{ return x*x; }

double f2(double x, double y)

{ return x*y; }

__1__ fun(int i, double x, double y)

{ if (i==1)

return __2__(x);

else

return __3__(x, y);

}

main()

{ double x1=5, x2=3, r;

r = fun(1, x1, x2);

r += fun(2, x1, x2);

printf("\nx1=%f, x2=%f, x1*x1+x1*x2=%f\n\n",x1, x2, r);

} 解题思路:

本题是根据给定的公式来计算函数的值。

第一处:程序中使用双精度double类型进行计算,所以函数

的返回值类型也为double,所以应填:double。

第二处:当i等于1时,则返回f1函数的值,所以应填:f1。

第三处:如果i不等于1,则返回f2函数的值,所以应填:f2。

***************************************************

给定程序MODI1.C中函数fun的功能是: 比较两个字符串,将

长的那个字符串的首地址作为函数值返回。

请改正函数fun中指定部位的错误, 使它能得出正确的结果。

注意: 不要改动main函数, 不得增行或删行, 也不得更改程

序的结构!

给定源程序:

#include

char fun(char *s, char *t)

{ int sl=0,tl=0; char *ss, *tt;

ss=s; tt=t;

while(*ss)

{ sl++;

(*ss)++;

}

while(*tt)

{ tl++;

(*tt)++;

}

if(tl>sl) return t;

else return s;

}

main()

{ char a[80],b[80],*p,*q; int i;

printf("\nEnter a string : "); gets(a);

printf("\nEnter a string again : "); gets(b);

printf("\nThe longer is :\n\n\"%s\"\n",fun(a,b));

}

解题思路:

第一处: 试题要求返回字符串的首地址,所以应改为:char

*fun(char *s,char *t)

第二处: 取字符串指针ss的下一个位置,所以应改为:ss++;。

第三处:取字符串指针tt的下一个位置,所以应改为:tt++;。

***************************************************

请编写函数fun,函数的功能是: 移动字符串中的内容,移动的

规则如下: 把第1到第m个字符, 平移到字符串的最后, 把第

m+1到最后的字符移到字符串的前部。

例如, 字符串中原有的内容为: ABCDEFGHIJK, m的值为3,

则移动后, 字符串中的内容应该是: DEFGHIJKABC。

注意:部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容, 仅在函数

fun的花括号中填入你编写的若干语句。

给定源程序:

#include

#include

#define N 80

void fun1(char *w) /* 本函数的功能是将字符串中字符循环

左移一个位置*/

{

int i; char t;

t=w[0];

for(i=0;i

w[i]=w[i+1];

w[strlen(w)-1]=t;

}

void fun(char *w, int m) /* 可调用fun1函数左移字符*/

{

}

main()

{ char a[N]= "ABCDEFGHIJK";

int m;

printf("The original string:\n");puts(a);

printf("\n\nEnter m: ");scanf("%d",&m);

fun(a,m);

printf("\nThe string after moving:\n");puts(a);

printf("\n\n");

NONO();

}

解题思路:

本题是考察字符串的操作。

1. 由于函数fun1是将字符串中字符循环左移一个位置,并通

过实参w返回循环左移一个位置的字符串。

2. 利用循环for语句来操作多少个字符(m)需要循环左移。

参考答案:

void fun1(char *w) /* 本函数的功能是将字符串中字符循环

左移一个位置*/

{

int i; char t;

t=w[0];

for(i=0;i

w[i]=w[i+1];

w[strlen(w)-1]=t;

}

void fun(char *w, int m) /* 可调用fun1函数左移字符*/

{

int i;

for(i = 0 ; i < m ; i++) fun1(w);

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第07套:

程序通过定义并赋初值的方式,利用结构体变量存储了一名

学生的信息。函数fun的功能是输出这位学生的信息。

请在程序的下划线处填入正确的内容并把下划线删除,使程

序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

typedef struct

{ int num;

char name[9];

char sex;

struct { int year,month,day ;} birthday;

float score[3];

}STU;

void show(STU ___1___)

{ int i;

printf("\n%d %s %c %d-%d-%d", tt.num, https://www.wendangku.net/doc/5e4503253.html,, tt.sex,

tt.birthday.year, tt.birthday.month, tt.birthday.day);

for(i=0; i<3; i++)

printf("%5.1f", ___2___);

printf("\n");

}

main( )

{ STU std={ 1,"Zhanghua",'M',1961,10,8,76.5,78.0,82.0 };

printf("\nA student data:\n");

show(___3___);

}

解题思路:

本题是利用结构体变量存储了一名学生的信息。

第一处:tt变量在函数体fun已经使用,所以应填:tt。

第二处:利用循环分别输出学生的成绩数据,所以应填:

tt.score[i]。

第三处:函数的调用,所以应填:std。

***************************************************

给定程序MODI1.C中函数fun 的功能是:求出数组中最大数

和次最大数,并把最大数和a[0]中的数对调、次最大数和a[1]

中的数对调。请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main 函数,不得增行或删行,也不得更改

程序的结构!

给定源程序:

#include

#define N 20

int fun ( int * a, int n )

{ int i, m, t, k ;

for(i=0;i<2;i++) {

m=0;

for(k=i+1;k

if(a[k]>a[m]) k=m;

t=a[i];a[i]=a[m];a[m]=t;

}

}

main( )

{ int x, b[N]={11,5,12,0,3,6,9,7,10,8}, n=10, i;

for ( i=0; i

printf("\n");

fun ( b, n );

for ( i=0; i

printf("\n");

}

解题思路:

第一处:外循环每循环一次,把当前位置i赋值给m,所以应

改为:m=i;。

第二处:通过内循环来找出最大的一个数的位置k,所以应

改为:if(a[k]>a[m]) m=k;。

***************************************************

请编写一个函数unsigned fun ( unsigned w ),w 是一个大于

10的无符号整数,若w 是n (n ≥2)位的整数,函数求出

w的低n-1位的数作为函数值返回。

例如:w 值为5923,则函数返回923;w 值为923 则函

数返回23。

注意: 部分源程序存在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun

的花括号中填入你编写的若干语句。

给定源程序:

#include

unsigned fun ( unsigned w )

{

}

main( )

{ unsigned x;

printf ( "Enter a unsigned integer number : " ); scanf ( "%u",

&x );

printf ( "The original data is : %u\n", x );

if ( x < 10 ) printf ("Data error !");

else printf ( "The result : %u\n", fun ( x ) );

NONO( );

}

解题思路:

本题是考察考生怎样获取一个符合要求的无符号整数。本题

是应用if条件语句首先判断给出的数是几位数,再模相应的

值,最后得出的余数就是结果。

参考答案:

unsigned fun ( unsigned w )

{

if(w>10000) w %= 10000 ;

else if(w>1000) w %= 1000 ;

else if(w>100) w %= 100 ;

else if(w>10) w %=10 ;

return w ;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第08套:

给定程序通过定义并赋初值的方式,利用结构体变量存储了

一名学生的学号、姓名和3门课的成绩。函数fun的功能是将

该学生的各科成绩都乘以一个系数a。请在程序的下划线处填

入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

typedef struct

{ int num;

char name[9];

float score[3];

}STU;

void show(STU tt)

{ int i;

printf("%d %s : ",tt.num,https://www.wendangku.net/doc/5e4503253.html,);

for(i=0; i<3; i++)

printf("%5.1f",tt.score[i]);

printf("\n");

}

void modify(___1___ *ss,float a)

{ int i;

for(i=0; i<3; i++)

ss->___2___ *=a;

}

main( )

{ STU std={ 1,"Zhanghua",76.5,78.0,82.0 };

float a;

printf("\nThe original number and name and scores :\n"); show(std);

printf("\nInput a number : "); scanf("%f",&a);

modify(___3___,a);

printf("\nA result of modifying :\n");

show(std);

}

解题思路:

本题是利用结构体存储学生记录并由实参ss返回。

第一处:实参ss是一个结构型指针变量,所以应填:STU。第二处:该学生的各科成绩都乘以一个系数a,所以应填:score[i]。

第三处:函数的调用,由于函数定义时使用的指针结构型变量,所以应填:&std。

*************************************************** 给定程序MODI1.C中函数fun的功能是:求k!(k<13),所求阶乘的值作为函数值返回。例如:若k = 10,则应输出:3628800。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main 函数,不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

long fun ( int k)

{

if k > 0

return (k*fun(k-1));

else if ( k=0 )

return 1L;

}

main()

{ int k = 10 ;

printf("%d!=%ld\n", k, fun ( k )) ;

}

解题思路:

第一处:条件判断缺少圆括号。

第二处:判断相等的符号是==。

*************************************************** 程序定义了N×N的二维数组,并在主函数中自动赋值。请编写函数fun(int a[][N], int n),函数的功能是:使数组左下三角元素中的值乘以n 。

例如:若n的值为3,a 数组中的值为| 1 9 7 | | 3 9 7 |

a = | 2 3 8 | 则返回主程序后a数组中的值应为| 6 9 8 |

| 4 5 6 | | 12 15 18|

注意: 部分源程序存在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun 的花括号中填入你编写的若干语句。

给定源程序:

#include

#include

#define N 5

int fun ( int a[][N], int n )

{

}

main ( )

{ int a[N][N], n, i, j;

printf("***** The array *****\n");

for ( i =0; i

{ for ( j =0; j

{ a[i][j] = rand()%10; printf( "%4d", a[i][j] ); }

printf("\n");

}

do n = rand()%10 ; while ( n >=3 );

printf("n = %4d\n",n);

fun ( a, n );

printf ("***** THE RESULT *****\n");

for ( i =0; i

{ for ( j =0; j

printf("\n");

}

NONO( );

}

解题思路:

本题是利用两重循环给二维数组左下三角元素中的值乘以n。

参考答案:

int fun ( int a[][N], int n )

{

int i, j;

for(i = 0 ; i < N ; i++)

for(j = 0 ; j <= i; j++)

a[i][j] *= n ;

}

※※※※※※※※※※※※※※※※※※※※※※※※※第09套:

给定程序中,函数fun的功能是将不带头节点的单向链表结点数据域中的数据从小到大排序。即若原链表结点数据域从头至尾的数据为:10、4、2、8、6,排序后链表结点数据域从头至尾的数据为:2、4、6、8、10。

请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

#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) {

q = __1__ ;

while (__2__)

{ if (p->data > q->data)

{ t = p->data; p->data = q->data; q->data = t; }

q = q->next;

}

p = __3__ ;

}

}

NODE *creatlist(int a[])

{ NODE *h,*p,*q; int i;

h=NULL;

for(i=0; 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("\nThe original list:\n");

outlist(head);

fun(head);

printf("\nThe list after inverting :\n");

outlist(head);

}

解题思路:

本题是考察使用链表方法,使用两重while循环语句,对链表

的结点数据进行升序排列。

第一处:由于外循环变量使用p指针,内循环变量使用q指针,

所以q指向必须指向p的next

指针,因此应填写:p.next。

第二处:判断内循环q指针是否结束,所以应填:q。

第三处:外循环控制变量p指向自己的next指针,所以应填:

p.next。

***************************************************

给定程序MODI1.C中函数fun的功能是: 将s所指字符串中的

字母转换为按字母

序列的后续字母(但Z转换为A, z转换为a),其它字符不变。

请改正函数fun中指定部位的错误, 使它能得出正确的结果。

注意: 不要改动main函数, 不得增行或删行, 也不得更改程

序的结构!

给定源程序:

#include

#include

void fun (char *s)

{

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;

}

(*s)++;

}

}

main()

{ char s[80];

printf("\n Enter a string with length < 80. :\n\n "); gets(s);

printf("\n The string : \n\n "); puts(s);

fun ( s );

printf ("\n\n The Cords :\n\n "); puts(s);

}

解题思路:

第一处: 使用while循环来判断字符串指针s是否结束,所以应

改为:while(*s)。

第二处: 取字符串指针s的下一个位置,所以应改为:s++;。

***************************************************

请编写函数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。

注意:部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun

的花括号中填入你编写的若干语句。

给定源程序:

#include

#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

printf("\n\nEnter p: ");scanf("%d",&p);

fun(a,p,n);

printf("\nThe data after moving:\n");

for(i=0; i

printf("\n\n");

NONO();

}

解题思路:

本题是考察一维数组的操作。

1. 定义一维数组中间变量b,把n值后面数组中的内容存入b

中。

2. 再把m前的数组中的内容存入b中。

3. 最后把数组b的内容依次存放到w中。

参考答案:

void fun(int *w, int p, int n)

{

int i, j = 0, b[N] ;

for(i = p + 1 ; i < n ; i++) b[j++] = w[i] ;

for(i = 0 ; i <= p ; i++) b[j++] = w[i] ;

for(i = 0 ; i < n ; i++) w[i]= b[i] ;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第10套:

给定程序中,函数fun的功能是:判定形参a所指的N×N(规

定N为奇数)的矩阵是否是"幻方",若是,函数返回值为1;

不是,函数返回值为0。"幻方"的判定条件是:矩阵每行、每

列、主对角线及反对角线上元素之和都相等。

例如,以下3×3的矩阵就是一个"幻方":

4 9 2

3 5 7

8 1 6

请在程序的下划线处填入正确的内容并把下划线删除, 使程

序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#define N 3

int fun(int (*a)[N])

{ int i,j,m1,m2,row,colum;

m1=m2=0;

for(i=0; i

{ j=N-i-1; m1+=a[i][i]; m2+=a[i][j]; }

if(m1!=m2) return 0;

for(i=0; i

row=colum= __1__;

for(j=0; j

{ row+=a[i][j]; colum+=a[j][i]; }

if( (row!=colum) __2__ (row!=m1) ) return 0;

}

return __3__;

}

main()

{ int x[N][N],i,j;

printf("Enter number for array:\n");

for(i=0; i

for(j=0; j

printf("Array:\n");

for(i=0; i

{ for(j=0; j

printf("\n");

}

if(fun(x)) printf("The Array is a magic square.\n");

else printf("The Array isn't a magic square.\n");

}

解题思路:

第一处:行列变量row和colum的值初始化为0。

第二处:两个条件只要有一个不满足就返回0,所以应填:||。

第三处:如果矩阵是“幻方”,则返回1。

***************************************************

给定程序MODI1.C中fun函数的功能是: 根据整型形参m,计

算如下公式的值。

1 1 1

t = 1 - ----- - ----- - …… - -----

2 3 m

例如,若主函数中输入5,则应输出-0.283333。

请改正函数fun中的错误或在横线处填上适当的内容并把横

线删除, 使它能计算出正确的结果。

注意:不要改动main 函数,不得增行或删行,也不得更改

程序的结构!

给定源程序:

#include

double fun( int m )

{

double t = 1.0;

int i;

for( i = 2; i <= m; i++ )

t = 1.0-1 /i;

_______;

}

main()

{

int m ;

printf( "\nPlease enter 1 integer numbers:\n" );

scanf( "%d", &m);

printf( "\n\nThe result is %lf\n", fun( m ) );

}

解题思路:

第一处:在除法运算中,如果除数和被除数都是整数,所么所除结果也是整数,因此应改为t-=1./i。

第二处:应是返回公式的值,函数中公式的值是存放在临时变量t中,所以应填return t;。

*************************************************** 请编写一个函数,函数的功能是删除字符串中的所有空格。例如, 主函数中输入"asd af aa z67", 则输出为"asdafaaz67"。注意:部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun 的花括号中填入你编写的若干语句。

给定源程序:

#include

#include

int fun(char *str)

{

}

main()

{

char str[81];

int n;

printf("Input a string:") ;

gets(str);

puts(str);

fun(str);

printf("*** str: %s\n",str);

NONO();

}

解题思路:

本题是考察考生怎样利用字符串指针来删除字符串的空格字符。在函数开始处把指针p先指

向字符串str以及位置变量i置0,然后采用while循环和字符串指针p来处理的,每循环一次来判断指针p所指的字符是否为空格,如果不是空格,则把该字符写到str字符串中,位置由i来控制,如果是空格,则不处理,继续取下一字符,直至字符串结束为止,最后再把字符串结束符写到

位置为i的str上,再通过形参str返回。

参考答案:

int fun(char *str)

{

char *p = str ;

int i = 0 ;

while(*p) {

if(*p != ' ') str[i++] = *p ;

p++ ;

}

str[i] = 0 ;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第11套:

给定程序中,函数fun的功能是将带头结点的单向链表逆置。即若原链表中从头至尾结点数据域依次为:2、4、6、8、10,逆置后,从头至尾结点数据域依次为:

10、8、6、4、2。

请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

#define N 5

typedef struct node {

int data;

struct node *next;

} NODE;

void fun(NODE *h)

{ NODE *p, *q, *r;

/

p = h->__1__;

/

if (p==__2__) return;

q = p->next;

p->next = NULL;

while (q)

{ r = q->next; q->next = p;

p = q; q = __3__;

}

h->next = p;

}

NODE *creatlist(int a[])

{ NODE *h,*p,*q; int i;

h = (NODE *)malloc(sizeof(NODE));

h->next = NULL;

for(i=0; i

{ q=(NODE *)malloc(sizeof(NODE));

q->data=a[i];

q->next = NULL;

if (h->next == NULL) h->next = p = q;

else { p->next = q; p = q; }

}

return h;

}

void outlist(NODE *h)

{ NODE *p;

p = h->next;

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]={2,4,6,8,10};

head=creatlist(a); printf("\nThe original list:\n");

outlist(head);

fun(head);

printf("\nThe list after inverting :\n");

outlist(head);

}

解题思路:

本题是考察使用链表方法,对链表的结点数据进行降序排

列。

第一处:使用结构指针p,来控制链表的结束,p必须指向h

结构指针的next指针,来定位p的初始位置。所以应填写:

h->next。

第二处:判断p指针是否结束,所以应填写:0。

第三处:q指向原q的next指针,所以应填:r。

***************************************************

给定程序MODI1.C中函数fun的功能是: 计算s所指字符串中

含有t所指字符串的数目, 并作为函数值返回。

请改正函数fun中指定部位的错误, 使它能得出正确的结果。

注意: 不要改动main函数, 不得增行或删行, 也不得更改程

序的结构!

给定源程序:

#include

#include

#define N 80

int fun(char *s, char *t)

{ int n;

char *p , *r;

n=0;

while ( *s )

{ p=s;

/****

r=p;

while(*r)

if(*r==*p) { r++; p++; }

else break;

/****

if(*r= 0)

n++;

s++;

}

return n;

}

main()

{ char a[N],b[N]; int m;

printf("\nPlease enter string a : "); gets(a);

printf("\nPlease enter substring b : "); gets( b );

m=fun(a, b);

printf("\nThe result is : m = %d\n",m);

}

解题思路:

第一处: 程序中子串是由变量t来实现的,再根据下面while

循环体中语句可知,所以应改为:r=t;。

第二处: 是判断相等的条件,所以应改为:if(*r==0)。

***************************************************

请编写函数fun, 函数的功能是: 将放在字符串数组中的M个

字符串(每串的长度不超过N), 按顺序合并组成一个新的字

符串。函数fun中给出的语句仅供参考。

例如, 字符串数组中的M个字符串为

AAAA

BBBBBBB

CC

则合并后的字符串的内容应是: AAAABBBBBBBCC。

提示:strcat(a,b)的功能是将字符串b复制到字符串a的串尾

上,成为一个新串。

注意:部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容, 仅在函数

fun的花括号中填入你编写的若干语句。

给定源程序:

#include

#define M 3

#define N 20

void fun(char a[M][N], char *b)

{

int i; *b=0;

}

main()

{ char w[M][N]={"AAAA","BBBBBBB","CC"}, a[100];

int i ;

printf("The string:\n");

for(i=0; i

printf("\n");

fun(w,a);

printf("The A string:\n");

printf("%s",a);printf("\n\n");

NONO();

}

解题思路:

本题是考察字符串的操作。

使用for循环以及C语言函数strcat依次连接起来。

参考答案:

#include

#define M 3

#define N 20

void fun(char a[M][N], char *b)

{

int i; *b=0;

for(i = 0 ; i < M ; i++)

strcat(b, a[i]) ;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第12套:

给定程序中,函数fun的功能是将不带头结点的单向链表逆

置。即若原链表中从头至尾结点数据域依次为:2、4、6、8、

10,逆置后,从头至尾结点数据域依次为:10、8、6、4、2。

请在程序的下划线处填入正确的内容并把下划线删除, 使程

序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

#define N 5

typedef struct node {

int data;

struct node *next;

} NODE;

__1__ * fun(NODE *h)

{ NODE *p, *q, *r;

p = h;

if (p == NULL)

return NULL;

q = p->next;

p->next = NULL;

while (q)

{

r = q->__2__;

q->next = p;

p = q;

q = __3__ ;

}

return p;

}

NODE *creatlist(int a[])

{ NODE *h,*p,*q; int i;

h=NULL;

for(i=0; 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]={2,4,6,8,10};

head=creatlist(a);

printf("\nThe original list:\n");

outlist(head);

head=fun(head);

printf("\nThe list after inverting :\n");

outlist(head);

}

解题思路:

本题是考察使用链表方法,对链表的结点数据进行降序排

列,最后通过函数进行返回。

第一处:由于链表中的所有结果要求通过函数进行返回,所

以应填:NODE *。

第二处:中间变量r用来保存q的next指针,所以应填:next。

第三处:q指向原q的next指针,所以应填:r。

***************************************************

给定程序MODI1.C中函数fun的功能是: 将s所指字符串中位

于奇数位置的字符或ASCII码为偶数的字符放入t所指数组中

(规定第一个字符放在第0位中)。

例如, 字符串中的数据为: AABBCCDDEEFF,

则输出应当是:ABBCDDEFF。

请改正函数fun中指定部位的错误, 使它能得出正确的结果。

注意: 不要改动main函数, 不得增行或删行, 也不得更改程

序的结构!

给定源程序:

#include

#include

#define N 80

void fun(char *s, char t[])

{ int i, j=0;

for(i=0; i

if(i%2 && s[i]%2==0)

t[j++]=s[i];

t[i]='\0';

}

main()

{ char s[N], t[N];

printf("\nPlease enter string s : "); gets(s);

fun(s, t);

printf("\nThe result is : %s\n",t);

}

解题思路:

第一处: 根据试题分析,两个条件之间应该是“或”的关系,

而不是“与”的关系,所以应改为:if(i%2 || s[i]%2==0)。

第二处: 当字符串处理结束后,应该补上字符串的结束符,

那么字符串t的位置是由i来控制,所以应改为:t[j]=0;。

***************************************************

请编写函数fun, 函数的功能是: 将M行N列的二维数组中的

数据, 按列的顺序

依次放到一维数组中。函数fun中给出的语句仅供参考。

例如, 二维数组中的数据为:

33 33 33 33

44 44 44 44

55 55 55 55

则一维数组中的内容应是:

33 44 55 33 44 55 33 44 55 33 44 55。

注意:部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容, 仅在函数fun的花括号中填入你编写的若干语句。

给定源程序:

#include

void fun(int s[][10], int b[], int *n, int mm, int nn)

{

int i,j,np=0; /* np用作b数组下标*/

*n=np;

}

main()

{ int w[10][10]={{33,33,33,33},{44,44,44,44},{55,55,55,55}},i,j;

int a[100]={0}, n=0;

printf("The matrix:\n");

for(i=0; i<3; i++)

{ for(j=0;j<4; j++)printf("%3d",w[i][j]);

printf("\n");

}

fun(w,a,&n,3,4);

printf("The A array:\n");

for(i=0;i

NONO();

}

解题思路:

本题是把二维数组中的数据按行存放到一维数组中。

1. 计算存放到一维数组中的位置。

2. 取出二维数组中的数据存放到一维数组(已计算出的位置)中。

参考答案:

void fun(int (*s)[10], int *b, int *n, int mm, int nn)

{

int i,j,np=0; /* np用作b数组下标*/

for(i = 0 ; i < nn ; i++)

for(j = 0 ; j < mm ; j++) {

b[np] = s[j][i] ;

np = i * mm + j + 1;

}

*n=np;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第13套:

给定程序中,函数fun的功能是将带头节点的单向链表结点数据域中的数据从小到大排序。即若原链表结点数据域从头至尾的数据为:10、4、2、8、6,排序

后链表结点数据域从头至尾的数据为:2、4、6、8、10。

请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

#define N 6

typedef struct node {

int data;

struct node *next;

} NODE;

void fun(NODE *h)

{ NODE *p, *q; int t;

p = __1__ ;

while (p) {

q = __2__ ;

while (q) {

if (p->data __3__ q->data)

{ t = p->data; p->data = q->data; q->data = t; }

q = q->next;

}

p = p->next;

}

}

NODE *creatlist(int a[])

{ NODE *h,*p,*q; int i;

h = (NODE *)malloc(sizeof(NODE));

h->next = NULL;

for(i=0; i

{ q=(NODE *)malloc(sizeof(NODE));

q->data=a[i];

q->next = NULL;

if (h->next == NULL) h->next = p = q;

else { p->next = q; p = q; }

}

return h;

}

void outlist(NODE *h)

{ NODE *p;

p = h->next;

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("\nThe original list:\n");

outlist(head);

fun(head);

printf("\nThe list after sorting :\n");

outlist(head);

}

解题思路:

本题是考察使用链表方法,对链表的结点数据进行升序排列。

第一处:使用结构指针p,来控制链表的结束,p必须指向h 结构指针的next指针,来定位p 的初始位置。所以应填写:

h->next。

第二处:使用while循环,对链表中结点的数据进行排序,q

必须指向p结构指针的next指针。所以应填写:p->next。

第三处:如果当前结点中的数据大于(大于等于)循环中的

结点数据,那么进行交换,所

以应填写:>(或>=)。

***************************************************

给定程序MODI1.C是建立一个带头结点的单向链表, 并用随

机函数为各结点数据域赋值。函数fun的作用是求出单向链

表结点(不包括头结点)数据域中的最大值, 并且作为函数值

返回。

请改正函数fun中指定部位的错误, 使它能得出正确的结果。

注意: 不要改动main函数, 不得增行或删行, 也不得更改程

序的结构!

给定源程序:

#include

#include

typedef struct aa

{ int data;

struct aa *next;

} NODE;

fun ( NODE *h )

{ int max=-1;

NODE *p;

p=h ;

while(p)

{ if(p->data>max )

max=p->data;

p=h->next ;

}

return max;

}

outresult(int s, FILE *pf)

{ fprintf(pf,"\nThe max in link : %d\n",s);}

NODE *creatlink(int n, int m)

{ NODE *h, *p, *s, *q;

int i, x;

h=p=(NODE *)malloc(sizeof(NODE));h->data=9999;

for(i=1; i<=n; i++)

{ s=(NODE *)malloc(sizeof(NODE));

s->data=rand()%m; s->next=p->next;

p->next=s; p=p->next;

}

p->next=NULL;

return h;

}

outlink(NODE *h, FILE *pf)

{ NODE *p;

p=h->next;

fprintf(pf,"\nTHE LIST :\n\n HEAD ");

while(p)

{ fprintf(pf,"->%d ",p->data); p=p->next; }

fprintf(pf,"\n");

}

main()

{ NODE *head; int m;

head=creatlink(12, 100);

outlink(head , stdout);

m=fun(head);

printf("\nTHE RESULT :\n"); outresult(m, stdout);

}

解题思路:

程序中是使用while循环语句和结合结构指针p来找到数据域

中的最大值。

第一处: p指向形参结构指针h的next指针,所以应改为:

p=h->next;。

第二处: p指向自己的下一个结点,所以应改为:p=p->next,

***************************************************

请编写函数fun, 函数的功能是: 将M行N列的二维数组中的

数据,按行的顺序依次放到一维数组中, 一维数组中数据的

个数存放在形参n所指的存储单元中。

例如, 二维数组中的数据为:

33 33 33 33

44 44 44 44

55 55 55 55

则一维数组中的内容应是:

33 33 33 33 44 44 44 44 55 55 55 55。

注意:部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容, 仅在函数

fun的花括号中填入你编写的若干语句。

给定源程序:

#include

void fun(int (*s)[10], int *b, int *n, int mm, int nn)

{

}

main()

{ int w[10][10] =

{{33,33,33,33},{44,44,44,44},{55,55,55,55}},i,j ;

int a[100] = {0}, n = 0 ;

printf("The matrix:\n") ;

for(i = 0 ; i < 3 ; i++)

{ for(j = 0 ; j < 4 ; j++) printf("%3d",w[i][j]) ;

printf("\n") ;

}

fun(w, a, &n, 3, 4) ;

printf("The A array:\n") ;

for(i = 0 ; i < n ; i++) printf("%3d",a[i]);printf("\n\n") ;

NONO() ;

}

解题思路:

本题是把二维数组中的数据按行存放到一维数组中。

1. 计算存放到一维数组中的位置。

2. 取出二维数组中的数据存放到一维数组(已计算出的位

置)中。

参考答案:

void fun(int (*s)[10], int *b, int *n, int mm, int nn)

{

int i, j, k ;

for(i = 0 ; i < mm ; i++)

for(j = 0 ; j < nn ; j++) {

k = i * nn + j ;

b[k] = s[i][j] ;

}

*n = mm * nn ;

}

main()

{ int w[10][10] =

{{33,33,33,33},{44,44,44,44},{55,55,55,55}},i,j ;

int a[100] = {0}, n = 0 ;

printf("The matrix:\n") ;

for(i = 0 ; i < 3 ; i++)

{ for(j = 0 ; j < 4 ; j++) printf("%3d",w[i][j]) ;

printf("\n") ;

}

fun(w, a, &n, 3, 4) ;

printf("The A array:\n") ;

for(i = 0 ; i < n ; i++) printf("%3d",a[i]);printf("\n\n") ;

NONO() ;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第14套:

给定程序中, 函数fun的功能是用函数指针指向要调用的函

数,并进行调用。

规定在__2__处使f指向函数f1,在__3__处使f指向函数f2。当

调用正确时,程序输出:

x1=5.000000, x2=3.000000, x1*x1+x1*x2=40.000000

请在程序的下划线处填入正确的内容并把下划线删除, 使程

序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

double f1(double x)

{ return x*x; }

double f2(double x, double y)

{ return x*y; }

double fun(double a, double b)

{

__1__ (*f)();

double r1, r2;

f = __2__ ; /* point fountion f1 */

r1 = f(a);

f = __3__ ; /* point fountion f2 */

r2 = (*f)(a, b);

return r1 + r2;

}

main()

{ double x1=5, x2=3, r;

r = fun(x1, x2);

printf("\nx1=%f, x2=%f, x1*x1+x1*x2=%f\n",x1, x2, r);

}

解题思路:

本题主要是考察用函数指针指向要调用的函数。程序中共有

三处要填上适当的内容,使程

序能运行出正确的结果。

第一处:定义函数指针的类型,所以应填:double。

第二处:使f指向函数f1,所以应填:f1。

第三处:使f指向函数f2,所以应填:f2。

***************************************************

给定程序MODI1.C是建立一个带头结点的单向链表,并用随

机函数为各结点赋值。函数fun的功能是将单向链表结点(不

包括头结点)数据域为偶数的值累加起来, 并且作为函数值

返回。

请改正函数fun中指定部位的错误, 使它能得出正确的结果。

注意: 不要改动main函数, 不得增行或删行, 也不得更改程

序的结构!

给定源程序:

#include

#include

typedef struct aa

{ int data; struct aa *next; }NODE;

int fun(NODE *h)

{ int sum = 0 ;

NODE *p;

p=h;

while(p)

{ if(p->data%2==0)

sum +=p->data;

p=h->next;

}

return sum;

}

NODE *creatlink(int n)

{ NODE *h, *p, *s, *q;

int i, x;

h=p=(NODE *)malloc(sizeof(NODE));

for(i=1; i<=n; i++)

{ s=(NODE *)malloc(sizeof(NODE));

s->data=rand()%16;

s->next=p->next;

p->next=s;

p=p->next;

}

p->next=NULL;

return h;

}

outlink(NODE *h, FILE *pf)

{ NODE *p;

p = h->next;

fprintf(pf ,"\n\nTHE LIST :\n\n HEAD " );

while(p)

{ fprintf(pf ,"->%d ",p->data ); p=p->next; }

fprintf (pf,"\n");

}

outresult(int s, FILE *pf)

{ fprintf(pf,"\nThe sum of even numbers : %d\n",s);}

main()

{ NODE *head; int even;

head=creatlink(12);

head->data=9000;

outlink(head , stdout);

even=fun(head);

printf("\nThe result :\n"); outresult(even, stdout);

}

解题思路:

本题是考察如何使用单向链表把数据域的值按条件进行累加。

第一处:试题要求不计算头结点,所以应改为:p=h->next; 第二处:指向p的下一个结点来实现循环,所以应改为:p=p->next;

*************************************************** 请编写函数fun, 函数的功能是: 判断字符串是否为回文?若是, 函数返回1,主函数中输出: YES, 否则返回0, 主函数中输出NO。回文是指顺读和倒读都一样的字符串。

例如, 字符串LEVEL是回文, 而字符串123312就不是回文。注意:部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun 的花括号中填入

你编写的若干语句。

给定源程序:

#include

#define N 80

int fun(char *str)

{

}

main()

{ char s[N] ;

printf("Enter a string: ") ; gets(s) ;

printf("\n\n") ; puts(s) ;

if(fun(s)) printf(" YES\n") ;

else printf(" NO\n") ;

NONO() ;

}

解题思路:

本题是考察如何判断一个字符串是回文字符串,回文是指顺读和倒读都一样的字符串。可以利用for循环语句来判断,如果前后不一致,则不是回文字符串。

参考答案:

int fun(char *str)

{

int i, j = strlen(str) ;

for(i = 0 ; i < j / 2 ; i++)

if(str[i] != str[j - i - 1]) return 0 ;

return 1 ;

}

main()

{ char s[N] ;

printf("Enter a string: ") ; gets(s) ;

printf("\n\n") ; puts(s) ;

if(fun(s)) printf(" YES\n") ;

else printf(" NO\n") ;

NONO() ;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第15套:

程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。所有学生数据均以二进制方式输出到student.dat文件中。函数fun的功能是从指定文件中找出指定学号的学生数据,读入此学生数据,对该生的分数进行修改,使每门课的分数加3分,修改后重写文件中该学生的数据,即用该学生的新数据覆盖原数据,其它学生数据不变;若找不到,则什么都不做。请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#define N 5

typedef struct student {

long sno;

char name[10];

float score[3];

} STU;

void fun(char *filename, long sno)

{ FILE *fp;

STU n; int i;

fp = fopen(filename,"rb+");

while (!feof(__1__))

{ fread(&n, sizeof(STU), 1, fp);

if (n.sno__2__sno) break;

}

if (!feof(fp))

{ for (i=0; i<3; i++) n.score[i] += 3;

fseek(__3__, -1L*sizeof(STU), SEEK_CUR);

fwrite(&n, sizeof(STU), 1, fp);

}

fclose(fp);

}

main()

{ STU t[N]={ {10001,"MaChao", 91, 92, 77}, {10002,"CaoKai", 75, 60, 88},

{10003,"LiSi", 85, 70, 78}, {10004,"FangFang", 90, 82, 87}, {10005,"ZhangSan", 95, 80, 88}}, ss[N];

int i,j; FILE *fp;

fp = fopen("student.dat", "wb");

fwrite(t, sizeof(STU), N, fp);

fclose(fp);

printf("\nThe original data :\n");

fp = fopen("student.dat", "rb");

fread(ss, sizeof(STU), N, fp);

fclose(fp);

for (j=0; j

{ printf("\nNo: %ld Name: %-8s Scores: ",ss[j].sno, ss[j].name); for (i=0; i<3; i++) printf("%6.2f ", ss[j].score[i]);

printf("\n");

}

fun("student.dat", 10003);

fp = fopen("student.dat", "rb");

fread(ss, sizeof(STU), N, fp);

fclose(fp);

printf("\nThe data after modifing :\n");

for (j=0; j

{ printf("\nNo: %ld Name: %-8s Scores: ",ss[j].sno, ss[j].name);

for (i=0; i<3; i++) printf("%6.2f ", ss[j].score[i]);

printf("\n");

}

}

解题思路:

本题是考察如何从指定文件中找出指定学号的学生数据,并

进行适当的修改,修改后重新写回到文件中该学生的数据

上,即用该学生的新数据覆盖原数据。

第一处:判断读文件是否结束,所以应填:fp。

第二处:从读出的数据中判断是否是指定的学号,其中学号

是由形参sno来传递的,所以应填:==。

第三处:从已打开文件fp中重新定位当前读出的结构位置,

所以应填:fp。

***************************************************

给定程序MODI1.C中函数fun的功能是:利用插入排序法对字

符串中的字符按从小到大的顺序进行排序。插入法的基本算

法是:先对字符串中的头两个元素进行排序。然后把第三个

字符插入到前两个字符中,插入后前三个字符依然有序;再

把第四个字符插入到前三个字符中,……。待排序的字符串已

在主函数中赋予。

请改正程序中的错误,使它能得出正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程

序的结构。

给定源程序:

#include

#include

#define N 80

void insert(char *aa)

{ int i,j,n; char ch;

n=strlen[ aa ];

for( i=1; i

c=aa[i];

j=i-1;

while ((j>=0) && ( ch

{ aa[j+1]=aa[j];

j--;

}

aa[j+1]=ch;

}

}

main( )

{ char a[N]="QWERTYUIOPASDFGHJKLMNBVCXZ";

int i ;

printf ("The original string : %s\n", a);

insert(a) ;

printf("The string after sorting : %s\n\n",a );

}

解题思路:

第一处: 函数应该使用圆括号,所以应改为:n=strlen(aa) ;。

第二处: 变量c没有定义,但后面使用的是ch变量,所以应改

为:ch=aa[i];。

***************************************************

N名学生的成绩已在主函数中放入一个带头节点的链表结构

中,h指向链表的头节点。请编写函数fun,它的功能是:找出

学生的最高分,由函数值返回。

注意: 部分源程序在文件PROG1.C文件中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun

的花括号中填入你编写的若干语句。

给定源程序:

#include

#include

#define N 8

struct slist

{ double s;

struct slist *next;

};

typedef struct slist STREC;

double fun( STREC *h )

{

}

STREC * creat( double *s)

{ STREC *h,*p,*q; int i=0;

h=p=(STREC*)malloc(sizeof(STREC));p->s=0;

while(i

{ q=(STREC*)malloc(sizeof(STREC));

q->s=s[i]; i++; p->next=q; p=q;

}

p->next=0;

return h;

}

outlist( STREC *h)

{ STREC *p;

p=h->next; printf("head");

do

{ printf("->%2.0f",p->s);p=p->next;}

while(p!=0);

printf("\n\n");

}

main()

{ double s[N]={85,76,69,85,91,72,64,87}, max;

STREC *h;

h=creat( s ); outlist(h);

max=fun( h );

printf("max=%6.1f\n",max);

NONO();

}

解题思路:

本题是考察如何从链表中求出学生的最高分。

我们给出的程序是利用while循环语句以及临时结构指针p变

量来求出最高分。

1. 将链表中的第1个值赋给变量max。

2. 将链表指针p的初始位置指向h的next指针(h->next)。

3. 判断p指针是否结束,如果结束,则返回max,否则做下

一步。

4. 判断max是否小于p->s,如果小于,则max取p->s,否则不

替换。

5. 取p->next赋值给p(取下一结点位置给p),转3继续。

参考答案:

double fun( STREC *h )

{

double max=h->s;

STREC *p;

p=h->next;

while(p)

{ if(p->s>max )

max=p->s;

p=p->next;

}

return max;

}

STREC * creat( double *s)

{ STREC *h,*p,*q; int i=0;

h=p=(STREC*)malloc(sizeof(STREC));p->s=0;

while(i

{ q=(STREC*)malloc(sizeof(STREC));

q->s=s[i]; i++; p->next=q; p=q;

}

p->next=0;

return h;

}

outlist( STREC *h)

{ STREC *p;

p=h->next; printf("head");

do

{ printf("->%2.0f",p->s);p=p->next;}

while(p!=0);

printf("\n\n");

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第16套:

给定程序中,函数fun的功能是:求出形参ss所指字符串数组中

最长字符串的长度,将其余字符串右边用字符*补齐,使其与

最长的字符串等长。ss所指字符串数组中共有M个字符串,

且串长

请在程序的下划线处填入正确的内容并把下划线删除,使程

序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

#define M 5

#define N 20

void fun(char (*ss)[N])

{ int i, j, n, len=0;

for(i=0; i

{ len=strlen(ss[i]);

if(i==0) n=len;

if(len>n)n=len;

}

for(i=0; i

n=strlen(___1___);

for(j=0; j

ss[i][ ___2___]='*';

ss[i][n+j+ ___3___]='\0';

}

}

main()

{ char

ss[M][N]={"shanghai","guangzhou","beijing","tianjing","cchon

gqing"};

int i;

printf("The original strings are :\n");

for(i=0; i

printf("\n");

fun(ss);

printf("The result is :\n");

for(i=0; i

}

解题思路:

第一处:利用for循环语句取当前字符串的长度,所以应填:

ss[i]。

第二处:在字符串的右边填字符*,其开始位置是n+j,其中n

是该字符串本身的长度,j是

循环控制变量,所以应填:n+j。

第三处:字符串处理结束应置字符串结束符,其位置是n+j+1,

所以应填:1。

***************************************************

给定程序MODI1.C中fun 函数的功能是:将p所指字符串中

每个单词的最后一个字母改成大写。(这里的“单词”是指由空

格隔开的字符串)。

例如, 若输入

"I am a student to take the examination.",

则应输出"I aM A studenT tO takE thE examination."。

请修改程序中的错误之处, 使它能得出正确的结果。

注意: 不要改动main 函数, 不得删行, 也不得更改程序的

结构!

给定源程序:

#include

#include

void fun( char *p )

{

int k = 0;

for( ; *p; p++ )

if( k )

{

if( p == ' ' )

{

k = 0;

* (p-1) = toupper( *( p - 1 ) )

}

}

else

k = 1;

}

main()

{

char chrstr[64];

int d ;

printf( "\nPlease enter an English sentence within 63 letters: "); gets(chrstr);

d=strlen(chrstr) ;

chrstr[d] = ' ' ;

chrstr[d+1] = 0 ;

printf("\n\nBefore changing:\n %s", chrstr);

fun(chrstr);

printf("\nAfter changing:\n %s", chrstr);

}

解题思路:

第一处:关键字int错写成INT。

第二处:该行括号没有配对,所以只要加上一个右括号即可。*************************************************** 请编写函数fun, 对长度为7个字符的字符串, 除首、尾字符外,将其余5个字符按ASCII码降序排列。

例如,原来的字符串为CEAedca,排序后输出为CedcEAa 。注意: 部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容, 仅在函数fun的花括号中填入你编写的若干语句。

给定源程序:

#include

#include

#include

int fun(char *s,int num)

{

}

main()

{

char s[10];

printf("输入7个字符的字符串:");

gets(s);

fun(s,7);

printf("\n%s",s);

NONO();

}

解题思路:

本题是考察考生如何对字符串中的字符按降序进行排序。给出的程序是使用双重for循环以及冒泡法进行排序的,结果仍存放在原先的字符串上。

参考答案:

int fun(char *s,int num)

{

char ch ;

int i, j ;

for(i = 1 ; i < 6 ; i++)

for(j = i + 1 ; j < 6 ; j++) {

if(*(s + i) < *(s + j)) {

ch = *(s + j) ;

*(s + j) = *(s +i) ;

*(s + i) = ch ;

}

}

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第17套:

程序通过定义学生结构体数组,存储了若干名学生的学号、姓名和3门课的成绩。函数fun的功能是将存放学生数据的结构体数组,按照姓名的字典(从小到大)排序。

请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

struct student {

long sno;

char name[10];

float score[3];

};

void fun(struct student a[], int n)

{

__1__ t;

int i, j;

for (i=0; i<__2__; i++)

for (j=i+1; j

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("\n\nThe original data :\n\n");

for (j=0; j<4; j++)

{ printf("\nNo: %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("\n\nThe data after sorting :\n\n");

for (j=0; j<4; j++)

{ printf("\nNo: %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");

}

}

解题思路:

本题是对结构体数组中的姓名按升序进行排列。

第一处:t是一个临时变量,主要是存放学生数据的结构变量,

所以应填:struct student。

第二处:利用两重for循环进行排序操作,排序的终止条件应

该是总人数减1,所以应填:n-1。

第三处:对姓名进行比较大小,所以应填:a[i].name,a[j].name。

***************************************************

给定程序MODI1.C中函数fun的功能是:在p所指字符串中找

出ASCII码值最大的字符,将其放在第一个位置上;并将该

字符前的原字符向后顺序移动。

例如,调用fun函数之前给字符串输入:ABCDeFGH,

调用后字符串中的内容为:eABCDFGH。

请改正程序中的错误,使它能得出正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程

序的结构。

给定源程序:

#include

fun( char *p )

{ char max,*q; int i=0;

max=p[i];

while( p[i]!=0 )

{ if( max

{ max=p[i];

/

q=p+i

}

i++;

}

wihle( 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");

}

解题思路:

第一处:在语句后缺少分号,所应改为:q=p+i;。

第二处:保留字while写错,所应改为:while(q>p)。

***************************************************

学生的记录由学号和成绩组成,N名学生的数据已在主函数

中放入结构体数组s中, 请编写函数fun,它的功能是:把指

定分数范围内的学生数据放在b所指的数组中,分数范围内

的学生人数由函数值返回。

例如,输入的分数是60 69, 则应当把分数在60到69的学生数

据进行输出,包含60分和69分的学生数据。主函数中将把

60放在low中,把69放在heigh中。

注意: 部分源程序在文件PROG1.C文件中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun

的花括号中填入你编写的若干语句。

给定源程序:

#include

#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

printf("%s %4d\n",h[i].num,h[i].s);

printf("\n");

out = fopen("c:\\test\\out.dat","w") ;

n=fun( s,h,80,98 );

fprintf(out,"%d\n",n);

for(i=0;i

for(j=i+1;j

if(h[i].s>h[j].s) {tt=h[i] ;h[i]=h[j]; h[j]=tt;}

for(i=0;i

fprintf(out,"%4d\n",h[i].s);

fprintf(out,"\n");

fclose(out);

}

解题思路:

本题是把符合条件的学生记录存入到另一个结构体,最后通

过主函数进行输出。

1. 符合条件的学生人数存在变量j(初始值为0)中,最后返

回其值。

2. 利用for循环语句,依次判断是否符合条件,如果符合,则

存入另一个记录体中,人数j 加1。

参考答案:

int fun( STREC *a,STREC *b,int l, int h )

{

int i,j = 0 ;

for(i = 0 ; i < N ; i++)

if(a[i].s >= l && a[i].s <= h) b[j++] = a[i] ;

return j ;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第18套:

给定程序中,函数fun的功能是:将形参s所指字符串中的所

有字母字符顺序前移,其他字符顺序后移,处理后新字符串

的首地址作为函数值返回。

例如,s所指字符串为:asd123fgh543df,处理后新字符串

为:asdfghdf123543。

请在程序的下划线处填入正确的内容并把下划线删除,使程

序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

#include

char *fun(char *s)

{ int i, j, k, n; char *p, *t;

n=strlen(s)+1;

t=(char*)malloc(n*sizeof(char));

p=(char*)malloc(n*sizeof(char));

j=0; k=0;

for(i=0; i

{ if(((s[i]>='a')&&(s[i]<='z'))||((s[i]>='A')&&(s[i]<='Z'))) {

t[j]=__1__; j++;}

else

{ p[k]=s[i]; k++; }

}

for(i=0; i<__2__; i++) t[j+i]=p[i];

t[j+k]= __3__;

return t;

}

main()

{ char s[80];

printf("Please input: "); scanf("%s",s);

printf("\nThe result is: %s\n",fun(s));

}

解题思路:

第一处:函数中申请了两个内存空间,其p是存放字母字符

串,t是存放非字母字符串,根

据条件可知,p依次存放字母字符串,其位置由j来控制,所

以应填:s[i]。

第二处:利用for循环再把t中的内容依次追加到p中,其中t

的长度为k,所以应填:k。

第三处:字符串处理好后必须添加字符串结束符,所以应填:

'\0'。

***************************************************

给定程序MODI1.C中函数fun 的功能是:将s所指字符串中

最后一次出现的与

t1所指字符串相同的子串替换成t2所指字符串,所形成的新串

放在w所指的数组中。

在此处,要求t1和t2所指字符串的长度相同。

例如,当s所指字符串中的内容为:"abcdabfabc",t1所指子

串中的内容为:"ab",t2所指子串中的内容为:"99"时,结

果,在w所指的数组中的内容应为:

"abcdabf99c"。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程

序的结构!

给定源程序:

#include

#include

int fun (char *s, char *t1, char *t2 , char *w)

{

int i; char *p , *r, *a;

strcpy( w, s );

while ( w )

{ p = w; r = t1;

while ( *r )

IF ( *r == *p )

{ r++; p++; }

else break;

if ( *r == '\0' ) a = w;

w++;

}

r = t2;

while ( *r ){ *a = *r; a++; r++; }

}

main()

{

char s[100], t1[100], t2[100], w[100];

printf("\nPlease enter string S:"); scanf("%s", s);

printf("\nPlease enter substring t1:"); scanf("%s", t1);

printf("\nPlease enter substring t2:"); scanf("%s", t2);

if ( strlen(t1)==strlen(t2) )

{ fun( s, t1, t2, w);

printf("\nThe result is : %s\n", w);

}

else printf("\nError : strlen(t1) != strlen(t2)\n");

}

解题思路:

第一处:判断w指针所指的值是否是结束符,应改为:

while(*w)。

第二处:if错写成If。

***************************************************

函数fun的功能是:将s所指字符串中ASCII值为奇数的字符删

除,串中剩余字符形成一个新串放在t所指的数组中。

例如,若s所指字符串中的内容为:"ABCDEFG12345",其中

字符A的ASCII码值为奇数、…、字符1的ASCII码值也为奇

数、…都应当删除,其它依此类推。最后t所指的数组中的

内容应是:"BDF24"。

注意: 部分源程序存在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun 的花括号中填入

你编写的若干语句。

给定源程序:

#include

#include

void fun(char *s, char t[])

{

}

main()

{

char s[100], t[100];

printf("\nPlease enter string S:"); scanf("%s", s);

fun(s, t);

printf("\nThe result is: %s\n", t);

NONO();

}

解题思路:

本题是从一个字符串按要求生成另一个新的字符串。我们使用for循环语句来解决这个问题。

参考答案:

void fun(char *s, char t[])

{

int i, j = 0 ;

for(i = 0 ; i < strlen(s); i++) if(s[i] % 2==0) t[j++] = s[i] ;

t[j] = 0 ;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第19套:

程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。函数fun的功能是将形参a所指结构体变量s中的数据进行修改,并把a中地址作为函数值返回主函数,在主函数中输出修改后的数据。

例如:a所指变量s中的学号、姓名、和三门课的成绩依次是:10001、

" ZhangSan "、95、80、88,修改后输出t中的数据应为:10002、"LiSi "、96、

81、89。

请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

struct student {

long sno;

char name[10];

float score[3];

};

__1__ fun(struct student *a)

{ int i;

a->sno = 10002;

strcpy(a->name, "LiSi");

for (i=0; i<3; i++) __2__ += 1;

return __3__ ;

}

main()

{ struct student s={10001,"ZhangSan", 95, 80, 88}, *t;

int i;

printf("\n\nThe original data :\n");

printf("\nNo: %ld Name: %s\nScores: ",s.sno, https://www.wendangku.net/doc/5e4503253.html,);

for (i=0; i<3; i++) printf("%6.2f ", s.score[i]);

printf("\n");

t = fun(&s);

printf("\nThe data after modified :\n");

printf("\nNo: %ld Name: %s\nScores: ",t->sno, t->name);

for (i=0; i<3; i++) printf("%6.2f ", t->score[i]);

printf("\n");

}

解题思路:

本题是利用形参对结构体变量中的值进行修改并通过地址把函数值返回。

第一处:必须定义结构指针返回类型,所以应填:struct student *。

第二处:分别对成绩增加1分,所以应填:a->score[i]。

第三处:返回结构指针a,所以应填:a。

*************************************************** 给定程序MODI1.C中函数fun的功能是:从N个字符串中找出最长的那个串,并将其地址作为函数值返回。各字符串在主函数中输入,并放入一个字符串数组中。

请改正程序中的错误,使它能得出正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

给定源程序:

#include

#include

#define N 5

#define M 81

fun(char (*sq)[M])

{ int i; char *sp;

sp=sq[0];

for(i=0;i

if(strlen( sp)

sp=sq[i] ;

return sq;

}

main()

{ char str[N][M], *longest; int i;

printf("Enter %d lines :\n",N);

for(i=0; i

printf("\nThe N string :\n",N);

for(i=0; i

longest=fun(str);

printf("\nThe longest string :\n"); puts(longest);

} 解题思路:

第一处: 要求返回字符串的首地址,所以应改为:char

*fun(char (*sq)[M])。

第二处: 返回一个由变量sp控制的字符串指针,所以应改为:

return sp;。

***************************************************

函数fun的功能是:将a、b中的两个两位正整数合并形成一个

新的整数放在c 中。合并的方式是:将a中的十位和个位数依

次放在变量c的百位和个位上,b中的十位和个位数依次放在

变量c的十位和千位上。

例如,当a=45,b=12。调用该函数后,c=2415。

注意: 部分源程序存在文件PROG1.C中。数据文件IN.DA T中

的数据不得修改。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun

的花括号中填入

你编写的若干语句。

给定源程序:

#include

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);

NONO();

}

解题思路:

本题是给出两个两位数的正整数分别取出各位上的数字,再

按条件组成一个新数。

取a十位数字的方法:a/10

取a个位数字的方法:a%10

参考答案:

void fun(int a, int b, long *c)

{

*c = (b%10)*1000+(a/10)*100+(b/10)*10+a%10;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第20套:

给定程序中,函数fun的功能是:计算形参x所指数组中N个

数的平均值(规定所有数均为正数),将所指数组中小于平均

值的数据移至数组的前部,大于等于平

均值的数据移至x所指数组的后部,平均值作为函数值返回,

在主函数中输出平均值和移动后的数据。

例如,有10个正数:46 30 32 40 6 17 45 15 48 26,平均值为:

30.500000

移动后的输出为:30 6 17 15 26 46 32 40 45 48

请在程序的下划线处填入正确的内容并把下划线删除,使程

序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

#define N 10

double fun(double *x)

{ int i, j; double av, y[N];

av=0;

for(i=0; i

for(i=j=0; i

if( x[i]

{

y[j]=x[i]; x[i]=-1; __2__;}

i=0;

while(i

{ if( x[i]!= -1 ) y[j++]=x[i];

__3__;

}

for(i=0; i

return av;

}

main()

{ int i; double x[N];

for(i=0; i

printf("\n");

printf("\nThe average is: %f\n",fun(x));

printf("\nThe result :\n",fun(x));

for(i=0; i

printf("\n");

}

解题思路:

第一处:求出N个数的平均值,所以应填:N。

第二处:利用for循环语句,把数组x中小于平均值的数,依

次存放到数组y中,其中位置由变量j来控制,所以应填:j++。

第三处:i是while循环体的控制变量,每做一次循环均要加1。

***************************************************

给定程序MODI1.C中函数fun 的功能是:统计字符串中各元

音字母(即:A、E、I、O、U)的个数。注意:字母不分大、

小写。

例如:若输入:THIs is a boot,则输出应该是:1、0、2、2、

0。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main 函数,不得增行或删行,也不得更改

程序的结构!

给定源程序:

#include

fun ( char *s, int num[5] )

{ int k, i=5;

for ( k = 0; k

num[i]=0;

for (; *s; s++)

{ i = -1;

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( "\nPlease enter a string: " ); gets( s1 );

fun ( s1, num1 );

for ( i=0; i < 5; i++ ) printf ("%d ",num1[i]); printf ("\n");

}

解题思路:

第一处:num初始化错误,应为:num[k]=0;。

第二处:由于s是指针型变量,所以应改为:switch(*s)。

***************************************************

请编写函数fun,函数的功能是求出二维数组周边元素之和,

作为函数值返回。二维数组中的值在主函数中赋予。

例如:二维数组中的值为

1 3 5 7 9

2 9 9 9 4

6 9 9 9 8

1 3 5 7 0

则函数值为61。

注意: 部分源程序存在文件PROG1.C文件中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun

的花括号中填入你编写的若干语句。

给定源程序:

#include

#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;

clrscr();

printf ( "The original data is : \n" );

for ( i=0; i

{ for ( j =0; j

printf ("\n");

}

y = fun ( aa );

printf( "\nThe sum: %d\n" , y );

printf("\n");

NONO( );

}

解题思路:

本题是统计二维数组周边元素值之和,但要注意的是不要重

复计算四个角上的元素值,结果作为函数值返回。

参考答案:

int fun ( int a[M][N] )

{

int tot = 0, i, j ;

for(i = 0 ; i < N ; i++) {

tot += a[0][i] ;

tot += a[M-1][i] ;

}

for(i = 1 ; i < M - 1 ; i++) {

tot += a[i][0] ;

tot += a[i][N-1] ;

}

return tot ;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第21套:

给定程序中,函数fun的功能是:计算形参x所指数组中N个

数的平均值(规定所有数均为正数),将所指数组中大于平均

值的数据移至数组的前部,小于等于平均值的数据移至x所

指数组的后部,平均值作为函数值返回,在主函数中输出平

均值和移动后的数据。

例如,有10个正数:46 30 32 40 6 17 45 15 48 26,平均值为:

30.500000

移动后的输出为:46 32 40 45 48 30 6 17 15 26

请在程序的下划线处填入正确的内容并把下划线删除, 使程

序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

#define N 10

double fun(double *x)

{ int i, j; double s, av, y[N];

s=0;

for(i=0; i

av=__1__;

for(i=j=0; i

if( x[i]>av ){

y[__2__]=x[i]; x[i]=-1;}

for(i=0; i

if( x[i]!= __3__) y[j++]=x[i];

for(i=0; i

return av;

}

main()

{ int i; double x[N];

for(i=0; i

printf("\n");

printf("\nThe average is: %f\n",fun(x));

printf("\nThe result :\n",fun(x));

for(i=0; i

printf("\n");

}

解题思路:

第一处:计算N个数的平均值,所以应填:s/N。

第二处:利用for循环语句,把数组x中大于平均值的数,依次存放到数组y中,同时把数组x上的该数置为-1,其中位置由变量j来控制,所以应填:j++。

第三处:再利用循环把不是-1的数,依次仍存放到数组y中,所以应填:-1。

*************************************************** 给定程序MODI1.C的功能是:读入一个英文文本行,将其中每个单词的第一个字母改成大写,然后输出此文本行(这里的“单词”是指由空格隔开的字符串)。

例如,若输入:I am a student to take the examination.,

则应输出:I Am A Student To Take The Examination.。

请改正程序中的错误,使程序能得出正确的结果。

注意:不要改动main 函数,不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

include

upfst ( char p )

{ int k=0;

for ( ; *p; p++ )

if ( k )

{ if ( *p == ' ' ) k = 0; }

else if ( *p != ' ' )

{ k = 1; *p = toupper( *p ); }

}

main( )

{ char chrstr[81];

printf( "\nPlease enter an English text line: " ); gets( chrstr ); printf( "\n\nBefore changing:\n %s", chrstr );

upfst( chrstr );

printf( "\nAfter changing:\n %s\n", chrstr );

}

解题思路:

第一处:包含头文件的标识错误,在include前漏写了#。

第二处:由于传入的参数是字符串,所以应为upfst(char *p)。*************************************************** 程序定义了N×N的二维数组,并在主函数中赋值。请编写函数fun,函数的功能是:求出数组周边元素的平均值并作为函数值返给主函数中的s。

例如:a 数组中的值为

|0 1 2 7 9|

|1 9 7 4 5|

a = |2 3 8 3 1|

|4 5 6 8 2|

|5 9 1 4 1|

则返回主程序后s的值应为: 3.375。

注意: 部分源程序存在文件PROG1.C文件中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun 的花括号中填入你编写的若干语句。

给定源程序:

#include

#include

#define N 5

double fun ( int w[][N] )

{

}

main ( )

{ int a[N][N]={0,1,2,7,9,1,9,7,4,5,2,3,8,3,1,4,5,6,8,2,5,9,1,4,1}; int i, j;

double s ;

printf("***** The array *****\n");

for ( i =0; i

{ for ( j =0; j

{ printf( "%4d", a[i][j] ); }

printf("\n");

}

s = fun ( a );

printf ("***** THE RESULT *****\n");

printf( "The sum is : %lf\n",s );

NONO( );

}

解题思路:

本题是统计二维数组周边元素值的平均值,但要注意的是不要重复计算四个角上的元素值。

参考答案:

double fun ( int w[][N] )

{

int i, j, n=0;

double sum=0;

for ( i =0; i

sum+=w[0][i]+w[N-1][i]; n+=2;

}

for ( i =1; i

sum +=w[i][0]+w[i][N-1];

n+=2;

}

return sum/n;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第22套:

给定程序中,函数fun的功能是:将自然数1~10以及它们的平方根写到名为myfile3.txt的文本文件中,然后再顺序读出显示在屏幕上。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include int fun(char *fname )

{ FILE *fp; int i,n; float x;

if((fp=fopen(fname, "w"))==NULL) return 0;

for(i=1;i<=10;i++)

fprintf(___1___,"%d %f\n",i,sqrt((double)i));

printf("\nSucceed!!\n");

___2___;

printf("\nThe data in file :\n");

if((fp=fopen(___3___,"r"))==NULL)

return 0;

fscanf(fp,"%d%f",&n,&x);

while(!feof(fp))

{ printf("%d %f\n",n,x); fscanf(fp,"%d%f",&n,&x); }

fclose(fp);

return 1;

}

main()

{ char fname[]="myfile3.txt";

fun(fname);

}

解题思路:

本题要求所求出的数写入到指定的文件中保存。程序中共有

三处要填上适当的内容,使程序能运行出正确的结果。

第一处:int fprintf(FILE *stream, const char *format

[,argument, …]); 因此本处只能填写文件流的变量fp。

第二处:由于文件打开写操作,所以必须要关闭,因此,只

能填写关闭文件的函数fclose(fp)。

第三处:由于本题要把刚写入文件中的数据重新显示出来,

读方式已经给出,但没有给出

文件名,所以本处只能写文件名变量fname或者直接给出文

件名"myfile3.dat"。

***************************************************

给定程序MODI1.C中fun函数的功能是:将n个无序整数从小

到大排序。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程

序的结构!

给定源程序:

#include

#include

fun ( int n, int *a )

{ int i, j, p, t;

for ( j = 0; j

{ p = j;

for ( i=j+1; i

if ( a[p]>a[i] )

t=i;

if ( p!=j )

{ t = a[j]; a[j] = a[p]; a[p] = t; }

}

}

putarr( int n, int *z )

{ int i;

for ( i = 1; i <= n; i++, z++ )

{ printf( "%4d", *z );

if ( !( i%10 ) ) printf( "\n" );

} printf("\n");

}

main()

{ int aa[20]={9,3,0,4,1,2,5,6,8,10,7}, n=11;

printf( "\n\nBefore sorting %d numbers:\n", n ); putarr( n, aa );

fun( n, aa );

printf( "\nAfter sorting %d numbers:\n", n ); putarr( n, aa );

}

解题思路:

第一处:for循环的终止值应该

第二处:使用临时变量p来保存最小值位置i,所以应改为:

p=i;。

***************************************************

函数fun的功能是: 将两个两位数的正整数a、b合并形成一个

整数放在c中。合并的方式是: 将a数的十位和个位数依次放

在c数的个位和百位上, b数的十位和个位数依次放在c数的

十位和千位上。

例如, 当a=45, b=12时, 调用该函数后, c=2514。

注意: 部分源程序存在文件PROG1.C中。数据文件IN.DA T中

的数据不得修改。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun

的花括号中填入你编写的若干语句。

给定源程序:

#include

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);

NONO();

}

解题思路:

本题是给出两个两位数的正整数分别取出各位上的数字,再

按条件组成一个新数。

取a十位数字的方法:a/10

取a个位数字的方法:a%10

参考答案:

void fun(int a, int b, long *c)

{

*c=(b%10)*1000+(a%10)*100+(b/10)*10+(a/10);

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第23套:

给定程序中,函数fun的功能是:找出N×N矩阵中每列元素

中的最大值,并按顺序依次存放于形参b所指的一维数组中。

请在程序的下划线处填入正确的内容并把下划线删除, 使程

序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#define N 4

void fun(int (*a)[N], int *b)

{ int i,j;

for(i=0; i

/

b[i]= __1__;

for(j=1; j

if(b[i] __2__ a[j][i]) b[i]=a[j][i];

}

}

main()

{ int

x[N][N]={ {12,5,8,7},{6,1,9,3},{1,2,3,4},{2,8,4,3} },y[N],i,j;

printf("\nThe matrix :\n");

for(i=0;i

{ for(j=0;j

printf("\n");

}

fun(__3__);

printf("\nThe result is:");

for(i=0; i

printf("\n");

}

解题思路:

第一处:把每列的第1值赋值给b[i],所以应填:a[0][i]。

第二处:如果b[i]值小于a[j][i]的值,则把a[j][i]重新赋值给b[i]

中,保存最大的值,所以应填:<。

第三处:在主函数中,x是存放矩阵数据,y是存放每列的最

大值,所以应填:x,y。

***************************************************

给定程序MODI1.C中函数fun的功能是: 交换主函数中两个

变量的值。例如: 若变量a中的值原为8,b中的值为3。程序运

行后a中的值为3, b中的值为8。

请改正程序中的错误, 使它能计算出正确的结果。

注意: 不要改动main 函数, 不得增行或删行, 也不得更改

程序的结构!

给定源程序:

#include

int fun(int x,int y)

{

int t;

t=x;x=y;y=t;

}

main()

{

int a,b;

a=8;b=3;

fun(&a,&b);

printf("%d, %d\n",a,b);

}

解题思路:

第一处:函数形参定义不正确,在定义第2个形参时,也应

加上int。由于通过该函数实现两数交换,在C语言中,必须

交换地址中的值,所以应定义为int *x,int *y。

第二处:要交换地址中的值,不能交换地址,必须指定地址

中的值,因此应改为

t=*x;*x=*y;*y=t;。

***************************************************

编写函数fun, 函数的功能是求出小于或等于lim的所有素数

并放在aa数组中, 函数返回所求出的素数的个数。函数fun中

给出的语句仅供参考。

注意:部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun

的花括号中填入你编写的若干语句。

给定源程序:

#include

#define MAX 100

int fun(int lim, int aa[MAX])

{

int i,j,k=0;

/* 其中变量k用于统计素数个数*/

for(i=2;i<=lim;i++)

{

/* 以下完成判断aa数组中小于或等于lim的素数并统计个数

*/

}

return k;

}

main()

{

int limit, i, sum;

int aa[MAX] ;

printf("输入一个整数");

scanf("%d", &limit);

sum=fun(limit, aa);

for(i=0 ; i < sum ; i++) {

if(i % 10 == 0 && i != 0) printf("\n") ;

printf("%5d", aa[i]) ;

}

NONO();

}

解题思路:

本题是考察考生如何判断一个数是素数,再求出所有小于lim

数的素数并存入数组aa中保存,最后由形参aa返回,素数的

个数由函数值返回。

参考答案:

int fun(int lim, int aa[MAX])

{

int i,j,k=0;

/* 其中变量k用于统计素数个数*/

for(i=2;i<=lim;i++)

{

/* 以下完成判断aa数组中小于或等于lim的素数并统计个数

*/

for(j = 2 ; j <= (i/2) ; j++)

if(i % j == 0) break;

if(j > (i/2)) aa[k++] = i;

}

return k;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第24套:

程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。函数fun的功能是将形参a中的数据进行修改,把修改后的数据作为函数值返回主函数

进行输出。

例如:传给形参a的数据中,学号、姓名、和三门课的成绩依次是:10001、

"ZhangSan"、95、80、88,修改后的数据应为:10002、"LiSi"、96、81、89。

请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

struct student {

long sno;

char name[10];

float score[3];

};

__1__ fun(struct student a)

{ int i;

a.sno = 10002;

strcpy(__2__, "LiSi");

for (i=0; i<3; i++) __3__+= 1;

return a;

}

main()

{ struct student s={10001,"ZhangSan", 95, 80, 88}, t;

int i;

printf("\n\nThe original data :\n");

printf("\nNo: %ld Name: %s\nScores: ",s.sno, https://www.wendangku.net/doc/5e4503253.html,);

for (i=0; i<3; i++) printf("%6.2f ", s.score[i]);

printf("\n");

t = fun(s);

printf("\nThe data after modified :\n");

printf("\nNo: %ld Name: %s\nScores: ",t.sno, https://www.wendangku.net/doc/5e4503253.html,);

for (i=0; i<3; i++) printf("%6.2f ", t.score[i]);

printf("\n");

}

解题思路:

本题是对结构体变量中的值进行修改并通过函数值返回。

第一处:必须定义结构返回类型,所以应填:struct student。第二处:对姓名进行修改,所以应填:https://www.wendangku.net/doc/5e4503253.html,。

第三处:分别对成绩增加1分,所以应填:a.score[i]。

*************************************************** 假定整数数列中的数不重复,并存放在数组中。给定程序MODI1.C中函数fun的功能是:删除数列中值为x的元素。n 中存放的是数列中元素的个数。

请改正程序中的错误,使它能得出正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

给定源程序:

#include

#define N 20

fun(int *a,int n,int x)

{ int p=0,i;

a[n]=x;

while( x!=a[p] )

p=p+1;

/

if(P==n) return -1;

else

{ for(i=p;i

/

a[i+1]=a[i];

return n-1;

}

}

main()

{ int w[N]={-3,0,1,5,7,99,10,15,30,90},x,n,i;

n=10;

printf("The original data :\n");

for(i=0;i

printf("\nInput x (to delete): "); scanf("%d",&x);

printf("Delete : %d\n",x);

n=fun(w,n,x);

if ( n==-1 ) printf("***Not be found!***\n\n");

else

{ printf("The data after deleted:\n");

for(i=0;i

}

}

解题思路:

第一处: 条件语句中的小写p错写成大写P了。

第二处: 删除元素,应该是后面位置的元素值赋值给前面的位置上,所以应改为:

a[i]=a[i+1];。

*************************************************** 学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中, 请编写函数fun,它的功能是:把分数最低的学生数据放在b所指的数组中,

注意:分数最低的学生可能不止一个,函数返回分数最低的学生的人数。

注意: 部分源程序在文件PROG1.C文件中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun 的花括号中填入你编写的若干语句。给定源程序:

#include

#define N 16

typedef struct

{ char num[10];

int s;

} STREC;

int fun( STREC *a, STREC *b )

{

}

main()

{ STREC

s[N]={{"GA05",85},{"GA03",76},{"GA02",69},{"GA04",85},

{"GA01",91},{"GA07",72},{"GA08",64},{"GA06",87},

{"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91},

{"GA011",91},{"GA017",64},{"GA018",64},{"GA016",72}};

STREC h[N];

int i,n;FILE *out ;

n=fun( s,h );

printf("The %d lowest score :\n",n);

for(i=0;i

printf("%s %4d\n",h[i].num,h[i].s);

printf("\n");

out = fopen("c:\\test\\out.dat","w") ;

fprintf(out, "%d\n",n);

for(i=0;i

fprintf(out, "%4d\n",h[i].s);

fclose(out);

}

解题思路:

本题是把符合条件的学生记录存入到另一个结构体,人数通

过函数返回,记录由实参b返回。

1. 符合条件的学生人数存在变量j(初始值为0)中,最后返

回其值。

2. 利用for循环语句,依次判断是否符合条件,如果成绩相等,

则把记录存入b中,人数j加1;如果当前成绩a[i].s小于最低成

绩min,那么人数重新初始化为0,把当前成绩存入最低成绩

中,人数j加1。

3. 直至循环结束为止。

参考答案:

int fun( STREC *a, STREC *b )

{

int i, j = 0, min=a[0].s ;

for(i = 0 ; i < N; i++) {

if(min > a[i].s) {

j = 0 ; b[j++] = a[i] ; min = a[i].s ;

}

else if(min == a[i].s)

b[j++] = a[i] ;

}

return j ;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第25套:

人员的记录由编号和出生年、月、日组成,N名人员的数据已

在主函数中存入结构体数组std中,且编号唯一。函数fun的

功能是:找出指定编号人员的数据,作为函数值返回,由主

函数输出,若指定编号不存在,返回数据中的编号为空串。请

在程序的下划线处填入正确的内容并把下划线删除,使程序

得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

#define N 8

typedef struct

{ char num[10];

int year,month,day ;

}STU;

___1___ fun(STU *std, char *num)

{ int i; STU a={"",9999,99,99};

for (i=0; i

if( strcmp(___2___,num)==0 )

return (___3___);

return a;

}

main()

{ STU

std[N]={ {"111111",1984,2,15},{"222222",1983,9,21},{"33333

3",1984,9,1},

{"444444",1983,7,15},{"555555",1984,9,28},{"666666",1983,1

1,15},

{"777777",1983,6,22},{"888888",1984,8,19}};

STU p; char n[10]="666666";

p=fun(std,n);

if(p.num[0]==0)

printf("\nNot found !\n");

else

{ printf("\nSucceed !\n ");

printf("%s %d-%d-%d\n",p.num,p.year,p.month,p.day);

}

}

解题思路:

本题是要求从给定的人员数据中找出编号相同的记录数据。

第一处:从返回值来看,是返回一个结构型的值,所以应填:

STU。

第二处:判断结构变量中的编号num是否相等,所以应填:

stu[i].num。

第三处:返回编号相等的记录值,所以应填:std[i]。

***************************************************

给定程序MODI1.C中函数fun的功能是:从s所指字符串中,

找出与t所指字符串相同的子串的个数作为函数值返回。

例如,当s所指字符串中的内容为:"abcdabfab",t所指字符

串的内容为:

"ab",则函数返回整数3。

注意:不要改动main 函数,不得增行或删行,也不得更改

程序的结构!

给定源程序:

#include

#include

int fun (char *s, char *t)

{

int n; char *p , *r;

n = 0;

while ( *s )

{ p = s; r = t;

while ( *r )

if ( *r == *p ) {

r++; p++

}

else break;

if ( r == '\0' )

n++;

s++;

}

return n;

}

main()

{

char s[100], t[100]; int m;

printf("\nPlease enter string S:"); scanf("%s", s);

printf("\nPlease enter substring t:"); scanf("%s", t);

m = fun( s, t);

printf("\nThe result is: m = %d\n", m);

}

解题思路:

第一处:语句后缺少分号。

第二处:判断r的当前字符是否是字符串结束符,所以应改为:

if(*r==0)。

***************************************************

函数fun的功能是:将s所指字符串中ASCII值为偶数的字符删

除,串中剩余字

符形成一个新串放在t所指的数组中。

例如,若s所指字符串中的内容为:"ABCDEFG12345",其中

字符B的ASCII码值

为偶数、…、字符2的ASCII码值为偶数、…都应当删除,其

它依此类推。最后t所指的数组中的内容应是:"ACEG135"。

注意: 部分源程序存在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun

的花括号中填入你编写的若干语句。

给定源程序:

#include

#include

void fun(char *s, char t[])

{

}

main()

{

char s[100], t[100];

printf("\nPlease enter string S:"); scanf("%s", s);

fun(s, t);

printf("\nThe result is: %s\n", t);

NONO();

}

解题思路:

本题是从一个字符串按要求生成另一个新的字符串。我们使

用for循环语句来解决这个问题。

参考答案:

void fun(char *s, char t[])

{

int i, j = 0 ;

for(i = 0 ; i < strlen(s); i++) if(s[i] % 2) t[j++] = s[i] ;

t[j] = 0 ;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第26套:

给定程序中已建立一个带有头结点的单向链表,链表中的各

结点按数据域递增有序链接。函数fun的功能是:删除链表中

数据域值相同的结点,使之只保留一个。请在程序的下划线

处填入正确的内容并把下划线删除,使程序得出正确的结

果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

#define N 8

typedef struct list

{ int data;

struct list *next;

} SLIST;

void fun( SLIST *h)

{ SLIST *p, *q;

p=h->next;

if (p!=NULL)

{ q=p->next;

while(q!=NULL)

{ if (p->data==q->data)

{ p->next=q->next;

free(___1___);

q=p->___2___;

}

else

{ p=q;

q=q->___3___;

}

}

}

}

SLIST *creatlist(int *a)

{ SLIST *h,*p,*q; int i;

h=p=(SLIST *)malloc(sizeof(SLIST));

for(i=0; i

{ q=(SLIST *)malloc(sizeof(SLIST));

q->data=a[i]; p->next=q; p=q;

}

p->next=0;

return h;

}

void outlist(SLIST *h)

{ SLIST *p;

p=h->next;

if (p==NULL) printf("\nThe list is NULL!\n");

else

{ printf("\nHead");

do { printf("->%d",p->data); p=p->next; } while(p!=NULL); printf("->End\n");

}

}

main( )

{ SLIST *head; int a[N]={1,2,2,3,4,4,4,5};

head=creatlist(a);

printf("\nThe list before deleting :\n"); outlist(head);

fun(head);

printf("\nThe list after deleting :\n"); outlist(head);

}

解题思路:

本题是考察考生对链表的操作,主要是解决删除链表中数据域值相同的结点。程序中共有三处要填上适当的内容,使程序能运行出正确的结果。

函数fun中使用两个临时结构指针变量p和q对链表进行操作。首先p指向链表开始的next指针,q指向p的next指针,再利用while循环语句来判断指针q是否NULL,如果q指针是指向NULL,那么函数结束返回。如果不是NULL,那么就要判断p和q中data值是否相同,如果值相同,则要

删除该结点,然后继续判断下一结点值是相同,如果还相同,那么继续删除结点,直至不相同为止。如果两个结点的值不相同,那么p就指向q,q指向q的next指针再继续操作上述过程。

删除结点的方法是:先将p的next指针指向q的next指针,再释放q指针指向的内存,最后把

q指针再指向p的next指针就可以删除一个链表中的结点了。第一处:释放q指针所指的内存空间,应填q。

第二处:q指针指向p的next指针,重新完成链接,应填next。第三处:两个结点的值不相同,那么q就指向q的next指针,应填next。

*************************************************** 给定程序MODI1.C中函数fun的功能是:用选择法对数组中的n个元素按从小到大的顺序进行排序。

请修改程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行和删行,也不得更改程序的结构!

给定源程序:

#include

#define N 20

void fun(int a[], int n)

{ int i, j, t, p;

for (j = 0 ;j < n-1 ;j++) {

p = j

for (i = j;i < n; i++)

if(a[i] < a[p])

p = j;

t = a[p] ; a[p] = a[j] ; a[j] = t;

}

}

main()

{

int a[N]={9,6,8,3,-1},i, m = 5;

printf("排序前的数据:") ;

for(i = 0;i < m;i++) printf("%d ",a[i]); printf("\n");

fun(a,m);

printf("排序后的数据:") ;

for(i = 0;i < m;i++) printf("%d ",a[i]); printf("\n");

}

解题思路:

第一处:语句后缺少分号。

第二处:保存最小值的位置,所以应改为:p = i;。

*************************************************** 请编写一个函数fun,它的功能是:求出1到m之间(含m)能被7或11整除的所有整数放在数组a中,通过n返回这些数的个数。例如,若传送给m的值为50,则程序

输出:7 11 14 21 22 28 33 35 42 44 49

注意: 部分源程序存在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun 的花括号中填入

你编写的若干语句。

给定源程序:

#include

#define M 100

void fun ( int m, int *a , int *n )

{

}

main( )

{ int aa[M], n, k;

fun ( 50, aa, &n );

for ( k = 0; k < n; k++ )

if((k+1)%20==0) printf("\n");

else printf( "%4d", aa[k] );

printf("\n") ;

NONO( );

}

解题思路:

本题是考察考生对某个数能被其他的数整除方式,并把符合条件的数存放在数组a中。我们给出的程序是使用for循环语句以及取模的方式来解决这个问题的。

参考答案:

#include

#define M 100

void fun ( int m, int *a , int *n ) {

int i ;

*n=0 ;

for(i=7 ; i<=m; i++)

if((i % 7 == 0) || (i % 11 == 0)) a[(*n)++]=i ;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第27套:

给定程序中,函数fun的功能是:计算下式前n项的和作为函

数值返回。

例如,当形参n的值为10时,函数返回:9.612558。

请在程序的下划线处填入正确的内容并把下划线删除,使程

序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

double fun(int n)

{ int i; double s, t;

s=__1__;

for(i=1; i<=__2__; i++)

{ t=2.0*i;

s=s+(2.0*i-1)*(2.0*i+1)/__3__;

}

return s;

}

main()

{ int n=-1;

while(n<0)

{ printf("Please input(n>0): "); scanf("%d",&n); }

printf("\nThe result is: %f\n",fun(n));

}

解题思路:

第一处:根据公式可知,累加和变量s,应置0。

第二处:for循环的终止值应为形参n。

第三处:根据公式以及函数体中t变量内容,所以应填:t*t。

***************************************************

给定程序MODI1.C中函数fun 的功能是:统计substr所指子

字符串在str所指字符串中出现的次数。

例如,若字符串为aaas lkaaas,子字符串为as,则应输出2。

请改正程序中的错误,使它能计算出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程

序的结构!

给定源程序:

#include

fun (char *str,char *substr)

{ int i,j,k,num=0;

for(i = 0, str[i], i++)

for(j=i,k=0;substr[k]==str[j];k++,j++)

If(substr[k+1]=='\0')

{ num++;

break;

}

return num;

}

main()

{

char str[80],substr[80];

printf("Input a string:") ;

gets(str);

printf("Input a substring:") ;

gets(substr);

printf("%d\n",fun(str,substr));

}

解题思路:

第一处:循环for语句中应有分号。

第二处:if错写成If。

***************************************************

请编写一个函数fun,它的功能是:根据以下公式求π的值(要

求满足精度0.0005, 即某项小于0.0005时停止迭代):

π1 1×2 1×2×3 1×2×3×4 1×2×…×n

─= 1+─+─—+────+──────+……+────

────

2 3 3×5 3×5×7 3×5×7×9 3×5×…×(2n+1)

程序运行后,如果输入精度0.0005,则程序输出为3.14…。

注意: 部分源程序存在文件PROG1.C文件中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun

的花括号中填入你编写的若干语句。

给定源程序:

#include

#include

double fun ( double eps)

{

}

main( )

{ double x;

printf("Input eps:") ;

scanf("%lf",&x); printf("\neps = %lf, PI=%lf\n", x, fun(x));

NONO();

}

解题思路:

本题是根据公式进行计算。

参考答案:

double fun ( double eps)

{

double s=1,t=1./3;

int n=1;

while(t>=eps){ s+=t; n++; t=t*n/(2.0*n+1); }

return (s*2.0);

}

main( )

{ double x;

printf("Input eps:") ;

scanf("%lf",&x); printf("\neps = %lf, PI=%lf\n", x, fun(x));

NONO();

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第28套:

给定程序中,函数fun的功能是:统计形参s所指字符串中数

字字符出现的次数,并存放在形参t所指的变量中,最后在主

函数中输出。例如,形参s所指的字符串为:

abcdef35adgh3kjsdf7。输出结果为:4。

请在程序的下划线处填入正确的内容并把下划线删除,使程

序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

void fun(char *s, int *t)

{ int i, n;

n=0;

for(i=0; ___1___ !=NULL; i++)

if(s[i]>='0'&&s[i]<= ___2___ ) n++;

___3___ ;

}

main()

{ char s[80]="abcdef35adgh3kjsdf7";

int t;

printf("\nThe original string is : %s\n",s);

fun(s,&t);

printf("\nThe result is : %d\n",t);

}

解题思路:

第一处:在for循环中终止值要判断字符串是否结束符,所以

应填:s[i]。

第二处:判断是否是数字,所以应填:'9'。

第三处:字符串中数字字符出现的次数n,并存放在形参t所

指的变量中,所以应填:*t=n。

***************************************************

给定程序MODI1.C中函数fun的功能是:通过某种方式实现两

个变量值的交换,

规定不允许增加语句和表达式。例如变量a 中的值原为8,b

中的值原为3, 程序运行后a 中的值为3,b中的值为8。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main 函数,不得增行或删行,也不得更

改程序的结构!

给定源程序:

#include

int fun(int *x,int y)

{

int t ;

t = x ; x = y ;

return(y) ;

}

main()

{

int a = 3, b = 8 ;

printf("%d %d\n", a, b) ;

b = fun(&a, b) ;

printf("%d %d\n", a, b) ;

}

解题思路:

第一处:由于x是整型指针变量,所以地址不能赋值给整型

变量,因此必须取x地址上的值,所以应改为t=*x;*x=y;。

第二处:已交换后的值存放在t中,所以返回值应为return(t);。

***************************************************

请编写函数fun,它的功能是: 求出 1 到1000 之间能被7

或11整除、但不能同时被7 和11 整除的所有整数并将它们

放在a所指的数组中,通过n 返回这些数的个数。

注意: 部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun

的花括号中填入你编写的若干语句。

给定源程序:

#include

void fun (int *a, int *n)

{

}

main( )

{ int aa[1000], n, k ;

fun ( aa, &n ) ;

for ( k = 0 ; k < n ; k++ )

if((k + 1) % 10 == 0) printf("\n") ;

else printf("%5d", aa[k]) ;

NONO( );

}

解题思路:

本题是利用for循环语句以及取模%运算来得出符合条件的

整数并存入a所指的数组。

参考答案:

void fun (int *a, int *n)

{

int i ;

*n = 0 ;

for(i = 7 ; i < 1000 ; i++)

if(((i % 7) == 0 || (i % 11) == 0) && (i % 77) != 0) a[(*n)++] =

i ;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第29套:

程序通过定义学生结构体变量,存储了学生的学号、姓名和

3门课的成绩。函数fun的功能是对形参b所指结构体变量中

的数据进行修改,最后在主函数中输出修改后的数据。

例如: b所指变量t中的学号、姓名、和三门课的成绩依次是:

10002、

"ZhangQi"、93、85、87,修改后输出t中的数据应为:10004、

" LiJie "、93、

85、87。

请在程序的下划线处填入正确的内容并把下划线删除, 使程

序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

struct student {

long sno;

char name[10];

float score[3];

};

void fun( struct student *b)

{ int i;

b__1__ = 10004;

/

strcpy(b__2__, "LiJie");

}

main()

{ struct student t={10002,"ZhangQi", 93, 85, 87};

int i;

printf("\n\nThe original data :\n");

printf("\nNo: %ld Name: %s\nScores: ",t.sno, https://www.wendangku.net/doc/5e4503253.html,);

for (i=0; i<3; i++) printf("%6.2f ", t.score[i]);

printf("\n");

fun(__3__);

printf("\nThe data after modified :\n");

printf("\nNo: %ld Name: %s\nScores: ",t.sno, https://www.wendangku.net/doc/5e4503253.html,);

for (i=0; i<3; i++) printf("%6.2f ", t.score[i]);

printf("\n");

}

解题思路:

本题是对结构体变量中的值进行修改并通过函数中的参数进行返回。

第一处:对学号进行更改,所以应填:->no。

第二处:对姓名进行更改,所以应填:->name。

第三处:对函数的调用,所以应填:&t。

*************************************************** 给定程序MODI1.C中函数fun的功能是:应用递归算法求形参a的平方根。求平方根的迭代公式如下:

1 a

x1 = ─( x0 + ─)

2 x0

例如,a为2时,平方根值为:1.414214。

请改正程序中的错误,使它能得出正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

给定源程序:

#include

#include

double fun(double a, dounle x0)

{ double x1, y;

x1=(x0+ a/x0)/2.0;

if( fabs(x1-xo)>0.00001 )

y=fun(a,x1);

else y=x1;

return y;

}

main( )

{ double x;

printf("Enter x: "); scanf("%lf",&x);

printf("The square root of %lf is %lf\n",x,fun(x,1.0));

}

解题思路:

第一处: 第二个变量定义的保留字double写错。

第二处: 变量x0错写成xo了。

*************************************************** 学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中, 请编写函数fun,它的功能是:把高于等于平均分的学生数据放在b所指的数组中,高于等于平均分的学生人数通过形参n传回,平均分通过函数值返回。注意: 部分源程序在文件PROG1.C文件中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun 的花括号中填入你编写的若干语句。

给定源程序:

#include

#define N 12

typedef struct

{ char num[10];

double s;

} STREC;

double fun( STREC *a, STREC *b, int *n )

{

}

main()

{ STREC s[N]={{"GA05",85},{"GA03",76},{"GA02",69},{"GA04",85}, {"GA01",91},{"GA07",72},{"GA08",64},{"GA06",87}, {"GA09",60},{"GA11",79},{"GA12",73},{"GA10",90}}; STREC h[N], t;FILE *out ;

int i,j,n; double ave;

ave=fun( s,h,&n );

printf("The %d student data which is higher than %7.3f:\n",n,ave);

for(i=0;i

printf("%s %4.1f\n",h[i].num,h[i].s);

printf("\n");

out = fopen("c:\\test\\out.dat","w") ;

fprintf(out, "%d\n%7.3f\n", n, ave);

for(i=0;i

for(j=i+1;j

if(h[i].s

for(i=0;i

fprintf(out,"%4.1f\n",h[i].s);

fclose(out);

}

解题思路:

本题是计算平均分并把高于平均分的记录存入结构体数组中,最后平均分t通过函数值返回,人数n和符合条件的记录b 由形参传回。

1. 利用for循环计算平均分t。

2. 利用for循环把高于平均分的学生记录存入b中,人数*n加1。

参考答案:

double fun( STREC *a, STREC *b, int *n )

{

double t=0 ;

int i ;

*n = 0 ;

for(i = 0 ; i < N ; i++) t = t + a[i].s ;

t = t / N ;

for(i = 0 ; i < N ; i++) if(a[i].s > t) b[(*n)++] = a[i] ;

return t ;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第30套:

程序通过定义学生结构体变量,存储了学生的学号、姓名和

3门课的成绩。函数fun的功能是将形参a所指结构体变量中的

数据赋给函数中的结构体变量b,并修改b中的学号和姓名,

最后输出修改后的数据。例如:a所指变量中的学号、姓名、

和三门课的成绩依次是:10001、"ZhangSan"、95、80、88,

则修改后输出b中的数据应为:10002、"LiSi"、95、80、88。

请在程序的下划线处填入正确的内容并把下划线删除, 使程

序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

struct student {

long sno;

char name[10];

float score[3];

};

void fun(struct student a)

{ struct student b; int i;

b = __1__;

b.sno = 10002;

strcpy(__2__, "LiSi");

printf("\nThe data after modified :\n");

printf("\nNo: %ld Name: %s\nScores: ",b.sno, https://www.wendangku.net/doc/5e4503253.html,);

for (i=0; i<3; i++) printf("%6.2f ", b.__3__);

printf("\n");

}

main()

{ struct student s={10001,"ZhangSan", 95, 80, 88};

int i;

printf("\n\nThe original data :\n");

printf("\nNo: %ld Name: %s\nScores: ",s.sno, https://www.wendangku.net/doc/5e4503253.html,);

for (i=0; i<3; i++) printf("%6.2f ", s.score[i]);

printf("\n");

fun(s);

}

解题思路:

本题是对结构体变量中的值进行修改。

第一处:要修改的结构体变量是由形参a来传递的,所以应填:

a。

第二处:对结构体中的成员name进行替换,所以应填:

https://www.wendangku.net/doc/5e4503253.html,。

第三处:分别输出结构体中的成绩,所以应填:score[i]。

***************************************************

给定程序MODI1.C中函数fun的功能是:从s所指字符串中删

除所有小写字母c。

请改正程序中的错误,使它能计算出正确的结果。

注意:不要改动main 函数,不得增行或删行,也不得更改

程序的结构!

给定源程序:

#include

void fun( char *s )

{ int i,j;

for(i=j=0; s[i]!='\0'; i++)

if(s[i]!='c')

s[j]=s[i];

s[i]='\0';

}

main()

{ char s[80];

printf("Enter a string: "); gets(s);

printf("The original string: "); puts(s);

fun(s);

printf("The string after deleted : "); puts(s);printf("\n\n");

}

解题思路:

第一处: 新字符串的位置值是由变量j来控制的,但程序中字

符赋值后没有对j进行增量的语句,所以应改为:s[j++]=s[i];。

第二处: 对新字符串添加字符串结束符,由于程序中使用变

量j对新字符串来控制的,所以应改为:s[j]=0;。

假定输入的字符串中只包含字母和*号。请编写函数fun,它

的功能是:将字符串中的前导*号全部移到字符串的尾部。

函数fun中给出的语句仅供参考。

例如,字符串中的内容为:*******A*BC*DEF*G****,移

动后,字符串中的内

容应当是:A*BC*DEF*G***********。在编写函数时, 不得

使用C语言提供的字符串函数。

注意: 部分源程序在文件PROG1.C文件中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun

的花括号中填入你编写的若干语句。

给定源程序:

#include

void fun( char *a )

{

char *p,*q;

int n=0;

p=a;

while(*p=='*') /* 统计串头'*'个数n */

{n++; p++;}

q=a;

/* 向前复制字符串,请填写相应的语句完成其功能*/

for(;n>0;n--) /* 在串尾补n个'*' */

*q++='*';

*q='\0';

}

main()

{ char s[81],*p; int n=0;

printf("Enter a string:\n");gets(s);

fun( s );

printf("The string after moveing:\n");puts(s);

NONO();

}

解题思路:

本题是考察字符串的移动。具体操作请看参考源程序。

参考答案:

void fun( char *a )

{

char *p,*q;

int n=0;

p=a;

while(*p=='*') /* 统计串头'*'个数n */

{n++; p++;}

q=a;

/* 向前复制字符串,请填写相应的语句完成其功能*/

while(*p) {

*q=*p;

p++;q++;

}

for(;n>0;n--) /* 在串尾补n个'*' */

*q++='*';

*q='\0';

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第31套:

给定程序中,函数fun的功能是:对形参s所指字符串中下标

为奇数的字符按ASCII码大小递增排序,并将排序后下标为

奇数的字符取出,存入形参p所指字符数组中,形成一个新

串。

例如,形参s所指的字符串为:baawrskjghzlicda,执行后p所

指字符数组中的字符串应为:aachjlsw。

请在程序的下划线处填入正确的内容并把下划线删除,使程

序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

void fun(char *s, char *p)

{ int i, j, n, x, t;

n=0;

for(i=0; s[i]!='\0'; i++) n++;

for(i=1; i

___1___;

for(j=___2___+2 ; j

if(s[t]>s[j]) t=j;

if(t!=i)

{ x=s[i]; s[i]=s[t]; s[t]=x; }

}

for(i=1,j=0; i

/

p[j]=___3___;

}

main()

{ char s[80]="baawrskjghzlicda", p[50];

printf("\nThe original string is : %s\n",s);

fun(s,p);

printf("\nThe result is : %s\n",p);

}

解题思路:

第一处:取外循环的控制变量,所以应填:t=i。

第二处:内循环的起始变量,应该是i+2,所以应填:i。

第三处:新字符串处理完后应添加字符串结束符,所以应填:

'\0'。

***************************************************

给定程序MODI1.C中函数fun 的功能是:用下面的公式求π

的近似值,直到最后一项的绝对值小于指定的数(参数num )

为止:

π 1 1 1

┄┄≈1 - ┄┄+ ┄┄- ┄┄+ ...

4 3

5 7

例如, 程序运行后, 输入0.0001, 则程序输出3.1414。

请改正程序中的错误,使它能输出正确的结果。

注意:不要改动main 函数,不得增行或删行,也不得更改

程序的结构!

给定源程序:

#include

#include

float fun ( float num )

{ int s ;

float n, t, pi ;

t = 1 ; pi = 0 ; n = 1 ; s = 1 ;

while(t >= num)

{

pi = pi + t ;

n = n + 2 ;

s = -s ;

t = s % n ;

}

pi = pi * 4 ;

return pi ;

}

main( )

{ float n1, n2 ;

printf("Enter a float number: ") ;

scanf("%f", &n1) ;

n2 = fun(n1) ;

printf("%6.4f\n", n2) ;

}

解题思路:

数,那么应改为while(fabs(t)>=num)。

第二处:t是s除以n的值,而不是取余数,所以应改t=s/n;。*************************************************** 请编写一个函数void fun (char a[],char b[],int n),其功能是:删除一个字符串中指定下标的字符。其中, a指向原字符串, 删除指定字符后的字符串存放在b所指的数组中,n中存放指定的下标。

例如,输入一个字符串: World,然后输入3,则调用该函数后的结果为: Word。

注意: 部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun 的花括号中填入你编写的若干语句。

给定源程序:

#include

#include

#define LEN 20

void fun (char a[], char b[], int n)

{

}

main( )

{ char str1[LEN], str2[LEN] ;

int n ;

printf("Enter the string:\n") ;

gets(str1) ;

printf("Enter the position of the string deleted:") ;

scanf("%d", &n) ;

fun(str1, str2, n) ;

printf("The new string is: %s\n", str2) ;

NONO() ;

}

解题思路:

本题是利用字符串拷贝和字符串连接来生成新的字符串。

参考答案:

void fun (char a[], char b[], int n)

{

strncpy(b, a, n) ;

b[n] = 0 ;

strcat(b, a + n + 1) ;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第32套:给定程序中,函数fun的功能是:在形参ss所指字符串数组中,将所有串长超过k的字符串中右边的字符删除,只保留左边的k个字符。ss所指字符串数组中共有N个字符串,且串长小于M。请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

#define N 5

#define M 10

void fun(char (*ss) __1__, int k)

{ int i=0 ;

while(i< __2__) {

ss[i][k]=__3__; i++; }

}

main()

{ char x[N][M]={"Create","Modify","Sort","skip","Delete"};

int i;

printf("\nThe original string\n\n");

for(i=0;i

fun(x,4);

printf("\nThe string after deleted :\n\n");

for(i=0; i

}

解题思路:

本题是根据给定的字符串数组中删除串长大于某个值的右边字符串。

第一处:函数的定义,试题中已用M作为字符串的长度,所以应填:M。

第二处:利用while循环,分别对字符串数组中的每个字符串置字符串结束符,程序中已经给定了N个字符串,所以应填:N。

第三处:置字符串结束符,所以应填:0(或'\0')。

*************************************************** 给定程序MODI1.C中函数fun的功能是:根据以下公式求π值,并作为函数值返回。

例如,给指定精度的变量eps输入0.0005时,应当输出Pi=3.140578。

π 1 1 2 1 2 3 1 2 3 4

─=1+ ─+ ─×─+ ─×─×─+ ─×─×─×─+……

2 3 3 5 3 5 7 3 5 7 9

请改正程序中的错误,使它能得出正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

给定源程序:

#include

#include

double fun(double eps)

{ double s,t; int n=1;

s=0.0;

t=0;

while( t>eps)

{ s+=t;

t=t * n/(2*n+1);

n++;

}

return(s);

}

main()

{ double x;

printf("\nPlease enter a precision: "); scanf("%lf",&x);

printf("\neps=%lf, Pi=%lf\n\n",x,fun(x));

} 第一处: 初始化t的值,根据程序中的计算程序和试题的要求

得出,t应为1。

第二处: 根据公式π/2得出,所以返回时应原有s的基础上乘

以2作为返回值。

***************************************************

假定输入的字符串中只包含字母和*号。请编写函数fun,它

的功能是:使字符串的前导*号不得多于n个;若多于n个,则

删除多余的*号; 若少于或等于n个,则什么也不做,字符串中

间和尾部的*号不删除。函数fun中给出的语句仅供参考。例

如,字符串中的内容为:*******A*BC*DEF*G****,若n的

值为4,删除后,

字符串中的内容应当是:****A*BC*DEF*G****;若n的值

为8,则字符串中的内容仍

为:*******A*BC*DEF*G****。n的值在主函数中输入。在

编写函数时,不得使用C语言提供的字符串函数。

注意: 部分源程序在文件PROG1.C文件中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun

的花括号中填入

你编写的若干语句。

给定源程序:

#include

void fun( char *a, int n )

{

int i=0,j,k=0;

while(a[k]=='*') k++; /* k为统计*字符个数*/

if(k>n)

{

i=n;j=k;

/* 以下完成将下标为k至串尾的字符前移k-n个位置*/

}

}

main()

{ char s[81]; int n;

printf("Enter a string:\n");gets(s);

printf("Enter n : ");scanf("%d",&n);

fun( s,n );

printf("The string after deleted:\n");puts(s);

NONO();

}

解题思路:

本题是考察字符串的操作。

利用for循环来判断a[j]的字符是否是字符串结束符,如果不

是字符串结束符,则把a[j]

的字符依次存放到a[i]。其中,变量i是n的初始值,变量j是字

符串前导的*号数。

参考答案:

void fun( char *a, int n )

{

int i=0,j,k=0;

while(a[k]=='*') k++; /* k为统计*字符个数*/

if(k>n)

{

i=n;j=k;

/* 以下完成将下标为k至串尾的字符前移k-n个位置*/

for(; a[j] !=0 ; j++)

a[i++]=a[j];

a[i] = 0;

}

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第33套:

给定程序的功能是:调用函数fun将指定源文件中的内容复制

到指定的目标文件中,复制成功时函数返回值为1,失败时

返回值为0。在复制的过程中,把复制的内容输出到终端屏

幕。主函数中源文件名放在变量sfname中,目标文件名放在

变量tfname中。

请在程序的下划线处填入正确的内容并把下划线删除,使程

序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

int fun(char *source, char *target)

{ FILE *fs,*ft; char ch;

if((fs=fopen(source, ___1___))==NULL)

return 0;

if((ft=fopen(target, "w"))==NULL)

return 0;

printf("\nThe data in file :\n");

ch=fgetc(fs);

while(!feof(___2___))

{ putchar( ch );

fputc(ch,___3___);

ch=fgetc(fs);

}

fclose(fs); fclose(ft);

printf("\n\n");

return 1;

}

main()

{ char sfname[20] ="myfile1",tfname[20]="myfile2";

FILE *myf; int i; char c;

myf=fopen(sfname,"w");

printf("\nThe original data :\n");

for(i=1; i<30; i++){ c='A'+rand()%25;fprintf(myf,"%c",c);

printf("%c",c); }

fclose(myf);printf("\n\n");

if (fun(sfname, tfname)) printf("Succeed!");

else printf("Fail!");

}

解题思路:

本题要求是把一个文件中的内容复制到另一个文件中。程序

中共有三处要填上适当的内容,使程序能运行出正确的结

果。

第一处:要求打开一个读方式的源文件,因此可以填上"r"或

"r+"。打开读文件操作的流是fs。

第二处:用while循环来判断源文件是否已读到文件结束符,

int feof(FILE *stream),因

此,此处只能填写fs。

第三处:把已经读取的字符写入目标文件中,打开写文件操

作的流是ft,因此,此处只能填写ft。

***************************************************

给定程序MODI1.C中函数fun的功能是:将长整型数中每一位

上为偶数的数依次取出,构成一个新数放在t中。高位仍在

高位,低位仍在低位。例如,当s中的数为:87653142时,t

中的数为:8642。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程

序的结构!

给定源程序:

#include

void fun (long s, long *t)

{ int d;

long sl=1;

*t = 0;

while ( s > 0)

{ d = s%10;

if (d%2=0)

{ *t=d* sl+ *t;

sl *= 10;

}

s \= 10;

}

}

main()

{ long s, t;

printf("\nPlease enter s:"); scanf("%ld", &s);

fun(s, &t);

printf("The result is: %ld\n", t);

}

解题思路:

第一处:判断相等的条件是==。

第二处:整除的符号是/。

***************************************************

函数fun的功能是:将两个两位数的正整数a、b合并形成一个

整数放在c中。合并的方式是:将a数的十位和个位数依次放

在c数的十位和千位上,b数的十位和个位数依次放在c数的

百位和个位上。

例如,当a=45,b=12时,调用该函数后,c=5142。

注意: 部分源程序存在文件PROG1.C中。数据文件IN.DA T中

的数据不得修改。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun

的花括号中填入你编写的若干语句。

给定源程序:

#include

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);

NONO();

}

解题思路:

本题是给出两个两位数的正整数分别取出各位上的数字,再

按条件组成一个新数。

取a十位数字的方法:a/10

取a个位数字的方法:a%10

参考答案:

void fun(int a, int b, long *c)

{

*c=(a%10)*1000+(b/10)*100+(a/10)*10+(b%10);

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第34套:

用筛选法可得到2~n(n<10000)之间的所有素数,方法是:

首先从素数2开始,将所有2的倍数的数从数表中删去(把数表

中相应位置的值置成0);接着从数

表中找下一个非0数,并从数表中删去该数的所有倍数;依

此类推,直到所找的下一个数等于n为止。这样会得到一个序

列:

2,3,5,7,11,13,17,19,23,……函数fun用筛选法

找出所有小于等于n的素数,并统计素数的个数作为函数值

返回。

请在程序的下划线处填入正确的内容并把下划线删除,使程

序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

int fun(int n)

{ int a[10000], i,j, count=0;

for (i=2; i<=n; i++) a[i] = i;

i = 2;

while (i

for (j=a[i]*2; j<=n; j+=___1___)

a[j] = 0;

i++;

while (___2___==0)

i++;

}

printf("\nThe prime number between 2 to %d\n", n);

for (i=2; i<=n; i++)

if (a[i]!=___3___)

{ count++; printf( count%15?"%5d":"\n%5d",a[i]); }

return count;

}

main()

{ int n=20, r;

r = fun(n);

printf("\nThe number of prime is : %d\n", r);

}

解题思路:

第一处:所有2的倍数的数从数表中删去,所以应填:a[i]。第二处:找出下一个不是的a[i],所以应填:a[i]。

第三处:输出素数,只要判断a[i]不是0就是素数,所以应填:0。

*************************************************** 给定程序MODI1.C中函数fun的功能是: 为一个偶数寻找两个素数, 这两个素数之和等于该偶数,并将这两个素数通过形参指针传回主函数。

请改正函数fun中指定部位的错误, 使它能得出正确的结果。注意: 不要改动main函数, 不得增行或删行, 也不得更改程序的结构!

给定源程序:

#include

#include

void fun(int a,int *b,int *c)

{ int i,j,d,y;

for(i=3;i<=a/2;i=i+2) {

Y=1;

for(j=2;j<=sqrt((double)i);j++)

if(i%j==0) y=0;

if(y==1) {

d==a-i;

for(j=2;j<=sqrt((double)d);j++)

if(d%j==0) y=0;

if(y==1)

{ *b=i; *c=d; }

}

}

}

main()

{ int a,b,c;

do

{ printf("\nInput a: "); scanf("%d",&a); }

while(a%2);

fun(a,&b,&c);

printf("\n\n%d = %d + %d\n",a,b,c);

}

解题思路:

第一处:变量y错写成Y。

第二处:给变量d进行赋值,所以应改为:d=a-i;。

*************************************************** 请编写函数fun, 它的功能是:计算并输出n(包括n)以内能被5或9整除的所有自然数的倒数之和。

例如,在主函数中从键盘给n输入20后, 输出为: s=0.583333。注意: 要求n的值不大于100。

部分源程序在文件PROG1.C中。

请勿改动主函数main和其他函数中的任何内容, 仅在函数fun的花括号中填入你编写的若干语句。

给定源程序:

#include

double fun(int n)

{

}

main()

{ int n; double s;

printf("\nInput n: "); scanf("%d",&n);

s=fun(n);

printf("\n\ns=%f\n",s);

NONO();

}

解题思路:

本题是计算n(包括n)以内能被5或9整除的所有自然数的倒数之和。

参考答案:

double fun(int n)

{

int i;

double sum=0.0;

for(i=1; i<=n; i++)

if(i%5 == 0 || i%9 == 0) /* 被5或9整除*/

sum+=1.0/i;

return sum;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第35套:

给定程序中,函数fun的功能是建立一个N×N的矩阵。矩阵元素的构成规律是:最外层元素的值全部为1;从外向内第2层元素的值全部为2;第3层元素的值

全部为3,…依次类推。例如,若N=5,生成的矩阵为:

1 1 1 1 1

1 2 2 2 1

1 2 3 2 1

1 2 2 2 1

1 1 1 1 1

请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#define N 7

void fun(int (*a) __1__)

{ int i,j,k,m;

if(N%2==0) m=N/2 ;

else m=N/2+1;

for(i=0; i

for(j= __2__ ; j

a[i][j]=a[N-i-1][j]=i+1;

for(k=i+1; k

a[k][i]=a[k][N-i-1]= __3__;

}

} main()

{ int x[N][N]={0},i,j;

fun(x);

printf("\nThe result is:\n");

for(i=0; i

{ for(j=0; j

printf("\n");

}

}

解题思路:

第一处:建立一个N×N的矩阵,所以应填:[N]。

第二处:j的起始变量值应i。

第三处:也应该填写i+1。

***************************************************

给定程序MODI1.C中函数fun 的功能是: 将十进制正整数

m转换成k(2≤k≤9) 进制数, 并按高位到低位顺序输出。

例如,若输入8和2,则应输出1000(即十进制数8转换成二进制

表示是1000)。

请改正fun 函数中的错误,使它能得出正确的结果。

注意:不要改动main 函数。不得增行或删行,也不得更改

程序的结构!

给定源程序:

#include

#include

void fun( int m, int k )

{

int aa[20], i;

for( i = 0; m; i++ )

{

aa[i] = m/k;

m /= k;

}

for( ; i; i-- )

printf( "%d", aa[ i ] );

}

main()

{

int b, n;

printf( "\nPlease enter a number and a base:\n" );

scanf( "%d %d", &n, &b );

fun( n, b );

printf("\n");

}

解题思路:

第一处:应该取模而不是整除,所以应为:aa[i]=m%k;。

第二处:输出aa的位置不正确,所以应为:

printf("%d",aa[i-1]);。

***************************************************

编写一个函数,从num个字符串中找出最长的一个字符串,并

通过形参指针max传回该串地址。(注意: 主函数中用****作

为结束输入的标志,函数fun中给出的语句仅供参考。)

注意:部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun

的花括号中填入你编写的若干语句。

给定源程序:

#include

#include

fun(char(*a)[81],int num,char **max)

{

int i,k=0,len, maxlen; /* k为a数组中最长串所在元素的下标,

初始为0,maxlen为其串

长*/

maxlen=strlen(a[k]);

for(i=1;i

{

/* 以下完成查找最长串*/

}

*max=a[k];

}

main()

{

char ss[10][81],*ps;

int n,i=0;

printf("输入若干个字符串:");

gets(ss[i]);

puts(ss[i]);

while(!strcmp(ss[i],"****")==0)

{

i++;

gets(ss[i]);

puts(ss[i]);

}

n=i;

fun(ss,n,&ps);

printf("\nmax=%s\n",ps);

NONO();

}

解题思路:

本题是考察考生怎样从已输入的字符串中找出长度最大的

字符串。求字符串的长度可以使用strlen函数。

参考答案:

fun(char(*a)[81],int num,char **max)

{

int i,k=0,maxlen; /* k为a数组中最长串所在元素的下标,初始

为0,maxlen为其串长*/

maxlen=strlen(a[k]);

for(i=1;i

{

/* 以下完成查找最长串*/

if(strlen(a[i]) > maxlen) {

maxlen = strlen(a[i]) ;

k = i ;

}

}

*max=a[k];

}

第36套:

给定程序中,函数fun的功能是:统计出带有头结点的单向链表

中结点的个数, 存放在形参n所指的存储单元中。

请在程序的下划线处填入正确的内容并把下划线删除,使程

序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

#define N 8

typedef struct list

{ int data;

struct list *next;

} SLIST;

SLIST *creatlist(int *a);

void outlist(SLIST *);

void fun( SLIST *h, int *n)

{ SLIST *p;

___1___=0;

p=h->next;

while(p)

{ (*n)++;

p=p->___2___;

}

}

main()

{ SLIST *head;

int a[N]={12,87,45,32,91,16,20,48}, num;

head=creatlist(a); outlist(head);

fun(___3___, &num);

printf("\nnumber=%d\n",num);

}

SLIST *creatlist(int a[])

{ SLIST *h,*p,*q; int i;

h=p=(SLIST *)malloc(sizeof(SLIST));

for(i=0; i

{ q=(SLIST *)malloc(sizeof(SLIST));

q->data=a[i]; p->next=q; p=q;

}

p->next=0;

return h;

}

void outlist(SLIST *h)

{ SLIST *p;

p=h->next;

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");

}

}

解题思路:

本题是要求统计出带有头结点的单向链表中结点的个数。

第一处:对n所指的存储单元进行初始化,所以应填:*n。

第二处:指向p的下一个结点,所以应填:next。

第三处:函数调用,在主函数中已经给出了head,所以应填:

head。

***************************************************

给定程序MODI1.C中函数fun的功能是:求出s所指字符串中

最后一次出现的t 所指子字符串的地址,通过函数值返回,

在主函数中输出从此地址开始的字符串; 若未找到,则函数

值为NULL。

例如,当字符串中的内容为:"abcdabfabcdx",t中的内容为:

"ab"时,

输出结果应是:abcdx。当字符串中的内容为:

"abcdabfabcdx",t中的内容为:"abd"时,则程序输出未找到

信息:not be found!。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程

序的结构!

给定源程序:

#include

#include

char * fun (char *s, char *t )

{

char *p , *r, *a;

a = Null;

while ( *s )

{ p = s; r = t;

while ( *r )

if ( r == p )

{ r++; p++; }

else break;

if ( *r == '\0' ) a = s;

s++;

}

return a ;

}

main()

{

char s[100], t[100], *p;

printf("\nPlease enter string S :"); scanf("%s", s );

printf("\nPlease enter substring t :"); scanf("%s", t );

p = fun( s, t );

if ( p ) printf("\nThe result is : %s\n", p);

else printf("\nNot found !\n" );

}

解题思路:

第一处:指向空指针错误,Null应NULL。

第二处:比较指针位置的值是否相等,所以应改为:

if(*r==*p)。

***************************************************

函数fun的功能是:将s所指字符串中除了下标为偶数、同时

ASCII值也为偶数的字符外,其余的全都删除;串中剩余字符

所形成的一个新串放在t所指的数组中。例如,若s所指字符串中的内容为:"ABCDEFG123456",其中字符A的ASCII码值为奇数,因此应当删除;其中字符B的ASCII码值为偶数,但在数组中的下标为

奇数,因此也应当删除;而字符2的ASCII码值为偶数,所在数组中的下标也为偶数,因此不应当删除,其它依此类推。最后t所指的数组中的内容应是:"246"。

注意: 部分源程序存在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun 的花括号中填入

你编写的若干语句。

给定源程序:

#include

#include

void fun(char *s, char t[])

{

}

main()

{

char s[100], t[100];

printf("\nPlease enter string S:"); scanf("%s", s);

fun(s, t);

printf("\nThe result is: %s\n", t);

NONO();

}

解题思路:

本题是从一个字符串按要求生成另一个新的字符串。我们使用for循环语句来解决这个问题。

参考答案:

void fun(char *s, char t[])

{

int i, j = 0 ;

for(i = 0 ; i < strlen(s) ; i += 2)

if(s[i] % 2 == 0) t[j++] = s[i] ;

t[j] = 0 ;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第37套:

给定程序中,函数fun的功能是:在形参ss所指字符串数组中,查找含有形参substr所指子串的所有字符串并输出,若没找到则输出相应信息。ss所指字符串数组中共有N个字符串,且串长小于M。程序中库函数strstr(s1, s2)的功能是在s1串中查找s2子串,若没有,函数值为0,若有,为非0。

请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

#define N 5

#define M 15

void fun(char (*ss)[M], char *substr)

{ int i,find=0;

for(i=0; i< __1__ ; i++)

if( strstr(ss[i], __2__) != NULL )

{ find=1; puts(ss[i]); printf("\n"); }

if (find==__3__) printf("\nDon't found!\n");

}

main()

{ char x[N][M]={"BASIC","C langwage","Java","QBASIC","Access"},str[M];

int i;

printf("\nThe original string\n\n");

for(i=0;i

printf("\nEnter a string for search : "); gets(str);

fun(x,str);

}

解题思路:

本题是根据给定的字符串数组中查找指定的字符串,如果存在,则显示。

第一处:利用for循环,从几个字符串中进行查找,程序中已经给定了N个字符串,所以应填:N。

第二处:查找子串,子串由形参substr传递,所以应填:substr。第三处:试题要求,若没有找到,函数值为0,所以应填:0。*************************************************** 给定程序MODI1.C中函数fun的功能是:求三个数的最小公倍数。

例如,给主函数中的变量x1、x2、x3分别输入15 11 2,

则输出结果应当是:330。

请改正程序中的错误,使它能得出正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

给定源程序:

#include

fun(int x, y, z )

{ int j,t ,n ,m;

j = 1 ;

t=j%x;

m=j%y ;

n=j%z;

while(t!=0||m!=0||n!=0)

{ j = j+1;

t=j%x;

m=j%y;

n=j%z;

}

return i;

}

main( )

{ int x1,x2,x3,j ;

printf("Input x1 x2 x3: "); scanf("%d%d%d",&x1,&x2,&x3); printf("x1=%d, x2=%d, x3=%d \n",x1,x2,x3);

j=fun(x1,x2,x3);

printf("The minimal common multiple is : %d\n",j);

} 第一处: 函数中形参的定义不正确,应改为:fun(int x,int y, int

z)。

第二处: 程序中三个数的最小公倍数是用j处理的,所以应返

回j的值。

***************************************************

假定输入的字符串中只包含字母和*号。请编写函数fun,它

的功能是:只删除字符串前导和尾部的*号,串中字母之间的*

号都不删除。形参n给出了字符串的长度, 形参h给出了字符

串中前导*号的个数,形参e给出了字符串中最后*号的个数。

在编写函数时,不得使用C语言提供的字符串函数。

例如,字符串中的内容为:****A*BC*DEF*G*******,删

除后,字符串中的内容应当是:A*BC*DEF*G。

注意: 部分源程序在文件PROG1.C文件中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun

的花括号中填入你编写的若干语句。

给定源程序:

#include

void fun( char *a, int n,int h,int e )

{

}

main()

{ char s[81],*t,*f; int m=0, tn=0, fn=0;

printf("Enter a string:\n");gets(s);

t=f=s;

while(*t){t++;m++;}

t--;

while(*t=='*'){t--;tn++;}

while(*f=='*'){f++;fn++;}

fun( s , m,fn,tn );

printf("The string after deleted:\n");puts(s);

NONO();

}

解题思路:

本题是考察对字符串的操作。

1. 求出字符串的长度。

2. 利用循环把字符串中字符按要求仍存放在原字符串首址

开始的位置上。

参考答案:

void fun( char *a, int n,int h,int e )

{

char *p=a ;

int j=0,len=0;

while(*p) {p++; len++;}

while(j

a[j]=a[h+j];

j++;

}

a[j]=0;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第38套:

函数fun的功能是:把形参a所指数组中的奇数按原顺序依次

存放到a[0]、

a[1]、a[2]、……中,把偶数从数组中删除,奇数个数通过函

数值返回。例如:若a所指数组中的数据最初排列为:9、1、

4、2、3、6、

5、8、7,删除偶数后a 所指数组中的数据为:

9、1、3、5、7,返回值为5。

请在程序的下划线处填入正确的内容并把下划线删除,使程

序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#define N 9

int fun(int a[], int n)

{ int i,j;

j = 0;

for (i=0; i

if (a[i]%2==___1___)

{

a[j] = a[i]; ___2___;

}

return ___3___;

}

main()

{ int b[N]={9,1,4,2,3,6,5,8,7}, i, n;

printf("\nThe original data :\n");

for (i=0; i

printf("\n");

n = fun(b, N);

printf("\nThe number of odd : %d \n", n);

printf("\nThe odd number :\n");

for (i=0; i

printf("\n");

}

解题思路:

第一处:判断a[i]是否是奇数,若是,则仍保留在原数组中a[j],

所以应填:1。

第二处:数组a中的元素位置由j来控制,每增加一个元素,

则j加1,所以应填:j++。

第三处:返回删除偶数后a所指数组中数据的元素j,所以应

填:j。

***************************************************

给定程序MODI1.C中函数fun的功能是:求出两个非零正整数

的最大公约数,并作为函数值返回。

例如,若给num1和num2分别输入49和21,则输出的最大公

约数为7;若给num1

和num2分别输入27和81,则输出的最大公约数为27。

请改正程序中的错误,使它能得出正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程

序的结构。

给定源程序:

#include

int fun(int a,int b)

{ int r,t;

if(a

t=a; b=a; a=t;

}

r=a%b;

while(r!=0)

{ a=b; b=r; r=a%b; }

return(a);

}

main()

{ int num1, num2,a;

printf("Input num1 num2: "); scanf("%d%d",&num1,&num2);

printf("num1= %d num2= %d\n\n",num1,num2);

a=fun(num1,num2);

printf("The maximun common divisor is %d\n\n",a);

}

解题思路:

第一处:交换值的次序有问题,所以应改为:t=a;a=b;b=t;。

第二处:返回值错误,应改为:return(b);。

***************************************************

假定输入的字符串中只包含字母和*号。请编写函数fun,它

的功能是:删除字符串中所有的*号。在编写函数时,不得

使用C语言提供的字符串函数。

例如,字符串中的内容为:****A*BC*DEF*G*******,删

除后,字符串中的内容应当是:ABCDEFG。

注意: 部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun

的花括号中填入

你编写的若干语句。

给定源程序:

#include

void fun( char *a )

{

}

main()

{ char s[81];

printf("Enter a string:\n");gets(s);

fun( s );

printf("The string after deleted:\n");puts(s);

NONO();

}

解题思路:

本题是考察字符串的操作。

1. 利用循环扫描字符串中所有的字符是否是'*',如果不是

'*',则把这些字符存放字符串a首地址开始的位置上。

2. 最后给字符串a加上结束符。

参考答案:

void fun( char *a )

{

int j =0 ;

char *p=a;

while(*p) {

if(*p != '*') a[j++]=*p ;

p++ ;

}

a[j]=0;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第39套:

给定程序中,函数fun的功能是:在形参ss所指字符串数组中,

删除所有串长超过k的字符串,函数返回所剩字符串的个数。

ss所指字符串数组中共有N个字符串,且串长小于M。

请在程序的下划线处填入正确的内容并把下划线删除, 使程

序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

#define N 5

#define M 10

int fun(char (*ss)[M], int k)

{ int i,j=0,len;

for(i=0; i< __1__ ; i++)

{ len=strlen(ss[i]);

if(len<= __2__)

strcpy(ss[j++],__3__);

}

return j;

}

main()

{ char

x[N][M]={"Beijing","Shanghai","Tianjing","Nanjing","Wuhan"

};

int i,f;

printf("\nThe original string\n\n");

for(i=0;i

f=fun(x,7);

printf("The string witch length is less than or equal to 7 :\n");

for(i=0; i

}

解题思路:

本题是根据给定的字符串数组中删除串长大于某个值的字

符串。

第一处:利用for循环,从几个字符串中进行查找,程序中已

经给定了N个字符串,所以应填:N。

第二处:串长由形参k来传递,所以应填:k。

第三处:如果字符串ss[i]的串长小于k,则该字符串仍存在原

字符串数组中,位置由变量j 来控制,所以应填:ss[i]。

***************************************************

给定程序MODI1.C中函数fun的功能是:逐个比较p、q所指两

个字符串对应位置中的字符,把ASCII值大或相等的字符依

次存放到c所指数组中,形成一个新的字符串。

例如,若主函数中a字符串为:aBCDeFgH,

主函数中b字符串为:ABcd,

则c中的字符串应为:aBcdeFgH。

请改正程序中的错误,使它能得出正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程

序的结构。

给定源程序:

#include

#include

void fun(char *p ,char *q, char *c)

{

int k = 1;

while( *p != *q )

{ if( *p<*q ) c[k]=*q;

else c[k]=*p;

if(*p) p++;

if(*q) q++;

k++;

}

}

main()

{ char a[10]="aBCDeFgH", b[10]="ABcd", c[80]={'\0'};

fun(a,b,c);

printf("The string a: "); puts(a);

printf("The string b: "); puts(b);

printf("The result : "); puts(c);

}

解题思路:

第一处: 存放字符串初始位置也是从0开始存放的,由于k是控制c字符串的位置值,所以k值应为0。

第二处: 判断两个字符串中是否有字符串结束符产生,所以应改为:while( *p || *q ),

而不是两字符串中对应位置的值不相等。

*************************************************** 假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:除了字符串前导的*号之外,将串中其它*号全部删除。在编写函数时,不得使用C语言提供

的字符串函数。函数fun中给出的语句仅供参考。

例如,字符串中的内容为:****A*BC*DEF*G*******,删除后, 字符串中的内容应当是:****ABCDEFG。

注意: 部分源程序在文件PROG1.C文件中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun 的花括号中填入你编写的若干语句。

给定源程序:

#include

void fun( char *a )

{

int i=0,k;

while(a[i]=='*') i++;

k=i+1;

while(a[i]!='\0') /* 以下程序段实现非*字符前移*/

{

}

a[i+1]='\0';

}

main()

{ char s[81];

printf("Enter a string:\n");gets(s);

fun( s );

printf("The string after deleted:\n");puts(s);

NONO();

}

解题思路:

本题是考察字符串的操作。

1. 使用while循环语句求出字符串前导*号的个数。

2. 使用while循环语句判断a[i]是否是字符串结束符标志,如果不是字符串结束标志,则再判断是否是字符*号,如果不是*号,则把a[i]字符存入a[k]中,如果是*号则跳过该*号,直至字符串结束为止。

参考答案:

void fun( char *a )

{

int i=0,k;

while(a[i]=='*') i++;

k=i;

while(a[i]!='\0') /* 以下程序段实现非*字符前移*/

{

if(a[i] != '*') a[k++]=a[i];

i++;

}

a[k]='\0';

}

※※※※※※※※※※※※※※※※※※※※※※※※※第40套:

给定程序中已建立一个带有头结点的单向链表,链表中的各结点按结点数据域中的数据递增有序链接。函数fun的功能是:把形参x的值放入一个新结点并插入到链表中,插入后各结点数据域的值仍保持递增有序。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

#define N 8

typedef struct list

{ int data;

struct list *next;

} SLIST;

void fun( SLIST *h, int x)

{ SLIST *p, *q, *s;

s=(SLIST *)malloc(sizeof(SLIST));

s->data=___1___;

q=h;

p=h->next;

while(p!=NULL && x>p->data) {

q=___2___;

p=p->next;

}

s->next=p;

q->next=___3___; }

SLIST *creatlist(int *a)

{ SLIST *h,*p,*q; int i;

h=p=(SLIST *)malloc(sizeof(SLIST));

for(i=0; i

{ q=(SLIST *)malloc(sizeof(SLIST));

q->data=a[i]; p->next=q; p=q;

}

p->next=0;

return h;

}

void outlist(SLIST *h)

{ SLIST *p;

p=h->next;

if (p==NULL) printf("\nThe list is NULL!\n");

else

{ printf("\nHead");

do { printf("->%d",p->data); p=p->next; } while(p!=NULL);

printf("->End\n");

}

}

main()

{ SLIST *head; int x;

int a[N]={11,12,15,18,19,22,25,29};

head=creatlist(a);

printf("\nThe list before inserting:\n"); outlist(head);

printf("\nEnter a number : "); scanf("%d",&x);

fun(head,x);

printf("\nThe list after inserting:\n"); outlist(head);

}

解题思路:

本题是要求在一个有序的链表中插入一个数,插入后各结点

仍然是有序的。程序中共有三要填上适当的内容,使程序能

运行出正确的结果。

第一处:在函数fun的开始处,已经对结构指针s分配了内存,

其中data是一个整型变量,实际要求填入一个整型数据。根

据本题要求在一个链表插入一个整型数,该数已通过函数的

形参x传入,因此应填x。

第二处:使用一个while循环找出要插入一个数的位置,在循

环体中q实际上保留当前链表p位置的临时变量,如果

x>p->data时,那么再移动链表指针到下一个结果,再进行判

断是否符合条件,如果仍大于,则仍q保留链表p的位置。因

此,此处应填p。

第三处:当找到结点位置后,就要插入这个数,完成插入过

程。由于函数体中分配了结构指针s,s的next指针已经指向

了p,所以,当前位置q的next指针就应该指向指针s完成链表

的链接。因此,此处应填s。

***************************************************

给定程序MODI1.C中函数fun的功能是:计算正整数num的各

位上的数字之积。

例如,若输入:252,则输出应该是:20。若输入:202,则

输出应该是:0。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程

序的结构!

给定源程序:

#include

long fun (long num)

{

long k;

do

{ k*=num%10 ;

num\=10 ;

} while(num) ;

return (k) ;

}

main( )

{ long n ;

printf("\Please enter a number:") ; scanf("%ld",&n) ;

printf("\n%ld\n",fun(n)) ;

}

解题思路:

第一处:由于在k定义时没有赋初值,所以k是一个随机数,

根据试题要求,k应赋值为1。

第二处:整除的符号是/。

***************************************************

请编写一个函数fun,它的功能是:计算n门课程的平均分,

计算结果作为函数值返回。

例如:若有5门课程的成绩是:90.5, 72, 80, 61.5, 55 则函数

的值为:71.80。

注意: 部分源程序存在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun

的花括号中填入

你编写的若干语句。

给定源程序:

#include

float fun ( float *a , int n )

{

}

main()

{ float score[30]={90.5, 72, 80, 61.5, 55}, aver;

aver = fun( score, 5 );

printf( "\nAverage score is: %5.2f\n", aver);

NONO ( );

}

解题思路:

本题是使用循环来计算平均值且结果由函数值返回。

参考答案:

float fun ( float *a , int n )

{

int i;

float ave=0.0;

for(i=0; i

ave=ave/n;

return ave;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第41套:

给定程序中,函数fun的功能是:计算x所指数组中N个数的

平均值(规定所有数均为正数),平均值通过形参返回主函数,

将小于平均值且最接近平均值的数作为函数值返回,在主函

数中输出。

例如,有10个正数:46 30 32 40 6 17 45 15 48 26,平均值为:

30.500000

主函数中输出:m=30.0

请在程序的下划线处填入正确的内容并把下划线删除,使程

序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#define N 10

double fun(double x[],double *av)

{ int i,j; double d,s;

s=0;

for(i=0; i

__1__=s/N;

d=32767;

for(i=0; i

if(x[i]<*av && *av - x[i]<=d){

d=*av-x[i]; j=__2__;}

return __3__;

}

main()

{ int i; double x[N],av,m;

for(i=0; i

printf("\n");

m=fun(x,&av);

printf("\nThe average is: %f\n",av);

printf("m=%5.1f ",m);

printf("\n");

}

解题思路:

第一处:计算好的平均值通过形参av返回,所以应填:*av。

第二处:计算小于平均值且最接近平均值的位置j,所以应填:

i。

第三处:返回该数,所以应填:x[j]。

***************************************************

给定程序MODI1.C中函数fun的功能是:根据整型形参n,计

算如下公式的值。例如,若n=10,则应输出:0.617977。

请改正程序中的语法错误,使它能得出正确的结果。

注意:不要改动main 函数,不得增行或删行,也不得更改

程序的结构!

给定源程序:

#include

int fun ( int n )

{ float A=1; int i;

for (i=2; i

A = 1.0/(1+A);

return A ;

}

main( )

{ int n ;

printf("\nPlease enter n: ") ;

scanf("%d", &n ) ;

printf("A%d=%f\n", n, fun(n) ) ;

}

解题思路:

第一处:函数的返回是浮点型数,所以应改为:float fun(int n)。

第二处:for的终止条件应是i<=n。

***************************************************

程序定义了N×N的二维数组,并在主函数中自动赋值。请编

写函数fun,函数的功能是:使数组右上三角元素中的值乘以

m 。

例如:若m的值为2,a 数组中的值为

| 1 9 7 | | 2 18 14|

a = | 2 3 8 | 则返回主程序后a数组中的值应为| 2 6 16|

| 4 5 6 | | 4 5 12|

注意: 部分源程序存在文件PROG1.C文件中。

请勿改动主函数main和其它函数中的任何内容,仅在函数

fun的花括号中填入你编写的若干语句。

给定源程序:

#include

#include

#define N 5

int fun ( int a[][N], int m )

{

}

main ( )

{ int a[N][N], m, i, j;

printf("***** The array *****\n");

for ( i =0; i

{ for ( j =0; j

{ a[i][j] = rand()%20; printf( "%4d", a[i][j] ); }

printf("\n");

}

do m = rand()%10 ; while ( m>=3 );

printf("m = %4d\n",m);

fun ( a ,m );

printf ("THE RESULT\n");

for ( i =0; i

{ for ( j =0; j

printf("\n");

}

NONO ( );

}

解题思路:

本题是利用两重循环给二维数组右上三角元素中的值乘以

m。

参考答案:

int fun ( int a[][N], int m )

{

int i, j;

for(i = 0 ; i < N ; i++)

for(j = i ; j < N ; j++)

a[i][j] *= m ;

}

※※※※※※※※※※※※※※※※※※※※※※※※※第42套:

给定程序中,函数fun的功能是: 将s所指字符串中的所有数字字符移到所有非数字字符之后,并保持数字字符串和非数字字符串原有的先后次序。例如,形参s所指的字符串为:def35adh3kjsdf7。执行结果为:defadhkjsdf3537。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

void fun(char *s)

{ int i, j=0, k=0; char t1[80], t2[80];

for(i=0; s[i]!='\0'; i++)

if(s[i]>='0' && s[i]<='9')

{

t2[j]=s[i]; ___1___;

}

else t1[k++]=s[i];

t2[j]=0; t1[k]=0;

for(i=0; i

for(i=0; i<___3___; i++) s[k+i]=t2[i];

}

main()

{ char s[80]="ba3a54j7sd567sdffs";

printf("\nThe original string is : %s\n",s);

fun(s);

printf("\nThe result is : %s\n",s);

}

解题思路:

t2是存放数字字符串,t1是存放非数字字符串。

第一处:t2存放数字字符串的位置是由j来控制的,每添加一个,j必须加1,所以应填:j++。第二处:利用for循环把t1字符串添加到原字符串s中,所以应填:s[i]=t1[i]。

第三处:利用for循环把t2字符串添加到原字符串s的尾部,其中数字字符串的长度为j,所

以应填:j。

*************************************************** 给定程序MODI1.C中函数fun 的功能是:用冒泡法对6个字符串按由小到大的顺序进行排序。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main 函数,不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

#define MAXLINE 20

fun ( char *pstr[6])

{ int i, j ;

char *p ;

for (i = 0 ; i < 5 ; i++ ) {

for (j = i + 1, j < 6, j++)

{

if(strcmp(*(pstr + i), *(pstr + j)) > 0)

{

p = *(pstr + i) ;

*(pstr + i) = pstr + j ;

*(pstr + j) = p ;

}

}

}

}

main( )

{ int i ;

char *pstr[6], str[6][MAXLINE] ;

for(i = 0; i < 6 ; i++) pstr[i] = str[i] ;

printf( "\nEnter 6 string(1 string at each line): \n" ) ;

for(i = 0 ; i < 6 ; i++) scanf("%s", pstr[i]) ;

fun(pstr) ;

printf("The strings after sorting:\n") ;

for(i = 0 ; i < 6 ; i++) printf("%s\n", pstr[i]) ;

}

解题思路:

第一处:for循环语句中缺少分号。

第二处:应该把pstr+j位置上的值赋值给*(pstr+i)上,所以应改为:

*(pstr+i)=*(pstr+j);。

*************************************************** 请编写函数fun,它的功能是:求出ss所指字符串中指定字符的个数,并返回此值。

例如,若输入字符串: 123412132,输入字符为: 1,则输出:3。

注意: 部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun 的花括号中填入你编写的若干语句。

给定源程序:

#include

#include

#define M 81

int fun(char *ss, char c)

{

}

main()

{ char a[M], ch;

printf("\nPlease enter a string:"); gets(a);

printf("\nPlease enter a char:"); ch = getchar();

printf("\nThe number of the char is: %d\n", fun(a, ch)); NONO ( );

}

解题思路:

本题是考察考生怎样从字符串中找出指定字符的个数。使用while循环语句来字符串是否结束,如果没有结束,则判断当前字符是否是指定的字符,如果是指定的字符,则个数cnt 加1,直至字符串结束为止,最后由函数返回。

参考答案:

int fun(char *ss, char c)

{

int cnt = 0 ;

char *p = ss ;

while(*p) {

if(*p == c) cnt++ ;

p++ ;

}

return cnt ;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第43套:

给定程序中,函数fun的功能是:在形参ss所指字符串数组中

查找与形参t所指字符串相同的串,找到后返回该串在字符串

数组中的位置(下标值),未找到则返回-1。ss所指字符串数

组中共有N个内容不同的字符串,且串长小于M。请在程序

的下划线处填入正确的内容并把下划线删除, 使程序得出正

确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

#define N 5

#define M 8

int fun(char (*ss)[M],char *t)

{ int i;

for(i=0; i< __1__ ; i++)

if(strcmp(ss[i],t)==0 ) return __2__ ;

return -1;

}

main()

{ char ch[N][M]={"if","while","switch","int","for"},t[M];

int n,i;

printf("\nThe original string\n\n");

for(i=0;i

printf("\nEnter a string for search: "); gets(t);

n=fun(ch,t);

if(n== __3__) printf("\nDon't found!\n");

else printf("\nThe position is %d .\n",n);

}

解题思路:

本题是考察在字符串查找指定的子串。

第一处:利用for循环,从几个字符串中进行查找,程序中已

经给定了N个字符串,所以应填:N。

第二处:在字符串已经找到,则返回字符串数组中的位置(下

标值),所以应填:i。

第三处:如果没有发现,则显示没有找到信息,所以应填:

-1。

***************************************************

给定程序MODI1.C中函数fun的功能是:从整数1到55之间,

选出能被3整除、且有一位上的数是5的那些数,并把这些数放

在b所指的数组中,这些数的个数作为函数值返回。规定,

函数中a1放个位数,a2放十位数。

请改正程序中的错误,使它能得出正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程

序的结构。

给定源程序:

#include

fun( int *b )

{ int k,a1,a2,i=0;

for(k=10; k<=55; k++) {

a2=k/1O;

a1=k-a2*10;

if((k%3==0 && a2==5)||(k%3==0 && a1==5))

{ b[i]=k; i++; }

}

return k;

}

main( )

{ int a[100],k,m;

m=fun( a );

printf("The result is :\n");

for(k=0; k

}

解题思路:

第一处: 取当前变量k的十位数字上的数,所以应改为:

a2=k/10;。

第二处: 要求统计个数并存入变量i中,最后返回i,所以应改

为:return i;。

***************************************************

假定输入的字符串中只包含字母和*号。请编写函数fun,它

的功能是:将字符串尾部的*号全部删除,前面和中间的*号

不删除。

例如,字符串中的内容为:****A*BC*DEF*G*******,删

除后,字符串中的内容应当是:****A*BC*DEF*G。在编写函

数时,不得使用C语言提供的字符串函数。

注意: 部分源程序在文件PROG1.C文件中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun

的花括号中填入你编写的若干语句。

给定源程序:

#include

void fun( char *a )

{

}

main()

{ char s[81];

printf("Enter a string:\n");gets(s);

fun( s );

printf("The string after deleted:\n");puts(s);

NONO();

}

解题思路:

本题是考察字符串的移动。

1. 使用while循环语句和字符串指针p扫描出尾部的*号。

2. 定义两个字符串中间变量s和t,其中s是存放*号后面的字

符串,t是存放*号字符串。

3. 最后利用字符串拷贝和连接,重新组成字符串a。

参考答案:

void fun( char *a )

{

char *p = a ;

while(*p) p++ ; p-- ;

while(*p == '*') p-- ;

p++ ;

*p = 0 ;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第44套:

函数fun的功能是进行数字字符转换。若形参ch中是数字字符

'0'~'9', 则

'0'转换成'9','1'转换成'8','2'转换成'7',……,'9'转换成'0';若

是其它字符则保持不变;并将转换后的结果作为函数值返

回。

请在程序的下划线处填入正确的内容并把下划线删除,使程

序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

___1___ fun(char ch)

{

if (ch>='0' && ___2___)

return '9'- (ch-___3___);

return ch ;

}

main()

{ char c1, c2;

printf("\nThe result :\n");

c1='2'; c2 = fun(c1);

printf("c1=%c c2=%c\n", c1, c2);

c1='8'; c2 = fun(c1);

printf("c1=%c c2=%c\n", c1, c2);

c1='a'; c2 = fun(c1);

printf("c1=%c c2=%c\n", c1, c2);

}

解题思路:

第一处:要求返回处理好的字符,所以应填:char。

第二处:判断该字符是否是数字,所以应填:ch<='9'。

第三处:只要减去'0'的ASCII值,即可得到要求的结果,所

以应填:'0'。

***************************************************

给定程序MODI1.C中函数fun的功能是:将p所指字符串中的

所有字符复制到b 中,要求每复制三个字符之后插入一个空

格。

例如,在调用fun函数之前给a输入字符串:ABCDEFGHIJK,

调用函数之后,字符数组b中的内容则为:ABC DEF GHI JK。

请改正程序中的错误,使它能得出正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程

序的结构。

给定源程序:

#include

void fun(char *p, char *b)

{ int i, k=0;

while(*p)

{ i=1;

while( i<=3 && *p ) {

b[k]=p;

k++; p++; i++;

}

if(*p)

{

b[k++]=" ";

}

}

b[k]='\0';

}

main()

{ char a[80],b[80];

printf("Enter a string: "); gets(a);

printf("The original string: "); puts(a);

fun(a,b);

printf("\nThe string after insert space: "); puts(b); printf("\n\n");

}

解题思路:

第一处:把指针p所指的值赋值给b[k]中。

第二处:把空格字符赋值给b[k++]中,而不是一个空格的字

符串。

***************************************************

N名学生的成绩已在主函数中放入一个带头节点的链表结构

中,h指向链表的头节点。请编写函数fun,它的功能是:求

出平均分,由函数值返回。例如,若学生的成绩是:85,

76,69,85,91,72,64,87, 则平均分应当是:78.625。

注意: 部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun

的花括号中填入你编写的若干语句。

给定源程序:

#include

#include

#define N 8

struct slist

{ double s;

struct slist *next;

};

typedef struct slist STREC;

double fun( STREC *h )

{

}

STREC * creat( double *s)

{ STREC *h,*p,*q; int i=0;

while(i

{ q=(STREC*)malloc(sizeof(STREC));

q->s=s[i]; i++; p->next=q; p=q;

}

p->next=0;

return h;

}

outlist( STREC *h)

{ STREC *p;

p=h->next; printf("head");

do

{ printf("->%4.1f",p->s);p=p->next;}

while(p!=0);

printf("\n\n");

}

main()

{ double s[N]={85,76,69,85,91,72,64,87},ave;

STREC *h;

h=creat( s ); outlist(h);

ave=fun( h );

printf("ave= %6.3f\n",ave);

NONO();

}

解题思路:

本题是计算链表结构中成绩的平均分。具体操作请看答案程序中的说明。

参考答案:

#include

#include

double fun( STREC *h )

{

STREC *p=h->next; /* 由于头结点中没有存放数据*/ double av=0.0; /* 对计算成绩平均值的变量进行初始化*/

int n = 0 ;

while(p!=NULL) { /* 判断链表是否结束*/

av = av + p->s ; /* 对成绩进行累加*/

p=p->next; /* 到下一个结点位置*/

n++; /* 人数加1 */

}

av /= n ; /* 计算成绩平均值*/

return av ; /* 返回成绩平均值*/

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第45套:

函数fun的功能是:把形参a所指数组中的偶数按原顺序依次存放到a[0]、

a[1]、a[2]、……中,把奇数从数组中删除,偶数个数通过函数值返回。例如:

若a所指数组中的数据最初排列为:9、1、4、2、3、6、5、8、7,删除奇数后a 所指数组中的数据为:4、2、6、8,返回值为4。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#define N 9

int fun(int a[], int n)

{ int i,j;

j = 0;

for (i=0; i

if (___1___== 0) {

___2___ = a[i]; j++;

}

return ___3___;

}

main()

{ int b[N]={9,1,4,2,3,6,5,8,7}, i, n;

printf("\nThe original data :\n");

for (i=0; i

printf("\n");

n = fun(b, N);

printf("\nThe number of even :%d\n", n);

printf("\nThe even :\n");

for (i=0; i

printf("\n");

}

解题思路:

第一处:判断a[i]是否是偶数,若是,则仍保留在原数组中a[j],所以应填:a[i] % 2。

第二处:数组a中的元素位置由j来控制,每增加一个元素,则j加1,所以应填:a[j]。

第三处:返回删除奇数后a所指数组中数据的元素j,所以应填:j。

*************************************************** 给定程序MODI1.C中函数fun的功能是:按以下递归公式求函数值。

┌10 (n=1)

fun(n)=┥

└fun(n-1)+2 (n>1)

例如,当给n输入5时,函数值为18;当给n输入3时,函数值为14。

请改正程序中的错误,使它能得出正确结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

给定源程序:

#include

fun ( n )

{ int c;

if(n=1)

c = 10 ;

else

c= fun(n-1)+2;

return(c);

} main()

{ int n;

printf("Enter n : "); scanf("%d",&n);

printf("The result : %d\n\n", fun(n));

}

解题思路:

第一处:形参n没有定义类型,所以应改为:fun (int n)。

第二处:判断相等的符号是==。

***************************************************

假定输入的字符串中只包含字母和*号。请编写函数fun,它

的功能是:使字符串中尾部的*号不得多于n个;若多于n个,

则删除多余的*号;若少于或等于n个,则什么也不做, 字符

串中间和前面的*号不删除。

例如,字符串中的内容为:****A*BC*DEF*G*******,若n

的值为4,删除后,字符串中的内容应当是:

****A*BC*DEF*G****;若n的值为7,则字符串中的内容仍

为:****A*BC*DEF*G*******。n的值在主函数中输入。在

编写函数时,不得使用C语言提供的字符串函数。

注意: 部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun

的花括号中填入你编写的若干语句。

给定源程序:

#include

void fun( char *a,int n )

{

}

main()

{ char s[81]; int n;

printf("Enter a string:\n");gets(s);

printf("Enter n : ");scanf("%d",&n);

fun( s,n );

printf("The string after deleted:\n");puts(s);

NONO();

}

解题思路:

本题是考察字符串的操作。

1. 使用while循环语句和字符串指针p扫描出尾部的*号。

2. 找出字符串最右边字母后出现'*'的第1位置。

3. 使用while循环来处理右边'*'是否大于n个,若大于,则取n

个'*'。

4. 最后给字符串加上结束符。

参考答案:

void fun( char *a,int n )

{

char *p=a ;

int j=0;

while(*p) p++; p--; /* 字符串的长度*/

while(*p == '*') p--; /* 字符串右的'*' */

p++;

while(j

p++ ;

j++;

}

*p = 0 ;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第46套:

给定程序中,函数fun的功能是:利用指针数组对形参ss所指

字符串数组中的字符串按由长到短的顺序排序,并输出排序

结果。ss所指字符串数组中共有N个字符串,且串长小于M。

请在程序的下划线处填入正确的内容并把下划线删除, 使程

序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

#define N 5

#define M 8

void fun(char (*ss)[M])

{ char *ps[N],*tp; int i,j,k;

for(i=0; i

for(i=0; i

k= __1__ ;

for(j=i+1; j

if(strlen(ps[k]) < strlen(__2__) ) k=j;

tp=ps[i]; ps[i]=ps[k]; ps[k]= __3__ ;

}

printf("\nThe string after sorting by length:\n\n");

for(i=0; i

}

main()

{ char ch[N][M]={"red","green","blue","yellow","black"};

int i;

printf("\nThe original string\n\n");

for(i=0;i

fun(ch);

}

解题思路:

本题是按字符串的长短进行排序。

第一处:外循环每循环一次,k应保存当前的i值,所以应填:

i。

第二处:使用内循环对i+1后面的字符串长度进行比较,所以

应填:ps[j]。

第三处:交换内容,所以应填:tp。

***************************************************

已知一个数列从第0项开始的前三项分别为0,0,1,以后的

各项都是其相邻的前三项之和。给定程序MODI1.C中函数fun

的功能是:计算并输出该数列前n项的平方根之和。n的值通过

形参传入。

例如,当n=10时,程序的输出结果应为:23.197745。

请改正程序中的错误,使程序能输出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程

序的结构!

给定源程序:

#include

fun(int n)

{ double sum, s0, s1, s2, s; int k;

sum = 1.0;

if (n <= 2) sum = 0.0;

s0 = 0.0; s1 = 0.0; s2 = 1.0;

for (k = 4; k <= n; k++)

{ s = s0 + s1 + s2;

sum += sqrt(s);

s0 = s1; s1 = s2; s2 = s;

}

return sum

}

main ( )

{ int n;

printf("Input N=");

scanf("%d", &n);

printf("%f\n", fun(n) );

}

解题思路:

第一处:由于函数返回是实数,所以必须定义返回的类型,

只有整型或无结果返回可以忽略,其他必须定义返回的类

型,所以要在此行前加上double或float。

第二处:该行缺少分号。

***************************************************

编写函数fun,它的功能是计算下列级数和,和值由函数值返

回。

例如,当n = 10,x=0.3时,函数值为1.349859。

注意: 部分源程序在文件PROG1.C文件中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun

的花括号中填入你编写的若干语句。

给定源程序:

#include

#include

double fun(double x , int n)

{

}

main()

{

printf("%f\n", fun(0.3,10));

NONO();

}

解题思路:

本题是根据给定的公式计算结果。使用for循环语句依次求出

每一项的值,分别进行累加并把结果存入变量s中,最后把s

作为函数值返回。其中,jc函数是计算阶乘的。

参考答案:

#include

#include

long jc(int n)

{

long s = 1 ;

int i ;

for(i = 1 ; i <= n ; i++) s *= i ;

return s ;

}

double fun(double x , int n)

{

double s = 1.0, y = x ;

int i ;

for(i = 1 ; i <= n ; i++) {

s += y / (double)jc(i) ;

y *= x ;

}

return s ;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第47套:

给定程序中,函数fun的功能是:找出形参s所指字符串中出

现频率最高的字母(不区分大小写),并统计出其出现的次

数。

例如,形参s所指的字符串为:abcAbsmaxless,程序执行后

的输出结果为:

letter 'a' : 3 times

letter 's' : 3 times

请在程序的下划线处填入正确的内容并把下划线删除, 使程

序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

#include

void fun(char *s)

{ int k[26]={0},n,i,max=0; char ch;

while(*s)

{ if( isalpha(*s) ) {

ch=tolower(__1__);

n=ch-'a';

k[n]+= __2__ ;

}

s++;

if(max

}

printf("\nAfter count :\n");

for(i=0; i<26;i++)

if (k[i]==max) printf("\nletter \'%c\' : %d times\n",i+'a',k[i]);

}

main()

{ char s[81];

printf("\nEnter a string:\n\n"); gets(s);

fun(s);

}

解题思路:

本题是找出字符串中出现频率最高的字母并统计出其次数。

第一处:将当前字母转换为小写字母,所以应填:*s。

第二处:把该字母出现的个数累加到指定的数组中,所以应

填:1。

第三处:如果当前该字母出现次数大于最大次数max,那么把该次数赋值给max,所以应填:

k[n]。

*************************************************** 给定程序MODI1.C中函数fun 的功能是:求S的值。

例如,当k为10时,函数值应为:1.533852。

请改正程序中的错误,使程序能输出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

void fun( int k )

{ int n; float s, w, p, q;

n = 1;

s = 1.0;

while ( n <= k )

{ w = 2.0 * n;

p = w - 1.0;

q = w + 1.0;

s = s * w *w/p/q;

n++;

}

return s

}

main ( )

{

printf("%f\n", fun (10));

}

解题思路:

第一处:由于函数返回是实数,所以必须定义返回的类型,只有整型或无结果返回可以忽略,其他必须定义返回的类型,所以要在此行前加上double或float。

第二处:缺少分号。

*************************************************** 编写函数fun,它的功能是:计算并输出下列级数和:

1 1 1

S = ──+ ──+ …+ ───

1×2 2×3 n(n+1)

例如,当n = 10时,函数值为:0.909091。

注意: 部分源程序在文件PROG1.C文件中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun 的花括号中填入你编写的若干语句。

给定源程序:

#include

double fun( int n )

{

}

main() /* 主函数*/

{

printf("%f\n", fun(10));

NONO();

}

解题思路:

本题是根据公式计算结果。使用for循环语句进行计算。但要注意的是:在除法运算中,如果除数和被除数都是整数,所以所除的结果也是整数,因此1应取实数或进行实型的类型转换。

参考答案:

double fun( int n )

{

double s = 0.0 ;

int i ;

for(i = 1 ; i <= n ; i++) s = s + 1.0 / (i * (i + 1)) ;

return s ;

}

※※※※※※※※※※※※※※※※※※※※※※※※※第48套:

给定程序中,函数fun的功能是:将形参s所指字符串中的数字字符转换成对应的数值,计算出这些数值的累加和作为函数值返回。

例如,形参s所指的字符串为:abs5def126jkm8,程序执行后的输出结果为:22。请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#include

#include

int fun(char *s)

{ int sum=0;

while(*s) {

if( isdigit(*s) ) sum+= *s- __1__ ;

__2__;

}

return __3__ ;

}

main()

{ char s[81]; int n;

printf("\nEnter a string:\n\n"); gets(s);

n=fun(s);

printf("\nThe result is: %d\n\n",n);

}

解题思路:

本题是把字符串中是数字字符转换成对应的数值并进行累加。

第一处:'0'字符对应的ASCII值是48,因此数字字符转换成对应数值时只要减去48,即是该数字字符对应的数值,所以应填:48。

第二处:到字符串下一个位置,所以应填:s++。

第三处:返回累加和sum,所以应填:sum。

*************************************************** 给定程序MODI1.C中函数fun的功能是:计算小于形参k的最大的10个能被13或17整除的自然数之和。k的值由主函数传入,若k的值为500,则函数值为4622。请改正程序中的错误,使程序能输出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程

序的结构!

给定源程序:

#include

int fun( int k )

{ int m=0, mc=0, j ;

while ((k >= 2) && (mc < 10))

{

if ((k%13 = 0) || (k%17 = 0))

{ m = m+ k; mc++; }

k--;

}

return m;

____

main ( )

{

printf("%d\n", fun (500));

}

解题思路:

第一处:判断相等的条件是==,而不是=,所以只能在比较

处再添加一个=。

第二处:经过编译可知,"{"和"}"没有配对,所以在横线处

加上"}"。

***************************************************

编写函数fun,它的功能是:求小于形参n同时能被3与7整除

的所有自然数之和的平方根,并作为函数值返回。

例如若n为1000时,程序输出应为:s = 153.909064。

注意: 部分源程序在文件PROG1.C文件中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun

的花括号中填入你编写的若干语句。

给定源程序:

#include

#include

double fun( int n)

{

}

main() /* 主函数*/

{

printf("s =%f\n", fun ( 1000) );

NONO();

}

解题思路:

本题是求小于形参n同时能被3与7整除的所有自然数之和的

平方根,并作为函数值返回。

参考答案:

double fun( int n)

{

double sum=0.0;

int i;

for(i=21; i<=n; i++)

if((i % 3==0) && (i % 7==0)) sum+=i;

return sqrt(sum) ;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第49套:

给定程序中,函数fun的功能是:将形参s所指字符串中所有

ASCII码值小于97 的字符存入形参t所指字符数组中,形成一

个新串,并统计出符合条件的字符个数

作为函数值返回。

例如,形参s所指的字符串为:Abc@1x56*,程序执行后t所

指字符数组中的字符串应为:A@156*。

请在程序的下划线处填入正确的内容并把下划线删除, 使程

序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

int fun(char *s, char *t)

{ int n=0;

while(*s)

{ if(*s < 97) {

*(t+n)= __1__ ; n++; }

__2__ ;

}

*(t+n)=0;

return __3__ ;

}

main()

{ char s[81],t[81]; int n;

printf("\nEnter a string:\n"); gets(s);

n=fun(s,t);

printf("\nThere are %d letter which ASCII code is less than

97: %s\n",n,t);

}

解题思路:

本题是根据条件组成新的字符串并统计出符合条件的个数

n。

第一处:把符合条件的当前字符存放到t字符串中,所以应填:

*s。

第二处:到字符串下一个位置,所以应填:s++。

第三处:返回符合条件的字符个数n,所以应填:n。

***************************************************

给定程序MODI1.C中函数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

{

int j, c=0, float xa=0.0;

for (j=0; j

xa += x[j]/n;

printf("ave =%f\n",xa);

for (j=0; j

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));

}

解题思路:

第一处:两种类型变量定义之间应该用分号,所以应改为:

int j, c=0; float xa=0.;。

第二处:在C语言中,大于等于应表达为>=。

***************************************************

编写函数fun,其功能是:根据以下公式求P的值,结果由函

数值带回。m与n为两个正整数且要求m > n。

m!

P = ───

n!(m-n)!

例如:m=12,n=8时,运行结果为495.000000。

注意: 部分源程序在文件PROG1.C文件中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun

的花括号中填入你编写的若干语句。

给定源程序:

#include

float fun(int m, int n)

{

}

main() /* 主函数*/

{

printf("P=%f\n", fun (12,8));

NONO();

}

解题思路:

本题是计算阶乘。

参考答案:

#include

long jc(int m)

{

long s=1;

int i ;

for(i=1;i<=m;i++) s=s*i ;

return s;

}

float fun(int m, int n)

{

float p;

p=1.0*jc(m)/jc(n)/jc(m-n) ;

return p;

}

※※※※※※※※※※※※※※※※※※※※※※※※※

第50套:

给定程序中,函数fun的功能是:有N×N矩阵,以主对角线为

对称线,对称元素相加并将结果存放在左下三角元素中,右

上三角元素置为0。例如,若N=3,有下列矩阵:

1 2 3

4 5 6

7 8 9

计算结果为

1 0 0

6 5 0

10 14 9

请在程序的下划线处填入正确的内容并把下划线删除,使程

序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构!

给定源程序:

#include

#define N 4

void fun(int (*t)___1___ )

{ int i, j;

for(i=1; i

{ for(j=0; j

{

___2___ =t[i][j]+t[j][i];

___3___ =0;

}

}

}

main()

{ int t[][N]={21,12,13,24,25,16,47,38,29,11,32,54,42,21,33,10},

i, j;

printf("\nThe original array:\n");

for(i=0; i

{ for(j=0; j

printf("\n");

}

fun(t);

printf("\nThe result is:\n");

for(i=0; i

{ for(j=0; j

printf("\n");

}

}

解题思路:

第一处:形参t的定义,整数数组其宽度为N,所以应填:[N]。

第二处:对称元素相加,其结果仍存放在左下三角元素中,

所以应填:t[i][j]。

第三处:右上三角元素置为0,所以应填:t[j][i]。

***************************************************

全国计算机等级考试二级C语言真题

2009年3月二级C语言笔试真题((1)—(10)每小题2分,(11)—(50)每题1分,共60分) 下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应位置上,答在试卷上不得分。 (1)下列叙述中正确的是 A)栈是“先进先出”的线性表 B)队列是“先进先出”的线性表 C)循环队列是非线性结构 D)有序性表既可以采用顺序存储结构,也可以采用链式存储结构 (2)支持子程序调用的数据结构是 A)栈B)树C)队列D)二叉树 (3)某二叉树有5个度为2的结点,则该二叉树中的叶子结点数是 A)10B)8C)6D)4 (4)下列排序方法中,最坏情况下比较次数最少的是 A)冒泡排序 B)简单选择排序 C)直接插入排序 D)堆排序 (5)软件按功能可以分为:应用软件、系统软件和支撑软件(或工具软件)。下面属于应用软件的是 A)编译软件 B)操作系统 C)教务管理系统 D)汇编程序 (6)下面叙述中错误的是 A)软件测试的目的是发现错误并改正错误 B)对被调试的程序进行“错误定位”是程序调试的必要步骤 C)程序调试通常也称为Debug D)软件测试应严格执行测试计划,排除测试的随意性 (7)耦合性和内聚性是对模块独立性度量的两个标准。下列叙述中正确的是 A)提高耦合性降低内聚性有利于提高模块的独立性 B)降低耦合性提高内聚性有利于提高模块的独立性

C)耦合性是指一个模块内部各个元素间彼此结合的紧密程度D)内聚性是指模块间互相连接的紧密程度 (8)数据库应用系统中的核心问题是 A)数据库设计 B)数据库系统设计 C)数据库维护 D)数据库管理员培训 (9)有两个关系R,S如下: 由关系R通过运算得到关系S,则所使用的运算为 A)选择B)投影C)插入D)连接 (10)将E-R图转换为关系模式时,实体和联系都可以表示为A)属性B)键C)关系D)域 (11)以下选项中合法的标识符是 A)1-1B)1—1C)-11D)1-- (12)若函数中有定义语句:intk;,则 A)系统将自动给k赋初值0 B)这时k中值无定义 C)系统将自动给k赋初值-1 D)这时k中无任何值 (13)以下选项中,能用作数据常量的是 A)o115B)0118C))115L (14)设有定义:intx=2;,以下表达式中,值不为6的是A)x*=x+1 B)x++,2*x C)x*=(1+x)

计算机二级考试C语言练习题及答案

一、选择题 1). 下列叙述中正确的是( )。 A.调用printf( )函数时,必须要有输出项 B.使用putchar( )函数时,必须在之前包含头文件stdio.h C.在C语言中,整数可以以二进制、八进制或十六进制的形式输出 D.调节getchar( )函数读入字符时,可以从键盘上输入字符所对应的ASCII码 正确答案:B 答案解析:选项A,若printf函数没有输出项,且格式字符串中不含格式信息,则输出的是格式字符串本身,若格式字符串含有格式信息,运行时则出现错误提示;选项C,在C 语言中,整数可以十进制、八进制或十六进制的形式输出;选项D,getchar函数是从标准输入设备读取一个字符。 2). 以下结构体类型说明和变量定义中正确的是( ) A.typedef struct { int n; char c; } REC; REC t1,t2; B.struct REC ; { int n; char c; }; REC t1,t2; C.typedef struct REC; { int n=0; char c=′A′; } t1,t2; D.struct { int n; char c; } REC; REC t1,t2; 正确答案:A 答案解析:定义结构体类型的一般形式为:struct 结构体名 {成员列表};struct 结构体名后不能加″;″号,所以选项B、C)错误,选项D中定义无名称的结构体类型同时定义结构体变量形式应为struct t1,t2;选项A为用户自定义类型,其为正确的定义形式。 3). 若实体A和B是一对多的联系,实体B和C是一对一的联系,则实体A和C的联系是( ) A.一对一 B.一对多 C.多对一 D.多对多 正确答案:B 答案解析:由于B和C有一一对应的联系,而A和B只间有一对多的联系,则通过关系之间的传递,则A和C之间也是一对多的联系。 4). 关于C语言的变量,以下叙述中错误的是( ) A.所谓变量是指在程序运行过程中其值可以被改变的量 B.变量所占的存储单元地址可以随时改变 C.程序中用到的所有变量都必须先定义后才能使用 D.由三条下划线构成的符号名是合法的变量名 正确答案:B

全国计算机二级C语言操作题题库

1.程序Cmody021.c输出如下所示图形: * *** ***** ******* ********* #include void main() { int i,j;for(i=1;i<=5;i++) { for(j=1;j<=5-i;j++)printf(" "); for(j=1;j<=2*i-1;j++) printf("*"); printf("\n"); } } 2.程序Cmody032.c的功能是:输出201-300之间的所有素数,统计总个数。#include #include void main() { int num; printf("\n"); num=fun(); printf("\nThe total of prime is %d",num); getch(); } int fun() { int m,i,k,n=0; for(m=201;m<=300;m++) { k=sqrt(m+1); for(i=2;i<=k;i++) /**/if(m/i==0)/**/ break; /**/if(i==k)/**/ { printf("%-4d",m); n++;

if(n%10==0)printf("\n"); } } return n; } 3. 程序Cmody041.c,其功能是统计输入字符串中小写英文字母的个数。如输入:abcdEFGHIJK123 输出:4 #include #include main() { char str1[128]; /**/int i,len,sum=0;/**/ gets(str1); len=strlen(str1); for(i=0;i='a'&&str1[i]<='z')/**/ sum++; } printf("%d\n",sum); getch(); } 4.程序Cmody051.c,其功能是统计输入字符串中大写英文字母的个数。如输入:abcDEFGH123 输出:5 #include #include main() { /**/char str1[128]/**/ int i,len,sum=0; printf("Please input a string:\n"); scanf("%s",str1); len=strlen(str1); for(i=0;i='A'&&str1[i]<='Z') /**/sum++;/**/

历年全国计算机二级C语言试题库完整

. . . . 参考 50道C 语言知识题 1.以下叙述中正确的是 A)用C 程序实现的算法必须要有输入和输出操作 B)用C 程序实现的算法可以没有输出但必须要有输入 C)用C 程序实现的算法可以没有输入但必须要有输出 D)用C 程序实现的算法可以既没有输入也没有输出 2.下列可用于C 语言用户标识符的一组是 A)void,define,WORDB)a3_3,_123,Car C)For,-abc,IFCaseD)2a,DO,sizeof 3.以下选项中可作为C 语言合法常量的是 A)-80B)-080C)-8e1.0D)-80.0e 4.若有语句:char*line[5];,以下叙述中正确的是 A)定义line 是一个数组,每个数组元素是一个基类型为char 为指针变量 B)定义line 是一个指针变量,该变量可以指向一个长度为5的字符型数组 C)定义line 是一个指针数组,语句中的*号称为间址运算符 D)定义line 是一个指向字符型函数的指针 5.以下定义语句中正确的是 A)inta=b=0;B)charA=65+1,b=′b′; 6.有以下程序段 charch;intk; ch=′a′; k=12; printf("%c,%d,",ch,ch,k);printf("k=%d\n",k); 已知字符a 的ASCII 码值为97,则执行上述程序段后输出结果是 A)因变量类型与格式描述符的类型不匹配输出无定值 B)输出项与格式描述符个数不符,输出为零值或不定值 C)a,97,12k=12 D)a,97,k=12 7.有以下程序 main() {inti,s=1; for(i=1;i<50;i++) if(!(i%5)&&!(i%3))s+=i; printf("%d\n",s);} 程序的输出结果是 A)409B)277C)1D)91 8.当变量c 的值不为2、4、6时,值也为"真"的表达式是 A)(c==2)||(c==4)||(c==6) B)(c>=2&&c<=6)||(c!=3)||(c!=5) C)(c>=2&&c<=6)&&!(c%2) D)(c>=2&&c<=6)&&(c%2!=1) 9.若变量已正确定义,有以下程序段

计算机二级c语言历年真题及答案

计算机二级c语言历年真题及答案【篇一:国家计算机二级c语言历年真题及答案】 class=txt>c语言程序设计 (考试时间90分钟,满分100分) 一、选择题((1)—(10)、(21)—(40)每题2分,(11)—(20)每题1分,共70分) (1)下列数据结构中,属于非线性结构的是 a)循环队列 b) 带链队列 c) 二叉树 d)带链栈 (2)下列数据结果中,能够按照“先进后出”原则存取数据的是 a) 循环队列 b) 栈 c)队列 d)二叉树 (3)对于循环队列,下列叙述中正确的是 a)队头指针是固定不变的 b)队头指针一定大于队尾指针 c)队头指针一定小于队尾指针 d)队头指针可以大于队尾指针,也可以小于队尾指针 (4)算法的空间复杂度是指 a)算法在执行过程中所需要的计算机存储空间 b)算法所处理的数据量 c)算法程序中的语句或指令条数 d)算法在执行过程中所需要的临时工作单元数 (5)软件设计中划分模块的一个准则是 a) 低内聚低耦合 b) 高内聚低耦合 c) 低内聚高耦合 d) 高内聚高耦合 (6)下列选项中不属于结构化程序设计原则的是 a) 可封装 d) 自顶向下

c) 模块化 d) 逐步求精 (7)软件详细设计产生的图如下: 该图是 a) n-s图 b) pad图 c) 程序流程图 d) e-r图 (8)数据库管理系统是 a)操作系统的一部分 b) 在操作系统支持下的系统软件 c) 一种编译系统 d) 一种操作系统 (9)在e-r图中,用来表示实体联系的图形是 a) 椭圆图 b) 矩形 c) 菱形 d) 三角形 (10)有三个关系r,s和t如下: 其中关系t由关系r和s通过某种操作得到,该操作为 a) 选择 b) 投影 c) 交 d) 并 (11)以下叙述中正确的是 a)程序设计的任务就是编写程序代码并上机调试 b)程序设计的任务就是确定所用数据结构 c)程序设计的任务就是确定所用算法 d)以上三种说法都不完整 (12)以下选项中,能用作用户标识符的是 a)void b)8_8 c)_0_ d)unsigned (13)阅读以下程序

计算机二级C语言测试题及答案解析(一)

2016年计算机二级C语言测试题及答案解析(一)1.(A )是构成C语言程序的基本单位。 A、函数 B、过程 C、子程序 D、子例程 2.C语言程序从C 开始执行。 A、程序中第一条可执行语句 B、程序中第一个函数 C、程序中的main函数 D、包含文件中的第一个函数 3、以下说法中正确的是(C )。 A、C语言程序总是从第一个定义的函数开始执行 B、在C语言程序中,要调用的函数必须在main( )函数中定义 C、C语言程序总是从main( )函数开始执行 D、C语言程序中的main( )函数必须放在程序的开始部分 4.下列关于C语言的说法错误的是(B )。 A、C程序的工作过程是编辑、编译、连接、运行 B、C语言不区分大小写。 C、C程序的三种基本结构是顺序、选择、循环 D、C程序从main函数开始执行 5.下列正确的标识符是(C )。

B、a[i] C、a2_i D、int t 5~8题为相同类型题 考点:标识符的命名规则 只能由字母、数字、下划线构成 数字不能作为标识符的开头 关键字不能作为标识符 选项A中的“-”,选项B中“[”与“]”不满足(1);选项D中的int为关键字,不满足(3) 6.下列C语言用户标识符中合法的是(B )。 A、3ax B、x C、case D、-e2 E)union 选项A中的标识符以数字开头不满足(2);选项C,E均为为关键字,不满足(3);选项D中的“-”不满足(1); 7.下列四组选项中,正确的C语言标识符是(C )。 A、%x B、a+b C、a123

选项A中的“%”,选项B中“+”不满足(1);选项D中的标识符以数字开头不满足(2) 8、下列四组字符串中都可以用作C语言程序中的标识符的是(A)。 A、print _3d db8 aBc B、I\am one_half start$it 3pai C、str_1 Cpp pow while D、Pxq My->book line# His.age 选项B中的“\”,”$”,选项D中“>”,”#”,”.”,”-”不满足(1);选项C 中的while为关键字,不满足(3) 9.C语言中的简单数据类型包括(D )。 A、整型、实型、逻辑型 B、整型、实型、逻辑型、字符型 C、整型、字符型、逻辑型 D、整型、实型、字符型 10.在C语言程序中,表达式5%2的结果是C 。 A、2.5 B、2 C、1 D、3 %为求余运算符,该运算符只能对整型数据进行运算。且符号与被模数相同。5%2=1;5%

计算机二级C语言考试编程题题库

计算机c语言编程题库 1、求100之内自然数中最大的能被17整除的数。 void main() { int i; for(i=100;i>0;i--) if(i%17==0)break; printf("%d\n",i); } 2、已知a,b,c都是1位整数,求当三位整数abc、cba的和为1333时a、b、c的值。 void main() { int a,b,c; for(a=1;a<=9;a++) { for(b=0;b<=9;b++) { for(c=1;c<=9;c++) if(a*100+b*10+c+c*100+b*10+a==1333) printf("%d,%d,%d\n",a,b,c); } } } 3、计算并输出200-400之间不能被3整除的整数的和。 void main() { int i,sum=0; for(i=200;i<=400;i++) if(i%3!=0) sum=sum+i; printf("%d\n",sum); } 4、从键盘输入10个数,统计非负数的个数,并计算非负数的和。 void main() { int i,n=0,sum=0; int a[10]; printf(“请输入10个数:”);

for(i=0;i<10;i++) scanf(“%d”,&a[i]); for(i=0;i<10;i++) if(a[i]>=0) { sum=sum+a[i]; n++;} printf("非负个数是%d,sum=%d\n",n,sum); } 5、求100之内自然数中偶数之和。 void main() { int i,sum=0; for(i=0;i<=100;i++) if(i%2==0) sum=sum+i; printf("sum=%d\n",sum); } 6、输入5个数,求和并输出。要求编写求和的函数。 void main() { int b(int x[],int n); int sum=0; int a[5]; int i; printf("请输入5个数:"); for(i=0;i<5;i++) scanf("%d",&a[i]); sum=b(a,5); printf("sum=%d\n",sum); } int b(int x[],int n) { int i,sum=0; for(i=0;i<5;i++) sum=sum+x[i]; return sum; } 7、编程计算1*2*3+3*4*5+5*6*7+...+99*100*101的值。 void main() { int i,sum=0; for(i=1;i<=99;i=i+2) sum=sum+i*(i+1)*(i+2); printf("%d\n",sum); } 8、编写程序,将用户输入的字符串中所有的字符a用*代替,然后输出。void main()

计算机二级c语言题库

一、选择题 (1) 下面叙述正确的是(C) A. 算法的执行效率与数据的存储结构无关 B. 算法的空间复杂度是指算法程序中指令(或语句)的条数 C. 算法的有穷性是指算法必须能在执行有限个步骤之后终止 D. 以上三种描述都不对 (2) 以下数据结构中不属于线性数据结构的是(C) A. 队列 B. 线性表 C. 二叉树 D. 栈 (3) 在一棵二叉树上第5层的结点数最多是(B) 注:由公式2k-1得 A. 8 B. 16 C. 32 D. 15 (4) 下面描述中,符合结构化程序设计风格的是(A) A. 使用顺序、选择和重复(循环)三种基本控制结构表示程序的控制逻辑 B. 模块只有一个入口,可以有多个出口 C. 注重提高程序的执行效率 D. 不使用goto语句 (5) 下面概念中,不属于面向对象方法的是(D) 注:P55-58 A. 对象 B. 继承 C. 类 D. 过程调用 (6) 在结构化方法中,用数据流程图(DFD)作为描述工具的软件开发阶段是(B) A. 可行性分析 B. 需求分析 C. 详细设计 D. 程序编码 (7) 在软件开发中,下面任务不属于设计阶段的是(D) A. 数据结构设计 B. 给出系统模块结构 C. 定义模块算法 D. 定义需求并建立系统模型 (8) 数据库系统的核心是(B) A. 数据模型 B. 数据库管理系统 C. 软件工具 D. 数据库 (9) 下列叙述中正确的是(C) A.数据库是一个独立的系统,不需要操作系统的支持 B.数据库设计是指设计数据库管理系统 C.数据库技术的根本目标是要解决数据共享的问题 D.数据库系统中,数据的物理结构必须与逻辑结构一致 (10) 下列模式中,能够给出数据库物理存储结构与物理存取方法的是(A) 注:P108 A. 内模式 B. 外模式 C. 概念模式 D. 逻辑模式 (11) 算法的时间复杂度是指(C) A. 执行算法程序所需要的时间 B. 算法程序的长度 C. 算法执行过程中所需要的基本运算次数 D. 算法程序中的指令条数 (12) 算法的空间复杂度是指(D) A. 算法程序的长度 B. 算法程序中的指令条数 C. 算法程序所占的存储空间 D. 算法执行过程中所需要的存储空间 (13) 设一棵完全二叉树共有699个结点,则在该二叉树中的叶子结点数为(B) 注:利用公式n=n0+n1+n2、n0=n2+1和完全二叉数的特点可求出 A. 349 B. 350 C. 255 D. 351 (14) 结构化程序设计主要强调的是(B) A.程序的规模 B.程序的易读性 C.程序的执行效率 D.程序的可移植性 (15) 在软件生命周期中,能准确地确定软件系统必须做什么和必须具备哪些功能的阶段是 (D) 注:即第一个阶段 A. 概要设计 B. 详细设计 C. 可行性分析 D. 需求分析 (16) 数据流图用于抽象描述一个软件的逻辑模型,数据流图由一些特定的图符构成。下列图符名标识的图符不属于数据流图合法图符的是(A) 注:P67

计算机二级c语言真题三[1]

计算机二级 c 语言真题三 一、选择题((1) ~(10) 每小题2 分,(11)-(50) 每小题1 分,共60 分) 下列各题A)、B)、c) 、D)四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应位置上,答在试卷上不得分。 (1) 算法的时间复杂度是指_______。 A)执行算法程序所需要的时间 B)算法程序的长度 C)算法执行过程中所需要的基本运算次数 D)算法程序中的指令条数 答案:C 评析:所谓算法的时间复杂度,是指执行算法所需要的计算工作量。 (2) 下列叙述中正确的是________。 A)线性表是线性结构B) 栈与队列是非线性结构 C)线性链表是非线性结构D) 二叉树是线性结构 答案:A

评析:一般将数据结构分为两大类型:线性结构与非线性结构。 线性表、栈与队列、线性链表都是线性结构,而二叉树是非线性结构。 (3) 下面关于完全二叉树的叙述中,错误的是_________。 A)除了最后一层外,每一层上的结点数均达到最大值 B)可能缺少若干个左右叶子结点 C)完全二叉树一般不是满二叉树 D)具有结点的完全二叉树的深度为[log2n]+1 答案:B 评析:满二叉树指除最后一层外每一层上所有结点都有两个子结 点的二叉树。完全二叉树指除最后一层外,每一层上的结点数均达到 最大值,在最后一层上只缺少右边的若干子结点( 叶子结点) 的二叉树。 (4) 结构化程序设计主要强调的是_________。 A)程序的规模B) 程序的易读性 c) 程序的执行效率D) 程序的可移植性 答案:B 评析:结构化程序设计主要强调的是结构化程序清晰易读,可理 解性好,程序员能够进行逐步求精、程序证明和测试,以保证程序的 正确性。

计算机二级C语言真题及答案

2014 年 3 月计算机二级 C 语言真题及答案 一、选择题 二、( 1)下列关于栈叙述正确的是 三、A) 栈顶元素最先能被删除 四、B)栈顶元素最后才能被删除 五、C) 栈底元素永远不能被删除? 六、D) 以上三种说法都不对 七、( 2)下列叙述中正确的是 八、A) 有一个以上根结点的数据结构不一定是非线性结构 九、B) 只有一个根结点的数据结构不一定是线性结构 十、C) 循环链表是非线性结构 十一、D)双向链表是非线性结构 十二、(3) 某二叉树共有7 个结点,其中叶子结点只有 1 个,则该二叉树的深度为(假设根结点在第 1 层) 十三、A)3? 十四、B)4? 十五、C)6? 十六、D)7 十七、(4) 在软件开发中,需求分析阶段产生的主要文档是 十八、A)软件集成测试计划? 十九、B)软件详细设计说明书二十、C)用户手册?

二十一、D)软件需求规格说明书 二十二、(5) 结构化程序所要求的基本结构不包括 二十三、A)顺序结构? 二十四、B)GOTC跳转 二十五、C)选择(分支)结构? 二十六、D)重复(循环)结构 二十七、(6) 下面描述中错误的是 二十八、A)系统总体结构图支持软件系统的详细设计 二十九、B)软件设计是将软件需求转换为软件表示的过程三十、C)数据结构与数据库设计是软件设计的任务之一 三十一、D)PAD图是软件详细设计的表示工具 三十二、(7) 负责数据库中查询操作的数据库语言是 三十三、A) 数据定义语言 三十四、B)数据管理语言 三十五、C)数据操纵语言 三十六、D)数据控制语言 三十七、 (8) 一个教师可讲授多门课程,一门课程可由多个教师讲授。则实体教师 和课程间的联系是 三十八、A)1:1 联系? 三十九、B)1:m 联系 四十、C)m:1 联系? 四十一、D)m:n 联系 四十二、(9)有三个关系R、S和T如下: 四十三、则由关系R和S得到关系T的操作是四十四、A) 自然连接?

2016年计算机二级c语言题库及答案

2016年计算机二级c语言题库及答案 一、选择题(每小题1分,共40小题,共40分) 1.设循环队列的存储空间为Q(1:35),初始状态为front=rear=35。现经过一系列入队与退队运算后,front=15,rear=15,则循环队列中的元素个数为( )。 A.20 B.0或35 C.15 D.16 2.下列关于栈的叙述中,正确的是( )。 A.栈底元素一定是最后入栈的元素 B.栈操作遵循先进后出的原则 C.栈顶元素一定是最先入栈的元素 D.以上三种说法都不对 3.下列链表中,其逻辑结构属于非线性结构的是( )0、 A.双向链表 B.带链的栈 C.二叉链表 D.循环链表 4.在关系数据库中,用来表示实体间联系的是( )。 A.网状结构 B.树状结构 C.属性 D.二维表 5.公司中有多个部门和多名职员,每个职员只能属于一个部门,一个部门可以有多名职员。则实体部门和职员间的联系是( )。 A.1:m联系 B.m:n联系 C.1:1联系 D.m:l联系

6.右两个关系R和S如下: 则由关系R得到关系S的操作是( )。 A.自然连接 B.并 C.选择 D.投影 7.数据字典(DD)所定义的对象都包含于( )。 A.软件结构图 B.方框图 C.数据流图(DFD图) D.程序流程图 8.软件需求规格说明书的作用不包括( )。 A.软件设计的依据 B.软件可行性研究的依据 C.软件验收的依据 D.用户与开发人员对软件要做什么的共同理解 9.下面属于黑盒测试方法的是( )。 A.边界值分析 B.路径覆盖 C.语句覆盖 D.逻辑覆盖 10.下面不属于软件设计阶段任务的是( )。 A.制订软件确认测试计划 B.数据库设计 C.软件总体设计 D.算法设计 11.以下叙述中正确的是( )。 A.在C语言程序中,main函数必须放在其他函数的最前面 B.每个后缀为C的C语言源程序都可以单独进行编译 C.在C语言程序中,只有main函数才可单独进行编译

机试全国计算机二级C语言程序题 题库(1---50)每年都一样

全国计算机二级C语言程序题题库(必考题库1--50) 建议下载到手机WPS打开 第一套 1. 程序填空程序通过定义学生结构体数组,存 储了若干个学生的学号、姓名和三门课的成 绩。函数fun的功能是将存放学生数据的结 构体数组,按照姓名的字典序(从小到大排 序)。 第一处struct student t; 第二处for(i=0;i0) 2 程序修改 /**found**/ q=p+i; /**found**/ while(q>p) 3程序设计 int fun(STREC *a,STREC *b,int l,int h) {int i,j=0; for(i=0;i=1&&a[i].s<=h) b[j++]=a[i]; return j; } 第二套 1. 程序填空 给定程序中已建立一个带有头结点的单向链表,链表中的各结点按数据域递增有序连接。函数fun的功能是:删除链表中数据域值相同的结点,使之只保留一个。 第一处free(q); 第二处q=p->next; 第三处q=q->next; 2. 程序修改 /**found**/ p=j; /**found**/ p=i; 3. 程序设计 void fun(int m,int *a,int *n) { int i; *n=0; for(i=7;i<=m;i++) if((i%7==0)||(i%11==0)) a[(*n)++]=i; } 第三套 1. 程序填空 函数fun的功能是:逆置数组元素是的值。例如:若a所指数组中的数据依次为:1、2、3、4、5、6、7、8、9,则逆置后依次为:9、8、7、6、5、4、3、2、1。形参n给出数组中数组中数据的个数。 第一处for(i=0;idata==ch)return n; 第三处k=fun(head,ch); 2. 程序修改 /**found**/ for(i=0,t=0;p[i];i++) /**found**/ c[t]=?\0?; 3. 程序设计 void fun(char *ss) { int i; for(i=1;i=?a?&&ss[i]<=?z?) ss[i]-=32; } } 第五套 1. 程序填空 给定程序中,函数fun的功能是:计算下 式前n项的和作为函数值返回。例如:当形参n 的值为10 的时,函数返回:9.6125588。 第一处s=0; 第二处for(i=1;i<=n;i++) 第三处s=s+(2.0*i-1)*(2.0*i+1)/(t*t); 2. 程序修改 /**found**/ for(i=0;str[i];i++) /**found**/ if(substr[k+1]==?\0?) 3. 程序设计 double fun(double eps) { double s=1,t=1./3; int n=1; while(t>=eps) {s+=t;n++;t=t*n/(2.0*n+1) ;} return(s*2.0); } 第六套 1. 程序填空 给定程序中,函数fun的功能是:将形参 s所指定字符串中所有的字母字符顺序前移,其他 字母顺序后移,处理后字符串的首地址作为函数 值返回。 第一处t[j]=s[i];j++; 第二处for(i=0;iscore[i]+=1; 第三处return a; 2. 程序修改 /**found**/ char *fun(char (*sq)[M]) /**found**/ return sp; 3. 程序设计 #include void fun(int a,int b,long *c) { *c=(b%10)*1000+(a/10)*100+(b/10)*10+a%10; } 第八套 1. 程序填空 函数fun的功能是:将形参观者工所指数 组中的前半部分元素中的值和后半部分元素中的 值对换。形参n中存放数组中数据的个数,若n 为奇书,则中间元素不动。 第一处p=(n%2==0)?n/2:n/2+1; 第二处a[i]=a[p+i]; 第三处a[p+i]=t; 2. 程序修改 /**found**/ float k; /**found**/ if(*a<*c) 3. 程序设计 int fun(STREC *a,STREC *b) { int i,max=a[0].s,n=0; for(i=1;i

全国计算机二级C选择题试题库第34套

全国计算机二级C选择题题库第34套 1、下列叙述中错误的是 A) 数据结构中的数据元素不能是另一数据结构 B) 数据结构中的数据元素可以是另一数据结构 C) 空数据结构可以是线性结构也可以是非线性结构 D) 非空数据结构可以没有根结点 参考答案:A 数据元素是一个含义很广泛的概念,它是数据的"基本单位",在计算机中通常作为一个整体进行考虑和处理。数据元素可以是一个数据也可以是被抽象出的具有一定结构数据集合,所以数据结构中的数据元素可以是另一数据结构。 满足有且只有一个根结点并且每一个结点最多有一个前件,也最多有一个后件的非空的数据结构认为是线性结构,不满足条件的结构为非线性结构。 空数据结构可以是线性结构也可以是非线性结构。非空数据结构可以没有根结点,如非性线结构"图"就没有根结点。 故选A选项。 2、为了降低算法的空间复杂度,要求算法尽量采用原地工作(in place)。所谓原地工作是指 A) 执行算法时所使用的额外空间固定(即不随算法所处理的数据空间大小的变化而变化) B) 执行算法时所使用的额外空间随算法所处理的数据空间大小的变化而变化 C) 执行算法时不使用额外空间 D) 执行算法时不使用任何存储空间 参考答案:A 算法的空间复杂度是指执行这个算法所需要的内存空间,包括输入数据所占的存储空

间、程序本身所占的存储空间、算法执行过程中所需要的额外空间。 如果额外空间量相对于问题规模(即输入数据所占的存储空间)来说是常数,即额外空间量不随问题规模的变化而变化,则称该算法是原地工作的。 故选A选项 3、某循环队列的存储空间为Q(1:m),初始状态为front=rear=m。现经过一系列的入队操作和退队操作后,front=m,rear=m-1,则该循环队列中的元素个数为 A) m-1 B) m C) 1 D) 0 参考答案:A 循环队列长度为m,由初始状态为front=rear=m,可知此时循环队列为空。入队运算时,首先队尾指针进1(即rear+1),然后在rear指针指向的位置插入新元素。特别的,当队尾指针rear=m+1时,置rear=1。退队运算时,排头指针进1(即front+1),然后删除front指针指向的位置上的元素,当排头指针front=m+1时,置front=1。 从排头指针front指向的后一个位置直到队尾指针rear指向的位置之间所有的元素均为队列 中的元素。如果rear-front>0,则队列中的元素个数为rear-front个;如果rear-front<0,则队列中的元素个数为rear-front+m 。该题中m-1

2017年全国计算机等级考试二级C语言真题及答案

2017年全国计算机等级考试二级笔试试卷 C 语言程序设计(附答案) (考试时间90 分钟,满分100 分) 一、选择题((1)—(10)、(21)—(40)每题2 分,(11)—(20)每题1 分,共70 分)下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确的选项填涂在答题卡相应位置上,答在试卷上不得分。 (1)下列叙述中正确的是 A)线性表的链式存储结构与顺序存储结构所需要的存储空间是相同的 B)线性表的链式存储结构所需要的存储空间一般要多于顺序存储结构 C)线性表的链式存储结构所需要的存储空间一般要少于顺序存储结构 D)上述三种说法都不对 (2)下列叙述中正确的是 A)在栈中,栈中元素随栈底指针与栈顶指针的变化而动态变化B)在栈中,栈顶指针不变,栈中元素随栈底指针的变化而动态变化C)在栈中,栈底指针不变,栈中元素随栈顶指针的变化而动态变化D)上述三种说法都不对 (3)软件测试的目的是 A)评估软件可靠性 B)发现并改正程序中的错误 C)改正程序中的错误 D)发现程序中的错误 (4)下面描述中,不属于软件危机表现的是 A)软件过程不规范B)软件开发生产率低C)软件质量难以控制C)软件成本不断提高(5)软件生命周期是指 A)软件产品从提出、实现、使用维护到停止使用退役的过程 B)软件从需求分析、设计、实现到测试完成的过程 C)软件的开发过程 D)软件的运行维护过程 (6)面向对象方法中,继承是指 A)一组对象所具有的相似性质 B)一个对象具有另一个对象的性质 C)各对象之间的共同性质 D)类之间共享属性和操作的机制 (7)层次型、网状型和关系型数据库划分原则是 A)记录长度B)文件的大小B)联系的复杂程度D)数据之间的联系方式 (8)一个工作人员可以使用多台计算机,而一台计算机可被多个人使用,则实体工作人员与实体计算机之间的联系是 A)一对一B)一对多C)多对多D)多对一 (9)数据库设计中反映用户对数据要求的模式是 A)内模式B)概念模式C)外模式D)设计模式 (10)有三个关系R、S 和T 如下:

计算机二级c语言1-3章先择题(带答案)

1.第一章第二章 1.C语言的函数体由()括起来。 A)<> B){} C)[] D)() 2.下面叙述错误的是() A)一个C源程序可由一个或多个函数组成 B)构成C语言源程序的基本单位是语句 C)C源程序中大、小写字母是有区别的 D)若一条语句较长,可分写在下一行或多行上 3.下面叙述正确的是() A)每行最多只能写两条语句 B)main()函数必须位于源程序文件的开头C)所有语句都必须以分号;结束 D)程序中必须含有自定义函数 4.C源程序中main()函数的位置()。 A)必须位于程序的最前面 B)必须在自定义函数前面C)必须在系统库函数后面 D)可以在自定义函数后面 5.结构化程序设计不包括()。 A)最优化 B)自顶而下,逐步细化C)模块化设计 D)结构化编码 6.下面叙述中,()不是结构化程序设计中的三种基本结构之一。 A)数据结构B)选择结构C)循环结构D)顺序结构

2.第三章数据类型、运算符和表达式 1.(B )为非法的字符串常量 A)“056”B)‘123’C)““D)“case” 2.( B )为正确的用户标识符。 A)min-5 B)max_at C)3_row D)union 3.以下(D )是正确的变量名。 A) a.bee B) -p11 C) int D) p_11 4.以下(D )是正确的变量名。 A)5f B)if C) f.5 D)_f5 5.以下(D )是正确的常量。 A)E-5 B)1E5.1 C)'a12' D)32766L 6.以下(A )是不正确的字符串常量。 A)'abc' B)"12'12" C)"0" D)" " 7.以下(BC )是正确的字符常量。 A)"c" B)'\\' C)'W' D)"\32a" 8.char型变量存放的是(A)。 A)ASCII代码值 B)字符本身C)十进制代码值 D)内码值 9.( B)为合法的常量。 A)5,236 B) 1.23E+8 C)‘b_k’D) 3.21E-6.5 10.(D)为正确的字符常量 A)‘\084’B)‘bcd’C)‘165’D)‘@’ 11.若有定义:int b=-15;则(D)为正确的赋值表达式。 A)*b=6 B)b=*5 C)b+10=-5 D)b+=b*3 12.若有定义:int x=2;则正确的赋值表达式是(A )。 A)a-=(a*3) B)double(-a) C)a*3 D)a*4=3 13.若有定义:float x=2,y;int a=3 ;语句y=1*(x+a)/3;运行后,y的值为(B)。 A)2.0 B)1.666667 C)1.0 D)0 14.若有定义:int a,b=5;语句a=(b/2)+b%2;运行后,a的值为(A ) A) 3 B) 4 C)0 D)2 15.下面叙述正确的是(B) A)2/3与2%3等价 B)5/(int)4.0与5/4等价C)++2与--3等价 D)++2与3等价 16.若有定义:int a,b=6;语句a=--b;运行后,a、b的值分别是(C)。 A) 6 6 B) 5 6 C) 5 5 D) 6 5 17.若有定义:int i=3,j=6;则表达式(--i)*(j++)的值为( D)。

(完整版)历年全国计算机二级C语言题库

50道C语言知识题 1.以下叙述中正确的是 A)用C程序实现的算法必须要有输入和输出操作 B)用C程序实现的算法可以没有输出但必须要有输入 C)用C程序实现的算法可以没有输入但必须要有输出 D)用C程序实现的算法可以既没有输入也没有输出 2.下列可用于C语言用户标识符的一组是 A)void,define,WORDB)a3_3,_123,Car C)For,-abc,IFCaseD)2a,DO,sizeof 3.以下选项中可作为C语言合法常量的是 A)-80B)-080C)-8e1.0D)-80.0e 4.若有语句:char*line[5];,以下叙述中正确的是 A)定义line是一个数组,每个数组元素是一个基类型为char为指针变量 B)定义line是一个指针变量,该变量可以指向一个长度为5的字符型数组 C)定义line是一个指针数组,语句中的*号称为间址运算符 D)定义line是一个指向字符型函数的指针 5.以下定义语句中正确的是 A)inta=b=0;B)charA=65+1,b=′b′; C)floata=1,*b=&a,*c=&b;D)doublea=00;b=1.1; 6.有以下程序段 charch;intk; ch=′a′; k=12; printf("%c,%d,",ch,ch,k);printf("k=%d\n",k); 已知字符a的ASCII码值为97,则执行上述程序段后输出结果是 A)因变量类型与格式描述符的类型不匹配输出无定值 B)输出项与格式描述符个数不符,输出为零值或不定值 C)a,97,12k=12 D)a,97,k=12 7.有以下程序 main() {inti,s=1; for(i=1;i<50;i++) if(!(i%5)&&!(i%3))s+=i; printf("%d\n",s);} 程序的输出结果是 A)409B)277C)1D)91 8.当变量c的值不为2、4、6时,值也为"真"的表达式是 A)(c==2)||(c==4)||(c==6) B)(c>=2&&c<=6)||(c!=3)||(c!=5) C)(c>=2&&c<=6)&&!(c%2) D)(c>=2&&c<=6)&&(c%2!=1) 9.若变量已正确定义,有以下程序段 inta=3,b=5,c=7;

相关文档
相关文档 最新文档