填空改错编程

来源:百度文库 编辑:神马文学网 时间:2024/04/29 22:20:13

目包含3道题:一道程序填空题、一道程序修改题、一道程序设计题),真实考试的时候,考生输入准考证后计算机随机为你抽取一套考试,每个考生考试时只需考一套题目(包含三道题),但由于考试时是随机抽题,所以即使把原题库告诉大家,你也不能知道到时计算机会给你抽取哪一套题,所以大家只有把全部题库都理解才能万无一失) 
   宏为世纪教育提供  网址:www.greatc.cn 
二级C语言上机试题汇编
※※※※※※※※※※※※※※※※※※※※※※※※※
第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)
/**********found**********/
{ t=*n % __1__;
/**********found**********/
if(t%2!= __2__)
{ x=x+t*i; i=i*10; }
*n =*n /10;
}
/**********found**********/
*n=__3__;
}
main()
{ unsigned long n=-1;
while(n>99999999||n<0)
{ printf("Please input(0fun(&n);
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 ;
/************found************/
if n = = 0
return 1.0 ;
while( n >1 && n < 170 )
/************found************/
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)
{
/**********found**********/
__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);
/**********found**********/
while (!feof(__2__)) {
/**********found**********/
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')
/**********found**********/
s[j]=s[i];
/**********found**********/
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;jprintf("\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;
/**********found**********/
fp = fopen(__1__, "rb+");
/**********found**********/
fseek(__2__, -1L*sizeof(STU), SEEK_END);
/**********found**********/
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;
/**********found***********/
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;
}
/**********found***********/
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;
/**********found**********/
fp = fopen(filename, __1__);
fread(s, sizeof(STU), N, fp);
fclose(fp);
for (i=0; ifor (j=i+1; j/**********found**********/
if (s[i].sno __2__ s[j].sno)
{ t = s[i]; s[i] = s[j]; s[j] = t; }
fp = fopen(filename, "wb");
/**********found**********/
__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;
/**********found***********/
s=p;
for(i=0; ido
{ a[i]=*p;
i++;
}
/**********found***********/
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; iprintf("The original data :\n");
for(i=0;iprintf("\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)
{
/**********found**********/
__1__ fp;
char str[100], str1[100], str2[100];
int a1; double f1;
fp = fopen("file1.txt", "w");
  fprintf(fp, "%s %d %f\n", s, a, f);
/**********found**********/
__2__ ;
fp = fopen("file1.txt", "r");
/**********found**********/
fscanf(__3__,"%s%s%s", str, str1, str2);
fclose(fp);
a1 = atoi(str1);
f1 = atof(str2);
printf("\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;
/**********found**********/
t=(STU *)calloc(sizeof(STU),m)
for(i=0; ifor(k=0; k{ for(i=j=0; iif(b[i].s > b[j].s) j=i;
/**********found**********/
   t(k)=b(j);
b[j].s=0;
}
return t;
}
outresult(STU a[], FILE *pf)
{ int i;
for(i=0; ifprintf(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; iprintf(" %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; in=fun(a,n);
printf("\n\nThe data after deleted :\n");
for(i=0;iNONO();
} 解题思路:
本题是删除已排序过数组中的相同数。
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; }
/**********found**********/
__1__ fun(int i, double x, double y)
{ if (i==1)
/**********found**********/
return __2__(x);
else
/**********found**********/
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
/**********found**********/
char fun(char *s, char *t)
{ int sl=0,tl=0; char *ss, *tt;
ss=s; tt=t;
while(*ss)
{ sl++;
/**********found**********/
(*ss)++;
}
while(*tt)
{ tl++;
/**********found**********/
(*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;iw[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;iw[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;
/**********found**********/
void show(STU ___1___)
{ int i;
printf("\n%d %s %c %d-%d-%d", tt.num, tt.name, tt.sex,
tt.birthday.year, tt.birthday.month, tt.birthday.day);
for(i=0; i<3; i++)
/**********found**********/
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");
/**********found**********/
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++) {
/**********found**********/
m=0;
for(k=i+1;k/**********found**********/
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; iprintf("\n");
fun ( b, n );
for ( i=0; iprintf("\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,tt.name);
for(i=0; i<3; i++)
printf("%5.1f",tt.score[i]);
printf("\n");
}
/**********found**********/
void modify(___1___ *ss,float a)
{ int i;
for(i=0; i<3; i++)
/**********found**********/
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);
/**********found**********/
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)
{
/************found************/
if k > 0
return (k*fun(k-1));
  /************found************/
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; jprintf("\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) {
/**********found**********/
q = __1__ ;
/**********found**********/
while (__2__)
{ if (p->data > q->data)
{ t = p->data; p->data = q->data; q->data = t; }
q = q->next;
  }
/**********found**********/
p = __3__ ;
}
}
NODE *creatlist(int a[])
{ NODE *h,*p,*q; int i;
h=NULL;
for(i=0; i{ 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)
{
/**********found***********/
while(*s!='@')
{ if(*s>='A' & *s<='Z' || *s>='a' && *s<='z')
{ if(*s=='Z') *s='A';
else if(*s=='z') *s='a';
else *s += 1;
}
/**********found***********/
(*s)++;
}
}
main()
{ char s[80];
printf("\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; iprintf("\n\nEnter p: ");scanf("%d",&p);
fun(a,p,n);
printf("\nThe data after moving:\n");
for(i=0; iprintf("\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/**********found**********/
row=colum= __1__;
for(j=0; j{ row+=a[i][j]; colum+=a[j][i]; }
/**********found**********/
if( (row!=colum) __2__ (row!=m1) ) return 0;
}
/**********found**********/
return __3__;
}
  main()
{ int x[N][N],i,j;
printf("Enter number for array:\n");
for(i=0; ifor(j=0; jprintf("Array:\n");
for(i=0; i{ for(j=0; jprintf("\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++ )
/**********found**********/
t = 1.0-1 /i;
/**********found**********/
_______;
}
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;
/**********found**********/
p = h->__1__;
/**********found**********/
if (p==__2__) return;
q = p->next;
p->next = NULL;
while (q)
{ r = q->next; q->next = p;
/**********found**********/
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;
/*********found**********/
r=p;
while(*r)
if(*r==*p) { r++; p++; }
else break;
/*********found**********/
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; iprintf("\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;
/**********found**********/
__1__ * fun(NODE *h)
{ NODE *p, *q, *r;
p = h;
if (p == NULL)
return NULL;
q = p->next;
p->next = NULL;
while (q)
{
/**********found**********/
r = q->__2__;
q->next = p;
p = q;
/**********found**********/
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/***********found**********/
  if(i%2 && s[i]%2==0)
t[j++]=s[i];
/***********found**********/
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;
/**********found**********/
p = __1__ ;
while (p) {
/**********found**********/
q = __2__ ;
while (q) {
/**********found**********/
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;
/***********found**********/
p=h ;
while(p)
{ if(p->data>max )
max=p->data;
/***********found**********/
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)
{
/**********found**********/
__1__ (*f)();
double r1, r2;
/**********found**********/
f = __2__ ; /* point fountion f1 */
r1 = f(a);
/**********found**********/
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;
/***********found**********/
p=h;
while(p)
{ if(p->data%2==0)
sum +=p->data;
/***********found**********/
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+");
/**********found**********/
while (!feof(__1__))
{ fread(&n, sizeof(STU), 1, fp);
/**********found**********/
if (n.sno__2__sno) break;
}
if (!feof(fp))
{ for (i=0; i<3; i++) n.score[i] += 3;
/**********found**********/
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;
/**********found**********/
n=strlen[ aa ];
for( i=1; i/**********found**********/
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/**********found**********/
n=strlen(___1___);
for(j=0; j/**********found**********/
ss[i][ ___2___]='*';
/**********found**********/
ss[i][n+j+ ___3___]='\0';
}
}
main()
{ char ss[M][N]={"shanghai","guangzhou","beijing","tianjing","cchongqing"};
int i;
printf("The original strings are :\n");
for(i=0; iprintf("\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 )
{
/**********found***********/
if( p == ' ' )
{
k = 0;
/**********found***********/
* (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)
  {
/**********found**********/
__1__ t;
int i, j;
/**********found**********/
for (i=0; i<__2__; i++)
for (j=i+1; j/**********found**********/
if (strcmp(__3__) > 0)
{ t = a[i]; a[i] = a[j]; a[j] = t; }
}
main()
{ struct student s[4]={{10001,"ZhangSan", 95, 80, 88},{10002,"LiSi", 85, 70, 78},
{10003,"CaoKai", 75, 60, 88}, {10004,"FangFang", 90, 82, 87}};
int i, j;
printf("\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\TAB { max=p[i];
/**********found**********/
\TAB q=p+i
\TAB }
i++;
}
/**********found**********/
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;iprintf("%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;ifor(j=i+1;jif(h[i].s>h[j].s) {tt=h[i] ;h[i]=h[j]; h[j]=tt;}
for(i=0;ifprintf(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'))) {
/**********found**********/
t[j]=__1__; j++;}
else
{ p[k]=s[i]; k++; }
}
  /**********found**********/
for(i=0; i<__2__; i++) t[j+i]=p[i];
/**********found**********/
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 );
/************found************/
while ( w )
{ p = w; r = t1;
while ( *r )
/************found************/
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];
};
/**********found**********/
__1__ fun(struct student *a)
{ int i;
a->sno = 10002;
strcpy(a->name, "LiSi");
/**********found**********/
for (i=0; i<3; i++) __2__ += 1;
/**********found**********/
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, s.name);
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
/**********found**********/
fun(char (*sq)[M])
{ int i; char *sp;
sp=sq[0];
for(i=0;iif(strlen( sp)sp=sq[i] ;
/**********found**********/
return sq;
}
main()
{ char str[N][M], *longest; int i;
printf("Enter %d lines :\n",N);
for(i=0; iprintf("\nThe N string :\n",N);
for(i=0; ilongest=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.DAT中的数据不得修改。
请勿改动主函数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;
/**********found**********/
for(i=0; ifor(i=j=0; iif( x[i]/**********found**********/
y[j]=x[i]; x[i]=-1; __2__;}
i=0;
while(i{ if( x[i]!= -1 ) y[j++]=x[i];
/**********found**********/
__3__;
}
for(i=0; ireturn av;
}
main()
{ int i; double x[N];
for(i=0; iprintf("\n");
printf("\nThe average is: %f\n",fun(x));
printf("\nThe result :\n",fun(x));
for(i=0; iprintf("\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/**********found**********/
num[i]=0;
for (; *s; s++)
{ i = -1;
/**********found**********/
switch ( s )
{ case 'a': case 'A': {i=0; break;}
case 'e': case 'E': {i=1; break;}
case 'i': case 'I': {i=2; break;}
case 'o': case 'O': {i=3; break;}
case 'u': case 'U': {i=4; break;}
}
if (i >= 0)
num[i]++;
}
}
main( )
{ char s1[81]; int num1[5], i;
printf( "\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; jprintf ("\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/**********found**********/
av=__1__;
for(i=j=0; iif( x[i]>av ){
/**********found**********/
y[__2__]=x[i]; x[i]=-1;}
for(i=0; i/**********found**********/
if( x[i]!= __3__) y[j++]=x[i];
for(i=0; ireturn av;
}
main()
{ int i; double x[N];
for(i=0; iprintf("\n");
printf("\nThe average is: %f\n",fun(x));
printf("\nThe result :\n",fun(x));
for(i=0; iprintf("\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
/************found************/
include
/************found************/
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; isum+=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++)
/**********found**********/
fprintf(___1___,"%d %f\n",i,sqrt((double)i));
printf("\nSucceed!!\n");
/**********found**********/
___2___;
printf("\nThe data in file :\n");
/**********found**********/
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;
/************found************/
for ( i=j+1; iif ( a[p]>a[i] )
/************found************/
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.DAT中的数据不得修改。
请勿改动主函数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/**********found**********/
b[i]= __1__;
for(j=1; j/**********found**********/
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;jprintf("\n");
}
/**********found**********/
fun(__3__);
printf("\nThe result is:");
for(i=0; iprintf("\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
/*********found**********/
int fun(int x,int y)
{
int t;
/*********found**********/
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];
};
/**********found**********/
__1__ fun(struct student a)
{ int i;
a.sno = 10002;
/**********found**********/
strcpy(__2__, "LiSi");
/**********found**********/
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, s.name);
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。
第二处:对姓名进行修改,所以应填:a.name。
第三处:分别对成绩增加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] )
\TAB p=p+1;
/**********found**********/
if(P==n) return -1;
else
{ for(i=p;i/**********found**********/
\TAB 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;iprintf("\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},
\TAB \TAB {"GA01",91},{"GA07",72},{"GA08",64},{"GA06",87},
\TAB \TAB {"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91},
\TAB \TAB {"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;iprintf("%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;ifprintf(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;
/**********found**********/
___1___ fun(STU *std, char *num)
{ int i; STU a={"",9999,99,99};
for (i=0; i/**********found**********/
if( strcmp(___2___,num)==0 )
/**********found**********/
return (___3___);
return a;
}
main()
{ STU std[N]={ {"111111",1984,2,15},{"222222",1983,9,21},{"333333",1984,9,1},
{"444444",1983,7,15},{"555555",1984,9,28},{"666666",1983,11,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 ) {
/************found************/
r++; p++
}
else break;
/************found************/
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;
/**********found**********/
free(___1___);
/**********found**********/
q=p->___2___;
}
else
{ p=q;
/**********found**********/
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++) {
/************found************/
  p = j
for (i = j;i < n; i++)
if(a[i] < a[p])
/************found************/
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;
/**********found**********/
s=__1__;
/**********found**********/
for(i=1; i<=__2__; i++)
{ t=2.0*i;
/**********found**********/
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;
/************found************/
for(i = 0, str[i], i++)
for(j=i,k=0;substr[k]==str[j];k++,j++)
/************found************/
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;
/**********found**********/
for(i=0; ___1___ !=NULL; i++)
/**********found**********/
if(s[i]>='0'&&s[i]<= ___2___ ) n++;
/**********found**********/
___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 ;
/**************found**************/
t = x ; x = y ;
/**************found**************/
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;
/**********found**********/
  b__1__ = 10004;
/**********found**********/
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, t.name);
for (i=0; i<3; i++) printf("%6.2f ", t.score[i]);
printf("\n");
/**********found**********/
fun(__3__);
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");
}
解题思路:
本题是对结构体变量中的值进行修改并通过函数中的参数进行返回。
第一处:对学号进行更改,所以应填:->no。
第二处:对姓名进行更改,所以应填:->name。
第三处:对函数的调用,所以应填:&t。
***************************************************
给定程序MODI1.C中函数fun的功能是:应用递归算法求形参a的平方根。求平
方根的迭代公式如下:
1 a
x1 = ─ ( x0 + ─ )
2 x0
例如,a为2时,平方根值为:1.414214。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
给定源程序:
#include
#include
/**********found**********/
double fun(double a, dounle x0)
{ double x1, y;
x1=(x0+ a/x0)/2.0;
/**********found**********/
if( fabs(x1-xo)>0.00001 )
\TAB 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},
\TAB \TAB {"GA01",91},{"GA07",72},{"GA08",64},{"GA06",87},
\TAB \TAB {"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;iprintf("%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;ifor(j=i+1;jif(h[i].sfor(i=0;ifprintf(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;
/**********found**********/
b = __1__;
b.sno = 10002;
/**********found**********/
strcpy(__2__, "LiSi");
printf("\nThe data after modified :\n");
printf("\nNo: %ld Name: %s\nScores: ",b.sno, b.name);
/**********found**********/
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, s.name);
for (i=0; i<3; i++) printf("%6.2f ", s.score[i]);
printf("\n");
fun(s);
}
解题思路:
本题是对结构体变量中的值进行修改。
第一处:要修改的结构体变量是由形参a来传递的,所以应填:a。
第二处:对结构体中的成员name进行替换,所以应填:b.name。
第三处:分别输出结构体中的成绩,所以应填: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')
  /************found************/
\TAB s[j]=s[i];
/************found************/
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/**********found**********/
___1___;
/**********found**********/
for(j=___2___+2 ; jif(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/**********found**********/
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 ;
/**************found**************/
while(t >= num)
{
pi = pi + t ;
n = n + 2 ;
s = -s ;
/**************found**************/
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) ;
}
解题思路:
第一处:要判断t的最后一项绝对小于指定的数,由于t是实数,那么应改为
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
/**********found**********/
void fun(char (*ss) __1__, int k)
{ int i=0 ;
/**********found**********/
while(i< __2__) {
  /**********found**********/
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;ifun(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;
/************found************/
t=0;
while( t>eps)
{ s+=t;
t=t * n/(2*n+1);
n++;
}
/************found************/
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;
/**********found**********/
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);
/**********found**********/
while(!feof(___2___))
{ putchar( ch );
/**********found**********/
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;
/************found************/
if (d%2=0)
{ *t=d* sl+ *t;
sl *= 10;
}
/************found************/
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.DAT中的数据不得修改。
请勿改动主函数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/**********found**********/
for (j=a[i]*2; j<=n; j+=___1___)
a[j] = 0;
i++;
/**********found**********/
while (___2___==0)
i++;
}
printf("\nThe prime number between 2 to %d\n", n);
for (i=2; i<=n; i++)
/**********found**********/
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) {
/**************found**************/
Y=1;
for(j=2;j<=sqrt((double)i);j++)
if(i%j==0) y=0;
if(y==1) {
/**************found**************/
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
/**********found**********/
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/**********found**********/
for(j= __2__ ; ja[i][j]=a[N-i-1][j]=i+1;
for(k=i+1; k/**********found**********/
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; jprintf("\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++ )
{
/**********found**********/
aa[i] = m/k;
m /= k;
}
for( ; i; i-- )
/**********found**********/
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;
/**********found**********/
___1___=0;
  p=h->next;
while(p)
{ (*n)++;
/**********found**********/
p=p->___2___;
}
}
main()
{ SLIST *head;
int a[N]={12,87,45,32,91,16,20,48}, num;
head=creatlist(a); outlist(head);
/**********found**********/
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;
/************found************/
a = Null;
while ( *s )
{ p = s; r = t;
while ( *r )
/************found************/
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;
/**********found**********/
for(i=0; i< __1__ ; i++)
/**********found**********/
if( strstr(ss[i], __2__) != NULL )
{ find=1; puts(ss[i]); printf("\n"); }
/**********found**********/
if (find==__3__) printf("\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;iprintf("\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
/************found************/
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;
}
/************found************/
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(ja[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/**********found**********/
if (a[i]%2==___1___)
{
/**********found**********/
a[j] = a[i]; ___2___;
}
/**********found**********/
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; iprintf("\n");
n = fun(b, N);
printf("\nThe number of odd : %d \n", n);
printf("\nThe odd number :\n");
for (i=0; iprintf("\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/************found************/
t=a; b=a; a=t;
}
r=a%b;
while(r!=0)
{ a=b; b=r; r=a%b; }
/************found************/
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;
/**********found**********/
for(i=0; i< __1__ ; i++)
{ len=strlen(ss[i]);
/**********found**********/
if(len<= __2__)
/**********found**********/
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;if=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)
{
/************found************/
int k = 1;
/************found************/
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));
/**********found**********/
s->data=___1___;
q=h;
p=h->next;
while(p!=NULL && x>p->data) {
/**********found**********/
q=___2___;
p=p->next;
}
s->next=p;
/**********found**********/
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)
{
/************found************/
long k;
do
{ k*=num%10 ;
/************found************/
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; iave=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/**********found**********/
__1__=s/N;
d=32767;
for(i=0; iif(x[i]<*av && *av - x[i]<=d){
/**********found**********/
d=*av-x[i]; j=__2__;}
/**********found**********/
return __3__;
}
main()
{ int i; double x[N],av,m;
for(i=0; iprintf("\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
/************found************/
int fun ( int n )
{ float A=1; int i;
/************found************/
for (i=2; iA = 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; jprintf("\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')
{
/**********found**********/
t2[j]=s[i]; ___1___;
}
else t1[k++]=s[i];
t2[j]=0; t1[k]=0;
/**********found**********/
for(i=0; i/**********found**********/
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++ ) {
/**************found**************/
for (j = i + 1, j < 6, j++)
{
if(strcmp(*(pstr + i), *(pstr + j)) > 0)
{
  p = *(pstr + i) ;
/**************found**************/
*(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;
/**********found**********/
for(i=0; i< __1__ ; i++)
/**********found**********/
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;iprintf("\nEnter a string for search: "); gets(t);
n=fun(ch,t);
/**********found**********/
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++) {
/************found************/
a2=k/1O;
a1=k-a2*10;
if((k%3==0 && a2==5)||(k%3==0 && a1==5))
{ b[i]=k; i++; }
}
/************found************/
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
/**********found**********/
___1___ fun(char ch)
{
/**********found**********/
if (ch>='0' && ___2___)
/**********found**********/
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 ) {
/**********found**********/
b[k]=p;
k++; p++; i++;
}
if(*p)
{
/**********found**********/
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;
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("->%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/**********found**********/
if (___1___== 0) {
/**********found**********/
___2___ = a[i]; j++;
}
/**********found**********/
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; iprintf("\n");
n = fun(b, N);
printf("\nThe number of even :%d\n", n);
printf("\nThe even :\n");
  for (i=0; iprintf("\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
/************found************/
fun ( n )
{ int c;
/************found************/
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(jp++ ;
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; ifor(i=0; i/**********found**********/
k= __1__ ;
for(j=i+1; j/**********found**********/
if(strlen(ps[k]) < strlen(__2__) ) k=j;
  /**********found**********/
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;ifun(ch);
}
解题思路:
本题是按字符串的长短进行排序。
第一处:外循环每循环一次,k应保存当前的i值,所以应填:i。
第二处:使用内循环对i+1后面的字符串长度进行比较,所以应填:ps[j]。
第三处:交换内容,所以应填:tp。
***************************************************
已知一个数列从第0项开始的前三项分别为0,0,1,以后的各项都是其相邻
的前三项之和。给定程序MODI1.C中函数fun的功能是:计算并输出该数列前n项的
平方根之和。n的值通过形参传入。
例如,当n=10时,程序的输出结果应为:23.197745。
请改正程序中的错误,使程序能输出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#include
/************found************/
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;
}
/************found************/
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) ) {
/**********found**********/
ch=tolower(__1__);
n=ch-'a';
/**********found**********/
k[n]+= __2__ ;
}
s++;
/**********found**********/
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
/************found************/
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++;
}
/************found************/
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) {
/**********found**********/
if( isdigit(*s) ) sum+= *s- __1__ ;
/**********found**********/
__2__;
}
/**********found**********/
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))
{
/************found************/
if ((k%13 = 0) || (k%17 = 0))
{ m = m+ k; mc++; }
k--;
}
return m;
/************found************/
  _____
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) {
/**********found**********/
*(t+n)= __1__ ; n++; }
/**********found**********/
  __2__ ;
}
*(t+n)=0;
/**********found**********/
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 fun(float x[], int n)
{
/************found************/
int j, c=0, float xa=0.0;
for (j=0; jxa += x[j]/n;
printf("ave =%f\n",xa);
for (j=0; j/************found************/
if (x[j] => xa)
c++;
return c;
}
main ( )
{ float x[100] = {193.199, 195.673, 195.757, 196.051, 196.092, 196.596, 196.579,
196.763};
printf("%d\n", fun (x, 8));
}
解题思路:
第一处:两种类型变量定义之间应该用分号,所以应改为: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
/**********found**********/
void fun(int (*t)___1___ )
  { int i, j;
for(i=1; i{ for(j=0; j{
/**********found**********/
___2___ =t[i][j]+t[j][i];
/**********found**********/
___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; jprintf("\n");
}
fun(t);
printf("\nThe result is:\n");
for(i=0; i{ for(j=0; jprintf("\n");
}
}
解题思路:
第一处:形参t的定义,整数数组其宽度为N,所以应填:[N]。
第二处:对称元素相加,其结果仍存放在左下三角元素中,所以应填:t[i][j]。
第三处:右上三角元素置为0,所以应填:t[j][i]。
***************************************************
给定程序MODI1.C中函数fun的功能是:计算函数
F(x,y,z)=(x+y)/(x-y)+(z+y)/(z-y)的值。其中x和y的值不等,z和y的值不等。
例如,当x的值为9、y的值为11、z的值为15时,函数值为 -3.50。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
给定源程序:
#include
#include
#include
/************found************/
#define FU(m,n) (m/n)
float fun(float a,float b,float c)
{ float value;
value=FU(a+b,a-b)+FU(c+b,c-b);
/************found************/
Return(Value);
}
  main()
{ float x,y,z,sum;
printf("Input x y z: ");
scanf("%f%f%f",&x,&y,&z);
printf("x=%f,y=%f,z=%f\n",x,y,z);
if (x==y||y==z){printf("Data error!\n");exit(0);}
sum=fun(x,y,z);
printf("The result is : %5.2f\n",sum);
}
解题思路:
第一处:define定义错误,所以应改为:#define FU(m,n) ((m)/(n))。
第二处:return错写成Return,变量value错写成Value。
***************************************************
规定输入的字符串中只包含字母和*号。请编写函数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. 利用循环扫描出字符串左边第1个字符不是'*'的字符。
2. 再利用循环把以后的字符依次移动原字符串首地址开始存放。
3. 最后给字符串a加上结束符。
参考答案:
void fun( char *a )
{
int j=0;
char *p = a ;
while(*p == '*') p++ ;
while(*p) {
a[j++] = *p ;
p++;
}
a[j]=0 ;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第51套:
给定程序中,函数fun的功能是:计算出形参s所指字符串中包含的单词个数,
作为函数值返回。为便于统计,规定各单词之间用空格隔开。
例如,形参s所指的字符串为:This is a C language program.,函数
的返回值为6。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
  不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
int fun(char *s)
{ int n=0, flag=0;
while(*s!='\0')
{ if(*s!=' ' && flag==0) {
/**********found**********/
__1__ ; flag=1;}
/**********found**********/
if (*s==' ') flag= __2__ ;
/**********found**********/
__3__ ;
}
return n;
}
main()
{ char str[81]; int n;
printf("\nEnter a line text:\n"); gets(str);
n=fun(str);
printf("\nThere are %d words in this text.\n\n",n);
}
解题思路:
本题是统计字符串中包含的单词个数。
第一处:单词个数用变量n来统计,当当前字母不是空格且flag状态标志为0时,则单词数
就加1,将状态标志flag置为1,所以应填:n++。
第二处:当当前字符是空格时,flag状态标志置0,所以应填:0。
第三处:到字符串下一个位置,所以应填:s++。
***************************************************
给定程序MODI1.C中函数 fun 的功能是:从n(形参)个学生的成绩中统计出低
于平均分的学生人数,此人数由函数值返回,平均分存放在形参aver所指的存储单
元中。
例如,若输入 8 名学生的成绩:80.5 60 72 90.5 98 51.5 88 64
则低于平均分的学生人数为: 4 (平均分为:75.5625 )。
请改正程序中的错误,使它能统计出正确的结果。
注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#define N 20
int fun ( float *s, int n, float *aver )
{ float ave, t = 0.0 ;
int count = 0, k, i ;
for ( k = 0 ; k < n ; k++ )
/**************found**************/
t = s[k] ;
ave = t / n ;
for ( i = 0 ; i < n ; i++ )
  if ( s[ i ] < ave ) count++ ;
/**************found**************/
*aver = Ave ;
return count ;
}
main()
{ float s[30], aver ;
int m, i ;
printf ( "\nPlease enter m: " ) ; scanf ("%d", &m ) ;
printf ( "\nPlease enter %d mark :\n ", m ) ;
for( i = 0 ; i < m ; i++ ) scanf ( "%f", s + i ) ;
printf( "\nThe number of students : %d \n" , fun ( s, m, &aver ) );
printf( "Ave = %f\n", aver ) ;
}
解题思路:
第一处:应求累加和,而不赋值,所以应改为t+=s[k];。
第二处:ave不需要取地址,直接赋给*aver就可以了。
***************************************************
请编写函数fun,其功能是求出数组的最大元素在数组中的下标并存放在k所
指的存储单元中。
例如, 输入如下整数: 876 675 896 101 301 401 980 431 451 777
则输出结果为: 6, 980
注意: 部分源程序在文件PROG1.C文件中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
int fun(int *s, int t, int *k)
{
}
main( )
{
int a[10]={876,675,896,101,301,401,980,431,451,777}, k ;
fun(a, 10, &k) ;
printf("%d, %d\n", k, a[k]) ;
NONO( ) ;
} 解题思路:
本题是考察考生如何在指定的数组找出最大元素值的下标,通过形参*k返回到主程序中。
给出的程序是使用for循环语句进行处理的,在循环之前,首先把数组的第一个元素值赋给
最大值变量max,位置pos为0,然后通过循环依次判断下一元素值是否大于最大值max,如果大
于,那么把这个数重新赋给max,位置i赋给pos,循环结果,即可得到最大值的位置pos,最后
执行语句*k=pos就可以实现返回了。
参考答案:
int fun(int *s, int t, int *k)
{
int i, pos = 0, max = *s ;
for(i = 1 ; i < t ; i++) {
if(max < *(s + i)) {
max = *(s + i) ;
pos = i ;
}
}
*k = pos ;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第52套:
给定程序中,函数fun的功能是:将N×N矩阵中元素的值按列右移1个位置,
  右边被移出矩阵的元素绕回左边。例如,N=3,有下列矩阵
1 2 3
4 5 6
7 8 9
计算结果为
3 1 2
6 4 5
9 7 8
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#define N 4
void fun(int (*t)[N])
{ int i, j, x;
/**********found**********/
for(i=0; i<___1___; i++)
{
/**********found**********/
x=t[i][___2___] ;
for(j=N-1; j>=1; j--)
t[i][j]=t[i][j-1];
/**********found**********/
t[i][___3___]=x;
}
}
main()
{ int t[][N]={21,12,13,24,25,16,47,38,29,11,32,54,42,21,33,10}, i, j;
printf("The original array:\n");
for(i=0; i{ for(j=0; jprintf("\n");
}
fun(t);
printf("\nThe result is:\n");
for(i=0; i{ for(j=0; jprintf("\n");
}
}
解题思路:
第一处:函数fun是对N×N矩阵进行操作,for循环的终止值为N。
第二处:把最后一列的元素值赋值给临时变量x保存用来交换,所以应填:N-1。
第三处:第1列元素值使用x替换,由于C语言的下标是从0开始的,所以应填:0。
***************************************************
  例如,若q的值为: 50.0,则函数值为: 49.394948。
请改正程序中的错误,使程序能输出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
double fun( double q )
{ int n; double s,t;
n = 2;
s = 2.0;
while (s<=q)
{
t=s;
/************found************/
s=s+(n+1)/n;
n++;
}
printf("n=%d\n",n);
/************found************/
return s;
}
main ( )
{
printf("%f\n", fun(50));
}
解题思路:
第一处:如果两个整数类型相除,结果仍为整数,所以必须转换其中一个数的类型,所以
应改为:s+=(float)(n+1)/n;。
第二处:返回结果错误,应改为:return t;。
***************************************************
编写函数fun,它的功能是:求Fibonacci数列中大于t的最小的一个数,结果
由函数返回。其中Fibonacci数列F(n)的定义为:
F(0)=0,F(1)=1
F(n)=F(n-1)+F(n-2)
例如:当t = 1000时,函数值为:1597。
注意: 部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
#include
int fun( int t)
  {
}
main() /* 主函数 */
{ int n;
n=1000;
printf("n = %d, f = %d\n",n, fun(n));
NONO();
} 解题思路:
本题是考察考生用递推算法来求出斐波那契数列中每项的值。给出的程序就是用变量f、f0
和f1来表示递推的过程,给变量f0和f1最初分别置数列中第1项和第2项的值0和1,然后进入循
环,执行语句f=f0+f1;将所得和值存入f中,这就是数列的第3项,把f1的值移入f0中,将f的
值移入f1中,为求数列的下一列作好准备;接着进入下一次循环,通过语句f=f0+f1求得数列的
第4项,不断重复以上步骤,每重复一次就依次求得数列的下一项,直至某项满足要为止。
参考答案:
int fun( int t)
{
int f0 = 0, f1 = 1, f ;
do {
f = f0 + f1 ;
f0 = f1 ;
f1 = f ;
} while(f < t) ;
return f ;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第53套:
函数fun的功能是:计算
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#include
double fun(double x)
{ double f, t; int n;
f = 1.0 + x;
/**********found**********/
t = ___1___;
n = 1;
do {
n++;
/**********found**********/
t *= (-1.0)*x/___2___;
f += t;
}
/**********found**********/
while (___3___ >= 1e-6);
return f;
}
  main()
{ double x, y;
x=2.5;
y = fun(x);
printf("\nThe result is :\n");
printf("x=%-12.6f y=%-12.6f\n", x, y);
}
解题思路:
第一处:根据公式可知,变量t的值为x。
第二处:根据公式可知,此处应该除以n,所以应填:n。
第三处:根据试题中条件的要求,所以应填:fabs(t)。
***************************************************
给定程序MODI1.C中函数fun的功能是: 求整数x的y次方的低3位值。例如,整
数5的6次方为15625, 此值的低3位值为625。
请改正函数fun中指定部位的错误, 使它能得出正确的结果。
注意: 不要改动main函数, 不得增行或删行, 也不得更改程序的结构!
给定源程序:
#include
long fun(int x,int y,long *p )
{ int i;
long t=1;
/**************found**************/
for(i=1; it=t*x;
*p=t;
/**************found**************/
t=t/1000;
return t;
}
main()
{ long t,r; int x,y;
printf("\nInput x and y: "); scanf("%ld%ld",&x,&y);
t=fun(x,y,&r);
printf("\n\nx=%d, y=%d, r=%ld, last=%ld\n\n",x, y,r,t );
}
解题思路:
第一处:错误在for循环语句上,根据试题要求,终止条件应该是i<=y。
第二处:要取低3位的值时,应模1000取余数,而不是整除1000取商。
***************************************************
例如, 在主函数中从键盘给x输入0.21后,输出为:s=1.100000。
注意: 部分源程序在文件PROG1.C中。
  请勿改动主函数main和其他函数中的任何内容, 仅在函数fun的
花括号中填入你编写的若干语句。
给定源程序:
#include
#include
double fun(double x)
{
}
main()
{ double x,s;
printf("Input x: "); scanf("%lf",&x);
s=fun(x);
printf("s=%f\n",s);
NONO();
}
解题思路:
本题是根据给定的公式进行计算。具体操作请看答案程序中的说明。
参考答案:
double fun(double x)
{
int n=1; /* 循环计数*/
double sn=1; /* 累计数*/
double xn=1,xn1=0; /*x的n值,以及x的n-1值;*/
while(fabs(xn-xn1)>=0.000001)/*绝对值是否满足条件*/
{
xn=xn*x*(0.5-n+1)/n; /*表达式分解以后xn=(xn-1)*x*(0.5-n+1)/n*/
n+=1;
sn+=xn; /*sn累加上xn*/
}
return(sn);
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第54套:
给定程序中,函数fun的功能是:计算出带有头结点的单向链表中各结点数据
域中值之和作为函数值返回。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#include
#define N 8
typedef struct list
{ int data;
struct list *next;
} SLIST;
SLIST *creatlist(int *);
void outlist(SLIST *);
int fun( SLIST *h)
{ SLIST *p; int s=0;
p=h->next;
while(p)
{
/**********found**********/
s+= p->___1___;
/**********found**********/
p=p->___2___;
}
return s;
}
   main()
{ SLIST *head;
int a[N]={12,87,45,32,91,16,20,48};
head=creatlist(a); outlist(head);
/**********found**********/
printf("\nsum=%d\n", fun(___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("The list is NULL!\n");
else
{ printf("\nHead ");
do
{ printf("->%d", p->data); p=p->next; }
while(p!=NULL);
printf("->End\n");
}
}
解题思路:
本题是计算出带有头结点的单向链表中各结点数据域中值之和。
第一处:累加数据域中的值,所以应填:data。
第二处:指定p的下一个指针,所以应填:next。
第三处:函数调用,在主函数中已经给出了head,所以应填:head。
***************************************************
给定程序MODI1.C中函数fun的功能是:将s所指字符串中出现的与t1所指字符
串相同的子串全部替换成t2所指字符串,所形成的新串放在w所指的数组中。在此
处,要求t1和t2所指字符串的长度相同。
例如,当s所指字符串中的内容为:"abcdabfab",t1所指子串中的内容为:
"ab",t2所指子串中的内容为:"99"时, 结果在w所指的数组中的内容应为:
"99cd99f99"。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动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;
/************found************/
while ( r )
if ( *r == *p ) { r++; p++; }
else break;
if ( *r == '\0' )
{ a = w; r = t2;
while ( *r ){
/************found************/
*a = *r; a++; r++
}
w += strlen(t2) ;
}
else w++;
}
}
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("Error : strlen(t1) != strlen(t2)\n");
}
解题思路:
第一处:判断字符串当前字符是否是字符串结束符,所以应改为:while(*r)。
第二处:语句后缺少分号。
***************************************************
函数fun的功能是:将s所指字符串中下标为偶数的字符删除,串中剩余字符
形成的新串放在t所指数组中。
例如,当s所指字符串中的内容为:"ABCDEFGHIJK",
在t所指数组中的内容应是:"BDFHJ"。
注意: 部分源程序存在文件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 = 1 ; i < strlen(s); i+=2) t[j++] = s[i] ;
t[j] = 0 ;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第55套:
给定程序中,函数fun的功能是:判断形参s所指字符串是否是"回文"
(Palindrome),若是,函数返回值为1;不是,函数返回值为0。"回文"
是正读和反读都一样的字符串(不区分大小写字母)。
例如,LEVEL和Level是"回文",而LEVLEV不是"回文"。
请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#include
#include
int fun(char *s)
{ char *lp,*rp;
/**********found**********/
lp= __1__ ;
rp=s+strlen(s)-1;
while((toupper(*lp)==toupper(*rp)) && (lp/**********found**********/
lp++; rp __2__ ; }
/**********found**********/
if(lpelse return 1;
}
main()
{ char s[81];
printf("Enter a string: "); scanf("%s",s);
if(fun(s)) printf("\n\"%s\" is a Palindrome.\n\n",s);
else printf("\n\"%s\" isn't a Palindrome.\n\n",s);
}
解题思路:
本题是判断字符串是否是“回文”。
   第一处:根据函数体fun中,对变量lp的使用可知,lp应指向形参s,所以应填:s。
第二处:rp是指向字符串的尾指针,当每做一次循环rp指向就要指向前一个字符,所以应
填:--。
第三处:当lp和rp相等时,则表示字符串是回文并返回1,否则就返回0,所以应填:return
0。
***************************************************
给定程序MODI1.C中fun函数的功能是:求出以下分数序列的前n项之和。
2 3 5 8 13 21
┄┄ , ┄┄ , ┄┄ , ┄┄ , ┄┄ , ┄┄ , ……
1 2 3 5 8 13
和值通过函数值返回main函数。
例如,若 n = 5,则应输出: 8.391667。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
/**************found**************/
fun (int n )
{ int a = 2, b = 1, c, k ;
double s=0.0 ;
for ( k = 1; k <= n; k++ )
{ s = s + 1.0 * a / b ;
/**************found**************/
c = a; a += b; b += c;
}
return(s) ;
}
main( )
{ int n = 5 ;
printf( "\nThe value of function is: %lf\n", fun ( n ) ) ;
}
解题思路:
第一处:由于计算的实型值要通过函数返回,所以必须定义函数的返回类型,只要int或void
可以省略,其他都要定义类型。由于返回是实型值,所以应在数名前加上double或float等定义。
第二处:根据公式可知,在for循环内b的值应是c。
***************************************************
请编写函数fun,函数的功能是:将大于形参m且紧靠m的k个素数存入xx所指
的数组中。例如,若输入17, 5,则应输出:19, 23, 29, 31, 37。函数fun中给
出的语句仅供参考。
注意: 部分源程序在文件PROG1.C文件中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
void fun(int m, int k, int xx[])
{
/* 以下代码仅供参考 */
   int i, j=1, t=m+1;
while(j<=k)
{
/* 以下完成判断素数,并存放到数组xx中 */
}
}
main()
{
int m, n, zz[1000] ;
printf( "\nPlease enter two integers:") ;
scanf("%d%d", &m, &n ) ;
fun( m, n, zz) ;
for( m = 0 ; m < n ; m++ )
printf("%d ", zz[m]) ;
printf("\n") ;
NONO( ) ;
} 解题思路:
本题是考察考生如何判断一个数是素数,再判断所求出的素数是否符合题义要求,如果符
合,则存入指定的数组xx中保存,最后由形参xx返回。
本题是用while循环语句分别求出5个符合题义的素数。其中,j是控制变量,m是所求素数
要大于这个数且还要紧靠这个数,k是所求素数的个数,j是当前所求第几个素数。其中while
循环体中的for循环语句是判断t是否是素数。
参考答案:
void fun(int m, int k, int xx[])
{
/* 以下代码仅供参考 */
int i, j=1, t=m+1;
while(j<=k)
{
/* 以下完成判断素数,并存放到数组xx中 */
   for(i = 2 ; i < t; i++)
if(t % i==0) break;
if(i==t) {
xx[j-1] = i;
j++;
}
t++;
}
}
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第56套:
给定程序的功能是:从键盘输入若干行文本(每行不超过80个字符),写到
文件myfile4.txt中,用-1作为字符串输入结束的标志。然后将文件的内容读出显
示在屏幕上。文件的读写分别由自定义函数ReadText和WriteText实现。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
   #include
#include
void WriteText(FILE *);
void ReadText(FILE *);
main()
{ FILE *fp;
if((fp=fopen("myfile4.txt","w"))==NULL)
{ printf(" open fail!!\n"); exit(0); }
WriteText(fp);
fclose(fp);
if((fp=fopen("myfile4.txt","r"))==NULL)
{ printf(" open fail!!\n"); exit(0); }
ReadText(fp);
fclose(fp);
}
/**********found**********/
void WriteText(FILE ___1___)
{ char str[81];
printf("\nEnter string with -1 to end :\n");
gets(str);
while(strcmp(str,"-1")!=0) {
/**********found**********/
fputs(___2___,fw); fputs("\n",fw);
gets(str);
}
}
void ReadText(FILE *fr)
{ char str[81];
printf("\nRead file and output to screen :\n");
fgets(str,81,fr);
while( !feof(fr) ) {
/**********found**********/
printf("%s",___3___);
fgets(str,81,fr);
}
}
解题思路:
本题要求是把键盘上输入的内容写到指定的文件中。程序中共有三处要填上适当的内容,
使程序能运行出正确的结果。
第一处:要求填写文件流的自变量名,在这个函数中,已有的语句fputs("\n",fw);分析可
知:由于文件流变量fw在函数体没有定义过,所以本处应填*fw或fw[]。
第二处:通过while循环语句,把键盘上输入的内容,要写入到指定的文件中,键盘上输入
的内容已存入字符串str变量中,因此,本处应填写str。
第三处:要把已存入文件中的内容,再从文件中读出且已存入字符串变量str中,最后在屏
幕显示出来,因此,此处应填写str。
***************************************************
给定程序MODI1.C中函数fun的功能是:从低位开始取出长整型变量s中奇数位
   上的数,依次构成一个新数放在t中。高位仍在高位,低位仍在低位。
例如,当s中的数为:7654321时,t中的数为:7531。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
/************found************/
void fun (long s, long t)
{ long sl=10;
*t = s % 10;
while ( s > 0)
{ s = s/100;
*t = s%10 * sl + *t;
/************found************/
\TAB sl = sl*100;
}
}
main()
{ long s, t;
printf("\nPlease enter s:"); scanf("%ld", &s);
fun(s, &t);
printf("The result is: %ld\n", t);
}
解题思路:
第一处:在函数fun中使用了*t,但在函数定义时没有使用*t,所以应改为:void fun(long
s,long *t)。
第二处:每循环一次,sl的值就乘以10,所以应改为:sl=sl*10;。
***************************************************
函数fun的功能是:将两个两位数的正整数a、b合并形成一个整数放在c中。
合并的方式是:将a数的十位和个位数依次放在c数的个位和百位上, b数的十位
和个位数依次放在c数的千位和十位上。
例如,当a=45,b=12时,调用该函数后,c=1524。
注意: 部分源程序存在文件PROG1.C中。数据文件IN.DAT中的数据不得修改。
请勿改动主函数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);
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第57套:
函数fun的功能是:把形参a所指数组中的最小值放在元素a[0]中,接着把
形参a所指数组中的最大值放在a[1]元素中;再把a所指数组元素中的次小值放
在a[2]中,把a所指数组元素中的次大值放在a[3];其余以此类推。例如:若a
所指数组中的数据最初排列为:9、1、4、2、3、6、5、8、7;则按规则移动
后,数据排列为:1、9、2、8、3、7、4、6、5。形参n中存放a所指数组中数
据的个数。
注意:规定fun函数中的max存放当前所找的最大值,px存放当前所找最大
值的下标。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
# include
#define N 9
void fun(int a[], int n)
{ int i,j, max, min, px, pn, t;
for (i=0; i{
/**********found**********/
max = min = ___1___;
px = pn = i;
for (j=i+1; j/**********found**********/
if (max<___2___)
{ max = a[j]; px = j; }
/**********found**********/
if (min>___3___)
{ min = a[j]; pn = j; }
}
if (pn != i)
{ t = a[i]; a[i] = min; a[pn] = t;
if (px == i) px =pn;
}
if (px != i+1)
{ t = a[i+1]; a[i+1] = max; a[px] = t; }
}
}
main()
{ int b[N]={9,1,4,2,3,6,5,8,7}, i;
printf("\nThe original data :\n");
for (i=0; iprintf("\n");
fun(b, N);
printf("\nThe data after moving :\n");
   for (i=0; iprintf("\n");
}
解题思路:
第一处:外循环每循环一次均把数组a当前位置的值,分别赋值给max和min变量,所以应填:
a[i]。
第二处:判断max是否小于a[j],若小于,则把a[j]赋值给max,所以应填:a[j]。
第三处:判断min是否大于a[j],若大于,则把a[j]赋值给min,所以应填:a[j]。
***************************************************
给定程序MODI1.C中函数fun的功能是:用递归算法计算斐波拉契数列中第n
项的值。从第1项起,斐波拉契数列为:1、1、2、3、5、8、13、21、……
例如,若给n输入7,该项的斐波拉契数值为:13。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
给定源程序:
#include
long fun(int g)
{
/**********found**********/
switch(g);
{ case 0: return 0;
/**********found**********/
case 1 ;case 2 : return 1 ;
}
return( fun(g-1)+fun(g-2) );
}
main()
{ long fib; int n;
printf("Input n: "); scanf("%d",&n); printf("n = %d\n",n);
fib=fun(n);
printf("fib = %d\n\n",fib);
}
解题思路:
第一处:switch后有多余的分号。
第二处:case 1后没有返回语句,也应该为return 1;。所以应改为:case 1: return 1; case
2:return 1;。
***************************************************
某学生的记录由学号、8门课程成绩和平均分组成,学号和8门课程的成绩已
在主函数中给出。请编写函数fun,它的功能是:求出该学生的平均分放在记录的
ave成员中。
例如,学生的成绩是:85.5,76,69.5,85,91,72,64.5,87.5,他的平均分应当
是:78.875。
注意: 部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun部位中填入你编
写的若干语句。
给定源程序:
#include
   #define N 8
typedef struct
{ char num[10];
double s[N];
double ave;
} STREC;
void fun(STREC *a)
{
}
main()
{ STREC s={"GA005",85.5,76,69.5,85,91,72,64.5,87.5};
int i;
fun( &s );
printf("The %s's student data:\n", s.num);
for(i=0;iprintf("%4.1f\n",s.s[i]);
printf("\nave=%7.3f\n",s.ave);
NONO();
} 解题思路:
本题是求记录结构中学生课程成绩的平均值,其结果仍放在该记录结构中。
参考答案:
void fun(STREC *a)
{
int i ;
for(i = 0 ; i < N ; i++)
a->ave = a->ave + a->s[i] ;
a->ave /= N ;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第58套:
给定程序中,函数fun的功能是:把形参s所指字符串中最右边的n个字符复制
到形参t所指字符数组中,形成一个新串。若s所指字符串的长度小于n,则将整个
   字符串复制到形参t所指字符数组中。
例如,形参s所指的字符串为:abcdefgh,n的值为5,程序执行后t所指字符数
组中的字符串应为:defgh。
请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#include
#define N 80
void fun(char *s, int n, char *t)
{ int len,i,j=0;
len=strlen(s);
/**********found**********/
if(n>=len) strcpy(__1__);
else {
/**********found**********/
for(i=len-n; i<=len-1; i++) t[j++]= __2__ ;
/**********found**********/
t[j]= __3__ ;
}
}
main()
{ char s[N],t[N]; int n;
printf("Enter a string: ");gets(s);
printf( "Enter n:"); scanf("%d",&n);
fun(s,n,t);
printf("The string t : "); puts(t);
}
解题思路:
本题是根据要求来复制字符串。
第一处:当给定的长度n大于该字符串s的长度,那么把该字符串直接拷贝到t就可以了,所
以应填:t,s。
第二处:使用for循环语句,把最右边n个字符依次添加到t中,所以应填:s[i]。
第三处:字符串操作结束,需要到t加一个字符串结束符,所以应填:'\0'。
***************************************************
给定程序MODI1.C中函数fun的功能是:找出一个大于形参m且紧随m的素数,
并作为函数值返回。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
int fun(int m)
{ int i, k ;
for (i = m + 1 ; ; i++) {
for (k = 2 ; k < i ; k++)
   /**************found**************/
if (i % k != 0)
break ;
/**************found**************/
if (k < i)
return(i);
}
}
void main()
{
int n ;
n = fun(20) ;
printf("n=%d\n", n) ;
}
解题思路:
第一处:判断素数的条件是一个数i除自身或1除外不被任何数k整除的数,如果一个数i被
另一个数k取模,模值等于零,那么这个不是素数并退出循环体,所以应改为if(i%k==0)。
第二处:如果i不被循环中任一个k值不整除,那么循环结束后k的值应该等于i,所以应改
为if(k==i)或if(k>=i)也可以。
***************************************************
请编写函数fun,它的功能是:求出能整除形参x且不是偶数的各整数,并按从
小到大的顺序放在pp所指的数组中,这些除数的个数通过形参n返回。
例如,若 x 中的值为: 35,则有 4 个数符合要求,它们是: 1, 5, 7, 35。
注意: 部分源程序在文件PROG1.C文件中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
void fun ( int x, int pp[], int *n )
{
}
main( )
{ int x, aa[1000], n, i ;
printf( "\nPlease enter an integer number:\n" ) ; scanf("%d", &x) ;
fun(x, aa, &n ) ;
for( i = 0 ; i < n ; i++ )
printf("%d ", aa[i]) ;
printf("\n") ;
NONO( ) ;
} 解题思路:
本题是求出能整除形参x且不是偶数的各整数,并按从小到大的顺序放在pp所指的数组中,
这些除数的个数通过形参n返回。
参考答案:
void fun ( int x, int pp[], int *n )
{
int i;
*n=0;
for(i=1; i <= x; i++)
if((x % i== 0) && (i % 2)) pp[(*n)++]=i;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第59套:
给定程序中,函数fun的功能是:在3×4的矩阵中找出在行上最大、在列上最
小的那个元素,若没有符合条件的元素则输出相应信息。
例如,有下列矩阵:
1 2 13 4
7 8 10 6
   3 5 9 7
程序执行结果为:find: a[2][2]=9
请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#define M 3
#define N 4
void fun(int (*a)[N])
{ int i=0,j,find=0,rmax,c,k;
while( (i{ rmax=a[i][0]; c=0;
for(j=1; jif(rmax/**********found**********/
rmax=a[i][j]; c= __1__ ; }
find=1; k=0;
while(k/**********found**********/
if (k!=i && a[k][c]<=rmax) find= __2__ ;
k++;
}
if(find) printf("find: a[%d][%d]=%d\n",i,c,a[i][c]);
/**********found**********/
__3__ ;
}
if(!find) printf("not found!\n");
}
main()
{ int x[M][N],i,j;
printf("Enter number for array:\n");
for(i=0; ifor(j=0; jprintf("The array:\n");
for(i=0; i{ for(j=0; jprintf("\n\n");
}
fun(x);
}
解题思路:
本题是在矩阵中找出在行上最大、在列上最小的那个元素。
第一处:找出行上最大的数,并该位置j(列)保存在c中,所以应填:j。
第二处:使用while循环语句和控制变量find,如果该数不是列是最小数,那么把find置0,
所以应填:0。
   第三处:i是while的控制变量,所以每做一次循环,该数均要加1,所以应填:i++。
***************************************************
给定程序MODI1.C中函数fun的功能是:根据整型形参m的值,计算如下公式的
值。
1 1 1
t = 1 - ----- - ----- - …… - -----
2*2 3*3 m*m
例如,若 m 中的值为: 5,则应输出: 0.536389。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
double fun ( int m )
{ double y = 1.0 ;
int i ;
/**************found**************/
for(i = 2 ; i < m ; i++)
/**************found**************/
y -= 1 /(i * i) ;
return( y ) ;
}
main( )
{ int n = 5 ;
printf( "\nThe result is %lf\n", fun ( n ) ) ;
}
解题思路:
第一处:使用for循环计算公式,必须计算到m,所以应改为for(i=2; i<=m; i++)。
第二处:在除法运算中,如果除数和被除数都是整数,所么所除结果也是整数,因此应改
为y-=1./(i*i)。
***************************************************
m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平均
分的人数作为函数值返回,将低于平均分的分数放在below所指的数组中。
例如,当score数组中的数据为:10、20、30、40、50、60、70、80、90时,
函数返回的人数应该是4, below中的数据应为: 10、20、30、40。
注意: 部分源程序在文件PROG1.C文件中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
#include
int fun(int score[], int m, int below[])
{
}
main( )
{ int i, n, below[9] ;
int score[9] = {10, 20, 30, 40, 50, 60, 70, 80, 90} ;
n = fun(score, 9, below) ;
   printf( "\nBelow the average score are: " ) ;
for (i = 0 ; i < n ; i++) printf("%d ", below[i]) ;
NONO() ;
} 解题思路:
本题是计算平均成绩,再把低于平均成绩的分数存入依次数组below中。
参考答案:
int fun(int score[], int m, int below[])
{
float av=0.0 ;
int i, j=0 ;
for(i=0; iav /= m;
for(i=0; iif(av>score[i]) below[j++]=score[i];
return j;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第60套:
给定程序中,函数fun的功能是:将形参指针所指结构体数组中的三个元素按
num成员进行升序排列。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
typedef struct
{ int num;
char name[10];
}PERSON;
/**********found**********/
void fun(PERSON ___1___)
{
/**********found**********/
___2___ temp;
if(std[0].num>std[1].num)
{ temp=std[0]; std[0]=std[1]; std[1]=temp; }
if(std[0].num>std[2].num)
{ temp=std[0]; std[0]=std[2]; std[2]=temp; }
if(std[1].num>std[2].num)
{ temp=std[1]; std[1]=std[2]; std[2]=temp; }
}
main()
{ PERSON std[ ]={ 5,"Zhanghu",2,"WangLi",6,"LinMin" };
int i;
/**********found**********/
fun(___3___);
printf("\nThe result is :\n");
for(i=0; i<3; i++)
printf("%d,%s\n",std[i].num,std[i].name);
}
解题思路:
本题是要求对结构体数组中的三个元素按num成员升序排列。
   第一处:由于在函数体fun中,已经使用了std变量,所以应填:*std。
第二处:由于temp是存放交换记录的中间变量,所以应填:PERSON。
第三处:函数的调用,所以应填:std。
***************************************************
给定程序MODI1.C中函数fun的功能是:将 m(1≤m≤10)个字符串连接起来,
组成一个新串,放入pt所指存储区中。
例如:把3个串:"abc","CD","EF"连接起来,结果是 "abcCDEF"。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#include
int fun ( char str[][10], int m, char *pt )
{
/************found************/
Int k, q, i ;
for ( k = 0; k < m; k++ )
{ q = strlen ( str [k] );
for (i=0; i/************found************/
pt[i] = str[k,i] ;
pt += q ;
pt[0] = 0 ;
}
}
main( )
{ int m, h ;
char s[10][10], p[120] ;
printf( "\nPlease enter m:" ) ;
scanf("%d", &m) ; gets(s[0]) ;
printf( "\nPlease enter %d string:\n", m ) ;
for ( h = 0; h < m; h++ ) gets( s[h]) ;
fun(s, m, p) ;
printf( "\nThe result is : %s\n", p) ;
}
解题思路:
第一处:保留字int错写成Int。
第二处:字符数组的字符串书写格式错误。
***************************************************
程序定义了N×N的二维数组,并在主函数中自动赋值。请编写函数
fun( int a[][N]),函数的功能是:使数组左下三角元素中的值全部置成0 。
例如:a 数组中的值为
| 1 9 7 | | 0 9 7 |
a = | 2 3 8 | 则返回主程序后a数组中的值应为 | 0 0 8 |
| 4 5 6 | | 0 0 0 |
注意: 部分源程序存在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
   你编写的若干语句。
给定源程序:
#include
#include
#define N 5
int fun ( int a[][N] )
{
}
main ( )
{ int a[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");
}
fun ( a );
printf ("THE RESULT\n");
for ( i =0; i{ for ( j =0; jprintf("\n");
}
NONO( );
} 解题思路:
本题是利用两重循环给二维数组左下三角元素中的值全部置成0。
参考答案:
int fun ( int a[][N] )
{
int i, j;
for(i = 0 ; i < N ; i++)
for(j = 0 ; j <= i; j++)
a[i][j] = 0 ;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第61套:
函数fun的功能是进行字母转换。若形参ch中是小写英文字母,则转换成对应
的大写英文字母;若ch中是大写英文字母,则转换成对应的小写英文字母;若是
其它字符则保持不变;并将转换后的结果作为函数值返回。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
   注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#include
char fun(char ch)
{
/**********found**********/
if ((ch>='a')___1___(ch<='z'))
return ch -'a' + 'A';
if ( isupper(ch) )
/**********found**********/
return ch +'a'-___2___ ;
/**********found**********/
return ___3___;
}
main()
{ char c1, c2;
printf("\nThe result :\n");
c1='w'; c2 = fun(c1);
printf("c1=%c c2=%c\n", c1, c2);
c1='W'; c2 = fun(c1);
printf("c1=%c c2=%c\n", c1, c2);
c1='8'; c2 = fun(c1);
printf("c1=%c c2=%c\n", c1, c2);
}
解题思路:
第一处:判断形参ch是否是小写字母,所以应填:&&。
第二处:小写字母与大写字母的ASCII值相差为32,所以应填:'A'或65。
第三处:返回处理后的形参ch,所以应填:ch。
***************************************************
给定程序MODI1.C中函数fun的功能是: 给一维数组a输入任意4个整数, 并按
下例的规律输出。例如输入1、2、3、4, 程序运行后将输出以下方阵。
4 1 2 3
3 4 1 2
2 3 4 1
1 2 3 4
请改正函数fun中指定部位的错误, 使它能得出正确的结果。
注意: 不要改动main函数, 不得增行或删行, 也不得更改程序的结构!
给定源程序:
#include
#define M 4
/**************found**************/
void fun(int a)
{ int i,j,k,m;
printf("Enter 4 number : ");
for(i=0; i   printf("\n\nThe result :\n\n");
for(i=M;i>0;i--)
{ k=a[M-1];
for(j=M-1;j>0;j--)
/**************found**************/
aa[j]=a[j-1];
a[0]=k;
for(m=0; mprintf("\n");
}
}
main()
{ int a[M];
fun(a); printf("\n\n");
}
解题思路:
第一处:在函数fun体中,a是一个整型数组,所以形参a应定义为指针型整数变量。
第二处:变量书写错误,aa应为a。
***************************************************
请编写一个函数fun, 它的功能是: 计算并输出给定整数n的所有因子(不包括
1与n自身)之和。规定n的值不大于1000。
例如,在主函数中从键盘给n输入的值为856, 则输出为:sum=763。
注意:部分源程序在文件PROG1.C中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
int fun(int n)
{
}
main()
{ int n,sum;
printf("Input n: "); scanf("%d",&n);
sum=fun(n);
printf("sum=%d\n",sum);
NONO();
}
 
解题思路:
本题是考察考生怎样利用循环来求出一个数n的所有(除1和自身外)因子i并求出它们的和
s作为函数值返回。判断因子的条件是:n % i == 0,(i是大于1且小于n中所有的正整数)。
参考答案:
int fun(int n)
{
int s = 0, i ;
for(i = 2 ; i < n ; i++) if(n % i == 0) s +=i ;
return s ;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第62套:
给定程序中,函数fun的功能是:把形参s所指字符串中下标为奇数的字符右
移到下一个奇数位置,最右边被移出字符串的字符绕回放到第一个奇数位置,下
标为偶数的字符不动(注:字符串的长度大于等于2)。例如,形参s所指的字符
串为:abcdefgh,执行结果为:ahcbedgf。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
void fun(char *s)
{ int i, n, k; char c;
n=0;
   for(i=0; s[i]!='\0'; i++) n++;
/**********found**********/
if(n%2==0) k=n-___1___ ;
else k=n-2;
/**********found**********/
c=___2___ ;
for(i=k-2; i>=1; i=i-2) s[i+2]=s[i];
/**********found**********/
s[1]=___3___ ;
}
main()
{ char s[80]="abcdefgh";
printf("\nThe original string is : %s\n",s);
fun(s);
printf("\nThe result is : %s\n",s);
}
解题思路:
第一处:首先判断字符串的长度是奇数还是偶数,如果是奇数,则k=n-1,所以应填:1。
第二处:取字符串最后一个奇数位的字符,并由变量c保存,所以应填:s[k]。
第三处:第1位奇数位用最一个奇数位字符替换,所以应填:c。
***************************************************
给定程序MODI1.C中 fun 函数的功能是:求
s = aa… aa - ... - aaa - aa - a
(此处 aa… aa 表示 n 个 a, a 和 n 的值在 1 至 9 之间)
例如 a = 3, n = 6, 则以上表达式为:
s = 333333 - 33333 - 3333 - 333 - 33 - 3
其值是:296298
a 和 n 是 fun 函数的形参,表达式的值作为函数值传回 main函数。
请改正程序中的错误,使它能计算出正确的结果。
注意: 不要改动 main 函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
long fun (int a, int n)
{ int j ;
/**************found**************/
long s = 0, t = 1 ;
for ( j = 0 ; j < n ; j++)
t = t * 10 + a ;
s = t ;
for ( j = 1 ; j < n ; j++) {
/**************found**************/
t = t % 10 ;
s = s - t ;
}
return(s) ;
}
main( )
   { int a, n ;
printf( "\nPlease enter a and n:") ;
scanf( "%d%d", &a, &n ) ;
printf( "The value of function is: %ld\n", fun ( a, n ) );
}
解题思路:
第一处:根据for循环计算t的值可知,变量t的初值不正确,应为0。
第二处:每次循环都是取t除以10的值,而不是取余数,所以应改t=t/10;。
***************************************************
请编写一个函数 void fun(char *tt, int pp[]),统计在tt所指字符串中
'a' 到 'z' 26个小写字母各自出现的次数,并依次放在pp所指数组中。
例如,当输入字符串:abcdefgabcdeabc 后,程序的输出结果应该是:
3 3 3 2 2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
注意: 部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
#include
void fun(char *tt, int pp[])
{
}
main( )
{ char aa[1000] ;
int bb[26], k, n ;
printf( "\nPlease enter a char string:" ) ; scanf("%s", aa) ;
fun(aa, bb ) ;
for ( k = 0 ; k < 26 ; k++ ) printf ("%d ", bb[k]) ;
printf( "\n" ) ;
NONO ( ) ;
} 解题思路:
本题是考察考生在给定的字符串中统计出26个小写字母的次数并存入到指定的数组中且由
形参返回。其中数组下标的位置可以通过某一个字符的ASCII值减去97或直接减'a'也可以,就
可以得出该字符出现次数存放的位置。例如:字符为b,那么位置为'b'-'a'=1,就是实际存放
的位置。
参考答案:
void fun(char *tt, int pp[])
{
char *p = tt ;
int i ;
for(i = 0 ; i < 26 ; i++) pp[i] = 0 ;
while(*p) {
if(*p >= 'a' && *p <= 'z') pp[*p - 'a'] += 1 ;
p++ ;
}
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第63套:
给定程序中,函数fun的功能是:有N×N矩阵,根据给定的m(m<=N)值,将
每行元素中的值均右移m个位置,左边置为0。例如,N=3,m=2,有下列矩阵
   1 2 3
4 5 6
7 8 9
程序执行结果为
0 0 1
0 0 4
0 0 7
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#define N 4
void fun(int (*t)[N], int m)
{ int i, j;
/**********found**********/
for(i=0; i{ for(j=N-1-m; j>=0; j--)
/**********found**********/
t[i][j+___2___ ]=t[i][j];
/**********found**********/
for(j=0; j<___3___; j++)
t[i][j]=0;
}
}
main()
{ int t[][N]={21,12,13,24,25,16,47,38,29,11,32,54,42,21,33,10}, i, j, m;
printf("\nThe original array:\n");
for(i=0; i{ for(j=0; jprintf("%2d ",t[i][j]);
printf("\n");
}
printf("Input m (m<=%d): ",N);scanf("%d",&m);
fun(t,m);
printf("\nThe result is:\n");
for(i=0; i{ for(j=0; jprintf("%2d ",t[i][j]);
printf("\n");
}
}
解题思路:
第一处:for循环变量的增量,所以应填:i++。
第二处:由于右移m个位置,所以应填:m。
第三处:左边m列均置于0,所以for循环的终止值应为m。
   ***************************************************
给定程序MODI1.C中函数 fun 的功能是:计算并输出high以内最大的10个素
数之和。high的值由主函数传给fun函数。
若high的值为: 100, 则函数的值为: 732。
请改正程序中的错误,使程序能输出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#include
int fun( int high )
{ int sum = 0, n=0, j, yes;
/************found************/
while ((high >= 2) && (n < 10)
{ yes = 1;
for (j=2; j<=high/2; j++ )
if (high % j ==0 ){
/************found************/
yes=0; break
}
if (yes) { sum +=high; n++; }
high--;
}
return sum ;
}
main ( )
{
printf("%d\n", fun (100));
}
解题思路:
第一处:括号没有匹配。
Error: While statement missing ) in function fun
在函数fun中While语句缺少)。
第二处:缺少分号。
Error: Break statement missing ; in function fun
在函数fun中break语句缺少;。
这种题型只要通过编译即可发现程序的错误所在。
***************************************************
编写函数fun,它的功能是:利用以下所示的简单迭代方法求
方程:cos(x)-x=0 的一个实根。
迭代步骤如下:
(1)取 x1 初值为0.0;
(2)x0 = x1,把x1的值赋给 x0;
(3)x1 = cos(x0),求出一个新的x1;
(4)若x0 - x1的绝对值小于 0.000001,执行步骤(5),否则执
行步骤(2);
   (5)所求x1就是方程 cos(x)-x=0 的一个实根,作为函数值返回。
程序将输出结果Root=0.739085。
注意: 部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun
的花括号中填入你编写的若干语句。
给定源程序:
#include
#include
float fun()
{
}
main()
{
printf("Root =%f\n", fun());
NONO();
} 解题思路:
本题是根据给定的公式及条件来计算方程的一个实根。
参考答案:
float fun()
{
float x0, x1=0.0;
do {
x0=x1;
x1=cos(x0);
} while(fabs(x0-x1)>0.000001);
return x1;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第64套:
给定程序中,函数fun的功能是:将a所指3×5矩阵中第k列的元素左移到第0
列,第k列以后的每列元素行依次左移,原来左边的各列依次绕到右边。
例如,有下列矩阵:
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
若k为2,程序执行结果为
3 4 5 1 2
3 4 5 1 2
3 4 5 1 2
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#define M 3
#define N 5
void fun(int (*a)[N],int k)
{ int i,j,p,temp;
/**********found**********/
for(p=1; p<= __1__; p++)
for(i=0; i{ temp=a[i][0];
/**********found**********/
for(j=0; j< __2__ ; j++) a[i][j]=a[i][j+1];
/**********found**********/
a[i][N-1]= __3__;
}
}
main( )
{ int x[M][N]={ {1,2,3,4,5},{1,2,3,4,5},{1,2,3,4,5} },i,j;
printf("The array before moving:\n\n");
for(i=0; i{ for(j=0; jprintf("\n");
}
fun(x,2);
printf("The array after moving:\n\n");
for(i=0; i{ for(j=0; jprintf("\n");
}
   }
解题思路:
第一处:外循环p的终止变量的值,试题要求第k列左移,所以应填:k。
第二处:矩阵共N列,所以应填:N-1。
第三处:把存放在临时变量temp中的值,放到a[i][N-1]中,所以应填:temp。
***************************************************
给定程序MODI1.C中函数fun的功能是:根据形参m的值(2≤m≤9〕,在m行m
列的二维数组中存放如下所示规律的数据,由main函数输出。
例如,若输入 2 | 若输入 4
则输出: | 则输出:
1 2 | 1 2 3 4
2 4 | 2 4 6 8
| 3 6 9 12
| 4 8 12 16
请改正程序函数中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#define M 10
int a[M][M] = {0} ;
/**************found**************/
fun(int **a, int m)
{ int j, k ;
for (j = 0 ; j < m ; j++ )
for (k = 0 ; k < m ; k++ )
/**************found**************/
a[j][k] = k * j ;
}
main ( )
{ int i, j, n ;
printf ( " Enter n : " ) ; scanf ("%d", &n ) ;
fun ( a, n ) ;
for ( i = 0 ; i < n ; i++)
{ for (j = 0 ; j < n ; j++)
printf ( "%4d", a[i][j] ) ;
printf ( "\n" ) ;
}
}
解题思路:
第一处:在函数体fun中可知,a是一个字符串数组型变量,所以应改为:fun(int a[][M],
int m)。
第二处:根据输出的结果可知,应改为:a[j][k]=(k+1)*(j+1);。
***************************************************
函数fun的功能是:将a、b中的两个两位正整数合并形成一个新的整数放在c
中。合并的方式是:将a中的十位和个位数依次放在变量c的十位和千位上,b中的
十位和个位数依次放在变量c的个位和百位上。
例如,当a=45,b=12。调用该函数后,c=5241。
   注意: 部分源程序存在文件PROG1.C中。数据文件IN.DAT中的数据不得修改。
请勿改动主函数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);
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第65套:
给定程序中,函数fun的功能是:将a所指4×3矩阵中第k行的元素与第0行元
素交换。
例如,有下列矩阵:
1 2 3
4 5 6
7 8 9
10 11 12
若k为2,程序执行结果为:
7 8 9
4 5 6
1 2 3
10 11 12
请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#define N 3
#define M 4
/**********found**********/
void fun(int (*a)[N], int __1__)
{ int i,j,temp ;
/**********found**********/
for(i = 0 ; i < __2__ ; i++)
{ temp=a[0][i] ;
/**********found**********/
a[0][i] = __3__ ;
a[k][i] = temp ;
}
   }
main()
{ int x[M][N]={ {1,2,3},{4,5,6},{7,8,9},{10,11,12} },i,j;
printf("The array before moving:\n\n");
for(i=0; i{ for(j=0; jprintf("\n\n");
}
fun(x,2);
printf("The array after moving:\n\n");
for(i=0; i{ for(j=0; jprintf("\n\n");
}
}
解题思路:
第一处:变量k在函数体fun中已经使用,所以应填:k。
第二处:共N行,所以应填:N。
第三处:变量值交换,所以应填:a[k][i]。
***************************************************
给定程序MODI1.C中函数 fun 的功能是: 读入一个字符串(长度<20 ),将该
字符串中的所有字符按ASCII码升序排序后输出。
例如, 若输入: edcba, 则应输出: abcde。
请改正程序中的错误,使它能统计出正确的结果。
注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
void fun( char t[] )
{
char c;
int i, j;
/**********found***********/
for( i = strlen( t ); i; i-- )
for( j = 0; j < i; j++ )
/**********found***********/
if( t[j] < t[ j + 1 ] )
{
c = t[j];
t[j] = t[ j + 1 ];
t[j + 1 ] = c;
}
}
main()
{
char s[81];
printf( "\nPlease enter a character string: " );
gets( s );
   printf( "\n\nBefore sorting:\n \"%s\"", s );
fun( s );
printf( "\nAfter sorting decendingly:\n \"%s\"", s );
}
解题思路:
第一处:外for循环的初始值应是strlen(t)-1。
第二处:由于是按升序排序,所以应 if(t[j]>t[j+1])。
***************************************************
请编写一个函数fun, 其功能是: 将ss所指字符串中所有下标为奇数位置上的
字母转换为大写(若该位置上不是字母, 则不转换)。
例如, 若输入"abc4EFg",则应输出"aBc4EFg"。
注意: 部分源程序在文件PROG1.C文件中。
请勿改动主函数main和其它函数中的任何内容, 仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
#include
void fun( char *ss )
{
}
void main( void )
{
char tt[51];
printf( "\nPlease enter an character string within 50 characters:\n" );
gets( tt );
printf( "\n\nAfter changing, the string\n \"%s\"", tt );
fun(tt) ;
printf( "\nbecomes\n \"%s\"", tt );
NONO();
}
解题思路:
本题是考察考生在字符串指定位置上的字母转换为大写。给出的程序是由i来控制字符串所
在的位置,字符串指针p是指向形参ss,再使用while循环语句对p进行控制来判断字符串是否结
束,在循环体中使用if条件语句来判断位置i是否为奇数且p所指的当前字符是否为'a'至'z'的
字母,如果满足这两个条件,则把该小写字母转换成大写字符,小写字母与大写字母的差是32,
所以只小写字母减去32,即可得到该字母的大写字母,且转换后的字母仍存放到原字符串的位
置上,转换结束后,最后通过形参ss返回已转换后的字符串。
参考答案:
void fun( char *ss )
{
char *p = ss ;
int i = 0 ;
while(*p) {
if((i % 2) && (*p >= 'a' && *p <= 'z')) *p -= 32 ;
p++ ;
i++ ;
}
return ss ;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第66套:
给定程序中,函数fun的功能是:将形参std所指结构体数组中年龄最大者的
数据作为函数值返回,并在main函数中输出。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
typedef struct
{ char name[10];
int age;
}STD;
STD fun(STD std[], int n)
{ STD max; int i;
/**********found**********/
max= ___1___;
for(i=1; i/**********found**********/
if(max.age<___2___) max=std[i];
return max;
}
main( )
{ STD std[5]={"aaa",17,"bbb",16,"ccc",18,"ddd",17,"eee",15 };
STD max;
max=fun(std,5);
printf("\nThe result: \n");
/**********found**********/
printf("\nName : %s, Age : %d\n", ___3___,max.age);
}
解题思路:
本题是从结构体中找出年龄最大的记录。
第一处:给存放最大者max赋初值,所以应填:*std。
第二处:当前最大者的年龄和结构中所有的年龄进行比较,所以应填:std[i].age。
第三处:输出最大者的姓名和年龄,所以应填:max.name。
***************************************************
给定程序MODI1.C中函数 fun 的功能是:实现两个整数的交换。
   例如给a和b分别输入:60 和 65,输出为:a = 65 b = 60
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
/**********found**********/
void fun ( int a, b )
{ int t;
/**********found**********/
t = b; b = a ; a = t;
}
main ( )
{ int a, b;
printf ( "Enter a , b : "); scanf ( "%d,%d", &a, &b );
fun ( &a , &b ) ;
printf (" a = %d b = %d\n ", a, b );
}
解题思路:
第一处:函数形参定义不正确,在定义第2个形参时,也应加上int。由于通过该函数实现
两数交换,在C语言中,必须交换地址中的值,所以应定义为int *a,int *b。
第二处:要交换地址中的值,不能交换地址,必须指定地址中的值,因此应改为
t=*b;*b=*a;*a=t;。
***************************************************
请编一个函数void fun(int tt[M][N ], int pp[N]),tt指向一个M行N列的
二维数组,求出二维数组每列中最小元素,并依次放入pp所指一维数组中。二维
数组中的数已在主函数中赋予。
注意: 部分源程序存在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
#define M 3
#define N 4
void fun ( int tt[M][N], int pp[N] )
{
}
main( )
{ int t [ M ][ N ]={{22,45, 56,30},
{19,33, 45,38},
{20,22, 66,40}};
int p [ N ], i, j, k;
printf ( "The original data is : \n" );
for( i=0; ifor( j=0; jprintf ( "%6d", t[i][j] );
printf("\n");
}
   fun ( t, p );
printf( "\nThe result is:\n" );
for ( k = 0; k < N; k++ ) printf ( " %4d ", p[ k ] );
printf("\n");
NONO( );
} 解题思路:
本题是求出二维数组每列中最小元素,并依次放入pp所指一维数组中。
参考答案:
void fun ( int tt[M][N], int pp[N] )
{
int i,j, min, k ;
for(i = 0 ; i < N ; i++) {
min = tt[0][i] ; k = 0 ;
for(j = 1 ; j < M ; j++)
if(min > tt[j][i]) {
\TAB min=tt[j][i] ;
k = j ;
}
pp[i] = tt[k][i] ;
}
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第67套:
给定程序中,函数fun的功能是:调用随机函数产生20个互不相同的整数放在
形参a所指数组中(此数组在主函数中已置0)。
请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#define N 20
void fun( int *a)
{ int i, x, n=0;
x=rand()%20;
   /**********found**********/
while (n<__1__)
{ for(i=0; i/**********found**********/
if( x==a[i] ) __2__;
/**********found**********/
if( i==__3__){ a[n]=x; n++; }
x=rand()%20;
}
}
main()
{ int x[N]={0} ,i;
fun( x );
printf("The result : \n");
for( i=0; i{ printf("%4d",x[i]);
if((i+1)%5==0)printf("\n");
}
printf("\n\n");
}
解题思路:
第一处:一共产生20个随机数,所以应填:N。
第二处:要求产生不同的20个整数,所以采用for循环对已产生的随机数进行比较,是否有
相同数,如果有相同,则退出循环体,所以应填:break。
第三处:当退出循环体还是进行判断,i和n的值是否相等,如果相等,则表示该随机整数
不重复,可以存放到指定的数组中,所以应填:n。
***************************************************
给定程序MODI1.C中函数fun的功能是: 先从键盘上输入一个3行3列矩阵的各
个元素的值, 然后输出主对角线元素之和。
请改正函数fun中的错误或在横线处填上适当的内容并把横线删除,使它能得
出正确的结果。
注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
int fun()
{
int a[3][3],sum;
int i,j;
/*********found**********/
______;
for (i=0;i<3;i++)
{ for (j=0;j<3;j++)
/*********found**********/
scanf("%d",a[i][j]);
}
for (i=0;i<3;i++)
sum=sum+a[i][i];
   printf("Sum=%d\n",sum);
}
main()
{
fun();
}
解题思路:
第一处:变量sum进行初始化,由于计算累加和,所以应为:sum=0;。
第二处:读入整型数,应使用地址读入,所以应为:scanf("%d",&a[i][j]);。
***************************************************
编写程序, 实现矩阵(3行3列)的转置(即行列互换)
例如, 输入下面的矩阵:
100 200 300
400 500 600
700 800 900
程序输出:
100 400 700
200 500 800
300 600 900
注意: 部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容, 仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
int fun(int array[3][3])
{
}
main()
{
int i,j;
int array[3][3]={{100,200,300},
{400,500,600},
{700,800,900}};
for (i=0;i<3;i++)
{ for (j=0;j<3;j++)
printf("%7d",array[i][j]);
printf("\n");
}
fun(array);
printf("Converted array:\n");
for (i=0;i<3;i++)
{ for (j=0;j<3;j++)
printf("%7d",array[i][j]);
printf("\n");
}
NONO();
}
 
解题思路:
本题是解决矩阵的转置问题。
参考答案:
int fun(int array[3][3])
{
int i,j,arr[3][3] ;
memcpy(arr, array, 9*sizeof(int)) ;
for(i = 0 ; i < 3 ; i++)
for(j = 0 ; j < 3 ; j++)
array[i][j] = arr[j][i] ;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第68套:
给定程序中,函数fun的功能是:求ss所指字符串数组中长度最长的字符串所
在的行下标,作为函数值返回,并把其串长放在形参n所指变量中。ss所指字符串
数组中共有M个字符串,且串长请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#define M 5
#define N 20
/**********found**********/
int fun(char (*ss) ___1___, int *n)
{ int i, k=0, len=0;
for(i=0; i{ len=strlen(ss[i]);
/**********found**********/
if(i==0) *n=___2___;
if(len>*n) {
/**********found**********/
___3___;
k=i;
   }
}
return(k);
}
main()
{ char ss[M][N]={"shanghai","guangzhou","beijing","tianjing","cchongqing"};
int n,k,i;
printf("\nThe original strings are :\n");
for(i=0;ik=fun(ss,&n);
printf("\nThe length of longest string is : %d\n",n);
printf("\nThe longest string is : %s\n",ss[k]);
}
解题思路:
第一处:形参ss的定义,它是一个字符串数组的定义,其宽度为N,所以应填:N。
第二处:取第一个字符串的长度赋值给变量*n,所以应填:len。
第三处:每循环一次,判断当前字符串的长度是否大于*n,如果大于,则*n=len。
***************************************************
给定程序MODI1.C中 fun 函数的功能是: 根据形参m,计算如下公式的值。
1 1 1 1
t = 1 + ----- +----- + ----- + ……+ -----
2 3 4 m
例如,若输入 5,则应输出 2.283333。
请改正程序中的错误或在下划线处填上适当的内容并把下划线删除, 使它
能计算出正确的结果。
注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
double fun( int m )
{
double t = 1.0;
int i;
for( i = 2; i <= m; i++ )
/**********found**********/
t += 1.0/k;
/**********found**********/
________
}
main()
{
int m;
printf( "\nPlease enter 1 integer number:" );
scanf( "%d", &m );
printf( "\nThe result is %lf\n", fun( m ) );
}
解题思路:
第一处:在此变量k没有定义过,再根据公式和for循环语句中所用的变量可知,这里的k
   实际上是i。
第二处:应是返回公式的值,函数中公式的值是存放在临时变量t中,所以应填return t;。
***************************************************
编写一个函数,该函数可以统计一个长度为2的字符串在另一个字符串中出现
的次数。例如,假定输入的字符串为: asd asasdfg asd as zx67 asd mklo,子字
符串为:as,则应输出6。
注意:部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
#include
int fun(char *str,char *substr)
{
}
main()
{
char str[81],substr[3];
int n;
printf("输入主字符串: ");
gets(str);
printf("输入子字符串: ");
gets(substr);
puts(str);
puts(substr);
n=fun(str,substr);
printf("n=%d\n",n);
NONO();
} 解题思路:
本题是统计一个字符串在另一个字符串中出现的次数。
程序流程如下:
1. 利用strstr函数,首先找到第一个出现的位置。
2. 利用while循环和strstr依次查找所有出现的位置,并进行统计,并把统计结果作为函
数值返回。
strstr(const char *s1, const char *s2)是字符串s2在s1中出现的位置,如果找到则返
回位置指针。
参考答案:
int fun(char *str,char *substr)
{
int cnt = 0 ;
char *p = str, *q ;
while(*p) {
q = strstr(p, substr) ;
if(q == NULL) break;
p = q + strlen(substr) ;
cnt++ ;
}
return cnt ;
}
main()
{
char str[81],substr[3];
int n;
printf("输入主字符串: ");
gets(str);
printf("输入子字符串: ");
gets(substr);
puts(str);
puts(substr);
n=fun(str,substr);
printf("n=%d\n",n);
NONO();
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第69套:
给定程序中,函数fun的功能是将a和b所指的两个字符串转换成面值相同的整
数,并进行相加作为函数值返回,规定字符串中只含9个以下数字字符。
例如,主函数中输入字符串:32486和12345,在主函数中输出的函数值为:
44831。
请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#include
#include
#define N 9
long ctod( char *s )
{ long d=0;
while(*s)
if(isdigit( *s)) {
/**********found**********/
d=d*10+*s-__1__;
/**********found**********/
__2__; }
return d;
}
long fun( char *a, char *b )
{
/**********found**********/
return __3__;
}
main()
   { char s1[N],s2[N];
do
{ printf("Input string s1 : "); gets(s1); }
while( strlen(s1)>N );
do
{ printf("Input string s2 : "); gets(s2); }
while( strlen(s2)>N );
printf("The result is: %ld\n", fun(s1,s2) );
}
解题思路:
第一处:数字字符与其对应的数值相差48,所以应填:48。
第二处:到字符串下一个位置,所以应填:s++。
第三处:返回两个数字字符串经转换成数值的和,所以应填:ctod(a)+ctod(b)。
***************************************************
给定程序MODI1.C中 fun 函数的功能是:分别统计字符串中大写字母和小写
字母的个数。
例如, 给字符串 s 输入:AAaaBBb123CCccccd,则应输出结果:
upper = 6, lower = 8。
请改正程序中的错误,使它能计算出正确的结果。
注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
/**********found**********/
void fun ( char *s, int a, int b )
{
while ( *s )
{ if ( *s >= 'A' && *s <= 'Z' )
/**********found**********/
*a=a+1 ;
if ( *s >= 'a' && *s <= 'z' )
/**********found**********/
*b=b+1;
s++;
}
}
main( )
{ char s[100]; int upper = 0, lower = 0 ;
printf( "\nPlease a string : " ); gets ( s );
fun ( s, & upper, &lower );
printf( "\n upper = %d lower = %d\n", upper, lower );
}
解题思路:
第一处:在等式右边应写*a。
第二处:在等式右边应写*b。
***************************************************
请编一个函数fun,函数的功能是使实型数保留2位小数,并对第三位进行四
舍五入 (规定实型数为正数)。
   例如:实型数为 1234.567, 则函数返回 1234.570000;
实型数为 1234.564, 则函数返回 1234.560000。
注意: 部分源程序存在文件PROG1.C文件中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
float fun ( float h )
{
}
main( )
{ float a;
printf ("Enter a: "); scanf ( "%f", &a );
printf ( "The original data is : " );
printf ( "%f \n\n", a );
printf ( "The result : %f\n", fun ( a ) );
NONO( );
} 解题思路:
本题主要是考察考生保留小数点后两位数并对第三位进行四舍五入。方法是先把这个数乘
以100,然后再加0.5(实现四舍五入),再把这个数存放到一个长整型变量中,目的是把小数
点后的小数去除,最后把这个数转换成浮点型数除以100,即可得出所的结果。
参考答案:
float fun ( float h )
{
long w ;
w = h * 100 + 0.5 ;
return (float) w / 100 ;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第70套:
给定程序中,函数fun的功能是:计算形参x所指数组中N个数的平均值(规定
所有数均为正数),作为函数值返回;并将大于平均值的数放在形参y所指数组中,
在主函数中输出。
例如,有10个正数:46 30 32 40 6 17 45 15 48 26,平均值为:
30.500000
主函数中输出:46 32 40 45 48
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#define N 10
double fun(double x[],double *y)
{ int i,j; double av;
/**********found**********/
av=__1__;
/**********found**********/
for(i=0; ifor(i=j=0; i/**********found**********/
if(x[i]>av) y[__3__]= x[i];
y[j]=-1;
return av;
   }
main()
{ int i; double x[N],y[N];
for(i=0; iprintf("\n");
printf("\nThe average is: %f\n",fun(x,y));
for(i=0; y[i]>=0; i++) printf("%5.1f ",y[i]);
printf("\n");
}
解题思路:
第一处:计算平均值时,需对变量av进行初始化为0。
第二处:利用for循环计算其平均值,所以应填:x[i]/N。
第三处:把数组x中元素值大于平均值的数依次存放到形参y所指的数组中其中位置由变量j
来控制,所以应填:j++。
***************************************************
给定程序MODI1.C中函数fun的功能是:根据整型形参m,计算如下公式的值。
     1          1          1             1
y = ------- +    --------- +   --------- + …… + -------
     100*100 200*200     300*300        m*m
例如,若m = 2000,则应输出: 0.000160。
请改正程序中的语法错误,使它能计算出正确的结果。
注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
/************found************/
fun ( int m )
{ double y = 0, d ;
int i ;
/************found************/
for( i = 100, i <= m, i += 100 )
{ d = (double)i * (double)i ;
y += 1.0 / d ;
}
return( y ) ;
}
main( )
{ int n = 2000 ;
printf( "\nThe result is %lf\n", fun ( n ) ) ;
}
解题思路:
第一处:由于计算的实型值要通过函数返回,所以必须定义函数的返回类型,只要int或void
可以省略,其他都要定义类型。由于返回是实型值,所以应在数名前加上double等定义。如果
使用float则精度不够,所以在这里不能使用float定义。
第二处:在for循环中,两个“;”不可省略,在此把“;”错写成“,”。
***************************************************
已知学生的记录由学号和学习成绩构成,N名学生的数据已存入a结构体数组
中。请编写函数 fun,函数的功能是:找出成绩最低的学生记录,通过形参返回
   主函数(规定只有一个最低分)。
注意: 部分源程序存在文件PROG1.C文件中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
#include
#define N 10
typedef struct ss
{ char num[10]; int s; } STU;
fun( STU a[], STU *s )
{
}
main ( )
{ STU a[N]={ {"A01",81},{"A02",89},{"A03",66},{"A04",87},{"A05",77},
{"A06",90},{"A07",79},{"A08",61},{"A09",80},{"A10",71} }, m ;
int i;
printf("***** The original data *****\n");
for ( i=0; i< N; i++ )printf("No = %s Mark = %d\n", a[i].num,a[i].s);
fun ( a, &m );
printf ("***** THE RESULT *****\n");
printf ("The lowest : %s , %d\n",m.num, m.s);
NONO( );
}
解题思路:
本题考察学生在一组记录中找出最低分。我们使用for循环语句来解决这个问题。
参考答案: fun( STU a[], STU *s )
{
   int i, min = a[0].s, j = 0;
for(i = 1 ; i < N ; i++)
if(min > a[i].s) { /* 如果最低分min仍大于当前分 */
j = i ; /* 记住位置 */
min = a[i].s ; /* 把当前分赋值给min */
}
*s = a[j] ;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第71套:
给定程序中,函数fun的功能是:将形参s所指字符串中的所有数字字符顺序
前移,其他字符顺序后移,处理后新字符串的首地址作为函数值返回。
例如,s所指字符串为:asd123fgh5##43df,
处理后新字符串为:123543asdfgh##df。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#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(isdigit(s[i])) {
/**********found**********/
p[__1__]=s[i]; j++;}
else
{ t[k]=s[i]; k++; }
}
/**********found**********/
for(i=0; i<__2__; i++) p[j+i]= t[i];
p[j+k]=0;
/**********found**********/
return __3__;
}
main()
{ char s[80];
printf("Please input: "); scanf("%s",s);
printf("\nThe result is: %s\n",fun(s));
}
解题思路:
第一处:函数中申请了两个内存空间,其p是存放数字字符串,t是存放非数字字符串,根
据条件可知,p依次存放数字字符串,其位置由j来控制,所以应填:j。
第二处:利用for循环再把t中的内容依次追加到p中,其中t的长度为k,所以应填:k。
第三处:最后返回p的首地址即可,所以应填:p。
***************************************************
给定程序MODI1.C中函数fun的功能是:首先把b所指字符串中的字符按逆序存
放, 然后将a所指字符串中的字符和b所指字符串中的字符,按排列的顺序交叉合
并到c所指数组中,过长的剩余字符接在c所指数组的尾部。例如,当a所指字符串
中的内容为"abcdefg",b所指字符串中的内容为"1234"时,c所指数组中的内容应
该为"a4b3c2d1efg";而当a所指字符串中的内容为"1234",b所指字符串中的内容
为"abcdefg"时,c所指数组中的内容应该为"1g2f3e4dcba"。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#include
void fun( char *a, char *b, char *c )
{
int i , j; char ch;
i = 0; j = strlen(b)-1;
/************found************/
while ( i > j )
   { ch = b[i]; b[i] = b[j]; b[j] = ch;
i++; j--;
}
while ( *a || *b ) {
/************found************/
If ( *a )
{ *c = *a; c++; a++; }
if ( *b )
{ *c = *b; c++; b++; }
}
*c = 0;
}
main()
{
char s1[100],s2[100],t[200];
printf("\nEnter s1 string : ");scanf("%s",s1);
printf("\nEnter s2 string : ");scanf("%s",s2);
fun( s1, s2, t );
printf("\nThe result is : %s\n", t );
}
解题思路:
第一处:应该判断i是否小于j,所以应改为:while(i第二处:if错写成If。
***************************************************
函数fun的功能是:将s所指字符串中下标为偶数同时ASCII值为奇数的字符删
除,s所指串中剩余的字符形成的新串放在t所指的数组中。
例如,若s所指字符串中的内容为"ABCDEFG12345",其中字符C的ASCII码值为
奇数,在数组中的下标为偶数, 因此必须删除;而字符1的ASCII码值为奇数,在
数组中的下标也为奇数,因此不应当删除,其它依此类推。
最后t所指的数组中的内容应是"BDF12345"。
注意: 部分源程序存在文件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(!((i % 2) ==0 && (s[i] % 2))) t[j++] = s[i] ;
t[j] = 0 ;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第72套:
给定程序中,函数fun的功能是计算下式
例如,若形参e的值为1e-3,函数的返回值2.735678。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
double fun(double e)
{ int i; double s, x;
/**********found**********/
s=0; i=__1__;
x=1.0;
while(x>e){
/**********found**********/
__2__;
/**********found**********/
x=(2.0*i-1)/((__3__)*(2.0*i));
s=s+x;
}
return s;
}
main()
{ double e=1e-3;
printf("\nThe result is: %f\n",fun(e));
}
解题思路:
第一处:根据公式以及下面的程序,可以得出i应为0。
第二处:根据公式以及i的初值为0,所以应填:i++。
第三处:根据公式要求,所以应填:2.0*i。
***************************************************
给定程序MODI1.C中函数 fun 的功能是:将s所指字符串的正序和反序进行连
接,形成一个新串放在t所指的数组中。
例如,当s所指字符串为:"ABCD" 时,则t所指字符串中的内容应
为:"ABCDDCBA"。
   请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#include
/************found************/
void fun (char s, char t)
{
int i, d;
d = strlen(s);
for (i = 0; ifor (i = 0; i/************found************/
t[2*d-1] = '\0';
}
main()
{
char s[100], t[100];
printf("\nPlease enter string S:"); scanf("%s", s);
fun(s, t);
printf("\nThe result is: %s\n", t);
}
解题思路:
第一处:从函数体fun中可知,两个均为字符指针型变量,应改为:void fun (char *s, char
*t)。
第二处:字符串结束位置错误,应改为:t[2*d]=0;。
***************************************************
函数fun的功能是: 将s所指字符串中除了下标为奇数、同时ASCII值也为奇
数的字符之外,其余的所有字符都删除,串中剩余字符所形成的一个新串放在t所
指的数组中。
例如,若s所指字符串中的内容为:"ABCDEFG12345",其中字符A的ASCII码值
虽为奇数,但所在元素的下标为偶数,因此必需删除;而字符1的ASCII码值为奇
数,所在数组中的下标也为奇数,因此不应当删除,其它依此类推。最后t所指的
数组中的内容应是:"135"。
注意: 部分源程序存在文件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 = 1 ; i < strlen(s) ; i += 2)
if(s[i] % 2) t[j++] = s[i] ;
t[j] = 0 ;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第73套:
给定程序中,函数fun的功能是计算下式
例如:若形参e的值为1e-3,函数的返回值为0.551690。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
double fun(double e)
{ int i, k; double s, t, x;
s=0; k=1; i=2;
/**********found**********/
x=__1__/4;
/**********found**********/
while(x __2__ e)
{ s=s+k*x;
k=k* (-1);
t=2*i;
/**********found**********/
x=__3__/(t*t);
i++;
}
return s;
}
main()
{ double e=1e-3;
printf("\nThe result is: %f\n",fun(e));
}
解题思路:
第一处:根据公式,首项应该是3.4,所以应填:3.。
第二处:当x大于e时,循环体才会运行,所以应填:>。
   第三处:分子的值是2i+1,所以应填:2*i+1。
***************************************************
给定程序MODI1.C中函数 fun 的功能是:求出以下分数序列的前n项之和。和
值通过函数值返回到main函数。
2 3 5 8 13 21
┄┄ , ┄┄ , ┄┄ , ┄┄ , ┄┄ , ┄┄ , ……
1 2 3 5 8 13
例如,若n = 5,则应输出:8.391667。
请改正程序中的错误,使它能计算出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
/************found************/
fun ( int n )
{ int a, b, c, k; double s;
s = 0.0; a = 2; b = 1;
for ( k = 1; k <= n; k++ ) {
/************found************/
s = s + (Double)a / b;
c = a; a = a + b; b = c;
}
return s;
}
main( )
{ int n = 5;
printf( "\nThe value of function is: %lf\n", fun ( n ) );
}
解题思路:
第一处:由于计算的实型值要通过函数返回,所以必须定义函数的返回类型,只要int或void
可以省略,其他都要定义类型。由于返回是实型值,所以应在数名前加上double或float等定义。
第二处:double的第1个字母错写成大写D。
***************************************************
请编写一个函数fun,它的功能是:求出一个2×M整型二维数组中最大元素的
值,并将此值返回调用函数。
注意: 部分源程序存在文件PROG1.C文件中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
#define M 4
fun (int a[][M])
{
}
main( )
{ int arr[2][M]={5,8,3,45,76,-4,12,82} ;
printf("max =%d\n", fun(arr)) ;
NONO( ) ;
   }
解题思路:
本题是求出一个2×M整型二维数组中最大元素的值。
参考答案:
fun (int a[][M])
{
int i, j, max=a[0][0];
for(i=0; i<2; i++)
for(j=0; jif(maxreturn max;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第74套:
人员的记录由编号和出生年、月、日组成,N名人员的数据已在主函数中存入
结构体数组std中。函数fun的功能是:找出指定出生年份的人员,将其数据放在
形参k所指的数组中,由主函数输出,同时由函数值返回满足指定条件的人数。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#define N 8
   typedef struct
{ int num;
int year,month,day ;
}STU;
int fun(STU *std, STU *k, int year)
{ int i,n=0;
for (i=0; i/**********found**********/
if( ___1___==year)
/**********found**********/
k[n++]= ___2___;
/**********found**********/
return (___3___);
}
main()
{ STU std[N]={ {1,1984,2,15},{2,1983,9,21},{3,1984,9,1},{4,1983,7,15},
{5,1985,9,28},{6,1982,11,15},{7,1982,6,22},{8,1984,8,19}};
STU k[N]; int i,n,year;
printf("Enter a year : "); scanf("%d",&year);
n=fun(std,k,year);
if(n==0)
printf("\nNo person was born in %d \n",year);
else
{ printf("\nThese persons were born in %d \n",year);
for(i=0; iprintf("%d %d-%d-%d\n",k[i].num,k[i].year,k[i].month,k[i].day);
}
}
解题思路:
本题是从给定的人员数据中找出年龄相同的记录存入k中,并返回符合条件的人数。
第一处:断结构变量中的编号year是否相等,所以应填:std[i].year。
第二处:把符合条件的记录依次存入实参k中,所以应填:std[i]。
第三处:返回符合满足条件的人数,所以应填:n。
***************************************************
给定程序MODI1.C的功能是:读入一个整数k(2≤k≤10000),打印它的所有质
因子(即所有为素数的因子)。
例如,若输入整数:2310,则应输出:2、3、5、7、11。
请改正程序中的语法错误,使程序能得出正确的结果。
注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
/************found************/
IsPrime ( int n );
{ int i, m;
m = 1;
for ( i = 2; i < n; i++ )
/************found************/
   if !( n%i )
{ m = 0; break ; }
return ( m );
}
main( )
{ int j, k;
printf( "\nPlease enter an integer number between 2 and 10000: " ); scanf( "%d",
&k );
printf( "\n\nThe prime factor(s) of %d is( are ):", k );
for( j = 2; j <= k; j++ )
if( ( !( k%j ) )&&( IsPrime( j ) ) ) printf( "\n %4d", j );
printf("\n");
}
解题思路:
第一处:函数定义的行尾有多余的分号。
第二处:条件判断缺少圆括号。
***************************************************
已知学生的记录由学号和学习成绩构成,N名学生的数据已存入结构体数组a
中。请编写函数 fun,函数的功能是:找出成绩最高的学生记录,通过形参指针
传回主函数(规定只有一个最高分)。已给出函数的首部,请完成该函数。
注意: 部分源程序存在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
#include
#define N 10
typedef struct ss
{ char num[10]; int s; } STU;
fun( STU a[], STU *s )
{
}
main ( )
{ STU a[N]={ {"A01",81},{"A02",89},{"A03",66},{"A04",87},{"A05",77},
{"A06",90},{"A07",79},{"A08",61},{"A09",80},{"A10",71} }, m ;
int i;
printf("***** The original data *****\n");
for ( i=0; i< N; i++ )printf("No = %s Mark = %d\n", a[i].num,a[i].s);
fun ( a, &m );
printf ("***** THE RESULT *****\n");
printf ("The top : %s , %d\n",m.num, m.s);
NONO( );
}
解题思路:
本题考察学生在一组记录中找出最高分。我们使用for循环语句来解决这个问题。
参考答案:
fun( STU a[], STU *s )
{
int i, max = a[0].s, j = 0;
for(i = 1 ; i < N ; i++)
if(max < a[i].s) {
j = i ;
max = a[i].s ;
}
*s = a[j] ;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第75套:
给定程序中,函数fun的功能是:对形参ss所指字符串数组中的M个字符串按
长度由短到长进行排序。ss所指字符串数组中共有M个字符串,且串长请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#include
#define M 5
#define N 20
void fun(char (*ss)[N])
{ int i, j, k, n[M]; char t[N];
for(i=0; ifor(i=0; i{ k=i;
/**********found**********/
for(j=___1___; j/**********found**********/
if(n[k]>n[j]) ___2___;
if(k!=i)
{ strcpy(t,ss[i]);
strcpy(ss[i],ss[k]);
/**********found**********/
strcpy(ss[k],___3___);
n[k]=n[i];
}
}
}
main()
{ char ss[M][N]={"shanghai","guangzhou","beijing","tianjing","cchongqing"};
int i;
printf("\nThe original strings are :\n");
for(i=0; iprintf("\n");
fun(ss);
printf("\nThe result :\n");
for(i=0; i}
解题思路:
本题是要求按字符串的长短进行排序。
   第一处:内循环赋初值,应填:i+1。
第二处:找出最短的一个长度,所以应填:m=j。
第三处:交换字符串,所以应填:t。
***************************************************
给定程序MODI1.C中函数 fun 的功能是:判断ch中的字符是否与str所指串中
的某个字符相同; 若相同,什么也不做,若不同,则将其插在串的最后。
请改正程序中的错误,使它能进行正确的操作。
注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#include
/**********found**********/
void fun(char str, char ch )
{ while ( *str && *str != ch ) str++;
/**********found**********/
if ( *str == ch )
{ str [ 0 ] = ch;
/**********found**********/
str[1] = '0';
}
}
main( )
{ char s[81], c ;
printf( "\nPlease enter a string:\n" ); gets ( s );
printf ("\n Please enter the character to search : " );
c = getchar();
fun(s, c) ;
printf( "\nThe result is %s\n", s);
}
解题思路:
第一处:第1个形参应该是字符串类型,所以应改为:void fun(char *str, char ch)。
第二处:应该是判断不相等,所以应改为:if(*str!=ch)。
第三次:置字符串结束符错误,所以应改为:str[1] = 0;。
***************************************************
请编一个函数fun(char *s),函数的功能是把s所指字符串中的内容逆置。
例如:字符串中原有的字符串为:abcdefg,
则调用该函数后, 串中的内容为:gfedcba。
注意: 部分源程序存在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
#include
#define N 81
fun ( char *s )
{
}
   main( )
{ char a[N];
printf ( "Enter a string : " ); gets ( a );
printf ( "The original string is : " ); puts( a );
fun ( a );
printf("\n");
printf ( "The string after modified : ");
puts ( a );
NONO( );
}
解题思路:
本题是考察考生如何对字符串中的字符进行逆序操作。给出的程序使用了一个临时变量b
的字符串,使用for循环语句把原字符串的字符从尾部依次赋给临时变量b(从头开始)中,循
环结束后,再把临时变量b的内容重新复制给原字符串变量即可。
参考答案:
fun ( char *s )
{
char b[N] ;
int i = 0, j ;
memset(b, 0, N) ;
for(j = strlen(s) - 1 ; j >= 0 ; j--) b[i++] = s[j] ;
strcpy(s, b) ;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第76套:
给定程序中,函数fun的功能是:计算下式前n项的和作为函数值返回。
例如,当形参n的值为10时,函数返回:-0.204491。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
double fun(int n)
{ int i, k; double s, t;
s=0;
/**********found**********/
k=__1__;
for(i=1; i<=n; i++) {
/**********found**********/
t=__2__;
s=s+k*(2*i-1)*(2*i+1)/(t*t);
/**********found**********/
k=k*__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));
}
解题思路:
第一处:k是用来管理正负号的,公式中第一个值是正数,所以应填:1。
第二处:根据公式,t是2i,所以应填:2*i。
第三处:根据公式,第2个是负数,所以应填:(-1)。
***************************************************
给定程序MODI1.C中函数 fun 的功能是:判断一个整数是否是素数,若是返
回1,否则返回0。
在main()函数中,若fun返回1输出YES,若fun返回0输出NO!。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数。不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
int fun ( int m )
{ int k = 2;
while ( k <= m && (m%k))
/************found************/
k++
/************found************/
if (m = k )
return 1;
else return 0;
}
main( )
{ int n;
printf( "\nPlease enter n: " ); scanf( "%d", &n );
if ( fun ( n ) ) printf( "YES\n" );
else printf( "NO!\n" );
}
解题思路:
第一处:语句后缺少分号。
第二处:条件判断相等的符号是==。
***************************************************
请编写一个函数fun,它的功能是:找出一维整型数组元素中最大的值和它所
在的下标, 最大的值和它所在的下标通过形参传回。数组元素中的值已在主函数
中赋予。
主函数中x是数组名, n是x中的数据个数,max存放最大值,index存放最大值
所在元素的下标。
注意: 部分源程序存在文件PROG1.C文件中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
   给定源程序:
#include
#include
void fun(int a[], int n , int *max, int *d )
{
}
main()
{ int i, x[20], max , index, n = 10;
randomize() ;
for (i=0;i < n;i++) {x[i] = rand()%50; printf("%4d", x[i]) ; }
printf("\n");
fun( x, n , &max, &index);
printf("Max =%5d , Index =%4d\n",max, index );
NONO();
} 解题思路:
本题是找出一维整型数组元素中最大的值和它所在的下标, 最大的值和它所在的下标通过
形参传回。具体看参考源程序中的说明。
参考答案:
void fun(int a[], int n , int *max, int *d )
{
int i ;
*max=a[0];*d = 0 ; /* 把数组的第1个元素值赋值给最大值变量*max */
for(i = 1; i < n; i++)
if(*max < a[i]) { /* 判断*max是否小于当前值 */
*max = a[i]; /* 重新把最大值赋值给*max */
*d = i ; /* 记住下标 */
}
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第77套:
给定程序中,函数fun的功能是:将形参n中,各位上为偶数的数取出,并按
原来从高位到低位相反的顺序组成一个新的数,并作为函数值返回。
例如,输入一个整数:27638496,函数返回值为:64862。
请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
unsigned long fun(unsigned long n)
{ unsigned long x=0; int t;
while(n)
{ t=n%10;
/**********found**********/
if(t%2==__1__)
/**********found**********/
x=__2__+t;
/**********found**********/
n=__3__;
}
return x;
}
main()
{ unsigned long n=-1;
   while(n>99999999||n<0)
{ printf("Please input(0printf("\nThe result is: %ld\n",fun(n));
}
解题思路:
第一处:判断t是否是偶数,所以应填:0。
第二处:每操作一次,x必须乘以10,再加t,所以应填:10*x。
第三处:每循环一次n的值缩小10倍,所以应填:n/10。
***************************************************
给定程序MODI1.C中函数fun的功能是:将长整型数中每一位上为奇数的数依
次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。
例如,当s中的数为:87653142时,t中的数为:7531。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
void fun (long s, long *t)
{ int d;
long sl=1;
/************found************/
t = 0;
while ( s > 0)
{ d = s%10;
/************found************/
if (d%2 == 0)
{ *t = d * sl + *t;
\TAB sl *= 10;
}
s /= 10;
}
}
main()
{ long s, t;
clrscr();
printf("\nPlease enter s:"); scanf("%ld", &s);
fun(s, &t);
printf("The result is: %ld\n", t);
}
解题思路:
第一处:由于t是一个指针变量,赋初值的方式应为:*t=0;。
第二处:d%2条件判断时应为不是0,所以应改为:if(d%2!=0)。
***************************************************
编写一个函数fun,它的功能是:实现两个字符串的连接(不使用库函数strcat),
即把p2所指的字符串连接到p1所指的字符串后。
例如,分别输入下面两个字符串:
FirstString--
SecondString
   程序输出:
FirstString--SecondString
注意: 部分源程序在文件PROG1.C文件中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
void fun(char p1[], char p2[])
{
}
main()
{ char s1[80], s2[40] ;
printf("Enter s1 and s2:\n") ;
scanf("%s%s", s1, s2) ;
printf("s1=%s\n", s1) ;
printf("s2=%s\n", s2) ;
printf("Invoke fun(s1,s2):\n") ;
fun(s1, s2) ;
printf("After invoking:\n") ;
printf("%s\n", s1) ;
NONO() ;
} 解题思路:
本题是不使用字符串库函数来实现两个字符串的连接。
参考答案:
void fun(char p1[], char p2[])
{
char *p=p1;
while(*p)p++;
while(*p2) *p++=*p2++;
   *p=0;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第78套:
给定程序中,函数fun的功能是:将N×N矩阵主对角线元素中的值与反向对角
线对应位置上元素中的值进行交换。例如,若N=3,有下列矩阵:
1 2 3
4 5 6
7 8 9
交换后为:
3 2 1
4 5 6
9 8 7
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
   #define N 4
/**********found**********/
void fun(int ___1___ , int n)
{ int i,s;
/**********found**********/
for(___2___; i++)
{ s=t[i][i];
t[i][i]=t[i][n-i-1];
/**********found**********/
t[i][n-1-i]=___3___;
}
}
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; jprintf("\n");
}
fun(t,N);
printf("\nThe result is:\n");
for(i=0; i{ for(j=0; jprintf("\n");
}
}
解题思路:
第一处:在函数体fun中,已经使用了t整型数组,所以应填:t[][N]。
第二处:要求填写for循环语句的初始值和终止值,所以应填:i=0;i第三处:交换变量的值,根据循环体中的语句可知,s是存放交换的中间变量,所以应填:
s。
***************************************************
由N个有序整数组成的数列已放在一维数组中,给定程序MODI1.C中函数fun的
功能是:利用折半查找算法查找整数m在数组中的位置。若找到,返回其下标值;
反之,返回-1。
折半查找的基本算法是:每次查找前先确定数组中待查的范围:low和high
(low中间位置元素中的值, 则下一次的查找范围落在中间位置之后的元素中;反之,
下一次的查找范围落在中间位置之前的元素中。直到low>high,查找结束。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
给定源程序:
#include
#define N 10
/************found************/
void fun(int a[], int m )
{ int low=0,high=N-1,mid;
   while(low<=high)
{ mid=(low+high)/2;
if(mhigh=mid-1;
/************found************/
else If(m > a[mid])
low=mid+1;
else return(mid);
}
return(-1);
}
main()
{ int i,a[N]={-3,4,7,9,13,45,67,89,100,180 },k,m;
printf("a数组中的数据如下:");
for(i=0;iprintf("Enter m: "); scanf("%d",&m);
k=fun(a,m);
if(k>=0) printf("m=%d,index=%d\n",m,k);
else printf("Not be found!\n");
}
解题思路:
第一处:函数有返回值,不能定义为void,所以应改为:int fun(int a[],int m)。
第二处:if错定成If。
***************************************************
假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:除了
尾部的*号之外,将字符串中其它*号全部删除。形参p已指向字符串中最后的一个
字母。在编写函数时,不得使用C语言提供的字符串函数。
例如,字符串中的内容为:****A*BC*DEF*G*******,删除后,字符串中的内
容应当是: ABCDEFG*******。
注意: 部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
void fun( char *a, char *p )
{
}
main()
{ char s[81],*t;
printf("Enter a string:\n");gets(s);
t=s;
while(*t)t++;
t--;
while(*t=='*')t--;
fun( s , t );
printf("The string after deleted:\n");puts(s);
   NONO();
} 解题思路:
本题是考察字符串的操作。
1. 利用循环扫描出p指针左边的字符是否是'*',如果不是'*',则依次把这些字符移动原
字符串a首地址开始存放。
2. 把p指针所指的字符串也依次存放到字符串a中。
3. 最后给字符串a加上结束符。
参考答案:
void fun( char *a, char *p )
{
char *q=a;
int j=0;
while(*q && qif(*q != '*') a[j++] = *q ;
q++ ;
}
while(*p) a[j++]=*p++;
a[j]=0;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第79套:
给定程序中,函数fun的功能是:求ss所指字符串数组中长度最短的字符串所
在的行下标,作为函数值返回,并把其串长放在形参n所指变量中。ss所指字符串
数组中共有M个字符串,且串长请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#include
#define M 5
#define N 20
int fun(char (*ss)[N], int *n)
{ int i, k=0, len= N;
/**********found**********/
for(i=0; i<___1___; i++)
{ len=strlen(ss[i]);
if(i==0) *n=len;
/**********found**********/
if(len ___2___ *n)
{ *n=len;
k=i;
}
}
   /**********found**********/
return(___3___);
}
main()
{ char ss[M][N]={"shanghai","guangzhou","beijing","tianjing","chongqing"};
int n,k,i;
printf("\nThe original strings are :\n");
for(i=0;ik=fun(ss,&n);
printf("\nThe length of shortest string is : %d\n",n);
printf("\nThe shortest string is : %s\n",ss[k]);
}
解题思路:
第一处:字符串数组共有M个字符串,所以在循环中终止值应填:M。
第二处:由于本题是取长度最短的字符串,*n总是保存长度最短值,所以应填:<。
第三处:其中k是保存长度最短的字符串所在的行下标,所以应填:k。
***************************************************
给定程序MODI1.C中函数 fun 的功能是:将tt所指字符串中的小写字母都改
为对应的大写字母,其它字符不变。
例如,若输入"Ab, cD",则输出"AB, CD"。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#include
char* fun( char tt[] )
{
int i;
for( i = 0; tt[i]; i++ )
/**********found***********/
if(( 'a' <= tt[i] )||( tt[i] <= 'z' ) )
/**********found***********/
tt[i] += 32;
return( tt );
}
main( )
{
char tt[81];
printf( "\nPlease enter a string: " );
gets( tt );
printf( "\nThe result string is:\n%s", fun( tt ) );
}
解题思路:
第一处:判断是小写字母,则条件应该是与的关系。
第二处:小写字母的ASCII值减去32正好是其大写字母。
***************************************************
请编写函数fun,其功能是: 将所有大于1小于整数m的非素数存入xx所指数组
   中, 非素数的个数通过k传回。
例如,若输入:17,则应输出:4 6 8 9 10 12 14 15 16。
注意: 部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容, 仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
void fun( int m, int *k, int xx[] )
{
}
main()
{
int m, n, zz[100];
printf( "\nPlease enter an integer number between 10 and 100: " );
scanf( "%d", &n );
fun( n, &m, zz );
printf( "\n\nThere are %d non-prime numbers less than %d:", m, n );
for( n = 0; n < m; n++ )
printf( "\n %4d", zz[n] );
NONO();
} 解题思路:
本题是考察考生如何判断一个数不是素数,如果所给出的数是非素数且小于指定的数,那
么这些数应存放到指定的数组xx中保存,最后由形参xx返回。
在给出的程序中函数isP就是判断一个数是否是素数,若是非素数,则返回1,否则返回0。
本题是用for(i=2;i存入数组xx中。其中,i是控制变量,m是试题给出的整数。
参考答案:
#include
int isP(int m)
{
   int j, tag = 0 ;
for(j = 2 ; j < m && !tag ; j++)
if(m % j == 0) tag = 1 ;
return tag ;
}
void fun( int m, int *k, int xx[] )
{
int i, cnt = 0 ;
for(i = 2 ; i < m ; i++)
if(isP(i)) xx[cnt++] = i ;
*k = cnt ;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第80套:
给定程序中,函数fun的功能是:将形参n中,各位上为偶数的数取出,并按
原来从高位到低位的顺序组成一个新的数,并作为函数值返回。
例如,从主函数输入一个整数:27638496,函数返回值为:26846。
请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
   不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
unsigned long fun(unsigned long n)
{ unsigned long x=0, s, i; int t;
s=n;
/**********found**********/
i=__1__;
/**********found**********/
while(__2__)
{ t=s%10;
if(t%2==0){
/**********found**********/
x=x+t*i; i=__3__;
}
s=s/10;
}
return x;
}
main()
{ unsigned long n=-1;
while(n>99999999||n<0)
{ printf("Please input(0printf("\nThe result is: %ld\n",fun(n));
}
解题思路:
第一处:对变量i赋初值,根据i的使用规则来看,i应等于1。
第二处:while循环要求计算后的s应大于0,所以应填:s。
第三处:每循环一次,i要乘以10,所以应填:i*10。
***************************************************
给定程序MODI1.C中函数fun的功能是:输出M行M列整数方阵,然后求两条对
角线上元素之和,返回此和数。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#define M 5
/************found************/
int fun(int n, int xx[][])
{ int i, j, sum=0;
printf( "\nThe %d x %d matrix:\n", M, M );
for( i = 0; i < M; i++ )
{ for( j = 0; j < M; j++ )
/************found************/
printf( "%f ", xx[i][j] );
printf("\n");
}
   for( i = 0 ; i < n ; i++ )
sum += xx[i][i]+xx[i][ n-i-1 ];
return( sum );
}
main( )
{ int aa[M][M]={{1,2,3,4,5},{4,3,2,1,0},
\TAB \TAB {6,7,8,9,0},{9,8,7,6,5},{3,4,5,6,7}};
printf ( "\nThe sum of all elements on 2 diagnals is %d.",fun( M, aa ));
}
解题思路:
第一处:形参必须定义字符串数组的长度,所以应改为:int fun(int n,int xx[][M])。
第二处:由于xx是整型的双维数组,不能用浮点型输出,所以应改为:printf("%d
",xx[i][j]);。
***************************************************
函数fun的功能是:将a、b中的两个两位正整数合并形成一个新的整数放在c
中。合并的方式是:将a中的十位和个位数依次放在变量c的千位和十位上,b中的
十位和个位数依次放在变量c的个位和百位上。
例如,当a=45,b=12。调用该函数后,c=4251。
注意: 部分源程序存在文件PROG1.C中。数据文件IN.DAT中的数据不得修改。
请勿改动主函数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);
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第81套:
给定程序中,函数fun的功能是:在形参s所指字符串中的每个数字字符之后
插入一个*号。例如,形参s所指的字符串为:def35adh3kjsdf7。执行结果为:
def3*5*adh3*kjsdf7*。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
void fun(char *s)
{ int i, j, n;
for(i=0; s[i]!='\0'; i++)
   /**********found**********/
if(s[i]>='0' ___1___ s[i]<='9')
{ n=0;
/**********found**********/
while(s[i+1+n]!= ___2___) n++;
for(j=i+n+1; j>i; j--)
/**********found**********/
s[j+1]= ___3___;
s[j+1]='*';
i=i+1;
}
}
main()
{ char s[80]="ba3a54cd23a";
printf("\nThe original string is : %s\n",s);
fun(s);
printf("\nThe result is : %s\n",s);
}
解题思路:
第一处:判断是数字,应该使用“与”,所以应填:&&。
第二处:判断字符串是否是字符串结束符,所以应填:'\0'。
第三处:如果当前字符是数字字符,则把当前字符以后的所有字符往后一个位置,所以应
填:s[j]。
***************************************************
给定程序MODI1.C中函数fun的功能是:根据整型形参m,计算如下公式的值。
    1    1     1          1
y = 1 + ----- + ----- + ----- + …… + -----
       2*2  3*3   4*4        m*m
例如,若 m 中的值为: 5,则应输出:1.463611。
请改正程序中的错误,使它能得出正确的结果。
注意: 不要改动 main 函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
double fun ( int m )
{ double y = 1.0 ;
int i;
/**************found**************/
for(i = 2 ; i < m ; i++)
/**************found**************/
y += 1 / (i * i) ;
return( y ) ;
}
main( )
{ int n = 5 ;
printf( "\nThe result is %lf\n", fun ( n ) ) ;
}
解题思路:
   第一处:使用for循环计算公式,必须计算到m,所以应改为for(i=2; i<=m; i++)。
第二处:在除法运算中,如果除数和被除数都是整数,所以所除结果也是整数,因此应改
为y+=1./(i*i)。
***************************************************
请编写函数fun, 函数的功能是:实现B=A+A', 即把矩阵A加上A的转置, 存放
在矩阵B中。计算结果在 main 函数中输出。
例如,输入下面的矩阵: 其转置矩阵为:
1 2 3 1 4 7
4 5 6 2 5 8
7 8 9 3 6 9
程序输出:
2 6 10
6 10 14
10 14 18
注意: 部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
void fun ( int a[3][3], int b[3][3])
{
}
main( ) /* 主程序 */
{ int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}, t[3][3] ;
int i, j ;
fun(a, t) ;
for (i = 0 ; i < 3 ; i++) {
for (j = 0 ; j < 3 ; j++)
printf("%7d", t[i][j]) ;
printf("\n") ;
}
NONO () ;
}
解题思路:
本题考察考生如何实现矩阵的转置,然后执行两个矩阵中的元素值相加生成一个新的矩阵。
矩阵转置实现上就是原行元素值变为列元素值,原列元素值变为行元素值。
参考答案:
void fun ( int a[3][3], int b[3][3])
{
int c[3][3] ;
int i, j ;
for(i = 0 ; i < 3 ; i++)
for(j = 0 ; j < 3 ; j++) {
c[i][j] = a[j][i] ; /* 矩阵的转置 */
b[i][j] = a[i][j] + c[i][j] ;
}
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第82套:
给定程序中,函数fun的功能是:找出100~999之间(含100和999)所有整数
中各位上数字之和为x(x为一正整数)的整数,然后输出;符合条件的整数个数作
为函数值返回。
例如,当x值为5时,100~999之间各位上数字之和为5的整数有:104、113、
122、131、140、203、212、221、230、302、311、320、401、410、500。共有15
个。当x值为27时,各位数字之和为27的整数是:999。只有1个。
请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
fun(int x)
{ int n, s1, s2, s3, t;
n=0;
t=100;
/**********found**********/
while(t<=__1__){
/**********found**********/
s1=t%10; s2=(__2__)%10; s3=t/100;
/**********found**********/
if(s1+s2+s3==__3__)
{ printf("%d ",t);
n++;
}
t++;
}
return n;
}
main()
{ int x=-1;
while(x<0)
{ printf("Please input(x>0): "); scanf("%d",&x); }
printf("\nThe result is: %d\n",fun(x));
}
解题思路:
第一处:使用while循环找出100~999之间所有整数,所以应填:999。
第二处:s2是求十位数字,所以应填:t/10。
第三处:各位数字之和为x,所以应填:x。
***************************************************
给定程序MODI1.C中函数fun的功能是:从低位开始取出长整型变量s中偶数位
上的数,依次构成一个新数放在t中。高位仍在高位,低位仍在低位。
例如,当s中的数为:7654321时,t中的数为:642。
请改正程序中的错误,使它能得出正确的结果。
   注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
/************found************/
void fun (long s, long t)
{ long sl=10;
s /= 10;
*t = s % 10;
/************found************/
while ( s < 0)
{ s = s/100;
*t = s%10*sl + *t;
sl = sl * 10;
}
}
main()
{ long s, t;
printf("\nPlease enter s:"); scanf("%ld", &s);
fun(s, &t);
printf("The result is: %ld\n", t);
}
解题思路:
第一处:在函数fun体中,t是一个指针型变量,因此定义形参时也应定义指针。
第二处:条件应该s>0,所以应改为:while(s>0)。
***************************************************
学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组
s中,请编写函数fun,它的功能是:按分数的高低排列学生的记录,高分在前。
注意: 部分源程序在文件PROG1.C文件中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
#define N 16
typedef struct
{ char num[10];
int s;
} STREC;
int fun( STREC a[] )
{
}
main()
{ STREC s[N]={{"GA005",85},{"GA003",76},{"GA002",69},{"GA004",85},
\TAB \TAB {"GA001",91},{"GA007",72},{"GA008",64},{"GA006",87},
\TAB \TAB {"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91},
\TAB \TAB {"GA011",66},{"GA017",64},{"GA018",64},{"GA016",72}};
int i;FILE *out ;
fun( s );
   printf("The data after sorted :\n");
for(i=0;i{ if( (i)%4==0 )printf("\n");
printf("%s %4d ",s[i].num,s[i].s);
}
printf("\n");
out = fopen("c:\\test\\out.dat","w") ;
for(i=0;i{ if( (i)%4==0 && i) fprintf(out, "\n");
fprintf(out, "%4d ",s[i].s);
}
fprintf(out,"\n");
fclose(out) ;
}
解题思路:
本题是按结构体中成绩s进行降序排列,其结果仍存入当前结构体中。
参考答案:
#include
#define N 16
typedef struct
{ char num[10];
int s;
} STREC;
int fun( STREC a[] )
{
STREC tmp;
int i,j;
for(i = 0; i < N; i++)
for(j = i+1; j < N; j++)
if(a[i].s < a[j].s) {
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第83套:
给定程序中,函数fun的功能是:找出100至x(x≤999)之间各位上的数字之
和为15的所有整数,然后输出;符合条件的整数个数作为函数值返回。
例如,当n值为500时,各位数字之和为15的整数有:159、168、177、186、
195、249、258、267、276、285、294、339、348、357、366、375、384、393、
429、438、447、456、465、474、483、492。共有26个。
请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
fun(int x)
{ int n, s1, s2, s3, t;
/**********found**********/
n=__1__;
t=100;
/**********found**********/
while(t<=__2__)
{ s1=t%10; s2=(t/10)%10; s3=t/100;
if(s1+s2+s3==15)
{ printf("%d ",t);
n++;
}
/**********found**********/
__3__;
}
return n;
}
main()
{ int x=-1;
while(x>999||x<0)
{ printf("Please input(0printf("\nThe result is: %d\n",fun(x));
}
解题思路:
第一处:符合条件的整数个数n,必须进行初始化,所以应填:0。
   第二处:找出x≤999,所以应填:x。
第三处:循环控制变量t每循环一次t要加1,所以应填:t++。
***************************************************
给定程序MODI1.C中函数fun的功能是:先将s所指字符串中的字符按逆序存放
到t所指字符串中,然后把s所指串中的字符按正序连接到t所指串的后面。
例如:当s所指的字符串为:"ABCDE"时,
则t所指的字符串应为:"EDCBAABCDE"。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#include
void fun (char *s, char *t)
{
/************found************/
int i;
sl = strlen(s);
for (i=0; i/************found************/
t[i] = s[sl-i];
for (i=0; i\TAB t[sl+i] = s[i];
t[2*sl] = '\0';
}
main()
{ char s[100], t[100];
printf("\nPlease enter string s:"); scanf("%s", s);
fun(s, t);
printf("The result is: %s\n", t);
}
解题思路:
第一处:变量sl没有定义。
第二处:在C语言中,字符串开始位置从0开始的,所以应改为:t[i] = s[sl-i-1];。
***************************************************
函数fun的功能是: 将a、b中的两个两位正整数合并形成一个新的整数放在
c中。合并的方式是:将a中的十位和个位数依次放在变量c的百位和个位上,b中
的十位和个位数依次放在变量c的千位和十位上。
例如,当a=45,b=12。调用该函数后,c=1425。
注意: 部分源程序存在文件PROG1.C中。数据文件IN.DAT中的数据不得修改。
请勿改动主函数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);
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第84套:
函数fun的功能是:从三个形参a,b,c中找出中间的那个数,作为函数值返
回。
例如,当a=3, b=5, c=4时,中数为4。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
int fun(int a, int b, int c)
{
int t;
/**********found**********/
t = (a>b) ? (b>c? b :(a>c?c:___1___)) : ((a>c)?___2___ : ((b>c)?c:___3___));
return t;
}
main()
{ int a1=3, a2=5, a3=4, r;
r = fun(a1, a2, a3);
printf("\nThe middle number is : %d\n", r);
}
解题思路:
第一处:给三个数进行比较大小,所以应填:a。
第二处:给三个数进行比较大小,所以应填:a。
第三处:给三个数进行比较大小,所以应填:b。
***************************************************
给定程序MODI1.C中函数fun的功能是: 首先将大写字母转换为对应小写字母;
若小写字母为a~u,则将其转换为其后的第5个字母;若小写字母为v~z, 使其值减
21。转换后的小写字母作为函数值返回。例如,若形参是字母A,则转换为小写字母
f; 若形参是字母W,则转换为小写字母b。
请改正函数fun中指定部位的错误, 使它能得出正确的结果。
注意: 不要改动main函数, 不得增行或删行, 也不得更改程序的结构!
给定源程序:
#include
#include
char fun(char c)
{ if( c>='A' && c<='Z')
/**************found**************/
C=C+32;
   if(c>='a' && c<='u')
/**************found**************/
c=c-5;
else if(c>='v'&&c<='z')
c=c-21;
return c;
}
main()
{ char c1,c2;
printf("\nEnter a letter(A-Z): "); c1=getchar();
if( isupper( c1 ) )
{ c2=fun(c1);
printf("\n\nThe letter \'%c\' change to \'%c\'\n", c1,c2);
}
else printf("\nEnter (A-Z)!\n");
}
解题思路:
第一处:变量c错写成大写C了。
第二处:要求转换为其后的第5个字母,所以应改为:c=c+5;。
***************************************************
请编写函数fun, 其功能是: 计算并输出
例如, 在主函数中从键盘给n输入20后,输出为:s=534.188884。
注意: 要求n的值大于1但不大于100。
部分源程序在文件PROG1.C中。
请勿改动主函数main和其他函数中的任何内容, 仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
#include
double fun(int n)
{
}
main()
{ int n; double s;
printf("\n\nInput n: "); scanf("%d",&n);
s=fun(n);
printf("\n\ns=%f\n\n",s);
NONO();
}
解题思路:
本题是根据公式计算多项式的值。注意变量的取值范围。
参考答案:
double fun(int n)
{
int i;
double fac=1.0;
double sum=1.0;
for(i=2;i<=n;i++) {
fac+=sqrt(i);
sum+=fac;
}
return sum;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第85套:
给定程序的功能是调用fun函数建立班级通讯录。通讯录中记录每位学生的
编号、姓名和电话号码。班级的人数和学生的信息从键盘读入,每个人的信息作
为一个数据块写到名为myfile5.dat的二进制文件中。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
   果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#include
#define N 5
typedef struct
{ int num;
char name[10];
char tel[10];
}STYPE;
void check();
/**********found**********/
int fun(___1___ *std)
{
/**********found**********/
___2___ *fp; int i;
if((fp=fopen("myfile5.dat","wb"))==NULL)
return(0);
printf("\nOutput data to file !\n");
for(i=0; i/**********found**********/
fwrite(&std[i], sizeof(STYPE), 1, ___3___);
fclose(fp);
return (1);
}
main()
{ STYPE s[10]={ {1,"aaaaa","111111"},{1,"bbbbb","222222"},{1,"ccccc","333333"},
{1,"ddddd","444444"},{1,"eeeee","555555"}};
int k;
k=fun(s);
if (k==1)
{ printf("Succeed!"); check(); }
else
printf("Fail!");
}
void check()
{ FILE *fp; int i;
STYPE s[10];
if((fp=fopen("myfile5.dat","rb"))==NULL)
{ printf("Fail !!\n"); exit(0); }
printf("\nRead file and output to screen :\n");
printf("\n num name tel\n");
for(i=0; i{ fread(&s[i],sizeof(STYPE),1, fp);
printf("%6d %s %s\n",s[i].num,s[i].name,s[i].tel);
   }
fclose(fp);
}
解题思路:
本题是要求把指定的学生记录输出到指定的文件中。程序中共有三处要填上适当的内容,
使程序能运行出正确的结果。
第一处:结构定义自变量,因此应填写STYPE。
第二处:在所填行的下面一行,使用fopen来创建一个二进制文件,但文件流的变量名fp
已经给出,这样,此处只能填写FILE。
每三处:fwrite是把变量中的内容写入指定文件中,再根据fwrite参数的使用要求,所以
只能填写文件流变量fp。
***************************************************
给定程序MODI1.C中函数fun的功能是:先将在字符串s中的字符按正序存放
到t串中,然后把s中的字符按逆序连接到t串的后面。
例如:当s中的字符串为:"ABCDE"时,
则t中的字符串应为:"ABCDEEDCBA"。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#include
void fun (char *s, char *t)
{ int i, sl;
sl = strlen(s);
/************found************/
for( i=0; i<=s1; i ++)
t[i] = s[i];
for (i=0; i\TAB t[sl+i] = s[sl-i-1];
/************found************/
t[sl] = '\0';
}
main()
{ char s[100], t[100];
printf("\nPlease enter string s:"); scanf("%s", s);
fun(s, t);
printf("The result is: %s\n", t);
}
解题思路:
第一处:变量sl错写成了s1。
第二处:新串t的字符串结束位置不正确,应该是两倍的sl距离。
***************************************************
函数fun的功能是:将两个两位数的正整数a、b合并形成一个整数放在c中。
合并的方式是:将a数的十位和个位数依次放在c数的千位和十位上, b数的十位
和个位数依次放在c数的百位和个位上。
例如,当a=45,b=12时,调用该函数后,c=4152。
注意: 部分源程序存在文件PROG1.C中。数据文件IN.DAT中的数据不得修改。
   请勿改动主函数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: %d\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);
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第86套:
甲乙丙丁四人同时开始放鞭炮,甲每隔t1秒放一次,乙每隔t2秒放一次, 丙
每隔t3秒放一次,丁每隔t4秒放一次,每人各放n次。函数fun的功能是根据形参
提供的值,求出总共听到多少次鞭炮声作为函数值返回。注意,当几个鞭炮同时
炸响,只算一次响声,第一次响声是在第0秒。
例如,若t1=7,t2=5,t3=6,t4=4,n=10,则总共可听到28次鞭炮声。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
/**********found**********/
#define OK(i, t, n) ((___1___%t==0) && (i/tint fun(int t1, int t2, int t3, int t4, int n)
{ int count, t , maxt=t1;
if (maxt < t2) maxt = t2;
if (maxt < t3) maxt = t3;
if (maxt < t4) maxt = t4;
count=1; /* 给count赋初值 */
/**********found**********/
for(t=1; t< maxt*(n-1); ___2___)
{
if(OK(t, t1, n) || OK(t, t2, n)|| OK(t, t3, n) || OK(t, t4, n) )
count++;
}
/**********found**********/
return ___3___;
}
main()
{ int t1=7, t2=5, t3=6, t4=4, n=10, r;
r = fun(t1, t2, t3, t4, n);
printf("The sound : %d\n", r);
}
   解题思路:
第一处:根据定义的要求,所以应填:i。
第二处:for循环语句的增量,所以应填:t++。
第三处:返回统计次数,所以应填:count。
***************************************************
给定程序MODI1.C中函数fun的功能是: 根据输入的三个边长(整型值), 判断
能否构成三角形; 构成的是等边三角形, 还是等腰三角形。若能构成等边三角形
函数返回3,若能构成等腰三角形函数返回2, 若能构成一般三角形函数返回1, 若
不能构成三角形函数返回0。
请改正函数fun中指定部位的错误, 使它能得出正确的结果。
注意: 不要改动main函数, 不得增行或删行, 也不得更改程序的结构!
给定源程序:
#include
#include
/**************found**************/
void fun(int a,int b,int c)
{ if(a+b>c && b+c>a && a+c>b) {
if(a==b && b==c)
return 3;
else if(a==b||b==c||a==c)
return 2;
/**************found**************/
else retrun 1
}
else return 0;
}
main()
{ int a,b,c,shape;
printf("\nInput a,b,c: "); scanf("%d%d%d",&a,&b,&c);
printf("\na=%d, b=%d, c=%d\n",a,b,c);
shape =fun(a,b,c);
printf("\n\nThe shape : %d\n",shape);
}
解题思路:
第一处:函数有返回值,不能定义为void,所以应改为:int fun(int a,int b,int c)。
第二处:语句后缺少分号。
***************************************************
请编写函数fun, 其功能是: 计算并输出3到n之间(含3和n)所有素数的平方根
之和。
例如, 在主函数中从键盘给n输入100后,输出为: sum=148.874270。
注意: 要求n的值大于2但不大于100。
部分源程序在文件PROG1.C中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
#include
   double fun(int n)
{
}
main()
{ int n; double sum;
printf("\n\nInput n: "); scanf("%d",&n);
sum=fun(n);
printf("\n\nsum=%f\n\n",sum);
NONO();
}
解题思路:
本题是计算并输出3到n之间(含3和n)所有素数的平方根之和。
参考答案:
double fun(int n)
{
int i,j=0;
double s=0;
for (i=3; i<=n; i++) {
for (j=2; jif (i%j == 0) break;
if (j == i) s=s+sqrt(i);
}
return s;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第87套:
函数fun的功能是:统计长整数n的各个位上出现数字1、2、3的次数,并通过
外部(全局)变量c1,c2,c3返回主函数。例如:当n=123114350时,结果应该为:
c1=3 c2=1 c3=2。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
int c1,c2,c3;
void fun(long n)
{ c1 = c2 = c3 = 0;
while (n) {
/**********found**********/
switch(___1___)
{
/**********found**********/
case 1: c1++;___2___;
/**********found**********/
case 2: c2++;___3___;
case 3: c3++;
}
n /= 10;
}
}
main()
{ long n=123114350L;
fun(n);
printf("\nThe result :\n");
printf("n=%ld c1=%d c2=%d c3=%d\n",n,c1,c2,c3);
}
解题思路:
第一处:取个位数上的数,所以n%10就可以得到个位数。
第二处:switch条件判断中,满足条件做好后,必须使用break语句跳出选择体,所以应填:
break。
   第三处:同第二处。
***************************************************
给定程序MODI1.C中函数fun的功能是: 统计一个无符号整数中各位数字值为
零的个数, 通过形参传回主函数;并把该整数中各位上最大的数字值作为函数值
返回。例如, 若输入无符号整数30800, 则数字值为零的个数为3, 各位上数字值
最大的是8。
请改正函数fun中指定部位的错误, 使它能得出正确的结果。
注意: 不要改动main函数, 不得增行或删行, 也不得更改程序的结构!
给定源程序:
#include
int fun(unsigned n, int *zero)
{ int count=0,max=0,t;
do
{ t=n%10;
/**************found**************/
if(t=0)
count++;
if(maxn=n/10;
}while(n);
/**************found**************/
zero=count;
return max;
}
main()
{ unsigned n; int zero,max;
printf("\nInput n(unsigned): "); scanf("%d",&n);
max = fun( n,&zero );
printf("\nThe result: max=%d zero=%d\n",max,zero);
}
解题思路:
第一处:条件相等符号为==。
第二处:由于zero是一个指针型变量,所以给它进行赋值时应带指针,因此应改为:
*zero=count;。
***************************************************
请编写函数fun, 其功能是: 计算并输出下列多项式的值:
    1        1             1
S = 1 + ── + ─── + … + ─────
       1*2      1*2*3        1*2*3*…50
例如, 在主函数中从键盘给n输入50后,输出为:s=1.718282。
注意: 要求n的值大于1但不大于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\n",s);
NONO();
}
解题思路:
本题是根据公式计算多项式的值。注意变量的取值范围。
参考答案:
double fun(int n)
{
double s=0, t=1;
int i ;
for(i=1; i<=n; i++) {
t *= i;
s += 1./t;
}
return s;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第88套:
函数fun的功能是:把形参a所指数组中的最大值放在a[0]中,接着求出a所
指数组中的最小值放在a[1]中;再把a所指数组元素中的次大值放在a[2]中,把
a数组元素中的次小值放在a[3]中;其余以此类推。例如:若a所指数组中的数据
最初排列为:1、4、2、3、9、6、5、8、7,则按规则移动后,数据排列为:
9、1、8、2、7、3、6、4、5。形参n中存放a所指数组中数据的个数。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#define N 9
/**********found**********/
void fun(int ___1___, int n)
{ int i, j, max, min, px, pn, t;
/**********found**********/
for (i=0; i{ max = min = a[i];
px = pn = i;
/**********found**********/
for (j=___3___; j{ if (max < a[j])
{ max = a[j]; px = j; }
if (min > a[j])
{ min = a[j]; pn = j; }
}
if (px != i)
{ t = a[i]; a[i] = max; a[px] = t;
if (pn == i) pn= px;
}
if (pn != i+1)
{ t = a[i+1]; a[i+1] = min; a[pn] = t; }
}
}
main()
{ int b[N]={1,4,2,3,9,6,5,8,7}, i;
printf("\nThe original data :\n");
for (i=0; i   printf("\n");
fun(b, N);
printf("\nThe data after moving :\n");
for (i=0; iprintf("\n");
}
解题思路:
第一处:形参a应定义指针整型变量,所以应填:*a。
第二处:外for循环每次增量应该加2。
第三处:内for循环的初始值应为:i+1。
***************************************************
给定程序MODI1.C中函数fun的功能是:按顺序给s所指数组中的元素赋予从2
开始的偶数,然后再按顺序对每五个元素求一个平均值,并将这些值依次存放在
w所指的数组中。若s所指数组中元素的个数不是5的倍数,多余部分忽略不计。
例如,s所指数组有14个元素,则只对前10个元素进行处理,不对最后的4个
元素求平均值。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
给定源程序:
#include
#define SIZE 20
fun(double *s, double *w)
{ int k,i; double sum;
for(k=2,i=0;i{ s[i]=k; k+=2; }
/**********found**********/
sun=0.0;
for(k=0,i=0;i{ sum+=s[i];
/**********found**********/
if(i+1%5==0)
{ w[k]=sum/5; sum=0; k++; }
}
return k;
}
main( )
{ double a[SIZE],b[SIZE/5];
int i, k;
k = fun(a,b);
printf("The original data:\n");
for(i=0; i{ if(i%5==0) printf("\n");
printf("%4.0f", a[i]);
}
printf("\n\nThe result :\n");
for(i=0; iprintf("\n\n");
   }
解题思路:
第一处:变量名书写错误,应为sum。
第二处:由于%的优先级比+优先,所以必须加上括号,因此改为:if((i+1)%5==0)。
***************************************************
学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组
s中,请编写函数fun,它的功能是:把低于平均分的学生数据放在b所指的数组中,
低于平均分的学生人数通过形参n传回,平均分通过函数值返回。
注意: 部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
#define N 8
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}};
STREC h[N],t;FILE *out ;
int i,j,n; double ave;
ave=fun( s,h,&n );
printf("The %d student data which is lower than %7.3f:\n",n,ave);
for(i=0;iprintf("%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;ifor(j=i+1;jif(h[i].s>h[j].s) {t=h[i] ;h[i]=h[j]; h[j]=t;}
for(i=0;ifprintf(out,"%4.1f\n",h[i].s);
fclose(out);
}
解题思路:
本题是利用循环计算出记录结构中学生成绩的平均值,再把低于平均值的记录存放到b所指
的数组中。具体操作请看答案程序中的说明。
参考答案:
#include
#define N 8
typedef struct
   { char num[10];
double s;
} STREC;
double fun( STREC *a, STREC *b, int *n )
{
int i ;
double ave = 0.0 ;
*n = 0 ;
for(i = 0 ; i < N ; i++) ave = ave + a[i].s ;
ave /= N ; /* 计算平均值 */
for(i = 0 ; i < N ; i++)
if(a[i].s < ave) { /* 把低于平均值的记录存放到b所指的数组中 */
b[*n]=a[i] ;
(*n)++; /* 人数加1 */
}
return ave ; /* 返回平均值 */
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第89套:
给定程序中,函数fun的功能是:求出形参ss所指字符串数组中最长字符串的
长度,其余字符串左边用字符*补齐,使其与最长的字符串等长。字符串数组中共
有M个字符串,且串长请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
   #include
#define M 5
#define N 20
void fun(char (*ss)[N])
{ int i, j, k=0, n, m, len;
for(i=0; i{ len=strlen(ss[i]);
if(i==0) n=len;
if(len>n) {
/**********found**********/
n=len; ___1___=i;
}
}
for(i=0; iif (i!=k)
{ m=n;
len=strlen(ss[i]);
/**********found**********/
for(j=___2___; j>=0; j--)
ss[i][m--]=ss[i][j];
for(j=0; j/**********found**********/
___3___='*';
}
}
main()
{ char ss[M][N]={"shanghai","guangzhou","beijing","tianjing","cchongqing"};
int i;
printf("\nThe original strings are :\n");
for(i=0; iprintf("\n");
fun(ss);
printf("\nThe result:\n");
for(i=0; i}
解题思路:
第一处:使用变量k来保存第几个字符串是最长的字符串,所以应填:k。
第二处:利用for循环把原字符串右移至最右边存放,字符串的长为len,所以应填:len。
第三处:左边用字符*补齐,所以应填:ss[i][j]。
***************************************************
给定程序MODI1.C中函数fun的功能是: 计算整数n的阶乘。请改正程序中的错
误或在下划线处填上适当的内容并把下划线删除,使它能计算出正确的结果。
注意: 不要改动 main 函数, 不得增行或删行, 也不得更改程序的结构!
给定源程序:
#include
double fun(int n)
{
   double result=1.0;
while (n>1 && n<170)
/*********found*********/
result*=--n;
/*********found*********/
return _____;
}
main()
{
int n;
printf("Enter an integer: ");
scanf("%d",&n);
printf("\n\n%d!=%lg\n\n",n,fun(n));
}
解题思路:
第一处:--n是先减1,n--是后减1。本题应该先乘以n,再减1,才正确。
第二处:返回计算结果,所以应填:result。
***************************************************
编写函数fun,函数的功能是: 从s所指的字符串中删除给定的字符。同一字
母的大、小写按不同字符处理。
若程序执行时输入字符串为: turbo c and borland c++
从键盘上输入字符:n, 则输出后变为: turbo c ad borlad c++
如果输入的字符在字符串中不存在, 则字符串照原样输出。
注意: 部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容, 仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
#include
int fun(char s[],char c)
{
}
main()
{
static char str[]="turbo c and borland c++";
char ch;
printf("原始字符串:%s\n", str);
printf("输入一个字符:");
scanf("%c",&ch);
fun(str,ch);
printf("str[]=%s\n",str);
NONO();
} 解题思路:
本题是考察考生怎样在字符串中删除指定的字符,结果仍存放在原字符串中。给出的程序
是引用字符串指针p和while循环语句以及if条件判断语句进行处理的,新字符串的位置是由i
来控制的,循环结束后,再给新字符串置字符串结束符,最后产生的新字符串形参s返回到主程
序中。
参考答案:
int fun(char s[],char c)
{
char *p = s ;
int i = 0 ;
while(*p) {
if(*p != c) s[i++] = *p ;
p++ ;
}
s[i] = 0 ;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第90套:
函数fun的功能是:统计所有小于等于n(n>2)的素数的个数,素数的个数作
为函数值返回。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
int fun(int n)
{ int i,j, count=0;
printf("\nThe prime number between 3 to %d\n", n);
for (i=3; i<=n; i++) {
/**********found**********/
for (___1___; j/**********found**********/
if (___2___%j == 0)
break;
/**********found**********/
if (___3___>=i)
{ count++; printf( count%15? "%5d":"\n%5d",i); }
}
return count;
}
main()
{ int n=20, r;
r = fun(n);
printf("\nThe number of prime is : %d\n", r);
}
解题思路:
   第一处:素数的条件是除1和其本身外不能整除该数,所以应填:2。
第二处:判断i是否素数,所以应填:i。
第三处:如果内循环for中所有数都不能整除i,那么i是素数且j大于等于i,所以应填:j。
***************************************************
数列中,第一项值为3, 后一项都比前一项的值增5;给定程序MODI1.C中函数
fun的功能是: 计算前n(4加值放入数组中, 符合此条件的累加值的个数作为函数值返回主函数。
例如, 当n的值为20时,该数列为3,8,13,18,23,28,……,93,98。符合此条件
的累加值应为42,126,366,570,1010。
请改正函数fun中指定部位的错误, 使它能得出正确的结果。
注意: 不要改动main函数, 不得增行或删行, 也不得更改程序的结构!
给定源程序:
#include
#define N 20
int fun(int n,int *a)
{ int i,j,k,sum;
/**************found**************/
sum=j==0;
for(k=3,i=0;i{ sum=sum+k;
/**************found**************/
if(sum%4=2)
a[j++]=sum;
}
return j;
}
main()
{ int a[N],d,n,i;
printf("\nEnter n (4d=fun(n,a);
printf("\n\nThe result :\n");
for(i=0; i}
解题思路:
第一处:连续赋初值为0,中间使用条件相等符号了,所以应改为:sum=j=0;。
第二处:条件相等符号为==。
***************************************************
请编写函数fun, 其功能是: 计算并输出下列多项式的值:
例如, 在主函数中从键盘给n输入8后, 输出为: s=0.662872。
注意: 要求n的值大于1但不大于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("\ns=%f\n",s);
NONO();
} 解题思路:
本题是根据公式计算多项式的值。
参考答案:
double fun(int n)
{
int i;
double sum=0.0;
if (n>1 && n<=100) {
for(i=1; i<=n; i++)
sum+=1.0/(2*i-1)-1.0/(2*i);
}
return sum;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第91套:
函数fun的功能是:计算
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#include
double fun(double x)
{ double f, t; int n;
/**********found**********/
f = 1.0+___1___;
t = x;
n = 1;
do {
n++;
/**********found**********/
t *= x/___2___;
/**********found**********/
f += ___3___;
} while (fabs(t) >= 1e-6);
return f;
}
main()
{ double x, y;
x=2.5;
y = fun(x);
printf("\nThe result is :\n");
printf("x=%-12.6f y=%-12.6f \n", x, y);
   }
解题思路:
第一处:根据公式可知,此处应填:x。
第二处:根据公式可知,此处应该除以n,所以应填:n。
第三处:计算的结果进行累加并赋值给变量f,所以应填:t。
***************************************************
给定程序MODI1.C中函数fun的功能是: 计算n的5次方的值(规定n的值大于2、
小于8),通过形参指针传回主函数;并计算该值的个位、十位、百位上数字之和
作为函数值返回。
例如,7的5次方是16807, 其低3位数的和值是15。
请改正函数fun中指定部位的错误, 使它能得出正确的结果。
注意: 不要改动main函数, 不得增行或删行, 也不得更改程序的结构!
给定源程序:
#include
#include
int fun( int n ,int *value )
{ int d,s,i;
/**************found**************/
d=0; s=0;
for(i=1; i<=5; i++) d=d*n;
*value=d;
for(i=1; i<=3; i++)
{ s=s+d%10;
/**************found**************/
d=d\10;
}
return s;
}
main()
{ int n, sum, v;
do
{ printf("\nEnter n( 2while(n<=2||n>=8);
sum=fun( n,&v );
printf("\n\nThe result:\n value=%d sum=%d\n\n",v,sum);
}
解题思路:
第一处:变量d的初始值应为1。
第二处:整除的符号是/。
***************************************************
请编写函数fun, 其功能是: 计算并输出给定数组(长度为9)中每相邻两个元
素之平均值的平方根之和。
例如, 给定数组中的9个元素依次为12.0、34.0、4.0、23.0、34.0、45.0、
18.0、3.0、11.0, 输出应为: s=35.951014。
注意:部分源程序在文件PROG1.C中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
   给定源程序:
#include
#include
double fun(double x[9])
{
}
main()
{ double s,a[9]={12.0,34.0,4.0,23.0,34.0,45.0,18.0,3.0,11.0};
int i;
printf("\nThe original data is :\n");
for(i=0;i<9;i++)printf("%6.1f",a[i]); printf("\n\n");
s=fun(a);
printf("s=%f\n\n",s);
NONO();
} 解题思路:
本题是计算并输出给定数组中每相邻两个元素之平均值的平方根之和。
参考答案:
double fun(double x[9])
{
int i ;
double avg=0.0,sum=0.0;
for (i=0;i<8;i++) {
avg=(x[i]+x[i+1])/2;
sum+=sqrt(avg);
}
return sum;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第92套:
函数fun的功能是:计算
的前n项。若x=2.5,函数值为:12.182340。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
double fun(double x, int n)
{ double f, t; int i;
f = 1.0;
/**********found**********/
t = ___1___;
/**********found**********/
for (i=___2___; i{
/**********found**********/
t *= x/___3___;
f += t;
}
return f;
}
main()
{ double x, y;
x=2.5;
   y = fun(x, 12);
printf("\nThe result is :\n");
printf("x=%-12.6f y=%-12.6f\n", x, y);
}
解题思路:
第一处:t是处理公式中每一项中间项,所以应填:1。
第二处:根据公式可知,for循环变量的初始值应从1开始。
第三处:每做一次循环均要除以变量i的值,所以应填:i。
***************************************************
给定程序MODI1.C中函数fun的功能是: 找出100至n(不大于1000)之间三位数
字相等的所有整数, 把这些整数放在s所指数组中, 个数作为函数值返回。
请改正函数fun中指定部位的错误, 使它能得出正确的结果。
注意: 不要改动main函数, 不得增行或删行, 也不得更改程序的结构!
给定源程序:
#include
#define N 100
int fun(int *s, int n)
{ int i,j,k,a,b,c;
j=0;
for(i=100; i/**************found**************/
k=n;
a=k%10; k/=10;
b=k%10; k/=10;
/**************found**************/
c=k%10
if( a==b && a==c ) s[j++]=i;
}
return j;
}
main()
{ int a[N], n, num=0, i;
do
{ printf("\nEnter n( <=1000 ) : "); scanf("%d",&n); }
while(n > 1000);
num = fun( a,n );
printf("\n\nThe result :\n");
for(i=0; iprintf("\n\n");
}
解题思路:
第一处:k应该取循环变量i的值,所以应改为:k=i;。
第二处:语句后缺少分号。
***************************************************
请编写函数fun, 其功能是: 计算并输出给定10个数的方差:
   例如,给定的10个数为95.0、89.0、76.0、65.0、88.0、72.0、85.0、81.0、
90.0、56.0,输出为s=11.730729。
注意:部分源程序在文件PROG1.C中。
请勿改动主函数main和其他函数中的任何内容, 仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
#include
double fun(double x[10])
{
}
main()
{ double s, x[10]={95.0,89.0,76.0,65.0,88.0,72.0,85.0,81.0,90.0,56.0};
int i;
printf("\nThe original data is :\n");
for(i=0;i<10;i++)printf("%6.1f",x[i]); printf("\n\n");
s=fun(x);
printf("s=%f\n\n",s);
NONO();
} 解题思路:
本题是根据公式进行计算。
参考答案:
double fun(double x[10])
{
int i;
   double avg=0.0, sum=0.0, abs=0.0, fc;
for (i=0;i<10;i++) sum+=x[i];
avg=sum/10; /* 计算平均值 */
for (i=0;i<10;i++)
abs+=(x[i]-avg)*(x[i]-avg);
fc=sqrt(abs/10) ;
return fc;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第93套:
给定程序中已建立一个带有头结点的单向链表,在main函数中将多次调用fun
函数,每调用一次fun函数,输出链表尾部结点中的数据,并释放该结点,使链表
缩短。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#include
#define N 8
typedef struct list
{ int data;
struct list *next;
} SLIST;
void fun( SLIST *p)
   { SLIST *t, *s;
t=p->next; s=p;
while(t->next != NULL)
{ s=t;
/**********found**********/
t=t->___1___;
}
/**********found**********/
printf(" %d ",___2___);
s->next=NULL;
/**********found**********/
free(___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]={11,12,15,18,19,22,25,29};
head=creatlist(a);
printf("\nOutput from head:\n"); outlist(head);
printf("\nOutput from tail: \n");
while (head->next != NULL){
fun(head);
printf("\n\n");
printf("\nOutput from head again :\n"); outlist(head);
}
}
解题思路:
本题是对已经建立的链表,通过调用一次函数就输出链表尾部的数据。程序中共有三处要
   填上适当的内容,使程序能运行出正确的结果。
第一处:由于本题要求输出链表尾部的数据,函数是利用while循环语句找出链表尾部的指
针并存入临时变量s中,那么每循环一次就要判断链表是否已结束位置,如果是,则退出循环,
进行输出,由于是通过t指针变量进行操作的,因此,都要取t的next指针重新赋给t来实现,所
以本处应填next。
第二处:输出最后一个结点的数据,所以应填t->data或(*t).data。
第三处:输出出最后一个结点数据后,并把此结点删除了,程序要求释放内存,所以应填t。
***************************************************
给定程序MODI1.C中函数fun的功能是:将字符串中的字符按逆序输出,但不改
变字符串中的内容。
例如,若字符串为abcd,则应输出:dcba。
请改正程序中的错误,使它能计算出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
/************found************/
fun (char a)
{ if ( *a )
{ fun(a+1) ;
/************found************/
printf("%c" *a) ;
}
}
main( )
{ char s[10]="abcd";
printf("处理前字符串=%s\n处理后字符串=", s);
fun(s); printf("\n") ;
}
解题思路:
第一处:形参a应定义为字符串指针。
第二处:语句中缺少逗号。
***************************************************
请编写一个函数fun,它的功能是:比较两个字符串的长度,(不得调用C语言
提供的求字符串长度的函数),函数返回较长的字符串。若两个字符串长度相同,
则返回第一个字符串。
例如,输入beijing shanghai 为回车键),
函数将返回shanghai。
注意: 部分源程序存在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
char *fun ( char *s, char *t)
{
}
main( )
{ char a[20],b[20];
   printf("Input 1th string:") ;
gets( a);
printf("Input 2th string:") ;
gets( b);
printf("%s\n",fun (a, b ));
NONO ();
} 解题思路:
本题是比较两个字符串的长度并按要求返回字符串。
我们给出的程序是使用for循环来判断两个字符串中哪一个比较长或相等,循环的终止值为
两个字符串中是否字符串结束符,如果有,则退出循环体。接下来再判断两个字符串是否同时
出现结束符,则返回第一个字符串s,如果不没有同时出现,则判断哪一个字符串先有结束符,
则按要求返回指定的字符串。
参考答案:
char *fun ( char *s, char *t)
{
int i;
char *p=s, *q=t;
for(i=0;*p && *q; i++) {
p++; q++;
}
if(*p == 0 && *q == 0) return s ;
if(*p) return s ;
else return t ;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第94套:
函数fun的功能是:计算
的前n项之和。若x=2.5,n=15时,函数值为:1.917914。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#include
double fun(double x, int n)
{ double f, t; int i;
/**********found**********/
f = ___1___;
t = -1;
for (i=1; i{
/**********found**********/
t *= (___2___)*x/i;
/**********found**********/
f += ___3___;
}
return f;
}
main()
{ double x, y;
x=2.5;
   y = fun(x, 15);
printf("\nThe result is :\n");
printf("x=%-12.6f y=%-12.6f\n", x, y);
}
解题思路:
第一处:根据公式可知,变量f的初值为1。
第二处:根据公式可知,此处是正负号的变换,所以应填:-1。
第三处:计算的结果进行累加并赋值给变量f,所以应填:t。
***************************************************
给定程序MODI1.C中函数fun的功能是: 从3个红球,5个白球, 6个黑球中任意
取出8个作为一组,进行输出。在每组中,可以没有黑球,但必须要有红球和白球。
组合数作为函数值返回。正确的组合数应该是15。程序中i的值代表红球数, j的
值代表白球数,k的值代表黑球数。
请改正函数fun中指定部位的错误, 使它能得出正确的结果。
注意: 不要改动main函数, 不得增行或删行, 也不得更改程序的结构!
给定源程序:
#include
int fun()
{ int i,j,k,sum=0;
printf("\nThe result :\n\n");
/**************found**************/
for(i=0; i<=3; i++)
{ for(j=1; j<=5; j++)
{ k=8-i-j;
/**************found**************/
if(K>=0 && K<=6)
{ sum=sum+1;
printf("red:%4d white:%4d black:%4d\n",i,j,k);
}
}
}
return sum;
}
main()
{ int sum;
sum=fun();
printf("sum =%4d\n\n",sum);
}
解题思路:
第一处:外for循环的初始变量i的值应为1。
第二处:变量k写成了大写K了。
***************************************************
请编写函数fun, 其功能是: 计算并输出下列多项式的值:
例如, 在主函数中从键盘给n输入15, 则输出为:s=2.718282。
注意: 要求n的值大于1但不大于100。
   部分源程序在文件PROG1.C中。
请勿改动主函数main和其他函数中的任何内容, 仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
double fun(int n)
{
}
main()
{ int n; double s;
printf("Input n: "); scanf("%d",&n);
s=fun(n);
printf("s=%f\n",s);
NONO();
} 解题思路:
本题是根据给定的公式计算结果。使用for循环语句依次求出每一项的值,分别进行累加并
把结果存入变量s中,最后把s作为函数值返回。
参考答案:
double fun(int n)
{
double s=1 ;
long t=1;
int i;
for(i=1; i<=n; i++) {
t=t*i; /* 计算阶乘 */
s+=1./t; /* 计算每项的值并累加至变量s中 */
}
return s; /* 返回多项式的值 */
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第95套:
给定程序中,函数fun的功能是:计算N×N矩阵的主对角线元素和反向对角线
元素之和,并作为函数值返回。注意:要求先累加主对角线元素中的值,然后累
加反向对角线元素中的值。例如,若N=3,有下列矩阵:
1 2 3
4 5 6
7 8 9
fun函数首先累加1、5、9,然后累加3、5、7,函数的返回值为30。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#define N 4
fun(int t[][N], int n)
{ int i, sum;
/**********found**********/
___1___;
for(i=0; i/**********found**********/
sum+=___2___ ;
for(i=0; i/**********found**********/
sum+= t[i][n-i-___3___] ;
return sum;
}
main()
{ int t[][N]={21,2,13,24,25,16,47,38,29,11,32,54,42,21,3,10},i,j;
printf("\nThe original data:\n");
for(i=0; i   { for(j=0; jprintf("\n");
}
printf("The result is: %d",fun(t,N));
}
解题思路:
第一处:变量sum是用来存放主对角线元素和反向对角线元素之和,要对其进行初始化,所
以应填:sum=0。
第二处:对主对角线元素值累加,所以应填:t[i][i]。
第三处:对反向对角线元素值累加,所以应填:t[i][n-i-1]。
***************************************************
例如,若给m输入 -100,给n输入90,则函数求得的一个根值为2.000。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
给定源程序:
#include
#include
double funx(double x)
{ return(2*x*x*x-4*x*x+3*x-6); }
double fun( double m, double n)
{
/************found************/
int r;
r=(m+n)/2;
/************found************/
while(fabs(n-m)<0.001)
{ if(funx(r)*funx(n)<0) m=r;
\TAB else n=r;
\TAB r=(m+n)/2;
}
return r;
}
main( )
{ double m,n, root;
printf("Enter m n : \n"); scanf("%lf%lf",&m,&n);
root=fun( m,n );
printf("root = %6.3f\n",root);
}
解题思路:
第一处:变量r应该定义为实数型double或浮点型float变量。
第二处:while必须先满足条件,才做循环体的内容,所以应改为:while(fabs(m-n)>0.001)。
***************************************************
假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是: 除了
字符串前导和尾部的*号之外,将串中其它*号全部删除。形参h已指向字符串中第
   一个字母,形参p已指向字符串中最后一个字母。在编写函数时,不得使用C语言
提供的字符串函数。
例如,字符串中的内容为:****A*BC*DEF*G********,删除后,字符串中的内
容应当是:****ABCDEFG********。在编写函数时,不得使用C语言提供的字符串
函数。
注意: 部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
void fun( char *a, char *h,char *p )
{
}
main()
{ char s[81],*t, *f;
printf("Enter a string:\n");gets(s);
t=f=s;
while(*t)t++;
t--;
while(*t=='*')t--;
while(*f=='*')f++;
fun( s , f,t );
printf("The string after deleted:\n");puts(s);
NONO();
} 解题思路:
本题是考察字符串的操作。
1. 把r指针左边的字符仍存放字符串a首地址开始的位置上。
   2. 把r指针和p指针中间的字符进行判断,其字符是否是'*',如果不是'*',则把这些字符
放到第1步操作字符串a的后面。
3. 把p指针右边的字符放到第2步操作字符串a的后面。
4. 最后给字符串a加上结束符。
参考答案:
void fun( char *a, char *h,char *p )
{
int j=0;
char *q=a;
while(*q && q < h) a[j++] = *q++ ;
while(*h && *p && h < p) {
if(*h != '*') a[j++] = *h ;
h++;
}
while(*p) a[j++] = *p++ ;
a[j] = 0 ;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第96套:
给定程序中,函数fun的功能是:有N×N矩阵,将矩阵的外围元素顺时针旋转。
操作顺序是:首先将第一行元素的值存入临时数组r,然后使第一列成为第一行,
最后一行成为第一列,最后一列成为最后一行,临时数组中的元素成为最后一列。
例如,若N=3,有下列矩阵:
1 2 3
4 5 6
7 8 9
计算结果为
7 4 1
8 5 2
9 6 3
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#define N 4
void fun(int (*t)[N])
{ int j ,r[N];
for(j=0; jfor(j=0; j/**********found**********/
t[0][N-j-1]=t[j][___1___ ];
for(j=0; jt[j][0]=t[N-1][j];
/**********found**********/
for(j=N-1; j>=0;___2___ )
t[N-1][N-1-j]=t[j][N-1];
for(j=N-1; j>=0; j--)
/**********found**********/
t[j][N-1]=r[___3___];
}
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; jprintf("\n");
}
fun(t);
printf("\nThe result is:\n");
for(i=0; i   { for(j=0; jprintf("\n");
}
}
解题思路:
第一处:把第1列上的数存放到第1行上,所以应填:0。
第二处:for循环的增量值,由于循环是从大到小递减,所以应填:j--。
第三处:把临时数组中的元素成为最后一列,所以应填:j。
***************************************************
给定程序MODI1.C中函数 fun 的功能是:计算
S = f(-n) + f(-n+1) +…+ f(0) + f(1) + f(2) +…+ f(n)
的值。例如,当n为5时,函数值应为:10.407143。f(x)函数定义如下:
┌(x+1)/(x-2) x>0 且 x≠2
f(x) = ┤0 x=0 或 x=2
└(x-1)/(x-2) x<0
请改正程序中的错误,使程序能输出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#include
/************found************/
f( double x)
{
if (x == 0.0 || x == 2.0)
return 0.0;
else if (x < 0.0)
return (x -1)/(x-2);
else
return (x +1)/(x-2);
}
double fun( int n )
{ int i; double s=0.0, y;
for (i= -n; i<=n; i++)
{y=f(1.0*i); s += y;}
/************found************/
return s
}
main ( )
{
printf("%f\n", fun(5) );
}
解题思路:
第一处:由于返回值是实数型值,所以在函数名前加上double。
第二处:语句后缺少分号。
***************************************************
编写函数fun,它的功能是计算:
   s作为函数值返回。
在C语言中可调用log ( n )函数求ln (n)。log函数的引用说明是:
double log(double x)。
例如,若m的值为: 20,fun函数值为: 6.506583。
注意: 部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
#include
double fun( int m )
{
}
main()
{
printf("%f\n", fun(20));
NONO();
} 解题思路:
本题是根据给定的公式计算结果。使用for循环语句依次求出每一项的值,分别进行累加并
把结果存入变量s中,循环结束后再对s求平方根,结果仍存入s中,最后返回s。
参考答案:
double fun( int m )
{
double s = 0.0 ;
int i ;
for(i = 1 ; i <= m ; i++) s += log(1.0 * i) ;
s = sqrt(s) ;
   return s ;
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第97套:
函数fun的功能是:逆置数组元素中的值。例如:若a所指数组中的数据依次
为:1、2、3、4、5、6、7、8、9,则逆置后依次为:9、8、7、6、5、4、3、2、
1。形参n给出数组中数据的个数。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
void fun(int a[], int n)
{ int i,t;
/**********found**********/
for (i=0; i<___1___; i++)
{
t=a[i];
/**********found**********/
a[i] = a[n-1-___2___];
/**********found**********/
___3___ = t;
}
}
main()
{ int b[9]={1,2,3,4,5,6,7,8,9}, i;
   printf("\nThe original data :\n");
for (i=0; i<9; i++)
printf("%4d ", b[i]);
printf("\n");
fun(b, 9);
printf("\nThe data after invert :\n");
for (i=0; i<9; i++)
printf("%4d ", b[i]);
printf("\n");
}
解题思路:
第一处:利用for循环语句,对数组中的各元素进行逆置,所以终止值为n/2。
第二处:进行交换数组中元素的值,由于是依次是首和尾交换,所以应填:i。
第三处:使用中间变量t来交换的,所以应填:a[n-i-1]。
***************************************************
给定程序MODI1.C中函数fun的功能是:将一个由八进制数字字符组成的字符
串转换为与其面值相等的十进制整数。规定输入的字符串最多只能包含5位八进制
数字字符。
例如,若输入:77777,则输出将是:32767。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
给定源程序:
#include
int fun( char *p )
{ int n;
/**********found**********/
n= *P-'o';
p++;
while( *p!=0 ) {
/**********found**********/
\TAB n=n*8+*P-'o';
\TAB p++;
}
return n;
}
main()
{ char s[6]; int i; int n;
printf("Enter a string (Ocatal digits): "); gets(s);
if(strlen(s)>5){ printf("Error: String too longer !\n\n");exit(0); }
for(i=0; s[i]; i++)
if(s[i]<'0'||s[i]>'7')
{ printf("Error: %c not is ocatal digits!\n\n",s[i]);exit(0); }
printf("The original string: "); puts(s);
n=fun(s);
printf("\n%s is convered to integer number: %d\n\n",s,n);
}
解题思路:
   第一和第二处:*p错写成*P,'0'错写成'o'。
***************************************************
学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组
s中,请编写函数fun,它的功能是:函数返回指定学号的学生数据,指定的学号在主
函数中输入。若没找到指定学号,在结构体变量中给学号置空串,给成绩置-1,作
为函数值返回。(用于字符串比较的函数是strcmp)。
注意: 部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
#include
#define N 16
typedef struct
{ char num[10];
int s;
} STREC;
STREC fun( STREC *a, char *b )
{
}
main()
{ STREC s[N]={{"GA005",85},{"GA003",76},{"GA002",69},{"GA004",85},
\TAB \TAB {"GA001",91},{"GA007",72},{"GA008",64},{"GA006",87},
\TAB \TAB {"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91},
\TAB \TAB {"GA011",77},{"GA017",64},{"GA018",64},{"GA016",72}};
STREC h;
char m[10];
int i;FILE *out ;
printf("The original data:\n");
for(i=0; i{ if(i%4==0) printf("\n");
printf("%s %3d ",s[i].num,s[i].s);
}
printf("\n\nEnter the number: ");gets(m);
h=fun( s,m );
printf("The data : ");
printf("\n%s %4d\n",h.num,h.s);
printf("\n");
out = fopen("c:\\test\\out.dat","w") ;
h=fun(s,"GA013");
fprintf(out,"%s %4d\n",h.num,h.s);
fclose(out);
}
解题思路:
本题是从学生记录体中找出给定的学号。具体操作请看答案程序中的说明。
参考答案:
STREC fun( STREC *a, char *b )
{
STREC c ;
int i ;
c.num[0] = '\0' ; /* 置初始空串 */
c.s = -1 ; /* 置成绩为-1 */
for(i = 0 ; i < N ; i++)
if(strcmp(a[i].num, b)==0) { /* 判断学号是否相等 */
strcpy(c.num, a[i].num) ; /* 相等,则对学号进行赋值 */
c.s=a[i].s; /* 相等,则对成绩进行赋值 */
break ; /* 退出循环体 */
}
return c ; /* 返回结构体变量 */
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第98套:
给定程序中,函数fun的功能是:在带有头结点的单向链表中,查找数据域中
值为ch的结点。找到后通过函数值返回该结点在链表中所处的顺序号;若不存在
   值为ch的结点,函数返回0值。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#include
#define N 8
typedef struct list
{ int data;
struct list *next;
} SLIST;
SLIST *creatlist(char *);
void outlist(SLIST *);
int fun( SLIST *h, char ch)
{ SLIST *p; int n=0;
p=h->next;
/**********found**********/
while(p!=___1___)
{ n++;
/**********found**********/
if (p->data==ch) return ___2___;
else p=p->next;
}
return 0;
}
main()
{ SLIST *head; int k; char ch;
char a[N]={'m','p','g','a','w','x','r','d'};
head=creatlist(a);
outlist(head);
printf("Enter a letter:");
scanf("%c",&ch);
/**********found**********/
k=fun(___3___);
if (k==0) printf("\nNot found!\n");
else printf("The sequence number is : %d\n",k);
}
SLIST *creatlist(char *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("->%c",p->data); p=p->next; }
while(p!=NULL);
printf("->End\n");
}
}
解题思路:
本题是在给定的链表中要求找出指定的值。
第一处:判断p是否结束,所以应填:NULL。
第二处:在函数fun中,使用n来计算结点的位置,当找到ch值,则返回结点的位置n,所以
应填:return n。
第三处:函数调用,在主函数中已经给出了head和ch,所以应填:head,ch。
***************************************************
给定程序MODI1.C中函数fun的功能是:删除p所指字符串中的所有空白字符(包
括制表符、回车符及换行符)。
输入字符串时用'#'结束输入。
请改正程序中的错误,使它能输出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#include
#include
fun ( char *p)
{ int i,t; char c[80];
/************found************/
For (i = 0,t = 0; p[i] ; i++)
if(!isspace(*(p+i))) c[t++]=p[i];
/************found************/
c[t]="\0";
strcpy(p,c);
}
main( )
{ char c,s[80];
int i=0;
printf("Input a string:");
c=getchar();
while(c!='#')
{ s[i]=c;i++;c=getchar(); }
s[i]='\0';
   fun(s);
puts(s);
}
解题思路:
第一处:保留字for错写成For。
第二处:置字符串结束符错误,应该是:'\0'。
***************************************************
请编写一个函数fun,它的功能是:将ss所指字符串中所有下标为奇数位置上
的字母转换为大写(若该位置上不是字母,则不转换)。
例如, 若输入"abc4EFg",则应输出"aBc4EFg"。
注意: 部分源程序存在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
#include
void fun ( char *ss )
{
}
main( )
{ char tt[81] ;
printf( "\nPlease enter an string within 80 characters:\n" ); gets( tt );
printf( "\n\nAfter changing, the string\n \"%s\"", tt );
fun( tt );
printf( "\nbecomes\n \"%s\"\n", tt );
NONO ( );
} 解题思路:
本题是考察考生对字母按要求进行转换。其中大小字母的ASCII值相差32。
参考答案:
void fun ( char *ss )
{
int i ;
for(i = 1 ; i < strlen(*ss) ; i+=2) {
if(ss[i] >= 'a' && ss[i] <= 'z') ss[i] -= 32 ;
}
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第99套:
函数fun的功能是:将形参a所指数组中的前半部分元素中的值和后半部分元
素中的值对换。形参n中存放数组中数据的个数,若n为奇数,则中间的元素不动。
例如:若a所指数组中的数据依次为:1、2、3、4、5、6、7、8、9,则调换后
为:6、7、8、9、5、1、2、3、4。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
#define N 9
void fun(int a[], int n)
{ int i, t, p;
/**********found**********/
p = (n%2==0)?n/2:n/2+___1___;
   for (i=0; i{
t=a[i];
/**********found**********/
a[i] = a[p+___2___];
/**********found**********/
___3___ = t;
}
}
main()
{ int b[N]={1,2,3,4,5,6,7,8,9}, i;
printf("\nThe original data :\n");
for (i=0; iprintf("\n");
fun(b, N);
printf("\nThe data after moving :\n");
for (i=0; iprintf("\n");
}
解题思路:
第一处:如果n是奇数,则中间的元素不动,所以应填:1。
第二处:使用for循环语句来交换数组元素的值,所以应填:i。
第三处:使用中间变量t来交换的,所以应填:t。
***************************************************
给定程序MODI1.C中函数fun的功能是:把主函数中输入的3个数,最大的放在
a中,最小的放在c中,中间的放在b中。
例如,输入的数为:55 12 34,
输出结果应当是:a=55.0 , b=34.0 , c=12.0。
请改正程序中的错误,使它能得出正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
给定源程序:
#include
void fun(float *a,float *b,float *c)
{
/**********found**********/
float *k;
if( *a<*b )
{ k=*a; *a=*b; *b=k; }
/**********found**********/
if( *a>*c )
{ k=*c; *c=*a; *a=k; }
if( *b<*c )
{ k=*b; *b=*c; *c=k; }
}
main()
{ float a,b,c;
printf("Input a b c: "); scanf("%f%f%f",&a,&b,&c);
   printf("a = %4.1f, b = %4.1f, c = %4.1f\n\n",a,b,c);
fun(&a,&b,&c);
printf("a = %4.1f, b = %4.1f, c = %4.1f\n\n",a,b,c);
}
解题思路:
第一处:在函数fun体中,k是一个浮点型变量,所以应改为:float k;。
第二处:三个数比较大小,第1个条件是第1个比第2个小,则交换。第3个条件是第2个比第
3个小,则也交换。第2个条件是应该第1和第3个小,则交换就符合题意了,所以应改为:
if(*a<*c)。
***************************************************
学生的记录由学号和成绩组成,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},
\TAB \TAB {"GA01",91},{"GA07",72},{"GA08",64},{"GA06",87},
\TAB \TAB {"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91},
\TAB \TAB {"GA011",77},{"GA017",64},{"GA018",64},{"GA016",72}};
STREC h[N];
int i,n;FILE *out ;
n=fun( s,h );
printf("The %d highest score :\n",n);
for(i=0;iprintf("%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;ifprintf(out, "%4d\n",h[i].s);
fclose(out);
}
解题思路:
本题是找出最高成绩,再把N名学生的成绩等于最高成绩的记录存入b所指的数组中。具体
操作请看答案程序中的说明。
   参考答案:
int fun( STREC *a, STREC *b )
{
int i, max = a[0].s, n=0;
for(i = 1; i < N; i++)
if(max < a[i].s) max = a[i].s ; /* 找出最高成绩 */
for(i = 0; i < N; i++)
if(max==a[i].s) b[n++] = a[i] ; /* 找相等的最高成绩并存入数组b中 */
return n; /* 返回符合条件的人数 */
} ※※※※※※※※※※※※※※※※※※※※※※※※※
第00套:
给定程序中,函数fun的功能是:在形参s所指字符串中寻找与参数c相同的字
符,并在其后插入一个与之相同的字符,若找不到相同的字符则函数不做任何处
理。
例如,s所指字符串为:baacda,c中的字符为:a,
执行后s所指字符串为:baaaacdaa。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
   void fun(char *s, char c)
{ int i, j, n;
/**********found**********/
for(i=0; s[i]!=___1___ ; i++)
if(s[i]==c)
{
/**********found**********/
n=___2___ ;
while(s[i+1+n]!='\0') n++;
for(j=i+n+1; j>i; j--) s[j+1]=s[j];
/**********found**********/
s[j+1]=___3___ ;
i=i+1;
}
}
main()
{ char s[80]="baacda", c;
printf("\nThe string: %s\n",s);
printf("\nInput a character: "); scanf("%c",&c);
fun(s,c);
printf("\nThe result is: %s\n",s);
}
解题思路:
第一处:在for循环中终止值要判断字符串是否结束符,所以应填:'\0'。
第二处:n用于统计参数c后还有多少个字符,要对其进行初始化,所以应填:0。
第三处:要求插入相同的字符c,所以应填:c。
***************************************************
在主函数中从键盘输入若干个数放入数组中, 用0结束输入并放在最后一个
元素中。给定程序MODI1.C中函数fun的功能是:计算数组元素中值为正数的平均
值(不包括0)。
例如:数组中元素中的值依次为:39,-47,21,2,-8,15,0,
则程序的运行结果为:19.250000。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main 函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include
double fun ( int x[])
{
/************found************/
int sum = 0.0;
int c=0, i=0;
while (x[i] != 0)
{ if (x[i] > 0) {
sum += x[i]; c++; }
i++;
}
/************found************/
   sum \= c;
return sum;
}
main( )
{ int x[1000]; int i=0;
printf( "\nPlease enter some data (end with 0): " );
do
{ scanf("%d", &x[i]); }
while (x[i++] != 0);
printf("%f\n", fun ( x ));
}
解题思路:
第一处:由于sum是存放实数值,因此不能定义为整型,所以应改为double sum=0.0;或float
sum=0.0;。
第二处:除的运算符是“/”。
***************************************************
编写函数fun,函数的功能是:根据以下公式计算s,计算结果作为函数值返
回;n通过形参传入。
   1       1              1
S=1 + ── + ─── + ... + ──────
   1+2    1+2+3         1+2+3+...+n
例如:若n的值为11时,函数的值为:1.833333
注意: 部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include
float fun(int n)
{
}
main()
{ int n; float s;
printf("\nPlease enter N:"); scanf("%d", &n);
s = fun(n);
printf("the result is: %f\n", s);
NONO();
} 解题思路:
本题是根据给定的公式计算结果。使用for循环语句依次求出每一项的值,分别进行累加并
把结果存入变量s中,最后返回s。
参考答案:
float fun(int n)
{
int i,j,t;
float s=0;
for(i=1;i<=n;i++) {
t=0;
for(j=1;j<=i;j++) t+=j;
s=s+1./t;
}
return s;
}    
1