全國計算機二級C題庫第11--20套 |
本題目如果下載后發現有錯誤的地方,請聯系網站管理員:QQ121431055
考試時,上機題目有三套,基本操作題、簡單應用題、綜合應用題 第11套: 給定程序中,函數fun的功能是將帶頭結點的單向鏈表逆置。即若原鏈表中從 頭至尾結點數據域依次為:2、4、6、8、10,逆置后,從頭至尾結點數據域依次為: 10、8、6、4、2。 請在程序的下劃線處填入正確的內容并把下劃線刪除, 使程序得出正確的結果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結構! 給定源程序: #include #include #define N 5 typedef struct node { int data; struct node *next; } NODE; void fun(NODE *h) { NODE *p, *q, *r; /**********found**********/ p = h->__1__; /**********found**********/ if (p==__2__) return; q = p->next; p->next = NULL; while (q) { r = q->next; q->next = p; /**********found**********/ p = q; q = __3__; } h->next = p; } NODE *creatlist(int a[]) { NODE *h,*p,*q; int i; h = (NODE *)malloc(sizeof(NODE)); h->next = NULL; for(i=0; i { q=(NODE *)malloc(sizeof(NODE)); q->data=a[i]; q->next = NULL; if (h->next == NULL) h->next = p = q; else { p->next = q; p = q; } } return h; } void outlist(NODE *h) { NODE *p; p = h->next; if (p==NULL) printf("The list is NULL!\n"); else { printf("\nHead "); do { printf("->%d", p->data); p=p->next; } while(p!=NULL); printf("->End\n"); } } main() { NODE *head; int a[N]={2,4,6,8,10}; head=creatlist(a); printf("\nThe original list:\n"); outlist(head); fun(head); printf("\nThe list after inverting :\n"); outlist(head); } 解題思路: 本題是考察使用鏈表方法,對鏈表的結點數據進行降序排列。 第一處:使用結構指針p,來控制鏈表的結束,p必須指向h結構指針的next指針,來定位p 的初始位置。所以應填寫:h->next。 第二處:判斷p指針是否結束,所以應填寫:0。 第三處:q指向原q的next指針,所以應填:r。 *************************************************** 給定程序MODI1.C中函數fun的功能是: 計算s所指字符串中含有t所指字符串 的數目, 并作為函數值返回。 請改正函數fun中指定部位的錯誤, 使它能得出正確的結果。 注意: 不要改動main函數, 不得增行或刪行, 也不得更改程序的結構! 給定源程序: #include #include #define N 80 int fun(char *s, char *t) { int n; char *p , *r; n=0; while ( *s ) { p=s; /*********found**********/ r=p; while(*r) if(*r==*p) { r++; p++; } else break; /*********found**********/ if(*r= 0) n++; s++; } return n; } main() { char a[N],b[N]; int m; printf("\nPlease enter string a : "); gets(a); printf("\nPlease enter substring b : "); gets( b ); m=fun(a, b); printf("\nThe result is : m = %d\n",m); } 解題思路: 第一處: 程序中子串是由變量t來實現的,再根據下面while循環體中語句可知,所以應改 為:r=t;。 第二處: 是判斷相等的條件,所以應改為:if(*r==0)。 *************************************************** 請編寫函數fun, 函數的功能是: 將放在字符串數組中的M個字符串(每串的長 度不超過N), 按順序合并組成一個新的字符串。函數fun中給出的語句僅供參考。 例如, 字符串數組中的M個字符串為 AAAA BBBBBBB CC 則合并后的字符串的內容應是: AAAABBBBBBBCC。 提示:strcat(a,b)的功能是將字符串b復制到字符串a的串尾上,成為一個新 串。 注意:部分源程序在文件PROG1.C中。 請勿改動主函數main和其它函數中的任何內容, 僅在函數fun的花括號中填入 你編寫的若干語句。 給定源程序: #include #define M 3 #define N 20 void fun(char a[M][N], char *b) { /* 以下代碼僅供參考 */ int i; *b=0; } main() { char w[M][N]={"AAAA","BBBBBBB","CC"}, a[100]; int i ; printf("The string:\n"); for(i=0; i printf("\n"); fun(w,a); printf("The A string:\n"); printf("%s",a);printf("\n\n"); NONO(); } 解題思路: 本題是考察字符串的操作。 使用for循環以及C語言函數strcat依次連接起來。 參考答案: #include #define M 3 #define N 20 void fun(char a[M][N], char *b) { /* 以下代碼僅供參考 */ int i; *b=0; for(i = 0 ; i < M ; i++) strcat(b, a[i]) ; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第12套: 給定程序中,函數fun的功能是將不帶頭結點的單向鏈表逆置。即若原鏈表中 從頭至尾結點數據域依次為:2、4、6、8、10,逆置后,從頭至尾結點數據域依次 為:10、8、6、4、2。 請在程序的下劃線處填入正確的內容并把下劃線刪除, 使程序得出正確的結 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結構! 給定源程序: #include #include #define N 5 typedef struct node { int data; struct node *next; } NODE; /**********found**********/ __1__ * fun(NODE *h) { NODE *p, *q, *r; p = h; if (p == NULL) return NULL; q = p->next; p->next = NULL; while (q) { /**********found**********/ r = q->__2__; q->next = p; p = q; /**********found**********/ q = __3__ ; } return p; } NODE *creatlist(int a[]) { NODE *h,*p,*q; int i; h=NULL; for(i=0; i { q=(NODE *)malloc(sizeof(NODE)); q->data=a[i]; q->next = NULL; if (h == NULL) h = p = q; else { p->next = q; p = q; } } return h; } void outlist(NODE *h) { NODE *p; p=h; if (p==NULL) printf("The list is NULL!\n"); else { printf("\nHead "); do { printf("->%d", p->data); p=p->next; } while(p!=NULL); printf("->End\n"); } } main() { NODE *head; int a[N]={2,4,6,8,10}; head=creatlist(a); printf("\nThe original list:\n"); outlist(head); head=fun(head); printf("\nThe list after inverting :\n"); outlist(head); } 解題思路: 本題是考察使用鏈表方法,對鏈表的結點數據進行降序排列,最后通過函數進行返回。 第一處:由于鏈表中的所有結果要求通過函數進行返回,所以應填:NODE *。 第二處:中間變量r用來保存q的next指針,所以應填:next。 第三處:q指向原q的next指針,所以應填:r。 *************************************************** 給定程序MODI1.C中函數fun的功能是: 將s所指字符串中位于奇數位置的字符 或ASCII碼為偶數的字符放入t所指數組中(規定第一個字符放在第0位中)。 例如, 字符串中的數據為: AABBCCDDEEFF, 則輸出應當是:ABBCDDEFF。 請改正函數fun中指定部位的錯誤, 使它能得出正確的結果。 注意: 不要改動main函數, 不得增行或刪行, 也不得更改程序的結構! 給定源程序: #include #include #define N 80 void fun(char *s, char t[]) { int i, j=0; for(i=0; i /***********found**********/ if(i%2 && s[i]%2==0) t[j++]=s[i]; /***********found**********/ t[i]='\0'; } main() { char s[N], t[N]; printf("\nPlease enter string s : "); gets(s); fun(s, t); printf("\nThe result is : %s\n",t); } 解題思路: 第一處: 根據試題分析,兩個條件之間應該是“或”的關系,而不是“與”的關系,所以 應改為:if(i%2 || s[i]%2==0)。 第二處: 當字符串處理結束后,應該補上字符串的結束符,那么字符串t的位置是由i來控 制,所以應改為:t[j]=0;。 *************************************************** 請編寫函數fun, 函數的功能是: 將M行N列的二維數組中的數據, 按列的順序 依次放到一維數組中。函數fun中給出的語句僅供參考。 例如, 二維數組中的數據為: 33 33 33 33 44 44 44 44 55 55 55 55 則一維數組中的內容應是: 33 44 55 33 44 55 33 44 55 33 44 55。 注意:部分源程序在文件PROG1.C中。 請勿改動主函數main和其它函數中的任何內容, 僅在函數fun的花括號中填入 你編寫的若干語句。 給定源程序: #include void fun(int s[][10], int b[], int *n, int mm, int nn) { /* 以下代碼僅供參考 */ int i,j,np=0; /* np用作b數組下標 */ *n=np; } main() { int w[10][10]={{33,33,33,33},{44,44,44,44},{55,55,55,55}},i,j; int a[100]={0}, n=0; printf("The matrix:\n"); for(i=0; i<3; i++) { for(j=0;j<4; j++)printf("=",w[i][j]); printf("\n"); } fun(w,a,&n,3,4); printf("The A array:\n"); for(i=0;i NONO(); } 解題思路: 本題是把二維數組中的數據按行存放到一維數組中。 1. 計算存放到一維數組中的位置。 2. 取出二維數組中的數據存放到一維數組(已計算出的位置)中。 參考答案: void fun(int (*s)[10], int *b, int *n, int mm, int nn) { /* 以下代碼僅供參考 */ int i,j,np=0; /* np用作b數組下標 */ for(i = 0 ; i < nn ; i++) for(j = 0 ; j < mm ; j++) { b[np] = s[j][i] ; np = i * mm + j + 1; } *n=np; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第13套: 給定程序中,函數fun的功能是將帶頭節點的單向鏈表結點數據域中的數據從 小到大排序。即若原鏈表結點數據域從頭至尾的數據為:10、4、2、8、6,排序 后鏈表結點數據域從頭至尾的數據為:2、4、6、8、10。 請在程序的下劃線處填入正確的內容并把下劃線刪除, 使程序得出正確的結 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結構! 給定源程序: #include #include #define N 6 typedef struct node { int data; struct node *next; } NODE; void fun(NODE *h) { NODE *p, *q; int t; /**********found**********/ p = __1__ ; while (p) { /**********found**********/ q = __2__ ; while (q) { /**********found**********/ if (p->data __3__ q->data) { t = p->data; p->data = q->data; q->data = t; } q = q->next; } p = p->next; } } NODE *creatlist(int a[]) { NODE *h,*p,*q; int i; h = (NODE *)malloc(sizeof(NODE)); h->next = NULL; for(i=0; i { q=(NODE *)malloc(sizeof(NODE)); q->data=a[i]; q->next = NULL; if (h->next == NULL) h->next = p = q; else { p->next = q; p = q; } } return h; } void outlist(NODE *h) { NODE *p; p = h->next; if (p==NULL) printf("The list is NULL!\n"); else { printf("\nHead "); do { printf("->%d", p->data); p=p->next; } while(p!=NULL); printf("->End\n"); } } main() { NODE *head; int a[N]= {0, 10, 4, 2, 8, 6 }; head=creatlist(a); printf("\nThe original list:\n"); outlist(head); fun(head); printf("\nThe list after sorting :\n"); outlist(head); } 解題思路: 本題是考察使用鏈表方法,對鏈表的結點數據進行升序排列。 第一處:使用結構指針p,來控制鏈表的結束,p必須指向h結構指針的next指針,來定位p 的初始位置。所以應填寫:h->next。 第二處:使用while循環,對鏈表中結點的數據進行排序,q必須指向p結構指針的next指針。 所以應填寫:p->next。 第三處:如果當前結點中的數據大于(大于等于)循環中的結點數據,那么進行交換,所 以應填寫:>(或>=)。 *************************************************** 給定程序MODI1.C是建立一個帶頭結點的單向鏈表, 并用隨機函數為各結點數 據域賦值。函數fun的作用是求出單向鏈表結點(不包括頭結點)數據域中的最大值, 并且作為函數值返回。 請改正函數fun中指定部位的錯誤, 使它能得出正確的結果。 注意: 不要改動main函數, 不得增行或刪行, 也不得更改程序的結構! 給定源程序: #include #include typedef struct aa { int data; struct aa *next; } NODE; fun ( NODE *h ) { int max=-1; NODE *p; /***********found**********/ p=h ; while(p) { if(p->data>max ) max=p->data; /***********found**********/ p=h->next ; } return max; } outresult(int s, FILE *pf) { fprintf(pf,"\nThe max in link : %d\n",s);} NODE *creatlink(int n, int m) { NODE *h, *p, *s, *q; int i, x; h=p=(NODE *)malloc(sizeof(NODE));h->data=9999; for(i=1; i<=n; i++) { s=(NODE *)malloc(sizeof(NODE)); s->data=rand()%m; s->next=p->next; p->next=s; p=p->next; } p->next=NULL; return h; } outlink(NODE *h, FILE *pf) { NODE *p; p=h->next; fprintf(pf,"\nTHE LIST :\n\n HEAD "); while(p) { fprintf(pf,"->%d ",p->data); p=p->next; } fprintf(pf,"\n"); } main() { NODE *head; int m; head=creatlink(12, 100); outlink(head , stdout); m=fun(head); printf("\nTHE RESULT :\n"); outresult(m, stdout); } 解題思路: 程序中是使用while循環語句和結合結構指針p來找到數據域中的最大值。 第一處: p指向形參結構指針h的next指針,所以應改為:p=h->next;。 第二處: p指向自己的下一個結點,所以應改為:p=p->next, *************************************************** 請編寫函數fun, 函數的功能是: 將M行N列的二維數組中的數據,按行的順序 依次放到一維數組中, 一維數組中數據的個數存放在形參n所指的存儲單元中。 例如, 二維數組中的數據為: 33 33 33 33 44 44 44 44 55 55 55 55 則一維數組中的內容應是: 33 33 33 33 44 44 44 44 55 55 55 55。 注意:部分源程序在文件PROG1.C中。 請勿改動主函數main和其它函數中的任何內容, 僅在函數fun的花括號中填入 你編寫的若干語句。 給定源程序: #include void fun(int (*s)[10], int *b, int *n, int mm, int nn) { } main() { int w[10][10] = {{33,33,33,33},{44,44,44,44},{55,55,55,55}},i,j ; int a[100] = {0}, n = 0 ; printf("The matrix:\n") ; for(i = 0 ; i < 3 ; i++) { for(j = 0 ; j < 4 ; j++) printf("=",w[i][j]) ; printf("\n") ; } fun(w, a, &n, 3, 4) ; printf("The A array:\n") ; for(i = 0 ; i < n ; i++) printf("=",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("=",w[i][j]) ; printf("\n") ; } fun(w, a, &n, 3, 4) ; printf("The A array:\n") ; for(i = 0 ; i < n ; i++) printf("=",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(); 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;匚氖侵疙樧x和倒讀都一樣 的字符串。 例如, 字符串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 ; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第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__, fwrite(&n, sizeof(STU), 1, fp); } fclose(fp); } main() { STU t[N]={ {10001,"MaChao", 91, 92, 77}, {10002,"CaoKai", 75, 60, 88}, {10003,"LiSi", 85, 70, 78}, {10004,"FangFang", 90, 82, 87}, {10005,"ZhangSan", 95, 80, 88}}, ss[N]; int i,j; FILE *fp; fp = fopen("student.dat", "wb"); fwrite(t, sizeof(STU), N, fp); fclose(fp); printf("\nThe original data :\n"); fp = fopen("student.dat", "rb"); fread(ss, sizeof(STU), N, fp); fclose(fp); for (j=0; j { printf("\nNo: %ld Name: %-8s Scores: ",ss[j].sno, ss[j].name); for (i=0; i<3; i++) printf("% printf("\n"); } fun("student.dat", 10003); fp = fopen("student.dat", "rb"); fread(ss, sizeof(STU), N, fp); fclose(fp); printf("\nThe data after modifing :\n"); for (j=0; j { printf("\nNo: %ld Name: %-8s Scores: ",ss[j].sno, ss[j].name); for (i=0; i<3; i++) printf("% printf("\n"); } } 解題思路: 本題是考察如何從指定文件中找出指定學號的學生數據,并進行適當的修改,修改后重新 寫回到文件中該學生的數據上,即用該學生的新數據覆蓋原數據。 第一處:判斷讀文件是否結束,所以應填:fp。 第二處:從讀出的數據中判斷是否是指定的學號,其中學號是由形參sno來傳遞的,所以應 填:==。 第三處:從已打開文件fp中重新定位當前讀出的結構位置,所以應填:fp。 *************************************************** 給定程序MODI1.C中函數fun的功能是:利用插入排序法對字符串中的字符按 從小到大的順序進行排序。插入法的基本算法是:先對字符串中的頭兩個元素進 行排序。然后把第三個字符插入到前兩個字符中,插入后前三個字符依然有序; 再把第四個字符插入到前三個字符中,……。待排序的字符串已在主函數中賦予。 請改正程序中的錯誤,使它能得出正確結果。 注意:不要改動main函數,不得增行或刪行,也不得更改程序的結構。 給定源程序: #include #include #define N 80 void insert(char *aa) { int i,j,n; char ch; /**********found**********/ n=strlen[ aa ]; for( i=1; i /**********found**********/ c=aa[i]; j=i-1; while ((j>=0) && ( ch { aa[j+1]=aa[j]; j--; } aa[j+1]=ch; } } main( ) { char a[N]="QWERTYUIOPASDFGHJKLMNBVCXZ"; int i ; printf ("The original string : %s\n", a); insert(a) ; printf("The string after sorting : %s\n\n",a ); } 解題思路: 第一處: 函數應該使用圓括號,所以應改為:n=strlen(aa) ;。 第二處: 變量c沒有定義,但后面使用的是ch變量,所以應改為:ch=aa[i];。 *************************************************** N名學生的成績已在主函數中放入一個帶頭節點的鏈表結構中,h指向鏈表的頭 節點。請編寫函數fun,它的功能是:找出學生的最高分,由函數值返回。 注意: 部分源程序在文件PROG1.C文件中。 請勿改動主函數main和其它函數中的任何內容,僅在函數fun的花括號中填入 你編寫的若干語句。 給定源程序: #include #include #define N 8 struct slist { double s; struct slist *next; }; typedef struct slist STREC; double fun( STREC *h ) { } STREC * creat( double *s) { STREC *h,*p,*q; int i=0; h=p=(STREC*)malloc(sizeof(STREC));p->s=0; while(i { q=(STREC*)malloc(sizeof(STREC)); q->s=s[i]; i++; p->next=q; p=q; } p->next=0; return h; } outlist( STREC *h) { STREC *p; p=h->next; printf("head"); do { printf("->% 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=% NONO(); } 解題思路: 本題是考察如何從鏈表中求出學生的最高分。 我們給出的程序是利用while循環語句以及臨時結構指針p變量來求出最高分。 1. 將鏈表中的第1個值賦給變量max。 2. 將鏈表指針p的初始位置指向h的next指針(h->next)。 3. 判斷p指針是否結束,如果結束,則返回max,否則做下一步。 4. 判斷max是否小于p->s,如果小于,則max取p->s,否則不替換。 5. 取p->next賦值給p(取下一結點位置給p),轉3繼續。 參考答案: double fun( STREC *h ) { double max=h->s; STREC *p; p=h->next; while(p) { if(p->s>max ) max=p->s; p=p->next; } return max; } STREC * creat( double *s) { STREC *h,*p,*q; int i=0; h=p=(STREC*)malloc(sizeof(STREC));p->s=0; while(i { q=(STREC*)malloc(sizeof(STREC)); q->s=s[i]; i++; p->next=q; p=q; } p->next=0; return h; } outlist( STREC *h) { STREC *p; p=h->next; printf("head"); do { printf("->% while(p!=0); printf("\n\n"); } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第16套: 給定程序中,函數fun的功能是:求出形參ss所指字符串數組中最長字符串的 長度,將其余字符串右邊用字符*補齊,使其與最長的字符串等長。ss所指字符串 數組中共有M個字符串,且串長 請在程序的下劃線處填入正確的內容并把下劃線刪除,使程序得出正確的結 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結構! 給定源程序: #include #include #define M 5 #define N 20 void fun(char (*ss)[N]) { int i, j, n, len=0; for(i=0; i { len=strlen(ss[i]); if(i==0) n=len; if(len>n)n=len; } for(i=0; i /**********found**********/ n=strlen(___1___); for(j=0; j /**********found**********/ ss[i][ ___2___]='*'; /**********found**********/ ss[i][n+j+ ___3___]='\0'; } } main() { char ss[M][N]={"shanghai","guangzhou","beijing","tianjing","cchongqing"}; int i; printf("The original strings are :\n"); for(i=0; i printf("\n"); fun(ss); printf("The result is :\n"); for(i=0; i } 解題思路: 第一處:利用for循環語句取當前字符串的長度,所以應填:ss[i]。 第二處:在字符串的右邊填字符*,其開始位置是n+j,其中n是該字符串本身的長度,j是 循環控制變量,所以應填:n+j。 第三處:字符串處理結束應置字符串結束符,其位置是n+j+1,所以應填:1。 *************************************************** 給定程序MODI1.C中 fun 函數的功能是:將p所指字符串中每個單詞的最后一 個字母改成大寫。(這里的“單詞”是指由空格隔開的字符串)。 例如, 若輸入 "I am a student to take the examination.", 則應輸出 "I aM A studenT tO takE thE examination."。 請修改程序中的錯誤之處, 使它能得出正確的結果。 注意: 不要改動 main 函數, 不得刪行, 也不得更改程序的結構! 給定源程序: #include #include void fun( char *p ) { int k = 0; for( ; *p; p++ ) if( k ) { /**********found***********/ if( p == ' ' ) { k = 0; /**********found***********/ * (p-1) = toupper( *( p - 1 ) ) } } else k = 1; } main() { char chrstr[64]; int d ; printf( "\nPlease enter an English sentence within 63 letters: "); gets(chrstr); d=strlen(chrstr) ; chrstr[d] = ' ' ; chrstr[d+1] = 0 ; printf("\n\nBefore changing:\n %s", chrstr); fun(chrstr); printf("\nAfter changing:\n %s", chrstr); } 解題思路: 第一處:關鍵字int錯寫成INT。 第二處:該行括號沒有配對,所以只要加上一個右括號即可。 *************************************************** 請編寫函數fun, 對長度為7個字符的字符串, 除首、尾字符外,將其余5個字 符按ASCII碼降序排列。 例如,原來的字符串為 CEAedca,排序后輸出為 CedcEAa 。 注意: 部分源程序在文件PROG1.C中。 請勿改動主函數main和其它函數中的任何內容, 僅在函數fun的花括號中填入 你編寫的若干語句。 給定源程序: #include #include #include int fun(char *s,int num) { } main() { char s[10]; printf("輸入7個字符的字符串:"); gets(s); fun(s,7); printf("\n%s",s); NONO(); } 解題思路: 本題是考察考生如何對字符串中的字符按降序進行排序。給出的程序是使用雙重for循環以 及冒泡法進行排序的,結果仍存放在原先的字符串上。 參考答案: int fun(char *s,int num) { char ch ; int i, j ; for(i = 1 ; i < 6 ; i++) for(j = i + 1 ; j < 6 ; j++) { if(*(s + i) < *(s + j)) { ch = *(s + j) ; *(s + j) = *(s +i) ; *(s + i) = ch ; } } } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第17套: 程序通過定義學生結構體數組,存儲了若干名學生的學號、姓名和3門課的成 績。函數fun的功能是將存放學生數據的結構體數組,按照姓名的字典序(從小到 大)排序。 請在程序的下劃線處填入正確的內容并把下劃線刪除, 使程序得出正確的結 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結構! 給定源程序: #include #include struct student { long sno; char name[10]; float score[3]; }; void fun(struct student a[], int n) { /**********found**********/ __1__ t; int i, j; /**********found**********/ for (i=0; i<__2__; i++) for (j=i+1; j /**********found**********/ if (strcmp(__3__) > 0) { t = a[i]; a[i] = a[j]; a[j] = t; } } main() { struct student s[4]={{10001,"ZhangSan", 95, 80, 88},{10002,"LiSi", 85, 70, 78}, {10003,"CaoKai", 75, 60, 88}, {10004,"FangFang", 90, 82, 87}}; int i, j; printf("\n\nThe original data :\n\n"); for (j=0; j<4; j++) { printf("\nNo: %ld Name: %-8s Scores: ",s[j].sno, s[j].name); for (i=0; i<3; i++) printf("% 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("% printf("\n"); } } 解題思路: 本題是對結構體數組中的姓名按升序進行排列。 第一處:t是一個臨時變量,主要是存放學生數據的結構變量,所以應填:struct student。 第二處:利用兩重for循環進行排序操作,排序的終止條件應該是總人數減1,所以應填: n-1。 第三處:對姓名進行比較大小,所以應填:a[i].name,a[j].name。 *************************************************** 給定程序MODI1.C中函數fun的功能是:在p所指字符串中找出ASCII碼值最大 的字符,將其放在第一個位置上;并將該字符前的原字符向后順序移動。 例如,調用fun函數之前給字符串輸入:ABCDeFGH, 調用后字符串中的內容為:eABCDFGH。 請改正程序中的錯誤,使它能得出正確結果。 注意:不要改動main函數,不得增行或刪行,也不得更改程序的結構。 給定源程序: #include fun( char *p ) { char max,*q; int i=0; max=p[i]; while( p[i]!=0 ) { if( max
\TAB { max=p[i]; /**********found**********/ \TAB q=p+i \TAB } i++; } /**********found**********/ wihle( q>p ) { *q=*(q-1); q--; } p[0]=max; } main() { char str[80]; printf("Enter a string: "); gets(str); printf("\nThe original string: "); puts(str); fun(str); printf("\nThe string after moving: "); puts(str); printf("\n\n"); } 解題思路: 第一處:在語句后缺少分號,所應改為:q=p+i;。 第二處:保留字while寫錯,所應改為:while(q>p)。 *************************************************** 學生的記錄由學號和成績組成,N名學生的數據已在主函數中放入結構體數組 s中, 請編寫函數fun,它的功能是:把指定分數范圍內的學生數據放在b所指的數 組中,分數范圍內的學生人數由函數值返回。 例如,輸入的分數是60 69, 則應當把分數在60到69的學生數據進行輸出, 包含60分和69分的學生數據。主函數中將把60放在low中,把69放在heigh中。 注意: 部分源程序在文件PROG1.C文件中。 請勿改動主函數main和其它函數中的任何內容,僅在函數fun的花括號中填入 你編寫的若干語句。 給定源程序: #include #define N 16 typedef struct { char num[10]; int s; } STREC; int fun( STREC *a,STREC *b,int l, int h ) { } main() { STREC s[N]={{"GA005",85},{"GA003",76},{"GA002",69},{"GA004",85}, {"GA001",96},{"GA007",72},{"GA008",64},{"GA006",87}, {"GA015",85},{"GA013",94},{"GA012",64},{"GA014",91}, {"GA011",90},{"GA017",64},{"GA018",64},{"GA016",72}}; STREC h[N],tt;FILE *out ; int i,j,n,low,heigh,t; printf("Enter 2 integer number low & heigh : "); scanf("%d%d", &low,&heigh); if ( heigh< low ){ t=heigh;heigh=low;low=t; } n=fun( s,h,low,heigh ); printf("The student's data between %d--%d :\n",low,heigh); for(i=0;i printf("%s M\n",h[i].num,h[i].s); printf("\n"); out = fopen("c:\\test\\out.dat","w") ; n=fun( s,h,80,98 ); fprintf(out,"%d\n",n); for(i=0;i for(j=i+1;j if(h[i].s>h[j].s) {tt=h[i] ;h[i]=h[j]; h[j]=tt;} for(i=0;i fprintf(out,"M\n",h[i].s); fprintf(out,"\n"); fclose(out); } 解題思路: 本題是把符合條件的學生記錄存入到另一個結構體,最后通過主函數進行輸出。 1. 符合條件的學生人數存在變量j(初始值為0)中,最后返回其值。 2. 利用for循環語句,依次判斷是否符合條件,如果符合,則存入另一個記錄體中,人數j 加1。 參考答案: int fun( STREC *a,STREC *b,int l, int h ) { int i,j = 0 ; for(i = 0 ; i < N ; i++) if(a[i].s >= l && a[i].s <= h) b[j++] = a[i] ; return j ; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第18套: 給定程序中,函數fun的功能是:將形參s所指字符串中的所有字母字符順序 前移,其他字符順序后移,處理后新字符串的首地址作為函數值返回。 例如,s所指字符串為:asd123fgh543df,處理后新字符串為:asdfghdf123543。 請在程序的下劃線處填入正確的內容并把下劃線刪除,使程序得出正確的結 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結構! 給定源程序: #include #include #include char *fun(char *s) { int i, j, k, n; char *p, *t; n=strlen(s)+1; t=(char*)malloc(n*sizeof(char)); p=(char*)malloc(n*sizeof(char)); j=0; k=0; for(i=0; i { if(((s[i]>='a')&&(s[i]<='z'))||((s[i]>='A')&&(s[i]<='Z'))) { /**********found**********/ t[j]=__1__; j++;} else { p[k]=s[i]; k++; } } /**********found**********/ for(i=0; i<__2__; i++) t[j+i]=p[i]; /**********found**********/ t[j+k]= __3__; return t; } main() { char s[80]; printf("Please input: "); scanf("%s",s); printf("\nThe result is: %s\n",fun(s)); } 解題思路: 第一處:函數中申請了兩個內存空間,其p是存放字母字符串,t是存放非字母字符串,根 據條件可知,p依次存放字母字符串,其位置由j來控制,所以應填:s[i]。 第二處:利用for循環再把t中的內容依次追加到p中,其中t的長度為k,所以應填:k。 第三處:字符串處理好后必須添加字符串結束符,所以應填:'\0'。 *************************************************** 給定程序MODI1.C中函數 fun 的功能是:將s所指字符串中最后一次出現的與 t1所指字符串相同的子串替換成t2所指字符串,所形成的新串放在w所指的數組中。 在此處,要求t1和t2所指字符串的長度相同。 例如,當s所指字符串中的內容為:"abcdabfabc",t1所指子串中的內容為: "ab",t2所指子串中的內容為:"99"時, 結果,在w所指的數組中的內容應為: "abcdabf 請改正程序中的錯誤,使它能得出正確的結果。 注意:不要改動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("% 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("% 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 if(strlen( sp) sp=sq[i] ; /**********found**********/ return sq; } main() { char str[N][M], *longest; int i; printf("Enter %d lines :\n",N); for(i=0; i printf("\nThe N string :\n",N); for(i=0; i longest=fun(str); printf("\nThe longest string :\n"); puts(longest); } 解題思路: 第一處: 要求返回字符串的首地址,所以應改為:char *fun(char (*sq)[M])。 第二處: 返回一個由變量sp控制的字符串指針,所以應改為:return sp;。 *************************************************** 函數fun的功能是:將a、b中的兩個兩位正整數合并形成一個新的整數放在c 中。合并的方式是:將a中的十位和個位數依次放在變量c的百位和個位上,b中的 十位和個位數依次放在變量c的十位和千位上。 例如,當a=45,b=12。調用該函數后,c=2415。 注意: 部分源程序存在文件PROG1.C中。數據文件IN.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 參考答案: void fun(int a, int b, long *c) { *c = (b)*1000+(a/10)*100+(b/10)*10+a; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第20套: 給定程序中,函數fun的功能是:計算形參x所指數組中N個數的平均值(規定 所有數均為正數),將所指數組中小于平均值的數據移至數組的前部,大于等于平 均值的數據移至x所指數組的后部,平均值作為函數值返回,在主函數中輸出平均 值和移動后的數據。 例如,有10個正數:46 30 32 40 6 17 45 15 48 26,平均值為: 30.500000 移動后的輸出為:30 6 17 15 26 46 32 40 45 48 請在程序的下劃線處填入正確的內容并把下劃線刪除,使程序得出正確的結 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結構! 給定源程序: #include #include #define N 10 double fun(double *x) { int i, j; double av, y[N]; av=0; /**********found**********/ for(i=0; i for(i=j=0; i if( x[i] /**********found**********/ y[j]=x[i]; x[i]=-1; __2__;} i=0; while(i { if( x[i]!= -1 ) y[j++]=x[i]; /**********found**********/ __3__; } for(i=0; i return av; } main() { int i; double x[N]; for(i=0; i printf("\n"); printf("\nThe average is: %f\n",fun(x)); printf("\nThe result :\n",fun(x)); for(i=0; i printf("\n"); } 解題思路: 第一處:求出N個數的平均值,所以應填:N。 第二處:利用for循環語句,把數組x中小于平均值的數,依次存放到數組y中,其中位置由 變量j來控制,所以應填:j++。 第三處:i是while循環體的控制變量,每做一次循環均要加1。 *************************************************** 給定程序MODI1.C中函數 fun 的功能是:統計字符串中各元音字母(即:A、 E、I、O、U)的個數。注意:字母不分大、小寫。 例如:若輸入:THIs is a boot,則輸出應該是:1、0、2、2、0。 請改正程序中的錯誤,使它能得出正確的結果。 注意:不要改動 main 函數,不得增行或刪行,也不得更改程序的結構! 給定源程序: #include fun ( char *s, int num[5] ) { int k, i=5; for ( k = 0; k /**********found**********/ num[i]=0; for (; *s; s++) { i = -1; /**********found**********/ switch ( s ) { case 'a': case 'A': {i=0; break;} case 'e': case 'E': {i=1; break;} case 'i': case 'I': {i=2; break;} case 'o': case 'O': {i=3; break;} case 'u': case 'U': {i=4; break;} } if (i >= 0) num[i]++; } } main( ) { char s1[81]; int num1[5], i; printf( "\nPlease enter a string: " ); gets( s1 ); fun ( s1, num1 ); for ( i=0; i < 5; i++ ) printf ("%d ",num1[i]); printf ("\n"); } 解題思路: 第一處:num初始化錯誤,應為:num[k]=0;。 第二處:由于s是指針型變量,所以應改為:switch(*s)。 *************************************************** 請編寫函數 fun,函數的功能是求出二維數組周邊元素之和,作為函數值返 回。二維數組中的值在主函數中賦予。 例如:二維數組中的值為 1 3 5 7 9 2 9 9 9 4 6 9 9 9 8 1 3 5 7 0 則函數值為 61。 注意: 部分源程序存在文件PROG1.C文件中。 請勿改動主函數main和其它函數中的任何內容,僅在函數fun的花括號中填入 你編寫的若干語句。 給定源程序: #include #define M 4 #define N 5 int fun ( int a[M][N] ) { } main( ) { int aa[M][N]={{1,3,5,7,9}, {2,9,9,9,4}, {6,9,9,9,8}, {1,3,5,7,0}}; int i, j, y; clrscr(); printf ( "The original data is : \n" ); for ( i=0; i { for ( j =0; j printf ("\n"); } y = fun ( aa ); printf( "\nThe sum: %d\n" , y ); printf("\n"); NONO( ); } 解題思路: 本題是統計二維數組周邊元素值之和,但要注意的是不要重復計算四個角上的元素值,結 果作為函數值返回。 參考答案: int fun ( int a[M][N] ) { int tot = 0, i, j ; for(i = 0 ; i < N ; i++) { tot += a[0][i] ; tot += a[M-1][i] ; } for(i = 1 ; i < M - 1 ; i++) { tot += a[i][0] ; tot += a[i][N-1] ; } return tot ; } |