全國計算機二級C題庫第1--10套 |
本題目如果下載后發現有錯誤的地方,請聯系網站管理員:QQ121431055
考試時,上機題目有三套,基本操作題、簡單應用題、綜合應用題 第01套: 給定程序中,函數fun的功能是:將形參n所指變量中,各位上為偶數的數去 除,剩余的數按原來從高位到低位的順序組成一個新的數,并通過形參指針n傳回 所指變量。 例如,輸入一個數:27638496,新的數:為739。 請在程序的下劃線處填入正確的內容并把下劃線刪除, 使程序得出正確的結果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結構! 給定源程序: #include void fun(unsigned long *n) { unsigned long x=0, i; int t; i=1; while(*n) /**********found**********/ { t=*n % __1__; /**********found**********/ if(t%2!= __2__) { x=x+t*i; i=i*10; } *n =*n /10; } /**********found**********/ *n=__3__; } main() { unsigned long n=-1; while(n>99999999||n<0) { printf("Please input(0 fun(&n); printf("\nThe result is: %ld\n",n); } 解題思路: 第一處:t是通過取模的方式來得到*n的個位數字,所以應填:10。 第二處:判斷是否是奇數,所以應填:0。 第三處:最后通形參n來返回新數x,所以應填:x。 *************************************************** 給定程序MODI1.C中函數 fun 的功能是:計算n!。 例如,給n輸入5,則輸出120.000000。 請改正程序中的錯誤,使程序能輸出正確的結果。 注意:不要改動main函數,不得增行或刪行,也不得更改程序的結構! 給定源程序: #include double fun ( int n ) { double result = 1.0 ; /************found************/ if n = = 0 return 1.0 ; while( n >1 && n < 170 ) /************found************/ result *= n-- return result ; } main ( ) { int n ; printf("Input N:") ; scanf("%d", &n) ; printf("\n\n%d! =%lf\n\n", n, fun(n)) ; } 解題思路: 第一處:條件語句書寫格式錯誤,應改為:if (n==0)。 第二處:語句后缺少分號。 *************************************************** 請編寫一個函數fun,它的功能是:將一個數字字符串轉換為一個整數(不得 調用C語言提供的將字符串轉換為整數的函數)。例如,若輸入字符串"-1234",則 函數把它轉換為整數值 -1234。函數fun中給出的語句僅供參考。 注意: 部分源程序存在文件PROG1.C文件中。 請勿改動主函數main和其它函數中的任何內容, 僅在函數fun的花括號中填 入你編寫的若干語句。 給定源程序: #include #include long fun ( char *p) { /* 以下代碼僅供參考 */ int i, len, t; /* len為串長,t為正負標識 */ long x=0; len=strlen(p); if(p[0]=='-') { t=-1; len--; p++; } else t=1; /* 以下完成數字字符串轉換為一個數字 */ return x*t; } main() /* 主函數 */ { char s[6]; long n; printf("Enter a string:\n") ; gets(s); n = fun(s); printf("%ld\n",n); NONO ( ); } NONO ( ) {/* 本函數用于打開文件,輸入數據,調用函數,輸出數據,關閉文件。 */ FILE *fp, *wf ; int i ; char s[20] ; long n ; fp = fopen("c:\\test\\in.dat","r") ; wf = fopen("c:\\test\\out.dat","w") ; for(i = 0 ; i < 10 ; i++) { fscanf(fp, "%s", s) ; n = fun(s); fprintf(wf, "%ld\n", n) ; } fclose(fp) ; fclose(wf) ; } 解題思路: 本題是將一個數字字符串轉換為一個整數。 參考答案: #include #include long fun ( char *p) { /* 以下代碼僅供參考 */ int i, len, t; /* len為串長,t為正負標識 */ long x=0; len=strlen(p); if(p[0]=='-') { t=-1; len--; p++; } else t=1; /* 以下完成數字字符串轉換為一個數字 */ while(*p) x = x*10-48+(*p++); return x*t; } main() /* 主函數 */ { char s[6]; long n; printf("Enter a string:\n") ; gets(s); n = fun(s); printf("%ld\n",n); NONO ( ); } NONO ( ) {/* 本函數用于打開文件,輸入數據,調用函數,輸出數據,關閉文件。 */ FILE *fp, *wf ; int i ; char s[20] ; long n ; fp = fopen("c:\\test\\in.dat","r") ; wf = fopen("c:\\test\\out.dat","w") ; for(i = 0 ; i < 10 ; i++) { fscanf(fp, "%s", s) ; n = fun(s); fprintf(wf, "%ld\n", n) ; } fclose(fp) ; fclose(wf) ; } 注意:由于NONO( )這個函數是改卷人用的,與考生沒有什么關系,故下面從第2套試題開始均省略NONO( ) ※※※※※※※※※※※※※※※※※※※※※※※※※ 第02套: 給定程序中,函數fun的功能是將形參給定的字符串、整數、浮點數寫到文本 文件中,再用字符方式從此文本文件中逐個讀入并顯示在終端屏幕上。 請在程序的下劃線處填入正確的內容并把下劃線刪除, 使程序得出正確的結 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結構! 給定源程序: #include void fun(char *s, int a, double f) { /**********found**********/ __1__ fp; char ch; fp = fopen("file1.txt", "w"); fprintf(fp, "%s %d %f\n", s, a, f); fclose(fp); fp = fopen("file1.txt", "r"); printf("\nThe result :\n\n"); ch = fgetc(fp); /**********found**********/ while (!feof(__2__)) { /**********found**********/ putchar(__3__); ch = fgetc(fp); } putchar('\n'); fclose(fp); } main() { char a[10]="Hello!"; int b=12345; double c= 98.76; fun(a,b,c); }
解題思路: 本題是考察先把給定的數據寫入到文本文件中,再從該文件讀出并顯示在屏幕上。 第一處:定義文本文件類型變量,所以應填:FILE *。 第二處:判斷文件是否結束,所以應填:fp。 第三處:顯示讀出的字符,所以應填:ch。 *************************************************** 給定程序MODI1.C中函數fun的功能是: 依次取出字符串中所有數字字符, 形 成新的字符串, 并取代原字符串。 請改正函數fun中指定部位的錯誤, 使它能得出正確的結果。 注意: 不要改動main函數, 不得增行或刪行, 也不得更改程序的結構! 給定源程序: #include void fun(char *s) { int i,j; for(i=0,j=0; s[i]!='\0'; i++) if(s[i]>='0' && s[i]<='9') /**********found**********/ s[j]=s[i]; /**********found**********/ s[j]="\0"; } main() { char item[80]; printf("\nEnter a string : ");gets(item); printf("\n\nThe string is : \"%s\"\n",item); fun(item); printf("\n\nThe string of changing is : \"%s\"\n",item ); } 解題思路: 第一處: 要求是取出原字符串中所有數字字符組成一個新的字符串,程序中是使用變量j 來控制新字符串的位置,所以應改為:s[j++]=s[i];。 第二處: 置新字符串的結束符,所以應改為:s[j]='\0';. *************************************************** 請編寫函數fun, 函數的功能是: 將M行N列的二維數組中的字符數據, 按列的 順序依次放到一個字符串中。 例如, 二維數組中的數據為: W W W W S S S S H H H H 則字符串中的內容應是: WSHWSHWSH。 注意:部分源程序在文件PROG1.C中。 請勿改動主函數main和其它函數中的任何內容, 僅在函數fun的花括號中填入 你編寫的若干語句。 給定源程序: #include #define M 3 #define N 4 void fun(char s[][N], char *b) { int i,j,n=0; for(i=0; i < N;i++) /* 請填寫相應語句完成其功能 */ { } b[n]='\0'; } main() { char a[100],w[M][N]={{'W','W','W','W'},{'S','S','S','S'},{'H','H','H','H'}}; int i,j; printf("The matrix:\n"); for(i=0; i { for(j=0;j printf("\n"); } fun(w,a); printf("The A string:\n");puts(a); printf("\n\n"); NONO(); } 解題思路: 本題是把二維數組中的字符數據按列存放到一個字符串中。 1. 計算存放到一維數組中的位置。 2. 取出二維數組中的字符存放到一維數組(已計算出的位置)中。 參考答案: void fun(char s[][N], char *b) { int i,j,n=0; for(i=0; i < N;i++) /* 請填寫相應語句完成其功能 */ { for(j = 0 ; j < M ; j++) { b[n] = s[j][i] ; n = i * M + j + 1; } } b[n]='\0'; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第03套: 程序通過定義學生結構體變量,存儲了學生的學號、姓名和3門課的成績。所 有學生數據均以二進制方式輸出到文件中。函數fun的功能是重寫形參filename所 指文件中最后一個學生的數據,即用新的學生數據覆蓋該學生原來的數據,其它學 生的數據不變。 請在程序的下劃線處填入正確的內容并把下劃線刪除, 使程序得出正確的結 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結構! 給定源程序: #include #define N 5 typedef struct student { long sno; char name[10]; float score[3]; } STU; void fun(char *filename, STU n) { FILE *fp; /**********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"); } } 解題思路: 本題是考察如何從文件中讀出數據,再把結構中的數據寫入文件中。 第一處:從指定的文件中讀出數據,所以應填:filename。 第二處:讀取文件fp的最后一條記錄,所以應填:fp。 第三處:再把讀出的記錄,寫入文件fp指定的位置上,所以應填:fp。 *************************************************** 給定程序MODI1.C中的函數Creatlink的功能是創建帶頭結點的單向鏈表, 并 為各結點數據域賦0到m-1的值。 請改正函數Creatlink中指定部位的錯誤, 使它能得出正確的結果。 注意: 不要改動main函數, 不得增行或刪行, 也不得更改程序的結構! 給定源程序: #include #include typedef struct aa { int data; struct aa *next; } NODE; NODE *Creatlink(int n, int m) { NODE *h=NULL, *p, *s; int i; /**********found***********/ p=(NODE )malloc(sizeof(NODE)); h=p; p->next=NULL; for(i=1; i<=n; i++) { s=(NODE *)malloc(sizeof(NODE)); s->data=rand()%m; s->next=p->next; p->next=s; p=p->next; } /**********found***********/ return p; } outlink(NODE *h) { NODE *p; p=h->next; printf("\n\nTHE LIST :\n\n HEAD "); while(p) { printf("->%d ",p->data); p=p->next; } printf("\n"); } main() { NODE *head; head=Creatlink(8,22); outlink(head); } 解題思路: 第一處: 指向剛分配的結構指針,所以應改為:p=(NODE *)malloc(sizeof(NODE)); 第二處: 在動態分配內存的下一行語句是,使用臨時結構指針變量h保存p指針的初始位置, 最后返回不能使用p,是因為p的位置已經發生了變化,所以應改為返回h。 *************************************************** 請編寫函數fun, 函數的功能是:統計一行字符串中單詞的個數,作為函數值返 回。一行字符串在主函數中輸入, 規定所有單詞由小寫字母組成,單詞之間由若干 個空格隔開, 一行的開始沒有空格。 注意:部分源程序在文件PROG1.C中。 請勿改動主函數main和其它函數中的任何內容, 僅在函數fun的花括號中填入 你編寫的若干語句。 給定源程序: #include #include #define N 80 int fun( char *s) { } main() { char line[N]; int num=0; printf("Enter a string :\n"); gets(line); num=fun( line ); printf("The number of word is : %d\n\n",num); NONO(); } 解題思路: 本題是統計字符串中的單詞數。 1. 利用while循環語句和指針變量,當字符為空格時,則單詞數k加1。 2. 循環結束返回k。 參考答案: int fun( char *s) { int k = 1 ; while(*s) { if(*s == ' ') k++ ; s++ ; } return k ; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第04套: 程序通過定義學生結構體變量,存儲了學生的學號、姓名和3門課的成績。所 有學生數據均以二進制方式輸出到文件中。函數fun的功能是從形參filename所指 的文件中讀入學生數據,并按照學號從小到大排序后,再用二進制方式把排序后的 學生數據輸出到filename所指的文件中,覆蓋原來的文件內容。 請在程序的下劃線處填入正確的內容并把下劃線刪除, 使程序得出正確的結 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結構! 給定源程序: #include #define N 5 typedef struct student { long sno; char name[10]; float score[3]; } STU; void fun(char *filename) { FILE *fp; int i, j; STU s[N], t; /**********found**********/ fp = fopen(filename, __1__); fread(s, sizeof(STU), N, fp); fclose(fp); for (i=0; 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"); } } 解題思路: 本題是考察把結構中的數據寫入文件。 第一處:建立文件的類型,考慮到是把結構中的數據(結構中的數據包含不打印的字符) 從文件中讀出,所以應填:"rb"。 第二處:判斷當前學號是否大于剛讀出的學號進行相比,如果大于,則進行交換,所以應 填:>。 第三處:把已排序的結構數據,重新寫入文件,所以應填:fwrite。 *************************************************** 給定程序MODI1.C中函數fun的功能是: 在字符串的最前端加入n個*號, 形成 新串, 并且覆蓋原串。 注意: 字符串的長度最長允許為79。 請改正函數fun中指定部位的錯誤, 使它能得出正確的結果。 注意: 不要改動main函數, 不得增行或刪行, 也不得更改程序的結構! 給定源程序: #include #include void fun ( char s[], int n ) { char a[80] , *p; int i; /**********found***********/ s=p; for(i=0; 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應指向s,所以應改為:p=s;。 第二處: 死循環,當do while循環執行一次,臨時變量p應該指向字符串的下一位置,所以 應改為:while(*p++);。 *************************************************** 請編寫函數fun,函數的功能是:統計各年齡段的人數。N個年齡通過調用隨機 函數獲得,并放在主函數的age數組中;要求函數把0至9歲年齡段的人數放在d[0] 中,把10至19歲年齡段的人數放在d[1]中,把20至29歲年齡段的人數放在d[2]中, 其余依此類推, 把100歲 (含100)以上年齡的人數都放在d[10]中。結果在主函數 中輸出。 注意:部分源程序在文件PROG1.C中。 請勿改動主函數main和其它函數中的任何內容,僅在函數fun的花括號中填入 你編寫的若干語句。 給定源程序: #include #define N 50 #define M 11 void fun( int *a, int *b) { } double rnd() { static t=29,c=217,m=1024,r=0; r=(r*t+c)%m; return((double)r/m); } main() { int age[N], i, d[M]; for(i=0; i printf("The original data :\n"); for(i=0;i printf("\n\n"); fun( age, d); for(i=0;i<10;i++)printf("M---M : M\n",i*10,i*10+9,d[i]); printf(" Over 100 : M\n",d[10]); NONO(d); } 解題思路: 本題是統計各年齡段的人數。 1. 初始化各年齡段人數為0。 2. 使用for循環以及求出各年齡的十位數字作為存放人數的地址,如果大于值大于10,則 存入d[10]中(大于110歲的人)。 參考答案: void fun( int *a, int *b) { int i, j ; for(i = 0 ; i < M ; i++) b[i] = 0 ; for(i = 0 ; i < N ; i++) { j = a[i] / 10 ; if(j > 10) b[M - 1]++ ; else b[j]++ ; } } double rnd() { static t=29,c=217,m=1024,r=0; r=(r*t+c)%m; return((double)r/m); } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第05套: 給定程序中,函數fun的功能是將參數給定的字符串、整數、浮點數寫到文本 文件中,再用字符串方式從此文本文件中逐個讀入,并調用庫函數atoi和atof將 字符串轉換成相應的整數、浮點數,然后將其顯示在屏幕上。 請在程序的下劃線處填入正確的內容并把下劃線刪除, 使程序得出正確的結 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結構! 給定源程序: #include #include void fun(char *s, int a, double f) { /**********found**********/ __1__ fp; char str[100], str1[100], str2[100]; int a1; double f1; fp = fopen("file1.txt", "w"); fprintf(fp, "%s %d %f\n", s, a, f); /**********found**********/ __2__ ; fp = fopen("file1.txt", "r"); /**********found**********/ fscanf(__3__,"%s%s%s", str, str1, str2); fclose(fp); a1 = atoi(str1); f1 = atof(str2); printf("\nThe result :\n\n%s %d %f\n", str, a1, f1); } main() { char a[10]="Hello!"; int b=12345; double c= 98.76; fun(a,b,c); } 解題思路: 本題是考察先把給定的數據寫入到文本文件中,再從該文件讀出并轉換成相應的整數、浮 點數顯示在屏幕上。 第一處:定義文本文件類型變量,所以應填:FILE *。 第二處:關閉剛寫入的文件,所以應填:fclose(fp)。 第三處:從文件中讀出數據,所以應填:fp。 *************************************************** 給定程序MODI1.C中函數fun的功能是: 對N名學生的學習成績,按從高到低的 順序找出前m(m≤10)名學生來, 并將這些學生數據存放在一個動態分配的連續存 儲區中, 此存儲區的首地址作為函數值返回。 請改正函數fun中指定部位的錯誤, 使它能得出正確的結果。 注意: 不要改動main函數, 不得增行或刪行, 也不得更改程序的結構! 給定源程序: #include #include #include #define N 10 typedef struct ss { char num[10]; int s; } STU; STU *fun(STU a[], int m) { STU b[N], *t; int i,j,k; /**********found**********/ t=(STU *)calloc(sizeof(STU),m) for(i=0; 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); } 解題思路: 第一處: 語句最后缺少分號。 第二處: 應該使用方括號,而不是圓括號。 像此類,使用編譯,即可發現。 *************************************************** 請編寫函數fun, 函數的功能是: 刪去一維數組中所有相同的數, 使之只剩一 個。數組中的數已按由小到大的順序排列,函數返回刪除后數組中數據的個數。 例如, 一維數組中的數據是: 2 2 2 3 4 4 5 6 6 6 6 7 7 8 9 9 10 10 10。 刪除后,數組中的內容應該是: 2 3 4 5 6 7 8 9 10。 注意:部分源程序在文件PROG1.C中。 請勿改動主函數main和其它函數中的任何內容, 僅在函數fun的花括號中填入 你編寫的若干語句。 給定源程序: #include #define N 80 int fun(int a[], int n) { } main() { int a[N]={2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10},i,n=20; printf("The original data :\n"); for(i=0; i printf("\n\nThe data after deleted :\n"); for(i=0;i 解題思路: 本題是刪除已排序過數組中的相同數。 1. 取出數組中的第1個數存放在臨時變量k中,再利用for循環來依次判斷所有的數。 2. 如果取出的數和k相比,如果不相同,則仍存放在原數組中,其中存放的位置由j來控制, 接著把這個數重新存入k。如果相同,則取下一數。 參考答案: int fun(int a[], int n) { int i, j = 1, k = a[0] ; for(i = 1 ; i < n ; i++) if(k != a[i]) { a[j++]=a[i] ; k = a[i] ; } a[j] = 0 ; return j ; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第06套: 給定程序中,函數fun的功能是根據形參i的值返回某個函數的值。當調用正 確時, 程序輸出: x1=5.000000, x2=3.000000, x1*x1+x1*x2=40.000000 請在程序的下劃線處填入正確的內容并把下劃線刪除, 使程序得出正確的結 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結構! 給定源程序: #include double f1(double x) { return x*x; } double f2(double x, double y) { return x*y; } /**********found**********/ __1__ fun(int i, double x, double y) { if (i==1) /**********found**********/ return __2__(x); else /**********found**********/ return __3__(x, y); } main() { double x1=5, x2=3, r; r = fun(1, x1, x2); r += fun(2, x1, x2); printf("\nx1=%f, x2=%f, x1*x1+x1*x2=%f\n\n",x1, x2, r); } 解題思路: 本題是根據給定的公式來計算函數的值。 第一處:程序中使用雙精度double類型進行計算,所以函數的返回值類型也為double,所 以應填:double。 第二處:當i等于1時,則返回f1函數的值,所以應填:f1。 第三處:如果i不等于1,則返回f2函數的值,所以應填:f2。 *************************************************** 給定程序MODI1.C中函數fun的功能是: 比較兩個字符串,將長的那個字符串 的首地址作為函數值返回。 請改正函數fun中指定部位的錯誤, 使它能得出正確的結果。 注意: 不要改動main函數, 不得增行或刪行, 也不得更改程序的結構! 給定源程序: #include /**********found**********/ char fun(char *s, char *t) { int sl=0,tl=0; char *ss, *tt; ss=s; tt=t; while(*ss) { sl++; /**********found**********/ (*ss)++; } while(*tt) { tl++; /**********found**********/ (*tt)++; } if(tl>sl) return t; else return s; } main() { char a[80],b[80],*p,*q; int i; printf("\nEnter a string : "); gets(a); printf("\nEnter a string again : "); gets(b); printf("\nThe longer is :\n\n\"%s\"\n",fun(a,b)); } 解題思路: 第一處: 試題要求返回字符串的首地址,所以應改為:char *fun(char *s,char *t) 第二處: 取字符串指針ss的下一個位置,所以應改為:ss++;。 第三處:取字符串指針tt的下一個位置,所以應改為:tt++;。 *************************************************** 請編寫函數fun,函數的功能是: 移動字符串中的內容,移動的規則如下: 把第 1到第m個字符, 平移到字符串的最后, 把第m+1到最后的字符移到字符串的前部。 例如, 字符串中原有的內容為: ABCDEFGHIJK, m的值為3, 則移動后, 字符串 中的內容應該是: DEFGHIJKABC。 注意:部分源程序在文件PROG1.C中。 請勿改動主函數main和其它函數中的任何內容, 僅在函數fun的花括號中填入 你編寫的若干語句。 給定源程序: #include #include #define N 80 void fun1(char *w) /* 本函數的功能是將字符串中字符循環左移一個位置 */ { int i; char t; t=w[0]; for(i=0;i w[i]=w[i+1]; w[strlen(w)-1]=t; } void fun(char *w, int m) /* 可調用fun1函數左移字符 */ { } main() { char a[N]= "ABCDEFGHIJK"; int m; printf("The original string:\n");puts(a); printf("\n\nEnter m: ");scanf("%d",&m); fun(a,m); printf("\nThe string after moving:\n");puts(a); printf("\n\n"); NONO(); } 解題思路: 本題是考察字符串的操作。 1. 由于函數fun1是將字符串中字符循環左移一個位置,并通過實參w返回循環左移一個位 置的字符串。 2. 利用循環for語句來操作多少個字符(m)需要循環左移。 參考答案: void fun1(char *w) /* 本函數的功能是將字符串中字符循環左移一個位置 */ { int i; char t; t=w[0]; for(i=0;i w[i]=w[i+1]; w[strlen(w)-1]=t; } void fun(char *w, int m) /* 可調用fun1函數左移字符 */ { int i; for(i = 0 ; i < m ; i++) fun1(w); } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第07套: 程序通過定義并賦初值的方式,利用結構體變量存儲了一名學生的信息。函 數fun的功能是輸出這位學生的信息。 請在程序的下劃線處填入正確的內容并把下劃線刪除,使程序得出正確的結 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結構! 給定源程序: #include typedef struct { int num; char name[9]; char sex; struct { int year,month,day ;} birthday; float score[3]; }STU; /**********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___); } 解題思路: 本題是利用結構體變量存儲了一名學生的信息。 第一處:tt變量在函數體fun已經使用,所以應填:tt。 第二處:利用循環分別輸出學生的成績數據,所以應填:tt.score[i]。 第三處:函數的調用,所以應填:std。 *************************************************** 給定程序MODI1.C中函數 fun 的功能是:求出數組中最大數和次最大數,并 把最大數和a[0]中的數對調、次最大數和a[1]中的數對調。 請改正程序中的錯誤,使它能得出正確的結果。 注意:不要改動 main 函數,不得增行或刪行,也不得更改程序的結構! 給定源程序: #include #define N 20 int fun ( int * a, int n ) { int i, m, t, k ; for(i=0;i<2;i++) { /**********found**********/ m=0; for(k=i+1;k /**********found**********/ if(a[k]>a[m]) k=m; t=a[i];a[i]=a[m];a[m]=t; } } main( ) { int x, b[N]={11,5,12,0,3,6,9,7,10,8}, n=10, i; for ( i=0; i fun ( b, n ); for ( i=0; i } 解題思路: 第一處:外循環每循環一次,把當前位置i賦值給m,所以應改為:m=i;。 第二處:通過內循環來找出最大的一個數的位置k,所以應改為:if(a[k]>a[m]) m=k;。 *************************************************** 請編寫一個函數 unsigned fun ( unsigned w ),w 是一個大于10的無符 號整數,若 w 是 n (n ≥ 2)位的整數,函數求出w的低 n-1位的數作為函數值返 回。 例如:w 值為 5923,則函數返回 923; w 值為 923 則函數返回 23。 注意: 部分源程序存在文件PROG1.C中。 請勿改動主函數main和其它函數中的任何內容,僅在函數fun的花括號中填入 你編寫的若干語句。 給定源程序: #include unsigned fun ( unsigned w ) { } main( ) { unsigned x; printf ( "Enter a unsigned integer number : " ); scanf ( "%u", &x ); printf ( "The original data is : %u\n", x ); if ( x < 10 ) printf ("Data error !"); else printf ( "The result : %u\n", fun ( x ) ); NONO( ); } 解題思路: 本題是考察考生怎樣獲取一個符合要求的無符號整數。本題是應用if條件語句首先判斷給 出的數是幾位數,再模相應的值,最后得出的余數就是結果。 參考答案: unsigned fun ( unsigned w ) { if(w>10000) w %= 10000 ; else if(w>1000) w %= 1000 ; else if(w>100) w %= 100 ; else if(w>10) w %=10 ; return w ; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第08套: 給定程序通過定義并賦初值的方式,利用結構體變量存儲了一名學生的學號、 姓名和3門課的成績。函數fun的功能是將該學生的各科成績都乘以一個系數a。 請在程序的下劃線處填入正確的內容并把下劃線刪除,使程序得出正確的結 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結構! 給定源程序: #include typedef struct { int num; char name[9]; float score[3]; }STU; void show(STU tt) { int i; printf("%d %s : ",tt.num,tt.name); for(i=0; i<3; i++) printf("% 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 } main() { int k = 10 ; printf("%d!=%ld\n", k, fun ( k )) ; } 解題思路: 第一處:條件判斷缺少圓括號。 第二處:判斷相等的符號是==。 *************************************************** 程序定義了N×N的二維數組,并在主函數中自動賦值。請編寫函數 fun(int a[][N], int n),函數的功能是:使數組左下三角元素中的值乘以n 。 例如:若n的值為3,a 數組中的值為 | 1 9 7 | | 3 9 7 | a = | 2 3 8 | 則返回主程序后a數組中的值應為 | 6 9 8 | | 4 5 6 | | 12 15 18| 注意: 部分源程序存在文件PROG1.C中。 請勿改動主函數main和其它函數中的任何內容,僅在函數fun的花括號中填入 你編寫的若干語句。 給定源程序: #include #include #define N 5 int fun ( int a[][N], int n ) { } main ( ) { int a[N][N], n, i, j; printf("***** The array *****\n"); for ( i =0; i { for ( j =0; j { a[i][j] = rand(); 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( ); } 解題思路: 本題是利用兩重循環給二維數組左下三角元素中的值乘以n。 參考答案: int fun ( int a[][N], int n ) { int i, j; for(i = 0 ; i < N ; i++) for(j = 0 ; j <= i; j++) a[i][j] *= n ; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第09套: 給定程序中,函數fun的功能是將不帶頭節點的單向鏈表結點數據域中的數據從小到大排序。即若原鏈表結點數據域從頭至尾的數據為:10、4、2、8、6,排序后鏈表結點數據域從頭至尾的數據為:2、4、6、8、10。 請在程序的下劃線處填入正確的內容并把下劃線刪除, 使程序得出正確的結 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結構! 給定源程序: #include #include #define N 6 typedef struct node { int data; struct node *next; } NODE; void fun(NODE *h) { NODE *p, *q; int t; p = h; while (p) { /**********found**********/ q = __1__ ; /**********found**********/ while (__2__) { if (p->data > q->data) { t = p->data; p->data = q->data; q->data = t; } q = q->next; } /**********found**********/ p = __3__ ; } } NODE *creatlist(int a[]) { NODE *h,*p,*q; int i; h=NULL; for(i=0; i { q=(NODE *)malloc(sizeof(NODE)); q->data=a[i]; q->next = NULL; if (h == NULL) h = p = q; else { p->next = q; p = q; } } return h; } void outlist(NODE *h) { NODE *p; p=h; if (p==NULL) printf("The list is NULL!\n"); else { printf("\nHead "); do { printf("->%d", p->data); p=p->next; } while(p!=NULL); printf("->End\n"); } } main() { NODE *head; int a[N]= {0, 10, 4, 2, 8, 6 }; head=creatlist(a); printf("\nThe original list:\n"); outlist(head); fun(head); printf("\nThe list after inverting :\n"); outlist(head); } 解題思路: 本題是考察使用鏈表方法,使用兩重while循環語句,對鏈表的結點數據進行升序排列。 第一處:由于外循環變量使用p指針,內循環變量使用q指針,所以q指向必須指向p的next 指針,因此應填寫:p.next。 第二處:判斷內循環q指針是否結束,所以應填:q。 第三處:外循環控制變量p指向自己的next指針,所以應填:p.next。 *************************************************** 給定程序MODI1.C中函數fun的功能是: 將s所指字符串中的字母轉換為按字母 序列的后續字母(但Z轉換為A, z轉換為a),其它字符不變。 請改正函數fun中指定部位的錯誤, 使它能得出正確的結果。 注意: 不要改動main函數, 不得增行或刪行, 也不得更改程序的結構! 給定源程序: #include #include void fun (char *s) { /**********found***********/ while(*s!='@') { if(*s>='A' & *s<='Z' || *s>='a' && *s<='z') { if(*s=='Z') *s='A'; else if(*s=='z') *s='a'; else *s += 1; } /**********found***********/ (*s)++; } } main() { char s[80]; printf("\n Enter a string with length < 80. :\n\n "); gets(s); printf("\n The string : \n\n "); puts(s); fun ( s ); printf ("\n\n The Cords :\n\n "); puts(s); } 解題思路: 第一處: 使用while循環來判斷字符串指針s是否結束,所以應改為:while(*s)。 第二處: 取字符串指針s的下一個位置,所以應改為:s++;。 *************************************************** 請編寫函數fun, 函數的功能是: 移動一維數組中的內容; 若數組中有n個整 數, 要求把下標從0到p(含p,p小于等于n-1)的數組元素平移到數組的最后。 例如, 一維數組中的原始內容為: 1,2,3,4,5,6,7,8,9,10; p的值為3。移動 后, 一維數組中的內容應為: 5,6,7,8,9,10,1,2,3,4。 注意:部分源程序在文件PROG1.C中。 請勿改動主函數main和其它函數中的任何內容,僅在函數fun的花括號中填入 你編寫的若干語句。 給定源程序: #include #define N 80 void fun(int *w, int p, int n) { } main() { int a[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; int i,p,n=15; printf("The original data:\n"); for(i=0; i fun(a,p,n); printf("\nThe data after moving:\n"); for(i=0; i NONO(); } 解題思路: 本題是考察一維數組的操作。 1. 定義一維數組中間變量b,把n值后面數組中的內容存入b中。 2. 再把m前的數組中的內容存入b中。 3. 最后把數組b的內容依次存放到w中。 參考答案: void fun(int *w, int p, int n) { int i, j = 0, b[N] ; for(i = p + 1 ; i < n ; i++) b[j++] = w[i] ; for(i = 0 ; i <= p ; i++) b[j++] = w[i] ; for(i = 0 ; i < n ; i++) w[i]= b[i] ; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第10套: 給定程序中,函數fun的功能是:判定形參a所指的N×N(規定N為奇數)的矩 陣是否是"幻方",若是,函數返回值為1; 不是,函數返回值為0。"幻方"的判定 條件是:矩陣每行、每列、主對角線及反對角線上元素之和都相等。 例如,以下3×3的矩陣就是一個"幻方": 4 9 2 3 5 7 8 1 6 請在程序的下劃線處填入正確的內容并把下劃線刪除, 使程序得出正確的結 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結構! 給定源程序: #include #define N 3 int fun(int (*a)[N]) { int i,j,m1,m2,row,colum; m1=m2=0; for(i=0; i { j=N-i-1; m1+=a[i][i]; m2+=a[i][j]; } if(m1!=m2) return 0; for(i=0; i /**********found**********/ row=colum= __1__; for(j=0; j { row+=a[i][j]; colum+=a[j][i]; } /**********found**********/ if( (row!=colum) __2__ (row!=m1) ) return 0; } /**********found**********/ return __3__; } main() { int x[N][N],i,j; printf("Enter number for array:\n"); for(i=0; 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,所以應填:||。 第三處:如果矩陣是“幻方”,則返回1。 *************************************************** 給定程序MODI1.C中fun函數的功能是: 根據整型形參m,計算如下公式的值。 1 1 1 t = 1 - ----- - ----- - …… - ----- 2 例如,若主函數中輸入5,則應輸出 -0.283333。 請改正函數fun中的錯誤或在橫線處填上適當的內容并把橫線刪除, 使它能 計算出正確的結果。 注意:不要改動 main 函數,不得增行或刪行,也不得更改程序的結構! 給定源程序: #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 ) ); } 解題思路: 第一處:在除法運算中,如果除數和被除數都是整數,所么所除結果也是整數,因此應改 為t-=1.0/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 ; } |