首页 [DOC]-2014年3月计算机二级C语言题库_南开100题

[DOC]-2014年3月计算机二级C语言题库_南开100题

举报
开通vip

[DOC]-2014年3月计算机二级C语言题库_南开100题[DOC]-2014年3月计算机二级C语言题库_南开100题 2014年3月计算机二级C语言题库_南开100题 说明:本题库是针对2014年3月份考试的上机考试题库,本题库共有100套题目(每套题目包含3道题:一道程序填空题、一道程序修改题、一道程序设计题),真实考试的时候,考生输入准考证后计算机随机为你抽取一套考试,每个考生考试时只需考一套题目(包含三道题),但由于考试时是随机抽题,所以即使把原题库告诉大家,你也不能知道到时计算机会给你抽取哪一套题,所以大家只有把全部题库都理解才能万无一失) 二级C语言上机...

[DOC]-2014年3月计算机二级C语言题库_南开100题
[DOC]-2014年3月计算机二级C语言题库_南开100题 2014年3月计算机二级C语言题库_南开100题 说明:本题库是针对2014年3月份考试的上机考 试题 中考模拟试题doc幼小衔接 数学试题 下载云南高中历年会考数学试题下载N4真题下载党史题库下载 库,本题库共有100套题目(每套题目包含3道题:一道程序填空题、一道程序修改题、一道程序 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 题),真实考试的时候,考生输入准考证后计算机随机为你抽取一套考试,每个考生考试时只需考一套题目(包含三道题),但由于考试时是随机抽题,所以即使把原题库告诉大家,你也不能知道到时计算机会给你抽取哪一套题,所以大家只有把全部题库都理解才能万无一失) 二级C语言上机试题汇编 ※※※※※※※※※※※※※※※※※※※※※※※※※ 第1套: 给定程序中,函数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; i fun ( char *s, int num[5] ) { int k, i=5; for ( k = 0; k= 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 #include #define N 10 double fun(double *x) { int i, j; double s, av, y[N]; s=0; for(i=0; iav ){ /**********found**********/ y[__2__]=x[i]; x[i]=-1;} for(i=0; i #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 #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; ja[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循环的终止值应该 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); } 第02套: 给定程序中,函数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(0 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( ) ※※※※※※※※※※※※※※※※※※※※※※※※※ 第03套: 给定程序中,函数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 #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 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf , 并 为各结点数据域赋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; i。 第三处:把已排序的结构数据,重新写入文件,所以应填: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; i #define N 50 #define M 11 void fun( int *a, int *b) { } double rnd() { static t=29,c=217,m=1024,r=0; r=(r*t+c)%m; return((double)r/m); } main() { int age[N], i, d[M]; for(i=0; i 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; i 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; i10 ) { printf("\nGive the number of the students who have better score: "); scanf("%d",&m); } pOrder=fun(a,m); printf("***** THE RESULT *****\n"); printf("The top :\n"); for(i=0; i #define N 80 int fun(int a[], int n) { } main() { int a[N]={2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10},i,n=20; printf("The original data :\n"); for(i=0; i 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;i 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;ka[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; ia[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=3 ); printf("n = %4d\n",n); fun ( a, n ); printf ("***** THE RESULT *****\n"); for ( i =0; i #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; idata=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; i #define N 3 int fun(int (*a)[N]) { int i,j,m1,m2,row,colum; m1=m2=0; for(i=0; i 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; idata=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; i #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; idata=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 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 #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; idata=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 #include #define N 80 void insert(char *aa) { int i,j,n; char ch; /**********found**********/ n=strlen[ aa ]; for( i=1; i=0) && ( ch #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(is=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(is=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个字符串,且串长 #include #define M 5 #define N 20 void fun(char (*ss)[N]) { int i, j, n, len=0; for(i=0; in)n=len; } for(i=0; i #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 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( maxp ) { *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;ih[j].s) {tt=h[i] ;h[i]=h[j]; h[j]=tt;} for(i=0;i= 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='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;i 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**********/ 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 #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;i 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 #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; idata=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;i 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; is[j]) t=j; if(t!=i) { x=s[i]; s[i]=s[t]; s[t]=x; } } for(i=1,j=0; i #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;i #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 #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 #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 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; idata=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;i /************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(j #define N 9 int fun(int a[], int n) { int i,j; j = 0; for (i=0; i int fun(int a,int b) { int r,t; if(a 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;i #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; idata=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; i #define N 10 double fun(double x[],double *av) { int i,j; double d,s; s=0; for(i=0; i /************found************/ int fun ( int n ) { float A=1; int i; /************found************/ for (i=2; i #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=3 ); printf("m = %4d\n",m); fun ( a ,m ); printf ("THE RESULT\n"); for ( i =0; i 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 #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;i 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 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(is=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; i1) 例如,当给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(j #include #define N 5 #define M 8 void fun(char (*ss)[M]) { char *ps[N],*tp; int i,j,k; for(i=0; i #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 #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; 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 #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 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; i #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; idata=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**************/ 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___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; i 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;iave = 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 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; iscore[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 #include #define N 5 int fun ( int a[][N] ) { } main ( ) { int a[N][N], i, j; printf("***** The array *****\n"); for ( i =0; i #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; i0;i--) { k=a[M-1]; for(j=M-1;j>0;j--) /**************found**************/ aa[j]=a[j-1]; a[0]=k; for(m=0; m 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=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 #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 #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 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**********/ 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; i 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 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个字符串,且串长 #define M 5 #define N 20 /**********found**********/ int fun(char (*ss) ___1___, int *n) { int i, k=0, len=0; for(i=0; i*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;i 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; iav) y[__3__]= x[i]; y[j]=-1; return av; } main() { int i; double x[N],y[N]; for(i=0; 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 #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 #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; i #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; j #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************/ 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个字符串,且 串长 #include #define M 5 #define N 20 void fun(char (*ss)[N]) { int i, j, k, n[M]; char t[N]; for(i=0; in[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; i #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(0 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; ihigh,查找结束。 请改正程序中的错误,使它能得出正确结果。 注意:不要改动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(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;i=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 && q #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;i #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 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(0 #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 #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(0 #include void fun (char *s, char *t) { /************found************/ int i; sl = strlen(s); for (i=0; i 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 #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 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/t #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; j 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(max 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 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 #define SIZE 20 fun(double *s, double *w) { int k,i; double sum; for(k=2,i=0;i #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;ih[j].s) {t=h[i] ;h[i]=h[j]; h[j]=t;} for(i=0;i #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个字符串,且串长 #include #define M 5 #define N 20 void fun(char (*ss)[N]) { int i, j, k=0, n, m, len; for(i=0; in) { /**********found**********/ n=len; ___1___=i; } } for(i=0; i=0; j--) ss[i][m--]=ss[i][j]; for(j=0; j 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=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 #define N 20 int fun(int n,int *a) { int i,j,k,sum; /**************found**************/ sum=j==0; for(k=3,i=0;i 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( 2=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 #define N 100 int fun(int *s, int n) { int i,j,k,a,b,c; j=0; for(i=100; i 1000); num = fun( a,n ); printf("\n\nThe result :\n"); for(i=0; i #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; idata=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 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 #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; 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; i0 且 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 #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; idata=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 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;i 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
本文档为【[DOC]-2014年3月计算机二级C语言题库_南开100题】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_594886
暂无简介~
格式:doc
大小:884KB
软件:Word
页数:0
分类:其他高等教育
上传时间:2017-09-15
浏览量:10