全國計算機二級C題庫第31--40套 |
本題目如果下載后發現有錯誤的地方,請聯系網站管理員:QQ121431055
考試時,上機操作題目有三套,基本操作題、簡單應用題、綜合應用題
第31套: 給定程序中,函數fun的功能是:對形參s所指字符串中下標為奇數的字符按 ASCII碼大小遞增排序,并將排序后下標為奇數的字符取出,存入形參p所指字符 數組中,形成一個新串。 例如,形參s所指的字符串為:baawrskjghzlicda,執行后p所指字符數組中 的字符串應為:aachjlsw。 請在程序的下劃線處填入正確的內容并把下劃線刪除,使程序得出正確的結 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結構! 給定源程序: #include void fun(char *s, char *p) { int i, j, n, x, t; n=0; for(i=0; s[i]!='\0'; i++) n++; for(i=1; i /**********found**********/ ___1___; /**********found**********/ for(j=___2___+2 ; j if(s[t]>s[j]) t=j; if(t!=i) { x=s[i]; s[i]=s[t]; s[t]=x; } } for(i=1,j=0; i /**********found**********/ p[j]=___3___; } main() { char s[80]="baawrskjghzlicda", p[50]; printf("\nThe original string is : %s\n",s); fun(s,p); printf("\nThe result is : %s\n",p); } 解題思路: 第一處:取外循環的控制變量,所以應填:t=i。 第二處:內循環的起始變量,應該是i+2,所以應填:i。 第三處:新字符串處理完后應添加字符串結束符,所以應填:'\0'。 *************************************************** 給定程序MODI1.C中函數 fun 的功能是:用下面的公式求π的近似值,直到 最后一項的絕對值小于指定的數(參數num )為止: π 1 1 1 ┄┄≈1 - ┄┄ + ┄┄ - ┄┄ + ... 4 3 5 7 例如, 程序運行后, 輸入0.0001, 則程序輸出3.1414。 請改正程序中的錯誤,使它能輸出正確的結果。 注意:不要改動 main 函數,不得增行或刪行,也不得更改程序的結構! 給定源程序: #include #include float fun ( float num ) { int s ; float n, t, pi ; t = 1 ; pi = 0 ; n = 1 ; s = 1 ; /**************found**************/ while(t >= num) { pi = pi + t ; n = n + 2 ; s = -s ; /**************found**************/ t = s % n ; } pi = pi * 4 ; return pi ; } main( ) { float n1, n2 ; printf("Enter a float number: ") ; scanf("%f", &n1) ; n2 = fun(n1) ; printf("% } 解題思路: 第一處:要判斷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 fun(x,4); printf("\nThe string after deleted :\n\n"); for(i=0; i } 解題思路: 本題是根據給定的字符串數組中刪除串長大于某個值的右邊字符串。 第一處:函數的定義,試題中已用M作為字符串的長度,所以應填:M。 第二處:利用while循環,分別對字符串數組中的每個字符串置字符串結束符,程序中已經 給定了N個字符串,所以應填:N。 第三處:置字符串結束符,所以應填:0(或'\0')。 *************************************************** 給定程序MODI1.C中函數fun的功能是:根據以下公式求π值,并作為函數值 返回。 例如,給指定精度的變量eps輸入0.0005時,應當輸出Pi=3.140578。 π 1 1 2 1 2 3 1 2 3 4 ─=1+ ─ + ─×─ + ─×─×─ + ─×─×─×─+…… 2 3 3 5 3 5 7 3 5 7 9 請改正程序中的錯誤,使它能得出正確結果。 注意:不要改動main函數,不得增行或刪行,也不得更改程序的結構。 給定源程序: #include #include double fun(double eps) { double s,t; int n=1; s=0.0; /************found************/ t=0; while( t>eps) { s+=t; t=t * n/(2*n+1); n++; } /************found************/ return(s); } main() { double x; printf("\nPlease enter a precision: "); scanf("%lf",&x); printf("\neps=%lf, Pi=%lf\n\n",x,fun(x)); } 解題思路: 第一處: 初始化t的值,根據程序中的計算程序和試題的要求得出,t應為1。 第二處: 根據公式π/2得出,所以返回時應原有s的基礎上乘以2作為返回值。 *************************************************** 假定輸入的字符串中只包含字母和*號。請編寫函數fun,它的功能是:使字 符串的前導*號不得多于n個;若多于n個,則刪除多余的*號; 若少于或等于n個, 則什么也不做,字符串中間和尾部的*號不刪除。函數fun中給出的語句僅供參考。 例如,字符串中的內容為:*******A*BC*DEF*G****,若n的值為4,刪除后, 字符串中的內容應當是:****A*BC*DEF*G****;若n的值為8,則字符串中的內容仍 為:*******A*BC*DEF*G****。n的值在主函數中輸入。 在編寫函數時,不得使用 C語言提供的字符串函數。 注意: 部分源程序在文件PROG1.C文件中。 請勿改動主函數main和其它函數中的任何內容,僅在函數fun的花括號中填入 你編寫的若干語句。 給定源程序: #include void fun( char *a, int n ) { /* 以下代碼僅供參考 */ int i=0,j,k=0; while(a[k]=='*') k++; /* k為統計*字符個數 */ if(k>n) { i=n;j=k; /* 以下完成將下標為k至串尾的字符前移k-n個位置 */ } } main() { char s[81]; int n; printf("Enter a string:\n");gets(s); printf("Enter n : ");scanf("%d",&n); fun( s,n ); printf("The string after deleted:\n");puts(s); NONO(); }
解題思路: 本題是考察字符串的操作。 利用for循環來判斷a[j]的字符是否是字符串結束符,如果不是字符串結束符,則把a[j] 的字符依次存放到a[i]。其中,變量i是n的初始值,變量j是字符串前導的*號數。 參考答案: void fun( char *a, int n ) { /* 以下代碼僅供參考 */ int i=0,j,k=0; while(a[k]=='*') k++; /* k為統計*字符個數 */ if(k>n) { i=n;j=k; /* 以下完成將下標為k至串尾的字符前移k-n個位置 */ for(; a[j] !=0 ; j++) a[i++]=a[j]; a[i] = 0; } } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第33套: 給定程序的功能是:調用函數fun將指定源文件中的內容復制到指定的目標 文件中,復制成功時函數返回值為1,失敗時返回值為0。在復制的過程中,把復 制的內容輸出到終端屏幕。主函數中源文件名放在變量sfname中,目標文件名放 在變量tfname中。 請在程序的下劃線處填入正確的內容并把下劃線刪除,使程序得出正確的結 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結構! 給定源程序: #include #include int fun(char *source, char *target) { FILE *fs,*ft; char ch; /**********found**********/ if((fs=fopen(source, ___1___))==NULL) return 0; if((ft=fopen(target, "w"))==NULL) return 0; printf("\nThe data in file :\n"); ch=fgetc(fs); /**********found**********/ while(!feof(___2___)) { putchar( ch ); /**********found**********/ fputc(ch,___3___); ch=fgetc(fs); } fclose(fs); fclose(ft); printf("\n\n"); return 1; } main() { char sfname[20] ="myfile1",tfname[20]="myfile2"; FILE *myf; int i; char c; myf=fopen(sfname,"w"); printf("\nThe original data :\n"); for(i=1; i<30; i++){ c='A'+rand()%;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; /************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 參考答案: void fun(int a, int b, long *c) { *c=(a)*1000+(b/10)*100+(a/10)*10+(b); } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第34套: 用篩選法可得到2~n(n<10000)之間的所有素數,方法是:首先從素數2開 始,將所有2的倍數的數從數表中刪去(把數表中相應位置的值置成0);接著從數 表中找下一個非0數,并從數表中刪去該數的所有倍數;依此類推,直到所找的下 一個數等于n為止。這樣會得到一個序列: 2,3,5,7,11,13,17,19,23,…… 函數fun用篩選法找出所有小于等于n的素數,并統計素數的個數作為函數值 返回。 請在程序的下劃線處填入正確的內容并把下劃線刪除,使程序得出正確的結 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結構! 給定源程序: #include int fun(int n) { int a[10000], i,j, count=0; for (i=2; i<=n; i++) a[i] = i; i = 2; while (i /**********found**********/ for (j=a[i]*2; j<=n; j+=___1___) a[j] = 0; i++; /**********found**********/ while (___2___==0) i++; } printf("\nThe prime number between 2 to %d\n", n); for (i=2; i<=n; i++) /**********found**********/ if (a[i]!=___3___) { count++; printf( count?"]":"\n]",a[i]); } return count; } main() { int n=20, r; r = fun(n); printf("\nThe number of prime is : %d\n", r); } 解題思路: 第一處:所有2的倍數的數從數表中刪去,所以應填:a[i]。 第二處:找出下一個不是的a[i],所以應填:a[i]。 第三處:輸出素數,只要判斷a[i]不是0就是素數,所以應填:0。 *************************************************** 給定程序MODI1.C中函數fun的功能是: 為一個偶數尋找兩個素數, 這兩個素 數之和等于該偶數,并將這兩個素數通過形參指針傳回主函數。 請改正函數fun中指定部位的錯誤, 使它能得出正確的結果。 注意: 不要改動main函數, 不得增行或刪行, 也不得更改程序的結構! 給定源程序: #include #include void fun(int a,int *b,int *c) { int i,j,d,y; for(i=3;i<=a/2;i=i+2) { /**************found**************/ Y=1; for(j=2;j<=sqrt((double)i);j++) if(i%j==0) y=0; if(y==1) { /**************found**************/ d==a-i; for(j=2;j<=sqrt((double)d);j++) if(d%j==0) y=0; if(y==1) { *b=i; *c=d; } } } } main() { int a,b,c; do { printf("\nInput a: "); scanf("%d",&a); } while(a%2); fun(a,&b,&c); printf("\n\n%d = %d + %d\n",a,b,c); } 解題思路: 第一處:變量y錯寫成Y。 第二處:給變量d進行賦值,所以應改為:d=a-i;。 *************************************************** 請編寫函數fun, 它的功能是:計算并輸出n(包括n)以內能被5或9整除的所有 自然數的倒數之和。 例如,在主函數中從鍵盤給n輸入20后, 輸出為: s=0.583333。 注意: 要求n的值不大于100。 部分源程序在文件PROG1.C中。 請勿改動主函數main和其他函數中的任何內容, 僅在函數fun的花括號中填入 你編寫的若干語句。 給定源程序: #include double fun(int n) { } main() { int n; double s; printf("\nInput n: "); scanf("%d",&n); s=fun(n); printf("\n\ns=%f\n",s); NONO(); } 解題思路: 本題是計算n(包括n)以內能被5或9整除的所有自然數的倒數之和。 參考答案: double fun(int n) { int i; double sum=0.0; for(i=1; i<=n; i++) if(i%5 == 0 || i%9 == 0) /* 被5或9整除 */ sum+=1.0/i; return sum; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第35套: 給定程序中,函數fun的功能是建立一個N×N的矩陣。 矩陣元素的構成規律 是:最外層元素的值全部為1;從外向內第2層元素的值全部為2;第3層元素的值 全部為3,…依次類推。例如,若N=5,生成的矩陣為: 1 1 1 1 1 1 2 2 2 1 1 2 3 2 1 1 2 2 2 1 1 1 1 1 1 請在程序的下劃線處填入正確的內容并把下劃線刪除, 使程序得出正確的結 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結構! 給定源程序: #include #define N 7 /**********found**********/ void fun(int (*a) __1__) { int i,j,k,m; if(N%2==0) m=N/2 ; else m=N/2+1; for(i=0; i /**********found**********/ for(j= __2__ ; j a[i][j]=a[N-i-1][j]=i+1; for(k=i+1; k /**********found**********/ a[k][i]=a[k][N-i-1]= __3__; } } main() { int x[N][N]={0},i,j; fun(x); printf("\nThe result is:\n"); for(i=0; i { for(j=0; j printf("\n"); } } 解題思路: 第一處:建立一個N×N的矩陣,所以應填:[N]。 第二處:j的起始變量值應i。 第三處:也應該填寫i+1。 *************************************************** 給定程序MODI1.C中函數 fun 的功能是: 將十進制正整數m轉換成k(2≤k≤9) 進制數, 并按高位到低位順序輸出。 例如,若輸入8和2,則應輸出1000(即十進制數8轉換成二進制表示是1000)。 請改正 fun 函數中的錯誤,使它能得出正確的結果。 注意:不要改動 main 函數。不得增行或刪行,也不得更改程序的結構! 給定源程序: #include #include void fun( int m, int k ) { int aa[20], i; for( i = 0; m; i++ ) { /**********found**********/ aa[i] = m/k; m /= k; } for( ; i; i-- ) /**********found**********/ printf( "%d", aa[ i ] ); } main() { int b, n; printf( "\nPlease enter a number and a base:\n" ); scanf( "%d %d", &n, &b ); fun( n, b ); printf("\n"); } 解題思路: 第一處:應該取模而不是整除,所以應為:aa[i]=m%k;。 第二處:輸出aa的位置不正確,所以應為:printf("%d",aa[i-1]);。 *************************************************** 編寫一個函數,從num個字符串中找出最長的一個字符串,并通過形參指針max 傳回該串地址。(注意: 主函數中用****作為結束輸入的標志,函數fun中給出的 語句僅供參考。) 注意:部分源程序在文件PROG1.C中。 請勿改動主函數main和其它函數中的任何內容,僅在函數fun的花括號中填入 你編寫的若干語句。 給定源程序: #include #include fun(char(*a)[81],int num,char **max) { /* 以下代碼僅供參考 */ int i,k=0,len, maxlen; /* k為a數組中最長串所在元素的下標,初始為0,maxlen為其串 長 */ maxlen=strlen(a[k]); for(i=1;i { /* 以下完成查找最長串 */ } *max=a[k]; } main() { char ss[10][81],*ps; int n,i=0; printf("輸入若干個字符串:"); gets(ss[i]); puts(ss[i]); while(!strcmp(ss[i],"****")==0) { i++; gets(ss[i]); puts(ss[i]); } n=i; fun(ss,n,&ps); printf("\nmax=%s\n",ps); NONO(); } 解題思路: 本題是考察考生怎樣從已輸入的字符串中找出長度最大的字符串。求字符串的長度可以使 用strlen函數。 參考答案: fun(char(*a)[81],int num,char **max) { /* 以下代碼僅供參考 */ int i,k=0,maxlen; /* k為a數組中最長串所在元素的下標,初始為0,maxlen為其串長 */ maxlen=strlen(a[k]); for(i=1;i { /* 以下完成查找最長串 */ if(strlen(a[i]) > maxlen) { maxlen = strlen(a[i]) ; k = i ; } } *max=a[k]; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第36套: 給定程序中,函數fun的功能是:統計出帶有頭結點的單向鏈表中結點的個數, 存放在形參n所指的存儲單元中。 請在程序的下劃線處填入正確的內容并把下劃線刪除,使程序得出正確的結 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結構! 給定源程序: #include #include #define N 8 typedef struct list { int data; struct list *next; } SLIST; SLIST *creatlist(int *a); void outlist(SLIST *); void fun( SLIST *h, int *n) { SLIST *p; /**********found**********/ ___1___=0; p=h->next; while(p) { (*n)++; /**********found**********/ p=p->___2___; } } main() { SLIST *head; int a[N]={12,87,45,32,91,16,20,48}, num; head=creatlist(a); outlist(head); /**********found**********/ fun(___3___, &num); printf("\nnumber=%d\n",num); } SLIST *creatlist(int a[]) { SLIST *h,*p,*q; int i; h=p=(SLIST *)malloc(sizeof(SLIST)); for(i=0; i { q=(SLIST *)malloc(sizeof(SLIST)); q->data=a[i]; p->next=q; p=q; } p->next=0; return h; } void outlist(SLIST *h) { SLIST *p; p=h->next; if (p==NULL) printf("The list is NULL!\n"); else { printf("\nHead "); do { printf("->%d",p->data); p=p->next; } while(p!=NULL); printf("->End\n"); } } 解題思路: 本題是要求統計出帶有頭結點的單向鏈表中結點的個數。 第一處:對n所指的存儲單元進行初始化,所以應填:*n。 第二處:指向p的下一個結點,所以應填:next。 第三處:函數調用,在主函數中已經給出了head,所以應填:head。 *************************************************** 給定程序MODI1.C中函數fun的功能是:求出s所指字符串中最后一次出現的t 所指子字符串的地址,通過函數值返回,在主函數中輸出從此地址開始的字符串; 若未找到,則函數值為NULL。 例如,當字符串中的內容為:"abcdabfabcdx",t中的內容為:"ab"時, 輸出結果應是:abcdx。 當字符串中的內容為:"abcdabfabcdx",t中的內容為:"abd"時, 則程序輸出未找到信息:not be found!。 請改正程序中的錯誤,使它能得出正確的結果。 注意:不要改動main函數,不得增行或刪行,也不得更改程序的結構! 給定源程序: #include #include char * fun (char *s, char *t ) { char *p , *r, *a; /************found************/ a = Null; while ( *s ) { p = s; r = t; while ( *r ) /************found************/ if ( r == p ) { r++; p++; } else break; if ( *r == '\0' ) a = s; s++; } return a ; } main() { char s[100], t[100], *p; printf("\nPlease enter string S :"); scanf("%s", s ); printf("\nPlease enter substring t :"); scanf("%s", t ); p = fun( s, t ); if ( p ) printf("\nThe result is : %s\n", p); else printf("\nNot found !\n" ); } 解題思路: 第一處:指向空指針錯誤,Null應NULL。 第二處:比較指針位置的值是否相等,所以應改為:if(*r==*p)。 *************************************************** 函數fun的功能是: 將s所指字符串中除了下標為偶數、同時ASCII值也為偶 數的字符外,其余的全都刪除;串中剩余字符所形成的一個新串放在t所指的數組 中。 例如,若s所指字符串中的內容為:"ABCDEFG123456",其中字符A的ASCII碼 值為奇數,因此應當刪除;其中字符B的ASCII碼值為偶數,但在數組中的下標為 奇數,因此也應當刪除;而字符2的ASCII碼值為偶數,所在數組中的下標也為偶 數,因此不應當刪除,其它依此類推。最后t所指的數組中的內容應是:"246"。 注意: 部分源程序存在文件PROG1.C中。 請勿改動主函數main和其它函數中的任何內容,僅在函數fun的花括號中填入 你編寫的若干語句。 給定源程序: #include #include void fun(char *s, char t[]) { } main() { char s[100], t[100]; printf("\nPlease enter string S:"); scanf("%s", s); fun(s, t); printf("\nThe result is: %s\n", t); NONO(); } 解題思路: 本題是從一個字符串按要求生成另一個新的字符串。我們使用for循環語句來解決這個問 題。 參考答案: void fun(char *s, char t[]) { int i, j = 0 ; for(i = 0 ; i < strlen(s) ; i += 2) if(s[i] % 2 == 0) t[j++] = s[i] ; t[j] = 0 ; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第37套: 給定程序中,函數fun的功能是:在形參ss所指字符串數組中,查找含有形參 substr所指子串的所有字符串并輸出,若沒找到則輸出相應信息。ss所指字符串 數組中共有N個字符串,且串長小于M。程序中庫函數strstr(s1, s2)的功能是在 s1串中查找s2子串,若沒有,函數值為0,若有,為非0。 請在程序的下劃線處填入正確的內容并把下劃線刪除, 使程序得出正確的結 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結構! 給定源程序: #include #include #define N 5 #define M 15 void fun(char (*ss)[M], char *substr) { int i,find=0; /**********found**********/ for(i=0; i< __1__ ; i++) /**********found**********/ if( strstr(ss[i], __2__) != NULL ) { find=1; puts(ss[i]); printf("\n"); } /**********found**********/ if (find==__3__) printf("\nDon't found!\n"); } main() { char x[N][M]={"BASIC","C langwage","Java","QBASIC","Access"},str[M]; int i; printf("\nThe original string\n\n"); for(i=0;i printf("\nEnter a string for search : "); gets(str); fun(x,str); } 解題思路: 本題是根據給定的字符串數組中查找指定的字符串,如果存在,則顯示。 第一處:利用for循環,從幾個字符串中進行查找,程序中已經給定了N個字符串,所以應 填:N。 第二處:查找子串,子串由形參substr傳遞,所以應填:substr。 第三處:試題要求,若沒有找到,函數值為0,所以應填:0。 *************************************************** 給定程序MODI1.C中函數fun的功能是:求三個數的最小公倍數。 例如,給主函數中的變量x1、x2、x3分別輸入15 11 2, 則輸出結果應當是:330。 請改正程序中的錯誤,使它能得出正確結果。 注意:不要改動main函數,不得增行或刪行,也不得更改程序的結構。 給定源程序: #include /************found************/ fun(int x, y, z ) { int j,t ,n ,m; j = 1 ; t=j%x; m=j%y ; n=j%z; while(t!=0||m!=0||n!=0) { j = j+1; t=j%x; m=j%y; n=j%z; } /************found************/ return i; } main( ) { int x1,x2,x3,j ; printf("Input x1 x2 x3: "); scanf("%d%d%d",&x1,&x2,&x3); printf("x1=%d, x2=%d, x3=%d \n",x1,x2,x3); j=fun(x1,x2,x3); printf("The minimal common multiple is : %d\n",j); } 解題思路: 第一處: 函數中形參的定義不正確,應改為:fun(int x,int y, int z)。 第二處: 程序中三個數的最小公倍數是用j處理的,所以應返回j的值。 *************************************************** 假定輸入的字符串中只包含字母和*號。請編寫函數fun,它的功能是:只刪 除字符串前導和尾部的*號,串中字母之間的*號都不刪除。形參n給出了字符串的 長度, 形參h給出了字符串中前導*號的個數,形參e給出了字符串中最后*號的個 數。在編寫函數時,不得使用C語言提供的字符串函數。 例如,字符串中的內容為:****A*BC*DEF*G*******,刪除后,字符串中的內 容應當是:A*BC*DEF*G。 注意: 部分源程序在文件PROG1.C文件中。 請勿改動主函數main和其它函數中的任何內容,僅在函數fun的花括號中填入 你編寫的若干語句。 給定源程序: #include void fun( char *a, int n,int h,int e ) { } main() { char s[81],*t,*f; int m=0, tn=0, fn=0; printf("Enter a string:\n");gets(s); t=f=s; while(*t){t++;m++;} t--; while(*t=='*'){t--;tn++;} while(*f=='*'){f++;fn++;} fun( s , m,fn,tn ); printf("The string after deleted:\n");puts(s); NONO(); } 解題思路: 本題是考察對字符串的操作。 1. 求出字符串的長度。 2. 利用循環把字符串中字符按要求仍存放在原字符串首址開始的位置上。 參考答案: void fun( char *a, int n,int h,int e ) { char *p=a ; int j=0,len=0; while(*p) {p++; len++;} while(j a[j]=a[h+j]; j++; } a[j]=0; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第38套: 函數fun的功能是:把形參a所指數組中的奇數按原順序依次存放到a[0]、 a[1]、a[2]、……中,把偶數從數組中刪除,奇數個數通過函數值返回。例如: 若a所指數組中的數據最初排列為:9、1、4、2、3、6、5、8、7,刪除偶數后a 所指數組中的數據為:9、1、3、5、7,返回值為5。 請在程序的下劃線處填入正確的內容并把下劃線刪除,使程序得出正確的結 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結構! 給定源程序: #include #define N 9 int fun(int a[], int n) { int i,j; j = 0; for (i=0; i /**********found**********/ if (a[i]%2==___1___) { /**********found**********/ a[j] = a[i]; ___2___; } /**********found**********/ return ___3___; } main() { int b[N]={9,1,4,2,3,6,5,8,7}, i, n; printf("\nThe original data :\n"); for (i=0; i n = fun(b, N); printf("\nThe number of odd : %d \n", n); printf("\nThe odd number :\n"); for (i=0; i } 解題思路: 第一處:判斷a[i]是否是奇數,若是,則仍保留在原數組中a[j],所以應填:1。 第二處:數組a中的元素位置由j來控制,每增加一個元素,則j加1,所以應填:j++。 第三處:返回刪除偶數后a所指數組中數據的元素j,所以應填:j。 *************************************************** 給定程序MODI1.C中函數fun的功能是:求出兩個非零正整數的最大公約數, 并作為函數值返回。 例如,若給num1和num2分別輸入49和21,則輸出的最大公約數為7;若給num1 和num2分別輸入27和81,則輸出的最大公約數為27。 請改正程序中的錯誤,使它能得出正確結果。 注意:不要改動main函數,不得增行或刪行,也不得更改程序的結構。 給定源程序: #include int fun(int a,int b) { int r,t; if(a /************found************/ t=a; b=a; a=t; } r=a%b; while(r!=0) { a=b; b=r; r=a%b; } /************found************/ return(a); } main() { int num1, num2,a; printf("Input num1 num2: "); scanf("%d%d",&num1,&num2); printf("num1= %d num2= %d\n\n",num1,num2); a=fun(num1,num2); printf("The maximun common divisor is %d\n\n",a); } 解題思路: 第一處:交換值的次序有問題,所以應改為:t=a;a=b;b=t;。 第二處:返回值錯誤,應改為:return(b);。 *************************************************** 假定輸入的字符串中只包含字母和*號。請編寫函數fun,它的功能是:刪除 字符串中所有的*號。在編寫函數時,不得使用C語言提供的字符串函數。 例如,字符串中的內容為:****A*BC*DEF*G*******,刪除后,字符串中的內 容應當是:ABCDEFG。 注意: 部分源程序在文件PROG1.C中。 請勿改動主函數main和其它函數中的任何內容,僅在函數fun的花括號中填入 你編寫的若干語句。 給定源程序: #include void fun( char *a ) { } main() { char s[81]; printf("Enter a string:\n");gets(s); fun( s ); printf("The string after deleted:\n");puts(s); NONO(); } 解題思路: 本題是考察字符串的操作。 1. 利用循環掃描字符串中所有的字符是否是'*',如果不是'*',則把這些字符存放字符串 a首地址開始的位置上。 2. 最后給字符串a加上結束符。 參考答案: void fun( char *a ) { int j =0 ; char *p=a; while(*p) { if(*p != '*') a[j++]=*p ; p++ ; } a[j]=0; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第39套: 給定程序中,函數fun的功能是:在形參ss所指字符串數組中,刪除所有串長 超過k的字符串,函數返回所剩字符串的個數。ss所指字符串數組中共有N個字符 串,且串長小于M。 請在程序的下劃線處填入正確的內容并把下劃線刪除, 使程序得出正確的結 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結構! 給定源程序: #include #include #define N 5 #define M 10 int fun(char (*ss)[M], int k) { int i,j=0,len; /**********found**********/ for(i=0; i< __1__ ; i++) { len=strlen(ss[i]); /**********found**********/ if(len<= __2__) /**********found**********/ strcpy(ss[j++],__3__); } return j; } main() { char x[N][M]={"Beijing","Shanghai","Tianjing","Nanjing","Wuhan"}; int i,f; printf("\nThe original string\n\n"); for(i=0;i f=fun(x,7); printf("The string witch length is less than or equal to 7 :\n"); for(i=0; i } 解題思路: 本題是根據給定的字符串數組中刪除串長大于某個值的字符串。 第一處:利用for循環,從幾個字符串中進行查找,程序中已經給定了N個字符串,所以應 填:N。 第二處:串長由形參k來傳遞,所以應填:k。 第三處:如果字符串ss[i]的串長小于k,則該字符串仍存在原字符串數組中,位置由變量j 來控制,所以應填:ss[i]。 *************************************************** 給定程序MODI1.C中函數fun的功能是:逐個比較p、q所指兩個字符串對應位 置中的字符,把ASCII值大或相等的字符依次存放到c所指數組中,形成一個新的 字符串。 例如,若主函數中a字符串為:aBCDeFgH, 主函數中b字符串為:ABcd, 則c中的字符串應為:aBcdeFgH。 請改正程序中的錯誤,使它能得出正確結果。 注意:不要改動main函數,不得增行或刪行,也不得更改程序的結構。 給定源程序: #include #include void fun(char *p ,char *q, char *c) { /************found************/ int k = 1; /************found************/ while( *p != *q ) { if( *p<*q ) c[k]=*q; else c[k]=*p; if(*p) p++; if(*q) q++; k++; } } main() { char a[10]="aBCDeFgH", b[10]="ABcd", c[80]={'\0'}; fun(a,b,c); printf("The string a: "); puts(a); printf("The string b: "); puts(b); printf("The result : "); puts(c); } 解題思路: 第一處: 存放字符串初始位置也是從0開始存放的,由于k是控制c字符串的位置值,所以k 值應為0。 第二處: 判斷兩個字符串中是否有字符串結束符產生,所以應改為:while( *p || *q ), 而不是兩字符串中對應位置的值不相等。 *************************************************** 假定輸入的字符串中只包含字母和*號。請編寫函數fun,它的功能是:除了字 符串前導的*號之外,將串中其它*號全部刪除。在編寫函數時,不得使用C語言提供 的字符串函數。函數fun中給出的語句僅供參考。 例如,字符串中的內容為:****A*BC*DEF*G*******,刪除后, 字符串中的內 容應當是:****ABCDEFG。 注意: 部分源程序在文件PROG1.C文件中。 請勿改動主函數main和其它函數中的任何內容,僅在函數fun的花括號中填入 你編寫的若干語句。 給定源程序: #include void fun( char *a ) { /* 以下代碼僅供參考 */ int i=0,k; while(a[i]=='*') i++; k=i+1; while(a[i]!='\0') /* 以下程序段實現非*字符前移 */ { } a[i+1]='\0'; } main() { char s[81]; printf("Enter a string:\n");gets(s); fun( s ); printf("The string after deleted:\n");puts(s); NONO(); } 解題思路: 本題是考察字符串的操作。 1. 使用while循環語句求出字符串前導*號的個數。 2. 使用while循環語句判斷a[i]是否是字符串結束符標志,如果不是字符串結束標志,則 再判斷是否是字符*號,如果不是*號,則把a[i]字符存入a[k]中,如果是*號則跳過該*號,直 至字符串結束為止。 參考答案: void fun( char *a ) { /* 以下代碼僅供參考 */ int i=0,k; while(a[i]=='*') i++; k=i; while(a[i]!='\0') /* 以下程序段實現非*字符前移 */ { if(a[i] != '*') a[k++]=a[i]; i++; } a[k]='\0'; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第40套: 給定程序中已建立一個帶有頭結點的單向鏈表,鏈表中的各結點按結點數據 域中的數據遞增有序鏈接。函數fun的功能是:把形參x的值放入一個新結點并插 入到鏈表中,插入后各結點數據域的值仍保持遞增有序。 請在程序的下劃線處填入正確的內容并把下劃線刪除,使程序得出正確的結 果。 注意:源程序存放在考生文件夾下的BLANK1.C中。 不得增行或刪行,也不得更改程序的結構! 給定源程序: #include #include #define N 8 typedef struct list { int data; struct list *next; } SLIST; void fun( SLIST *h, int x) { SLIST *p, *q, *s; s=(SLIST *)malloc(sizeof(SLIST)); /**********found**********/ s->data=___1___; q=h; p=h->next; while(p!=NULL && x>p->data) { /**********found**********/ q=___2___; p=p->next; } s->next=p; /**********found**********/ q->next=___3___; } SLIST *creatlist(int *a) { SLIST *h,*p,*q; int i; h=p=(SLIST *)malloc(sizeof(SLIST)); for(i=0; i { q=(SLIST *)malloc(sizeof(SLIST)); q->data=a[i]; p->next=q; p=q; } p->next=0; return h; } void outlist(SLIST *h) { SLIST *p; p=h->next; if (p==NULL) printf("\nThe list is NULL!\n"); else { printf("\nHead"); do { printf("->%d",p->data); p=p->next; } while(p!=NULL); printf("->End\n"); } } main() { SLIST *head; int x; int a[N]={11,12,15,18,19,22,25,29}; head=creatlist(a); printf("\nThe list before inserting:\n"); outlist(head); printf("\nEnter a number : "); scanf("%d",&x); fun(head,x); printf("\nThe list after inserting:\n"); outlist(head); } 解題思路: 本題是要求在一個有序的鏈表中插入一個數,插入后各結點仍然是有序的。程序中共有三 處要填上適當的內容,使程序能運行出正確的結果。 第一處:在函數fun的開始處,已經對結構指針s分配了內存,其中data是一個整型變量, 實際要求填入一個整型數據。根據本題要求在一個鏈表插入一個整型數,該數已通過函數的形 參x傳入,因此應填x。 第二處:使用一個while循環找出要插入一個數的位置,在循環體中q實際上保留當前鏈表p 位置的臨時變量,如果x>p->data時,那么再移動鏈表指針到下一個結果,再進行判斷是否符合 條件,如果仍大于,則仍q保留鏈表p的位置。因此,此處應填p。 第三處:當找到結點位置后,就要插入這個數,完成插入過程。由于函數體中分配了結構 指針s,s的next指針已經指向了p,所以,當前位置q的next指針就應該指向指針s完成鏈表的鏈 接。因此,此處應填s。 *************************************************** 給定程序MODI1.C中函數fun的功能是:計算正整數num的各位上的數字之積。 例如,若輸入:252,則輸出應該是:20。若輸入:202,則輸出應該是:0。 請改正程序中的錯誤,使它能得出正確的結果。 注意:不要改動main函數,不得增行或刪行,也不得更改程序的結構! 給定源程序: #include long fun (long num) { /************found************/ long k; do { k*=num ; /************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: % NONO ( ); } 解題思路: 本題是使用循環來計算平均值且結果由函數值返回。 參考答案: float fun ( float *a , int n ) { int i; float ave=0.0; for(i=0; i ave=ave/n; return ave; }
|