第二阶段补题报告

知识点

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

 

posted @ 2021-12-12 23:06  赵世荣  阅读(1038)  评论(0编辑  收藏  举报