m0_74289836 2023-02-10 09:30 采纳率: 85.7%
浏览 26
已结题

关于#格式控制#的问题,如何解决?

假设有n位同学m门功课的成绩如下,编一程序计算每位同学的总分以及各门功课的平均分。

img

第一行2个正整数,学生人数n和课程门数m。1 \leq n \leq 100 , 1 \leq m \leq 101≤n≤100,1≤m≤10,接下来有n行,每行一个学生的数据,依次是姓名和m门课程的成绩,姓名长度不超过8,课程成绩在0到150之间。
按照样例要求输出数据。姓名按照%-8s的格式输出,每门课程成绩按照%6d的格式输出,平均分按照%6.1f的格式控制输出。
样例:
5 4
张大明 120 142 120 256
李小红 110 107 106 280
王志强 108 100 127 290
王慧颖 115 138 119 270
李丹丹 134 129 115 284

为什么我最终输出的名字会这样呢?

img

//输入名字
for(i=0,j=4;i<n;i++)
      {
          scanf("%s",a[i]);  //a[i][j]是储存名字的 
              for(j=0;j<m;j++)
               scanf("%d",&b[i][j]);
          a[i][j]='\0';
      }

//输出名字
    for(i=0;i<n;i++)
    {
         printf("%-8s",a[i]);
         printf("%6d",c[i]);
        for(j=0;j<m;j++)
        {
           printf("%6d",b[i][j]);
        }
        printf("\n");
  • 写回答

3条回答 默认 最新

  • a5156520 2023-02-10 10:12
    关注

    因为第7行代码 a[i][j]='\0'; 这里把获取的每个学生名字字符串里的第j个下标位置添加了一个空字符,把姓名截断了,因为第4行已经获取了学生姓名,因此去掉此行即可,测试代码如下:

    #include <stdio.h> 
    #define N 100
    #define M 20
    
    int main(void){
        
        int n,m;
        scanf("%d%d",&n,&m);
        
        char a[N][20];
        int c[M];
        int b[N][M];
        
        int i,j;
        
        //输入名字
        for(i=0;i<n;i++)
          {
              scanf("%s",a[i]);  //a[i][j]是储存名字的 
              c[i]= 0;
              for(j=0;j<m;j++){
                   scanf("%d",&b[i][j]);
                   c[i]+=b[i][j]; //求每个学生的总分 
              }              
          }
          
          double avg[M];
          // 求每门功课的平均分 
          for(j=0;j<m;j++){
                  avg[j]=0;
                  for(i=0;i<n;i++){
                      avg[j]+=b[i][j];    
                }
                avg[j]/=n*1.0;
              
          }
     
    //输出名字
        for(i=0;i<n;i++)
        {
             printf("%-8s",a[i]);
             printf("%6d",c[i]);
            for(j=0;j<m;j++)
            {
               printf("%6d",b[i][j]);
            }
            printf("\n");
         }
         
         // 打印每门功课的平均分 
         printf("%-8s%6s","平均分"," ");     
         for(i=0;i<m;i++){
             printf("%6.1f",avg[i]);
         }
          
         
         
        return 0;    
    } 
    
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 2月18日
  • 已采纳回答 2月10日
  • 创建了问题 2月10日

悬赏问题

  • ¥15 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
  • ¥500 52810做蓝牙接受端
  • ¥15 基于PLC的三轴机械手程序
  • ¥15 多址通信方式的抗噪声性能和系统容量对比
  • ¥15 winform的chart曲线生成时有凸起
  • ¥15 msix packaging tool打包问题
  • ¥15 finalshell节点的搭建代码和那个端口代码教程
  • ¥15 Centos / PETSc / PETGEM
  • ¥15 centos7.9 IPv6端口telnet和端口监控问题
  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作