知识点
链接: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; }