知識點
鏈接:C 排序算法 - 趙世榮 - 博客園 (cnblogs.com)
順時針矩陣 - 趙世榮 - 博客園 (cnblogs.com)
編程題
7-2 字符串循環左移(部分正確)
錯因:1、錯誤地看出右移;
2、未考慮到大於字符數的情況
錯題:
#include<stdio.h> #include<string.h> int main(){ char str1[100+1],str2[100+1]; int N; gets(str1); scanf("%d",&N); int len; len=strlen(str1); int i,k=0; for(i=0;i<=len;i++){ if(i<=len-N){ str2[i]=str1[i+N];} else{str2[i]=str1[k]; k++;} } str2[i]='\0'; puts(str2); return 0; }
正確:
#include<stdio.h> #include<string.h> int main() { //輸入 char str1[100 + 1], str2[100 + 1]; int N; gets(str1); scanf("%d", &N); //計算 int len, i; len = strlen(str1); N%=len; for (i = 0; i < len; i++) { str2[(i - N+len) % len] = str1[i]; } str2[len] = '\0'; //輸出 puts(str2); return 0; }
7-3 順時針矩陣 (30 分)
錯題:
#include<stdio.h> #include<stdlib.h> #define X 100 int main(){ int N,m=1; int i,j,k,z,c; int a[X][X]={0}; scanf("%d",&N); for(c=0;c<=N/2+1;c++){ for(i=c;i<=N-c-1;i++){ a[c][i]=m++; } for(j=c+1;j<N-c;j++){ a[j][N-c-1]=m++; } for(k=N-c-2;k>=c;k--){ a[N-c-1][k]=m++; } for(z=N-c-2;z>=c+1;z--){ a[z][c]=m++; } } for(i=0;i<N;i++){ for(j=0;j<N;j++){ printf("%3d",a[i][j]); } printf("\n"); } }
正確:
#include<stdio.h> #include<stdlib.h> #define X 100 int main(){ int N,m=1; int i,j,k,z,c; int a[X][X]={0}; scanf("%d",&N); for(c=0;c<=N/2+1;c++){ //0 for(j=c;j<N-c;j++){ a[j][N-c-1]=m++; } for(k=N-c-2;k>=c;k--){ a[N-c-1][k]=m++; } for(z=N-c-2;z>=c+1;z--){ a[z][c]=m++; } for(i=c;i<N-c-1;i++){ a[c][i]=m++; } } for(i=0;i<N;i++){ for(j=0;j<N;j++){ printf("%4d",a[i][j]); } printf("\n"); } }
7-1 最受歡迎的菜品(部分正確)
錯因:只輸出了最后的最受歡迎的菜品
#include<stdio.h> int main(){ int n; scanf("%d",&n); int a[n+1]={0,0}; int m; while(scanf("%d",&m)!=EOF){ if(m>0&&m<=n) a[m]++; } int i; int max=1; for(i=1;i<=n+1;i++){ if(a[max]<=a[i]){ max=i; } } int j; int flag=0; for(j=1;j<=n+1;j++){ if(a[j]==a[max]){ flag=1; break; } } if(flag==0){ printf("%d %d",max,a[max]); }else{ printf("%d %d\n",j,a[j]); printf("%d %d\n",max,a[max]); } return 0; }
正確:
#include<stdio.h> int main() { //輸入 int N; scanf("%d", &N); int n, num[1000 + 1] = { 0 }; while (scanf("%d", &n) != EOF) { num[n]++; } //計算 int i,max=1; for (i = 1; i <= N; i++) { if (num[i] >= num[max]) { max = i; } } //輸出 int j; for (j = 1; j <= N; j++) { if (num[j] == num[max]) { printf("%d %d\n", j, num[j]); } } return 0; }
填空題
請完善程序,實現以下程序功能:以下程序模擬字符串處理函數strcat()的功能,對兩個字符串進行連接。首先從鍵盤上輸入兩個字符串並保存到數組s1(最多80個字符)和s2(最多80個字符)中,然后通過對字符串s2中字符逐個進行傳遞的方式,將字符串s2中的字符全部順序復制到數組s1中原有字符的后面,最后輸出s1的內容。
(部分正確)
錯誤:
#include <stdio.h> int main(void) {char s1[161],s2[81]; int i,j; gets(s1); //輸入字符串s1 gets(s2); //輸入字符串s2 i=0; //准備連接 while( s1!='\0' ) i++; for(j= 0 ; s2[j]!='\0' ;j++) //將字符串s2的內容連接到s1中 {s1[i]=s2[j]; i++ ; } s1[i+1]='\0' ; puts(s1); //輸出連接后的字符串s1 return 0; }
正確:
#include <stdio.h> int main(void) {char s1[161],s2[81]; int i,j; gets(s1); //輸入字符串s1 gets(s2); //輸入字符串s2 i=0; //准備連接 while( s1[i]!='\0' ) i++; for(j= 0 ; s2[j]!='\0' ;j++) //將字符串s2的內容連接到s1中 {s1[i]=s2[j]; i++ ; } s1[i]='\0' ; puts(s1); //輸出連接后的字符串s1 return 0; }
5-5
本題目要求運用二分查找法在數組R(已升序排序)中查找k值,輸出其位置pos(即數組下標,從0開始),如果找不到,則輸出-1。
(部分正確)
錯誤:
#include<stdio.h> #define N 10 int BSearch(int [],int,int); int main(){ int R[N],n; int pos,k; while(~scanf("%d",&n)) { for(int i=0;i<n;i++) scanf("%d",&R[i]); //按從小到大的順序輸入n個整數 scanf("%d",&k); //輸入待查找的整數k pos= (R,n,k) ; printf("%d\n",pos); } return 0; } int BSearch(int R[],int n,int x) // 二分查找函數,返回查找到的位置(數組下標,從0開始),未找到時,返回-1。 { int pos; int low=0,high=n-1,mid; for ( pos=-1;low<=high; ) { mid= (low+high)/2 ; if ( R[mid]==x ) { pos = mid ; break; } if ( x<R[mid] ) high = mid-1 ; else low = mid+1 ; } return pos; }
正確:
#include<stdio.h> #define N 10 int BSearch(int [],int,int); int main(){ int R[N],n; int pos,k; while(~scanf("%d",&n)) { for(int i=0;i<n;i++) scanf("%d",&R[i]); //按從小到大的順序輸入n個整數 scanf("%d",&k); //輸入待查找的整數k pos= BSearch(R,n,k)+1 ; printf("%d\n",pos); } return 0; } int BSearch(int R[],int n,int x) // 二分查找函數,返回查找到的位置(數組下標,從0開始),未找到時,返回-1。 { int pos; int low=0,high=n-1,mid; for ( pos=-1;low<=high; ) { mid= (low+high)/2 ; if ( x==R[mid] ) { pos = mid ; break; } if ( x<R[mid] ) high = mid-1 ; else low = mid+1 ; } return pos; }