![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
全國計算機二級C題庫第1--10套 |
本題目如果下載后發(fā)現(xiàn)有錯誤的地方,請聯(lián)系網(wǎng)站管理員:QQ121431055
考試時,上機題目有三套,基本操作題、簡單應(yīng)用題、綜合應(yīng)用題 第01套: 給定程序中,函數(shù)fun的功能是:將形參n所指變量中,各位上為偶數(shù)的數(shù)去 除,剩余的數(shù)按原來從高位到低位的順序組成一個新的數(shù),并通過形參指針n傳回 所指變量。 例如,輸入一個數(shù):27638496,新的數(shù):為739。 請在程序的下劃線處填入正確的內(nèi)容并把下劃線刪除, 使程序得出正確的結(jié)果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結(jié)構(gòu)! 給定源程序: #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 fun(&n); printf("\nThe result is: %ld\n",n); } 解題思路: 第一處:t是通過取模的方式來得到*n的個位數(shù)字,所以應(yīng)填:10。 第二處:判斷是否是奇數(shù),所以應(yīng)填:0。 第三處:最后通形參n來返回新數(shù)x,所以應(yīng)填:x。 *************************************************** 給定程序MODI1.C中函數(shù) fun 的功能是:計算n!。 例如,給n輸入5,則輸出120.000000。 請改正程序中的錯誤,使程序能輸出正確的結(jié)果。 注意:不要改動main函數(shù),不得增行或刪行,也不得更改程序的結(jié)構(gòu)! 給定源程序: #include double fun ( int n ) { double result = 1.0 ; /************found************/ if n = = 0 return 1.0 ; while( n >1 && n < 170 ) /************found************/ result *= n-- return result ; } main ( ) { int n ; printf("Input N:") ; scanf("%d", &n) ; printf("\n\n%d! =%lf\n\n", n, fun(n)) ; } 解題思路: 第一處:條件語句書寫格式錯誤,應(yīng)改為:if (n==0)。 第二處:語句后缺少分號。 *************************************************** 請編寫一個函數(shù)fun,它的功能是:將一個數(shù)字字符串轉(zhuǎn)換為一個整數(shù)(不得 調(diào)用C語言提供的將字符串轉(zhuǎn)換為整數(shù)的函數(shù))。例如,若輸入字符串"-1234",則 函數(shù)把它轉(zhuǎn)換為整數(shù)值 -1234。函數(shù)fun中給出的語句僅供參考。 注意: 部分源程序存在文件PROG1.C文件中。 請勿改動主函數(shù)main和其它函數(shù)中的任何內(nèi)容, 僅在函數(shù)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; /* 以下完成數(shù)字字符串轉(zhuǎn)換為一個數(shù)字 */ return x*t; } main() /* 主函數(shù) */ { char s[6]; long n; printf("Enter a string:\n") ; gets(s); n = fun(s); printf("%ld\n",n); NONO ( ); } NONO ( ) {/* 本函數(shù)用于打開文件,輸入數(shù)據(jù),調(diào)用函數(shù),輸出數(shù)據(jù),關(guān)閉文件。 */ 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) ; } 解題思路: 本題是將一個數(shù)字字符串轉(zhuǎn)換為一個整數(shù)。 參考答案: #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; /* 以下完成數(shù)字字符串轉(zhuǎn)換為一個數(shù)字 */ while(*p) x = x*10-48+(*p++); return x*t; } main() /* 主函數(shù) */ { char s[6]; long n; printf("Enter a string:\n") ; gets(s); n = fun(s); printf("%ld\n",n); NONO ( ); } NONO ( ) {/* 本函數(shù)用于打開文件,輸入數(shù)據(jù),調(diào)用函數(shù),輸出數(shù)據(jù),關(guān)閉文件。 */ 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( )這個函數(shù)是改卷人用的,與考生沒有什么關(guān)系,故下面從第2套試題開始均省略NONO( ) ※※※※※※※※※※※※※※※※※※※※※※※※※ 第02套: 給定程序中,函數(shù)fun的功能是將形參給定的字符串、整數(shù)、浮點數(shù)寫到文本 文件中,再用字符方式從此文本文件中逐個讀入并顯示在終端屏幕上。 請在程序的下劃線處填入正確的內(nèi)容并把下劃線刪除, 使程序得出正確的結(jié) 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結(jié)構(gòu)! 給定源程序: #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); }
解題思路: 本題是考察先把給定的數(shù)據(jù)寫入到文本文件中,再從該文件讀出并顯示在屏幕上。 第一處:定義文本文件類型變量,所以應(yīng)填:FILE *。 第二處:判斷文件是否結(jié)束,所以應(yīng)填:fp。 第三處:顯示讀出的字符,所以應(yīng)填:ch。 *************************************************** 給定程序MODI1.C中函數(shù)fun的功能是: 依次取出字符串中所有數(shù)字字符, 形 成新的字符串, 并取代原字符串。 請改正函數(shù)fun中指定部位的錯誤, 使它能得出正確的結(jié)果。 注意: 不要改動main函數(shù), 不得增行或刪行, 也不得更改程序的結(jié)構(gòu)! 給定源程序: #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 ); } 解題思路: 第一處: 要求是取出原字符串中所有數(shù)字字符組成一個新的字符串,程序中是使用變量j 來控制新字符串的位置,所以應(yīng)改為:s[j++]=s[i];。 第二處: 置新字符串的結(jié)束符,所以應(yīng)改為:s[j]='\0';. *************************************************** 請編寫函數(shù)fun, 函數(shù)的功能是: 將M行N列的二維數(shù)組中的字符數(shù)據(jù), 按列的 順序依次放到一個字符串中。 例如, 二維數(shù)組中的數(shù)據(jù)為: W W W W S S S S H H H H 則字符串中的內(nèi)容應(yīng)是: WSHWSHWSH。 注意:部分源程序在文件PROG1.C中。 請勿改動主函數(shù)main和其它函數(shù)中的任何內(nèi)容, 僅在函數(shù)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++) /* 請?zhí)顚懴鄳?yīng)語句完成其功能 */ { } b[n]='\0'; } main() { char a[100],w[M][N]={{'W','W','W','W'},{'S','S','S','S'},{'H','H','H','H'}}; int i,j; printf("The matrix:\n"); for(i=0; i { for(j=0;j printf("\n"); } fun(w,a); printf("The A string:\n");puts(a); printf("\n\n"); NONO(); } 解題思路: 本題是把二維數(shù)組中的字符數(shù)據(jù)按列存放到一個字符串中。 1. 計算存放到一維數(shù)組中的位置。 2. 取出二維數(shù)組中的字符存放到一維數(shù)組(已計算出的位置)中。 參考答案: void fun(char s[][N], char *b) { int i,j,n=0; for(i=0; i < N;i++) /* 請?zhí)顚懴鄳?yīng)語句完成其功能 */ { for(j = 0 ; j < M ; j++) { b[n] = s[j][i] ; n = i * M + j + 1; } } b[n]='\0'; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第03套: 程序通過定義學生結(jié)構(gòu)體變量,存儲了學生的學號、姓名和3門課的成績。所 有學生數(shù)據(jù)均以二進制方式輸出到文件中。函數(shù)fun的功能是重寫形參filename所 指文件中最后一個學生的數(shù)據(jù),即用新的學生數(shù)據(jù)覆蓋該學生原來的數(shù)據(jù),其它學 生的數(shù)據(jù)不變。 請在程序的下劃線處填入正確的內(nèi)容并把下劃線刪除, 使程序得出正確的結(jié) 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結(jié)構(gòu)! 給定源程序: #include #define N 5 typedef struct student { long sno; char name[10]; float score[3]; } STU; void fun(char *filename, STU n) { FILE *fp; /**********found**********/ fp = fopen(__1__, "rb+"); /**********found**********/ fseek(__2__, /**********found**********/ fwrite(&n, sizeof(STU), 1, __3__); fclose(fp); } main() { STU t[N]={ {10001,"MaChao", 91, 92, 77}, {10002,"CaoKai", 75, 60, 88}, {10003,"LiSi", 85, 70, 78}, {10004,"FangFang", 90, 82, 87}, {10005,"ZhangSan", 95, 80, 88}}; STU n={10006,"ZhaoSi", 55, 70, 68}, ss[N]; int i,j; FILE *fp; fp = fopen("student.dat", "wb"); fwrite(t, sizeof(STU), N, fp); fclose(fp); fp = fopen("student.dat", "rb"); fread(ss, sizeof(STU), N, fp); fclose(fp); printf("\nThe original data :\n\n"); for (j=0; j { printf("\nNo: %ld Name: %-8s Scores: ",ss[j].sno, ss[j].name); for (i=0; i<3; i++) printf("% printf("\n"); } fun("student.dat", n); printf("\nThe data after modifing :\n\n"); fp = fopen("student.dat", "rb"); fread(ss, sizeof(STU), N, fp); fclose(fp); for (j=0; j { printf("\nNo: %ld Name: %-8s Scores: ",ss[j].sno, ss[j].name); for (i=0; i<3; i++) printf("% printf("\n"); } } 解題思路: 本題是考察如何從文件中讀出數(shù)據(jù),再把結(jié)構(gòu)中的數(shù)據(jù)寫入文件中。 第一處:從指定的文件中讀出數(shù)據(jù),所以應(yīng)填:filename。 第二處:讀取文件fp的最后一條記錄,所以應(yīng)填:fp。 第三處:再把讀出的記錄,寫入文件fp指定的位置上,所以應(yīng)填:fp。 *************************************************** 給定程序MODI1.C中的函數(shù)Creatlink的功能是創(chuàng)建帶頭結(jié)點的單向鏈表, 并 為各結(jié)點數(shù)據(jù)域賦0到m-1的值。 請改正函數(shù)Creatlink中指定部位的錯誤, 使它能得出正確的結(jié)果。 注意: 不要改動main函數(shù), 不得增行或刪行, 也不得更改程序的結(jié)構(gòu)! 給定源程序: #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); } 解題思路: 第一處: 指向剛分配的結(jié)構(gòu)指針,所以應(yīng)改為:p=(NODE *)malloc(sizeof(NODE)); 第二處: 在動態(tài)分配內(nèi)存的下一行語句是,使用臨時結(jié)構(gòu)指針變量h保存p指針的初始位置, 最后返回不能使用p,是因為p的位置已經(jīng)發(fā)生了變化,所以應(yīng)改為返回h。 *************************************************** 請編寫函數(shù)fun, 函數(shù)的功能是:統(tǒng)計一行字符串中單詞的個數(shù),作為函數(shù)值返 回。一行字符串在主函數(shù)中輸入, 規(guī)定所有單詞由小寫字母組成,單詞之間由若干 個空格隔開, 一行的開始沒有空格。 注意:部分源程序在文件PROG1.C中。 請勿改動主函數(shù)main和其它函數(shù)中的任何內(nèi)容, 僅在函數(shù)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(); } 解題思路: 本題是統(tǒng)計字符串中的單詞數(shù)。 1. 利用while循環(huán)語句和指針變量,當字符為空格時,則單詞數(shù)k加1。 2. 循環(huán)結(jié)束返回k。 參考答案: int fun( char *s) { int k = 1 ; while(*s) { if(*s == ' ') k++ ; s++ ; } return k ; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第04套: 程序通過定義學生結(jié)構(gòu)體變量,存儲了學生的學號、姓名和3門課的成績。所 有學生數(shù)據(jù)均以二進制方式輸出到文件中。函數(shù)fun的功能是從形參filename所指 的文件中讀入學生數(shù)據(jù),并按照學號從小到大排序后,再用二進制方式把排序后的 學生數(shù)據(jù)輸出到filename所指的文件中,覆蓋原來的文件內(nèi)容。 請在程序的下劃線處填入正確的內(nèi)容并把下劃線刪除, 使程序得出正確的結(jié) 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結(jié)構(gòu)! 給定源程序: #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 for (j=i+1; j /**********found**********/ if (s[i].sno __2__ s[j].sno) { t = s[i]; s[i] = s[j]; s[j] = t; } fp = fopen(filename, "wb"); /**********found**********/ __3__(s, sizeof(STU), N, fp); /* 二進制輸出 */ fclose(fp); } main() { STU t[N]={ {10005,"ZhangSan", 95, 80, 88}, {10003,"LiSi", 85, 70, 78}, {10002,"CaoKai", 75, 60, 88}, {10004,"FangFang", 90, 82, 87}, {10001,"MaChao", 91, 92, 77}}, ss[N]; int i,j; FILE *fp; fp = fopen("student.dat", "wb"); fwrite(t, sizeof(STU), 5, fp); fclose(fp); printf("\n\nThe original data :\n\n"); for (j=0; j { printf("\nNo: %ld Name: %-8s Scores: ",t[j].sno, t[j].name); for (i=0; i<3; i++) printf("% printf("\n"); } fun("student.dat"); printf("\n\nThe data after sorting :\n\n"); fp = fopen("student.dat", "rb"); fread(ss, sizeof(STU), 5, fp); fclose(fp); for (j=0; j { printf("\nNo: %ld Name: %-8s Scores: ",ss[j].sno, ss[j].name); for (i=0; i<3; i++) printf("% printf("\n"); } } 解題思路: 本題是考察把結(jié)構(gòu)中的數(shù)據(jù)寫入文件。 第一處:建立文件的類型,考慮到是把結(jié)構(gòu)中的數(shù)據(jù)(結(jié)構(gòu)中的數(shù)據(jù)包含不打印的字符) 從文件中讀出,所以應(yīng)填:"rb"。 第二處:判斷當前學號是否大于剛讀出的學號進行相比,如果大于,則進行交換,所以應(yīng) 填:>。 第三處:把已排序的結(jié)構(gòu)數(shù)據(jù),重新寫入文件,所以應(yīng)填:fwrite。 *************************************************** 給定程序MODI1.C中函數(shù)fun的功能是: 在字符串的最前端加入n個*號, 形成 新串, 并且覆蓋原串。 注意: 字符串的長度最長允許為79。 請改正函數(shù)fun中指定部位的錯誤, 使它能得出正確的結(jié)果。 注意: 不要改動main函數(shù), 不得增行或刪行, 也不得更改程序的結(jié)構(gòu)! 給定源程序: #include #include void fun ( char s[], int n ) { char a[80] , *p; int i; /**********found***********/ s=p; for(i=0; i do { a[i]=*p; i++; } /**********found***********/ while(*p++) a[i]=0; strcpy(s,a); } main() { int n; char s[80]; printf("\nEnter a string : "); gets(s); printf("\nThe string \"%s\"\n",s); printf("\nEnter n ( number of * ) : "); scanf("%d",&n); fun(s,n); printf("\nThe string after insert : \"%s\" \n" ,s); } 解題思路: 第一處: 指針p應(yīng)指向s,所以應(yīng)改為:p=s;。 第二處: 死循環(huán),當do while循環(huán)執(zhí)行一次,臨時變量p應(yīng)該指向字符串的下一位置,所以 應(yīng)改為:while(*p++);。 *************************************************** 請編寫函數(shù)fun,函數(shù)的功能是:統(tǒng)計各年齡段的人數(shù)。N個年齡通過調(diào)用隨機 函數(shù)獲得,并放在主函數(shù)的age數(shù)組中;要求函數(shù)把0至9歲年齡段的人數(shù)放在d[0] 中,把10至19歲年齡段的人數(shù)放在d[1]中,把20至29歲年齡段的人數(shù)放在d[2]中, 其余依此類推, 把100歲 (含100)以上年齡的人數(shù)都放在d[10]中。結(jié)果在主函數(shù) 中輸出。 注意:部分源程序在文件PROG1.C中。 請勿改動主函數(shù)main和其它函數(shù)中的任何內(nèi)容,僅在函數(shù)fun的花括號中填入 你編寫的若干語句。 給定源程序: #include #define N 50 #define M 11 void fun( int *a, int *b) { } double rnd() { static t=29,c=217,m=1024,r=0; r=(r*t+c)%m; return((double)r/m); } main() { int age[N], i, d[M]; for(i=0; i printf("The original data :\n"); for(i=0;i printf("\n\n"); fun( age, d); for(i=0;i<10;i++)printf("M---M : M\n",i*10,i*10+9,d[i]); printf(" Over 100 : M\n",d[10]); NONO(d); } 解題思路: 本題是統(tǒng)計各年齡段的人數(shù)。 1. 初始化各年齡段人數(shù)為0。 2. 使用for循環(huán)以及求出各年齡的十位數(shù)字作為存放人數(shù)的地址,如果大于值大于10,則 存入d[10]中(大于110歲的人)。 參考答案: void fun( int *a, int *b) { int i, j ; for(i = 0 ; i < M ; i++) b[i] = 0 ; for(i = 0 ; i < N ; i++) { j = a[i] / 10 ; if(j > 10) b[M - 1]++ ; else b[j]++ ; } } double rnd() { static t=29,c=217,m=1024,r=0; r=(r*t+c)%m; return((double)r/m); } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第05套: 給定程序中,函數(shù)fun的功能是將參數(shù)給定的字符串、整數(shù)、浮點數(shù)寫到文本 文件中,再用字符串方式從此文本文件中逐個讀入,并調(diào)用庫函數(shù)atoi和atof將 字符串轉(zhuǎn)換成相應(yīng)的整數(shù)、浮點數(shù),然后將其顯示在屏幕上。 請在程序的下劃線處填入正確的內(nèi)容并把下劃線刪除, 使程序得出正確的結(jié) 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結(jié)構(gòu)! 給定源程序: #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); } 解題思路: 本題是考察先把給定的數(shù)據(jù)寫入到文本文件中,再從該文件讀出并轉(zhuǎn)換成相應(yīng)的整數(shù)、浮 點數(shù)顯示在屏幕上。 第一處:定義文本文件類型變量,所以應(yīng)填:FILE *。 第二處:關(guān)閉剛寫入的文件,所以應(yīng)填:fclose(fp)。 第三處:從文件中讀出數(shù)據(jù),所以應(yīng)填:fp。 *************************************************** 給定程序MODI1.C中函數(shù)fun的功能是: 對N名學生的學習成績,按從高到低的 順序找出前m(m≤10)名學生來, 并將這些學生數(shù)據(jù)存放在一個動態(tài)分配的連續(xù)存 儲區(qū)中, 此存儲區(qū)的首地址作為函數(shù)值返回。 請改正函數(shù)fun中指定部位的錯誤, 使它能得出正確的結(jié)果。 注意: 不要改動main函數(shù), 不得增行或刪行, 也不得更改程序的結(jié)構(gòu)! 給定源程序: #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 for(k=0; k { for(i=j=0; i if(b[i].s > b[j].s) j=i; /**********found**********/ t(k)=b(j); b[j].s=0; } return t; } outresult(STU a[], FILE *pf) { int i; for(i=0; i fprintf(pf,"No = %s Mark = %d\n", a[i].num,a[i].s); fprintf(pf,"\n\n"); } main() { STU a[N]={ {"A01",81},{"A02",89},{"A03",66},{"A04",87},{"A05",77}, {"A06",90},{"A07",79},{"A08",61},{"A09",80},{"A10",71} }; STU *pOrder; int i, m; printf("***** The Original data *****\n"); outresult(a, stdout); printf("\nGive the number of the students who have better score: "); scanf("%d",&m); while( m>10 ) { printf("\nGive the number of the students who have better score: "); scanf("%d",&m); } pOrder=fun(a,m); printf("***** THE RESULT *****\n"); printf("The top :\n"); for(i=0; i printf(" %s %d\n",pOrder[i].num , pOrder[i].s); free(pOrder); } 解題思路: 第一處: 語句最后缺少分號。 第二處: 應(yīng)該使用方括號,而不是圓括號。 像此類,使用編譯,即可發(fā)現(xiàn)。 *************************************************** 請編寫函數(shù)fun, 函數(shù)的功能是: 刪去一維數(shù)組中所有相同的數(shù), 使之只剩一 個。數(shù)組中的數(shù)已按由小到大的順序排列,函數(shù)返回刪除后數(shù)組中數(shù)據(jù)的個數(shù)。 例如, 一維數(shù)組中的數(shù)據(jù)是: 2 2 2 3 4 4 5 6 6 6 6 7 7 8 9 9 10 10 10。 刪除后,數(shù)組中的內(nèi)容應(yīng)該是: 2 3 4 5 6 7 8 9 10。 注意:部分源程序在文件PROG1.C中。 請勿改動主函數(shù)main和其它函數(shù)中的任何內(nèi)容, 僅在函數(shù)fun的花括號中填入 你編寫的若干語句。 給定源程序: #include #define N 80 int fun(int a[], int n) { } main() { int a[N]={2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10},i,n=20; printf("The original data :\n"); for(i=0; i printf("\n\nThe data after deleted :\n"); for(i=0;i 解題思路: 本題是刪除已排序過數(shù)組中的相同數(shù)。 1. 取出數(shù)組中的第1個數(shù)存放在臨時變量k中,再利用for循環(huán)來依次判斷所有的數(shù)。 2. 如果取出的數(shù)和k相比,如果不相同,則仍存放在原數(shù)組中,其中存放的位置由j來控制, 接著把這個數(shù)重新存入k。如果相同,則取下一數(shù)。 參考答案: int fun(int a[], int n) { int i, j = 1, k = a[0] ; for(i = 1 ; i < n ; i++) if(k != a[i]) { a[j++]=a[i] ; k = a[i] ; } a[j] = 0 ; return j ; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第06套: 給定程序中,函數(shù)fun的功能是根據(jù)形參i的值返回某個函數(shù)的值。當調(diào)用正 確時, 程序輸出: x1=5.000000, x2=3.000000, x1*x1+x1*x2=40.000000 請在程序的下劃線處填入正確的內(nèi)容并把下劃線刪除, 使程序得出正確的結(jié) 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結(jié)構(gòu)! 給定源程序: #include double f1(double x) { return x*x; } double f2(double x, double y) { return x*y; } /**********found**********/ __1__ fun(int i, double x, double y) { if (i==1) /**********found**********/ return __2__(x); else /**********found**********/ return __3__(x, y); } main() { double x1=5, x2=3, r; r = fun(1, x1, x2); r += fun(2, x1, x2); printf("\nx1=%f, x2=%f, x1*x1+x1*x2=%f\n\n",x1, x2, r); } 解題思路: 本題是根據(jù)給定的公式來計算函數(shù)的值。 第一處:程序中使用雙精度double類型進行計算,所以函數(shù)的返回值類型也為double,所 以應(yīng)填:double。 第二處:當i等于1時,則返回f1函數(shù)的值,所以應(yīng)填:f1。 第三處:如果i不等于1,則返回f2函數(shù)的值,所以應(yīng)填:f2。 *************************************************** 給定程序MODI1.C中函數(shù)fun的功能是: 比較兩個字符串,將長的那個字符串 的首地址作為函數(shù)值返回。 請改正函數(shù)fun中指定部位的錯誤, 使它能得出正確的結(jié)果。 注意: 不要改動main函數(shù), 不得增行或刪行, 也不得更改程序的結(jié)構(gòu)! 給定源程序: #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)); } 解題思路: 第一處: 試題要求返回字符串的首地址,所以應(yīng)改為:char *fun(char *s,char *t) 第二處: 取字符串指針ss的下一個位置,所以應(yīng)改為:ss++;。 第三處:取字符串指針tt的下一個位置,所以應(yīng)改為:tt++;。 *************************************************** 請編寫函數(shù)fun,函數(shù)的功能是: 移動字符串中的內(nèi)容,移動的規(guī)則如下: 把第 1到第m個字符, 平移到字符串的最后, 把第m+1到最后的字符移到字符串的前部。 例如, 字符串中原有的內(nèi)容為: ABCDEFGHIJK, m的值為3, 則移動后, 字符串 中的內(nèi)容應(yīng)該是: DEFGHIJKABC。 注意:部分源程序在文件PROG1.C中。 請勿改動主函數(shù)main和其它函數(shù)中的任何內(nèi)容, 僅在函數(shù)fun的花括號中填入 你編寫的若干語句。 給定源程序: #include #include #define N 80 void fun1(char *w) /* 本函數(shù)的功能是將字符串中字符循環(huán)左移一個位置 */ { int i; char t; t=w[0]; for(i=0;i w[i]=w[i+1]; w[strlen(w)-1]=t; } void fun(char *w, int m) /* 可調(diào)用fun1函數(shù)左移字符 */ { } main() { char a[N]= "ABCDEFGHIJK"; int m; printf("The original string:\n");puts(a); printf("\n\nEnter m: ");scanf("%d",&m); fun(a,m); printf("\nThe string after moving:\n");puts(a); printf("\n\n"); NONO(); } 解題思路: 本題是考察字符串的操作。 1. 由于函數(shù)fun1是將字符串中字符循環(huán)左移一個位置,并通過實參w返回循環(huán)左移一個位 置的字符串。 2. 利用循環(huán)for語句來操作多少個字符(m)需要循環(huán)左移。 參考答案: void fun1(char *w) /* 本函數(shù)的功能是將字符串中字符循環(huán)左移一個位置 */ { int i; char t; t=w[0]; for(i=0;i w[i]=w[i+1]; w[strlen(w)-1]=t; } void fun(char *w, int m) /* 可調(diào)用fun1函數(shù)左移字符 */ { int i; for(i = 0 ; i < m ; i++) fun1(w); } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第07套: 程序通過定義并賦初值的方式,利用結(jié)構(gòu)體變量存儲了一名學生的信息。函 數(shù)fun的功能是輸出這位學生的信息。 請在程序的下劃線處填入正確的內(nèi)容并把下劃線刪除,使程序得出正確的結(jié) 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結(jié)構(gòu)! 給定源程序: #include typedef struct { int num; char name[9]; char sex; struct { int year,month,day ;} birthday; float score[3]; }STU; /**********found**********/ void show(STU ___1___) { int i; printf("\n%d %s %c %d-%d-%d", tt.num, tt.name, tt.sex, tt.birthday.year, tt.birthday.month, tt.birthday.day); for(i=0; i<3; i++) /**********found**********/ printf("% 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___); } 解題思路: 本題是利用結(jié)構(gòu)體變量存儲了一名學生的信息。 第一處:tt變量在函數(shù)體fun已經(jīng)使用,所以應(yīng)填:tt。 第二處:利用循環(huán)分別輸出學生的成績數(shù)據(jù),所以應(yīng)填:tt.score[i]。 第三處:函數(shù)的調(diào)用,所以應(yīng)填:std。 *************************************************** 給定程序MODI1.C中函數(shù) fun 的功能是:求出數(shù)組中最大數(shù)和次最大數(shù),并 把最大數(shù)和a[0]中的數(shù)對調(diào)、次最大數(shù)和a[1]中的數(shù)對調(diào)。 請改正程序中的錯誤,使它能得出正確的結(jié)果。 注意:不要改動 main 函數(shù),不得增行或刪行,也不得更改程序的結(jié)構(gòu)! 給定源程序: #include #define N 20 int fun ( int * a, int n ) { int i, m, t, k ; for(i=0;i<2;i++) { /**********found**********/ m=0; for(k=i+1;k /**********found**********/ if(a[k]>a[m]) k=m; t=a[i];a[i]=a[m];a[m]=t; } } main( ) { int x, b[N]={11,5,12,0,3,6,9,7,10,8}, n=10, i; for ( i=0; i fun ( b, n ); for ( i=0; i } 解題思路: 第一處:外循環(huán)每循環(huán)一次,把當前位置i賦值給m,所以應(yīng)改為:m=i;。 第二處:通過內(nèi)循環(huán)來找出最大的一個數(shù)的位置k,所以應(yīng)改為:if(a[k]>a[m]) m=k;。 *************************************************** 請編寫一個函數(shù) unsigned fun ( unsigned w ),w 是一個大于10的無符 號整數(shù),若 w 是 n (n ≥ 2)位的整數(shù),函數(shù)求出w的低 n-1位的數(shù)作為函數(shù)值返 回。 例如:w 值為 5923,則函數(shù)返回 923; w 值為 923 則函數(shù)返回 23。 注意: 部分源程序存在文件PROG1.C中。 請勿改動主函數(shù)main和其它函數(shù)中的任何內(nèi)容,僅在函數(shù)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( ); } 解題思路: 本題是考察考生怎樣獲取一個符合要求的無符號整數(shù)。本題是應(yīng)用if條件語句首先判斷給 出的數(shù)是幾位數(shù),再模相應(yīng)的值,最后得出的余數(shù)就是結(jié)果。 參考答案: 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套: 給定程序通過定義并賦初值的方式,利用結(jié)構(gòu)體變量存儲了一名學生的學號、 姓名和3門課的成績。函數(shù)fun的功能是將該學生的各科成績都乘以一個系數(shù)a。 請在程序的下劃線處填入正確的內(nèi)容并把下劃線刪除,使程序得出正確的結(jié) 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結(jié)構(gòu)! 給定源程序: #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("% 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); } 解題思路: 本題是利用結(jié)構(gòu)體存儲學生記錄并由實參ss返回。 第一處:實參ss是一個結(jié)構(gòu)型指針變量,所以應(yīng)填:STU。 第二處:該學生的各科成績都乘以一個系數(shù)a,所以應(yīng)填:score[i]。 第三處:函數(shù)的調(diào)用,由于函數(shù)定義時使用的指針結(jié)構(gòu)型變量,所以應(yīng)填:&std。 *************************************************** 給定程序MODI1.C中函數(shù)fun的功能是:求k!(k<13),所求階乘的值作為函 數(shù)值返回。例如:若k = 10,則應(yīng)輸出:3628800。 請改正程序中的錯誤,使它能得出正確的結(jié)果。 注意:不要改動 main 函數(shù),不得增行或刪行,也不得更改程序的結(jié)構(gòu)! 給定源程序: #include long fun ( int k) { /************found************/ if k > 0 return (k*fun(k-1)); /************found************/ else if ( k=0 ) return } main() { int k = 10 ; printf("%d!=%ld\n", k, fun ( k )) ; } 解題思路: 第一處:條件判斷缺少圓括號。 第二處:判斷相等的符號是==。 *************************************************** 程序定義了N×N的二維數(shù)組,并在主函數(shù)中自動賦值。請編寫函數(shù) fun(int a[][N], int n),函數(shù)的功能是:使數(shù)組左下三角元素中的值乘以n 。 例如:若n的值為3,a 數(shù)組中的值為 | 1 9 7 | | 3 9 7 | a = | 2 3 8 | 則返回主程序后a數(shù)組中的值應(yīng)為 | 6 9 8 | | 4 5 6 | | 12 15 18| 注意: 部分源程序存在文件PROG1.C中。 請勿改動主函數(shù)main和其它函數(shù)中的任何內(nèi)容,僅在函數(shù)fun的花括號中填入 你編寫的若干語句。 給定源程序: #include #include #define N 5 int fun ( int a[][N], int n ) { } main ( ) { int a[N][N], n, i, j; printf("***** The array *****\n"); for ( i =0; i { for ( j =0; j { a[i][j] = rand(); printf( "M", a[i][j] ); } printf("\n"); } do n = rand() ; while ( n >=3 ); printf("n = M\n",n); fun ( a, n ); printf ("***** THE RESULT *****\n"); for ( i =0; i { for ( j =0; j printf("\n"); } NONO( ); } 解題思路: 本題是利用兩重循環(huán)給二維數(shù)組左下三角元素中的值乘以n。 參考答案: int fun ( int a[][N], int n ) { int i, j; for(i = 0 ; i < N ; i++) for(j = 0 ; j <= i; j++) a[i][j] *= n ; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第09套: 給定程序中,函數(shù)fun的功能是將不帶頭節(jié)點的單向鏈表結(jié)點數(shù)據(jù)域中的數(shù)據(jù)從小到大排序。即若原鏈表結(jié)點數(shù)據(jù)域從頭至尾的數(shù)據(jù)為:10、4、2、8、6,排序后鏈表結(jié)點數(shù)據(jù)域從頭至尾的數(shù)據(jù)為:2、4、6、8、10。 請在程序的下劃線處填入正確的內(nèi)容并把下劃線刪除, 使程序得出正確的結(jié) 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結(jié)構(gòu)! 給定源程序: #include #include #define N 6 typedef struct node { int data; struct node *next; } NODE; void fun(NODE *h) { NODE *p, *q; int t; p = h; while (p) { /**********found**********/ q = __1__ ; /**********found**********/ while (__2__) { if (p->data > q->data) { t = p->data; p->data = q->data; q->data = t; } q = q->next; } /**********found**********/ p = __3__ ; } } NODE *creatlist(int a[]) { NODE *h,*p,*q; int i; h=NULL; for(i=0; i { q=(NODE *)malloc(sizeof(NODE)); q->data=a[i]; q->next = NULL; if (h == NULL) h = p = q; else { p->next = q; p = q; } } return h; } void outlist(NODE *h) { NODE *p; p=h; if (p==NULL) printf("The list is NULL!\n"); else { printf("\nHead "); do { printf("->%d", p->data); p=p->next; } while(p!=NULL); printf("->End\n"); } } main() { NODE *head; int a[N]= {0, 10, 4, 2, 8, 6 }; head=creatlist(a); printf("\nThe original list:\n"); outlist(head); fun(head); printf("\nThe list after inverting :\n"); outlist(head); } 解題思路: 本題是考察使用鏈表方法,使用兩重while循環(huán)語句,對鏈表的結(jié)點數(shù)據(jù)進行升序排列。 第一處:由于外循環(huán)變量使用p指針,內(nèi)循環(huán)變量使用q指針,所以q指向必須指向p的next 指針,因此應(yīng)填寫:p.next。 第二處:判斷內(nèi)循環(huán)q指針是否結(jié)束,所以應(yīng)填:q。 第三處:外循環(huán)控制變量p指向自己的next指針,所以應(yīng)填:p.next。 *************************************************** 給定程序MODI1.C中函數(shù)fun的功能是: 將s所指字符串中的字母轉(zhuǎn)換為按字母 序列的后續(xù)字母(但Z轉(zhuǎn)換為A, z轉(zhuǎn)換為a),其它字符不變。 請改正函數(shù)fun中指定部位的錯誤, 使它能得出正確的結(jié)果。 注意: 不要改動main函數(shù), 不得增行或刪行, 也不得更改程序的結(jié)構(gòu)! 給定源程序: #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循環(huán)來判斷字符串指針s是否結(jié)束,所以應(yīng)改為:while(*s)。 第二處: 取字符串指針s的下一個位置,所以應(yīng)改為:s++;。 *************************************************** 請編寫函數(shù)fun, 函數(shù)的功能是: 移動一維數(shù)組中的內(nèi)容; 若數(shù)組中有n個整 數(shù), 要求把下標從0到p(含p,p小于等于n-1)的數(shù)組元素平移到數(shù)組的最后。 例如, 一維數(shù)組中的原始內(nèi)容為: 1,2,3,4,5,6,7,8,9,10; p的值為3。移動 后, 一維數(shù)組中的內(nèi)容應(yīng)為: 5,6,7,8,9,10,1,2,3,4。 注意:部分源程序在文件PROG1.C中。 請勿改動主函數(shù)main和其它函數(shù)中的任何內(nèi)容,僅在函數(shù)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 fun(a,p,n); printf("\nThe data after moving:\n"); for(i=0; i NONO(); } 解題思路: 本題是考察一維數(shù)組的操作。 1. 定義一維數(shù)組中間變量b,把n值后面數(shù)組中的內(nèi)容存入b中。 2. 再把m前的數(shù)組中的內(nèi)容存入b中。 3. 最后把數(shù)組b的內(nèi)容依次存放到w中。 參考答案: void fun(int *w, int p, int n) { int i, j = 0, b[N] ; for(i = p + 1 ; i < n ; i++) b[j++] = w[i] ; for(i = 0 ; i <= p ; i++) b[j++] = w[i] ; for(i = 0 ; i < n ; i++) w[i]= b[i] ; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第10套: 給定程序中,函數(shù)fun的功能是:判定形參a所指的N×N(規(guī)定N為奇數(shù))的矩 陣是否是"幻方",若是,函數(shù)返回值為1; 不是,函數(shù)返回值為0。"幻方"的判定 條件是:矩陣每行、每列、主對角線及反對角線上元素之和都相等。 例如,以下3×3的矩陣就是一個"幻方": 4 9 2 3 5 7 8 1 6 請在程序的下劃線處填入正確的內(nèi)容并把下劃線刪除, 使程序得出正確的結(jié) 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結(jié)構(gòu)! 給定源程序: #include #define N 3 int fun(int (*a)[N]) { int i,j,m1,m2,row,colum; m1=m2=0; for(i=0; i { j=N-i-1; m1+=a[i][i]; m2+=a[i][j]; } if(m1!=m2) return 0; for(i=0; i /**********found**********/ row=colum= __1__; for(j=0; j { row+=a[i][j]; colum+=a[j][i]; } /**********found**********/ if( (row!=colum) __2__ (row!=m1) ) return 0; } /**********found**********/ return __3__; } main() { int x[N][N],i,j; printf("Enter number for array:\n"); for(i=0; i for(j=0; j printf("Array:\n"); for(i=0; i { for(j=0; j } if(fun(x)) printf("The Array is a magic square.\n"); else printf("The Array isn't a magic square.\n"); } 解題思路: 第一處:行列變量row和colum的值初始化為0。 第二處:兩個條件只要有一個不滿足就返回0,所以應(yīng)填:||。 第三處:如果矩陣是“幻方”,則返回1。 *************************************************** 給定程序MODI1.C中fun函數(shù)的功能是: 根據(jù)整型形參m,計算如下公式的值。 1 1 1 t = 1 - ----- - ----- - …… - ----- 2 例如,若主函數(shù)中輸入5,則應(yīng)輸出 -0.283333。 請改正函數(shù)fun中的錯誤或在橫線處填上適當?shù)膬?nèi)容并把橫線刪除, 使它能 計算出正確的結(jié)果。 注意:不要改動 main 函數(shù),不得增行或刪行,也不得更改程序的結(jié)構(gòu)! 給定源程序: #include double fun( int m ) { double t = 1.0; int i; for( i = 2; i <= m; i++ ) /**********found**********/ ____________; /**********found**********/ _______; } main() { int m ; printf( "\nPlease enter 1 integer numbers:\n" ); scanf( "%d", &m); printf( "\n\nThe result is %lf\n", fun( m ) ); } 解題思路: 第一處:在除法運算中,如果除數(shù)和被除數(shù)都是整數(shù),所么所除結(jié)果也是整數(shù),因此應(yīng)改 為t-=1.0/i。 第二處:應(yīng)是返回公式的值,函數(shù)中公式的值是存放在臨時變量t中,所以應(yīng)填return t;。 *************************************************** 請編寫一個函數(shù),函數(shù)的功能是刪除字符串中的所有空格。 例如, 主函數(shù)中輸入"asd af aa z67", 則輸出為 "asdafaaz67"。 注意:部分源程序在文件PROG1.C中。 請勿改動主函數(shù)main和其它函數(shù)中的任何內(nèi)容,僅在函數(shù)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(); } 解題思路: 本題是考察考生怎樣利用字符串指針來刪除字符串的空格字符。在函數(shù)開始處把指針p先指 向字符串str以及位置變量i置0,然后采用while循環(huán)和字符串指針p來處理的,每循環(huán)一次來判 斷指針p所指的字符是否為空格,如果不是空格,則把該字符寫到str字符串中,位置由i來控制, 如果是空格,則不處理,繼續(xù)取下一字符,直至字符串結(jié)束為止,最后再把字符串結(jié)束符寫到位置為i的str上,再通過形參str返回。 參考答案: int fun(char *str) { char *p = str ; int i = 0 ; while(*p) { if(*p != ' ') str[i++] = *p ; p++ ; } str[i] = 0 ; } |