2020年MOOCC语言程序设计精髓第十一周编程题练兵

1找出按字典顺序排在最前面的国名
题目内容:
输入5个国名,编程找出并输出按字典顺序排在最前面的国名。
提示:所谓字典顺序就是将字符串按由小到大的顺序排列,因此找出按字典顺序排在最前面的国名指的就是最小的字符串。
程序的运行结果示例:
Input five countries’ names:
America↙
China↙
Japan↙
England↙
Sweden↙
The minimum is:America
输入提示信息:“Input five countries’ names:\n”
输入格式: 国名输入用gets()函数
输出格式:“The minimum is:%s\n”

#include 
#include 
#define MAX 5

int main()
{
    int i=0,j=0,minimum=0;
    char str[MAX][20];;
    printf("Input five countries' names:\n");
    gets(str[i]);
    for(i=1;i<5;i++){
        gets(str[i]);
        while(str[minimum][j]==str[i][j])
            j++;
        if(str[i][j]<str[minimum][j])
            minimum=i;
    }
    printf("The minimum is:%s\n",str[minimum]);
    return 0;
}

3月份表示
题目内容:
用指针数组保存表示每个月份的英文单词以及“Illegal month”的首地址,然后编程实现:从键盘任意输入一个数字表示月份值n,程序输出该月份的英文表示,若n不在1~12之间,则输出“Illegal month”。
程序的运行结果示例1:
Input month number:
3↙
month 3 is March
程序的运行结果示例2:
Input month number:
12↙
month 12 is December
程序的运行结果示例3:
Input month number:
14↙
Illegal month
月份输入提示信息:“Input month number:\n”
输入格式: “%d”
输出格式:
月份正确时输出格式:“month %d is %s\n”
月份错误时输出格式:"%s\n"

#include 
#include 
#define MAX 10

int main()
{
    int n;
    char str[MAX];
    printf("Input month number:\n");
    scanf("%d",&n);
    switch(n){
        case 1:strcpy(str,"January");
               break;
        case 2:strcpy(str,"February");
            break;
        case 3:strcpy(str,"March");
            break;
        case 4:strcpy(str,"April");
            break;
        case 5:strcpy(str,"May");
            break;
        case 6:strcpy(str,"June");
            break;
        case 7:strcpy(str,"July");
            break;
        case 8:strcpy(str,"August");
            break;
        case 9:strcpy(str,"September");
            break;
        case 10:strcpy(str,"October");
            break;
        case 11:strcpy(str,"November");
            break;
        case 12:strcpy(str,"December");
            break;
        default:printf("Illegal month\n");
            return 0;
    }
    printf("month %d is %s\n",n,str);
    return 0;
}

4程序改错——1
题目内容:
从键盘任意输入m个学生n门课程的成绩,然后计算每个学生各门课的总分sum和平均分aver。下面程序存在极为隐蔽的错误,请分析错误的原因,并修改程序,同时按照给出的程序运行示例检查修改后的程序。
改错:

#include  
#define STUD 30            //最多可能的学生人数
#define COURSE 5             //最多可能的考试科目数
void  Total(int *score, int sum[], float aver[], int m, int n);
void  Print(int *score, int sum[], float aver[], int m, int n);
int main(void)
{
         int     i, j, m, n, score[STUD][COURSE], sum[STUD];
         float   aver[STUD];
         printf("Enter the total number of students and courses:\n");
         scanf("%d%d",&m,&n);
         printf("Enter score:\n");
         for (i=0; i<m; i++)
         {
            for (j=0; j<n; j++)
            {
                scanf("%d", &score[i][j]);
            }
        }
        Total(*score, sum, aver, m, n);
        Print(*score, sum, aver, m, n);
        return 0;
}
 
void  Total(int *score, int sum[], float aver[], int m, int n)
{
        int  i, j;
        for (i=0; i<m; i++)
        {
            sum[i] = 0;
            for (j=0; j<n; j++)
            {
                sum[i] = sum[i] + *(score + i * n + j);
            }
            aver[i] = (float) sum[i] / n;
        }
}
 
void  Print(int *score, int sum[], float aver[], int m, int n)
{
        int  i, j;
        printf("Result:\n");
        for (i=0; i<m; i++)
        {
            for (j=0; j<n; j++)
            {
                printf("%4d\t", *(score + i * n + j));
            }
            printf("%5d\t%6.1f\n", sum[i], aver[i]);
     }
}

改正后(有错误的语句用/***** FOUND *****/标出了,便于大家对比):

#include  
#define STUD 30            //最多可能的学生人数
#define COURSE 5             //最多可能的考试科目数
void  Total(int *score, int sum[], float aver[], int m, int n);
void  Print(int *score, int sum[], float aver[], int m, int n);
int main(void)
{
         int     i, j, m, n, score[STUD][COURSE], sum[STUD];
         float   aver[STUD];
         printf("Enter the total number of students and courses:\n");
         scanf("%d%d",&m,&n);
         printf("Enter score:\n");
         for (i=0; i<m; i++)
         {
            for (j=0; j<n; j++)
            {
                scanf("%d", &score[i][j]);
            }
        }
        Total(*score, sum, aver, m, n);
        Print(*score, sum, aver, m, n);
        return 0;
}

void  Total(int *score, int sum[], float aver[], int m, int n)
{
        int  i, j;
        for (i=0; i<m; i++)
        {
            sum[i] = 0;
            for (j=0; j<n; j++)
            {
                /***** FOUND *****/
                sum[i] = sum[i] + *(score + i * COURSE + j);
            }
            aver[i] = (float) sum[i] / n;
        }
}

void  Print(int *score, int sum[], float aver[], int m, int n)
{
    int  i, j;
    printf("Result:\n");
    for (i=0; i<m; i++)
    {
        for (j=0; j<n; j++)
        {
            /***** FOUND *****/
            printf("%4d", *(score + i * COURSE + j));
        }
        printf("%5d%6.1f\n", sum[i], aver[i]);
    }
}

5程序改错——2
题目内容:
下面主函数调用函数SortString()按奥运会参赛国国名在字典中的顺序对其入场次序进行排序,目前程序存在错误,请修改正确,并按照给出的程序运行示例检查修改后的程序。
改错:

#include  
#include  
#define   M  150 /* 最多的字符串个数 */
#define   N  10 /* 字符串最大长度 */
void SortString(char *ptr[], int n);
int main()
{
  int    i, n; 
  char   *pStr[M];
  printf("How many countries?\n");
  scanf("%d",&n);
  getchar();        /* 读走输入缓冲区中的回车符 */
  printf("Input their names:\n");
  for (i=0; i<n; i++)  
  {
      gets(pStr[i]);  /* 输入n个字符串 */
  }
  SortString(pStr, n); /* 字符串按字典顺序排序 */
  printf("Sorted results:\n");
  for (i=0; i<n; i++)                    
  {
      puts(pStr[i]);  /* 输出排序后的n个字符串 */
  }
  return 0;
}
void SortString(char *ptr[], int n)
{
  int   i, j;
  char  *temp = NULL;
  for (i=0; i<n-1; i++)    
  {
      for (j=i+1; j<n; j++)
      {
         if (strcmp(ptr[j], ptr[i]) < 0)    
         {
              temp = ptr[i];
              ptr[i] = ptr[j];
              ptr[j] = temp;
         } 
      }   
  } 
}

改正后(有错误的语句用/***** FOUND *****/标出了,便于大家对比):

#include  
#include  
#define   M  150 /* 最多的字符串个数 */
#define   N  10 /* 字符串最大长度 */
void SortString(char *ptr[], int n);
int main()
{
  int    i, n;
  char   *pStr[M];
  printf("How many countries?\n");
  scanf("%d",&n);
  getchar();        /* 读走输入缓冲区中的回车符 */
  printf("Input their names:\n");
  for (i=0; i<n; i++)
  {
      /***** FOUND *****/
      //分配内存
      pStr[i]=(char *)malloc(sizeof(char));
      gets(pStr[i]);  /* 输入n个字符串 */
  }
  SortString(pStr, n); /* 字符串按字典顺序排序 */
  printf("Sorted results:\n");
  for (i=0; i<n; i++)
  {
      puts(pStr[i]);  /* 输出排序后的n个字符串 */
  }
  return 0;
}
void SortString(char *ptr[], int n)
{
  int   i, j;
  char  *temp = NULL;
  for (i=0; i<n-1; i++)
  {
      for (j=i+1; j<n; j++)
      {
         if (strcmp(ptr[j], ptr[i]) < 0)
         {
             temp = ptr[i];
             ptr[i] = ptr[j];
             ptr[j] = temp;
         }
      }
  }
}

另一种修改方式是定义二维字符数组对指针数组进行初始化:

#include  
#include  
#define   M  150 /* 最多的字符串个数 */
#define   N  10 /* 字符串最大长度 */
void SortString(char *ptr[], int n);
int main()
{
  int    i, n;
  /***** FOUND *****/
  char name[M][N];
  char   *pStr[M];
  printf("How many countries?\n");
  scanf("%d",&n);
  getchar();        /* 读走输入缓冲区中的回车符 */
  printf("Input their names:\n");
  for (i=0; i<n; i++)
  {
      /***** FOUND *****/
      pStr[i]=name[i];
      gets(pStr[i]);  /* 输入n个字符串 */
  }
  SortString(pStr, n); /* 字符串按字典顺序排序 */
  printf("Sorted results:\n");
  for (i=0; i<n; i++)
  {
      puts(pStr[i]);  /* 输出排序后的n个字符串 */
  }
  return 0;
}
void SortString(char *ptr[], int n)
{
  int   i, j;
  char  *temp = NULL;
  for (i=0; i<n-1; i++)
  {
      for (j=i+1; j<n; j++)
      {
         if (strcmp(ptr[j], ptr[i]) < 0)
         {
             temp = ptr[i];
             ptr[i] = ptr[j];
             ptr[j] = temp;
         }
      }
  }
}

6找数组最值
题目内容:
按如下函数原型编程从键盘输入一个m行n列的二维数组,然后计算数组中元素的最大值及其所在的行列下标值。其中,m和n的值由用户键盘输入。已知m和n的值都不超过10。
void InputArray(int *p, int m, int n);
int FindMax(int *p, int m, int n, int pRow, int pCol);//函数返回最大值,pRow和pCol分别返回最大值所在的行列下标
例如,程序的1次运行结果如下:
Input n:
3,4↙
Input 3
4 array:
1 2 3 4↙
5 6 7 8↙
9 0 -1 -2↙
max=9,row=2,col=0
数组行列数输入提示信息: “Input m,n:\n”
数组输入提示信息: "Input %d
%d array:\n"
输入格式:
输入数组行列数:"%d,%d"
输入数组元素:"%d"
输出格式: “max=%d,row=%d,col=%d\n”

#include 

void InputArray(int *p, int m, int n){
    int i,j;
    for(i=0;i<m;i++){
        for(j=0;j<n;j++){
            scanf("%d",p+i*n+j);
        }
    }
}

int  FindMax(int *p, int m, int n, int *pRow, int *pCol){
    int i,j;
    int max = p[(*pRow)*n+(*pCol)];
    for(i=0;i<m;i++){
        for(j=0;j<n;j++){
            if(p[i*n+j]>max){
                max=*(p+i*n+j);
                *pRow=i;
                *pCol=j;
            }
        }
    }
    return max;
}

int main(){
    int m,n,i,j,max,pRow=0,pCol=0;
    int *p=NULL;
    printf("Input m,n:\n");
    scanf("%d,%d",&m,&n);
    p=(int *)malloc(sizeof(int)*m*n);
    printf("Input %d*%d array:\n",m,n);
    InputArray(p,m,n);
    max=FindMax(p,m,n,&pRow,&pCol);
    printf("max=%d,row=%d,col=%d\n",max,pRow,pCol);
}

7冒泡排序
题目内容:
采用冒泡法进行升序排序法的基本原理是:对数组中的n个数执行n-1遍检查操作,在每一遍执行时,对数组中剩余的尚未排好序的元素进行如下操作:对相邻的两个元素进行比较,若排在后面的数小于排在前面的数,则交换其位置,这样每一遍操作中都将参与比较的数中的最大的数沉到数组的底部,经过n-1遍操作后就将全部n个数按从小到大的顺序排好序了。程序的某次运行结果如下:
Input n:10↙
Input 10 numbers:2 9 3 4 0 6 8 7 5 1↙
Sorting results: 0 1 2 3 4 5 6 7 8 9
输入数据个数提示:“Input n:”
输入数据提示:“Input %d numbers:”
输入格式: “%d”
输出提示:“Sorting results:”
输出格式:"%4d"

#include 

void BubbleSorting(int *p,int n){
    int i,j,temp;
    printf("Input %d numbers:");
    for(i=0;i<n;i++)
        scanf("%d",p+i);
    for(i=0;i<n-1;i++){
        for(j=n-1;j>=i;j--){
            if(*(p+j-1)>*(p+j)){
                temp=*(p+j-1);
                *(p+j-1)=*(p+j);
                *(p+j)=temp;
            }
        }
    }
    printf("Sorting results:");
    for(i=0;i<n;i++)
        printf("%4d",*(p+i));
}

int main(){
    int *p=NULL,n;
    printf("Input n:");
    scanf("%d",&n);
    p=(int*)calloc(10,sizeof(int));
    BubbleSorting(p,n);
}

8删除字符串中与某字符相同的字符
题目内容:
在字符串中删除与某字符相同的字符,要求用字符数组作函数参数。
程序运行结果示例:
Input a string:
hello, my friend!↙
Input a character:
!↙
Results:hello, my friend
输入字符串的提示信息: “Input a string:\n”
输入单个字符的提示信息: “Input a character:\n”
输入格式:
字符串输入用 gets()函数
单个字符输入用 getchar()函数
输出格式:“Results:%s\n”

#include 
#define MAX 20

void Deletestring(char str[],char a){
    char temp[MAX];
    int i,j;
    for(i=0,j=0;str[i]!='\0';i++){
        if(str[i]!=a){
            temp[j++]=str[i];
        }
    }
    temp[j]='\0';
    printf("Results:%s\n",temp);
}

int main(){
    char str[MAX],a;
    printf("Input a string:\n");
    gets(str);
    printf("Input a character:\n");
    a=getchar();
    Deletestring(str,a);
}

9求最大数和最小数的最大公约数
题目内容:
从键盘输入10个正整数,求出最大数,最小数,以及他们的最大公约数。要求用数组实现。
程序运行结果示例1:
Input 10 numbers:
15 23 56 87 94 105 78 19 22 43↙
maxNum=105
minNum=15
15
程序运行结果示例2:
Input 10 numbers:
33 1 2 9 8 7 5 4 0 10↙
maxNum=33
minNum=0
输入提示信息:“Input 10 numbers:\n”
输入格式: “%d”
输出格式:
最大数输出格式:“maxNum=%d\n”
最小数输出格式:“minNum=%d\n”
最大公约数输出格式:"%d"

#include 
#define MAX 10

int Gcd(int m,int n){
    if(n==0)
        return m;
    else
        return Gcd(n,m%n);
}

int Max_Min(int num[],int n){
    int max=num[0],min=num[0],i;
    for(i=0;i<n;i++){
        if(num[i]>max)
            max=num[i];
        if(num[i]<min)
            min=num[i];
    }
    printf("maxNum=%d\n",max);
    printf("minNum=%d\n",min);
    if(max==0||min==0)
        return 0;
    else{
        printf("%d",Gcd(max,min));
    }
}

int main(){
    int i,num[MAX];
    printf("Input 10 numbers:\n");
    for(i=0;i<MAX;i++)
        scanf("%d",&num[i]);
    Max_Min(num,MAX);
}

10数列合并
题目内容:
已知两个不同长度的降序排列的数列(假设序列的长度都不超过5),请编程将其合并为一个数列,使合并后的数列仍保持降序排列。
【提示】假设两个降序排列的数列分别保存在数组a和数组b中,用一个循环,从前往后依次比较保存在数组a和数组b中的两个剩余序列里的第一个数,将其中的较大者存到数组c中,当一个较短的序列存完后,再将较长的序列剩余的部分依次保存到数组c的末尾。假设两个序列的长度分别是m和n,在比较剩余序列的循环中,用i和j分别记录两个序列待比较的数组元素位置,循环结束后,若i小于m,则说明数组a中的数有剩余,将数组a中剩余的数存到数组c的末尾即可;若j小于n,则说明数组b中的数有剩余,将数组b中剩余的数存到数组c的末尾即可。在第一个循环中,用k记录往数组c中存了多少个数,在第二个循环中,就从k这个位置开始继续存储较长序列中剩余的数。
函数原型:void Merge(int a[], int b[], int c[], int m, int n);
函数功能:将两个长度分别为m和n、降序排列的子序列a和b合并后放到数组c中
程序运行结果示例1:
Input m,n:3,2↙
Input array a:5 3 1↙
Input array b:4 2↙
5 4 3 2 1
程序运行结果示例2:
Input m,n:3,3↙
Input array a:31 27 -5↙
Input array b:98 30 -7↙
98 31 30 27 -5 -7
输入两个数列长度的提示信息:“Input m,n:”
输入数列a的提示信息:“Input array a:”
输入数列b的提示信息:“Input array b:”
输入格式:
数列长度的输入格式:"%d,%d"
数列中每个数据的输入格式:"%d"
输出格式:"%4d"

#include 
#define MAX 5

void Merge(int a[], int b[], int c[], int m, int n){
    int i,j,k=0;
    for(i=0,j=0;i<m&&j<n;){
        if(a[i]>b[j])
            c[k++]=a[i++];
        else
            c[k++]=b[j++];
    }
    for(;i<m;i++){
        c[k++]=a[i];
    }
    for(;j<n;j++){
        c[k++]=b[j];
    }
    for(i=0;i<k;i++)
        printf("%4d",c[i]);
}

int main(){
    int i,m,n,a[MAX],b[MAX],c[MAX*2];
    printf("Input m,n:");
    scanf("%d,%d",&m,&n);
    printf("Input array a:");
    for(i=0;i<m;i++)
        scanf("%d",&a[i]);
    printf("Input array b:");
    for(i=0;i<n;i++)
        scanf("%d",&b[i]);
    Merge(a,b,c,m,n);
}

你可能感兴趣的:(C语言)