星痕࿐ 2024-06-18 23:14 采纳率: 46.2%
浏览 2

问大家一个C语言问题,为甚么我的代码

img



```c
#include  <stdio.h>
#define ARR_SIZE 30
int ReadScore(long num[], float score[]);
int main(void)
{
    int n;
    float score[ARR_SIZE];
    long num[ARR_SIZE];
    printf("Please enter num and score until score<0:\n");
    n = ReadScore(num, score);
    printf("Total students:%d", n);
    return 0;
}
//函数功能:从键盘输入一个班学生某门课的成绩及其学号
//当输入成绩为负值时,输入结束,函数返回学生总数
int ReadScore(long num[], float score[])
{
   int x=0;
   for(int i=0;i<ARR_SIZE;i++)
   {
       scanf("%d\n",&num[i]);
       
            scanf("%d",&score[i]);
        if(num[i]<0 || score[i]<0)
        break;
        else{
        if(score[i]<60.0)
        x++;
        }
        
   } 
    return x;
}

这是我的运行结果

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/d578e82ee28e44d994efa939ee539e2f.png "#left")
  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-18 23:14
    关注

    引自免费微信小程序:皆我百晓生

    从你提供的代码来看,存在几个问题导致你的程序未能按预期工作。主要问题在于scanf的使用方式以及在ReadScore函数中的逻辑处理。以下是修改后的代码,它应该能解决你遇到的问题:

    #include <stdio.h>
    
    #define ARR_SIZE 30
    
    int ReadScore(long num[], float score[]);
    void PrintFailures(long num[], float score[], int n);
    
    int main(void) {
        int n;
        float score[ARR_SIZE];
        long num[ARR_SIZE];
        
        printf("Please enter num and score until score<0:\n");
        n = ReadScore(num, score);
        printf("Total students:%d\n", n);
        
        // 打印不及格的学生名单
        PrintFailures(num, score, n);
        
        return 0;
    }
    
    // 函数功能:从键盘输入一个班学生某门课的成绩及其学号
    // 当输入成绩为负值时,输入结束,函数返回学生总数
    int ReadScore(long num[], float score[]) {
       int i = 0;
       
       while(i < ARR_SIZE) {
           // 使用空格分隔输入
           if(scanf("%ld %f", &num[i], &score[i]) != 2) {
               printf("Invalid input format.\n");
               break;
           }
           
           if(score[i] < 0) {
               break; // 结束输入
           }
           
           i++;
       }
       
       return i; // 返回实际输入的学生数
    }
    
    // 打印不及格学生名单
    void PrintFailures(long num[], float score[], int n) {
        int failCount = 0;
        
        printf("Failures:\n");
        for(int i = 0; i < n; i++) {
            if(score[i] < 60) {
                printf("Student %ld with score %.2f\n", num[i], score[i]);
                failCount++;
            }
        }
        
        printf("Total failures: %d\n", failCount);
    }
    

    这里的关键更改包括:

    1. 修改了scanf的使用,现在使用%ld %f来正确读取学号和分数,并确保输入是两个值。
    2. 使用while循环而非for循环,以便在达到数组大小前可以灵活地结束输入。
    3. 添加了一个额外的函数PrintFailures用于打印不及格的学生名单,这使得代码更清晰且易于维护。

    通过这些修改,你的程序应该能够正确读取学号和分数,计算不及格的学生数量,并打印出不及格的学生列表。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月18日

悬赏问题

  • ¥15 Xsheii7我安装这个文件的时候跳出来另一个文件已锁定文件的无一部分进程无法访问。这个该怎么解决
  • ¥15 unity terrain打包后地形错位,跟建筑不在同一个位置,怎么办
  • ¥15 FileNotFoundError 解决方案
  • ¥15 uniapp实现如下图的图表功能
  • ¥15 u-subsection如何修改相邻两个节点样式
  • ¥30 vs2010开发 WFP(windows filtering platform)
  • ¥15 服务端控制goose报文控制块的发布问题
  • ¥15 学习指导与未来导向啊
  • ¥15 求多普勒频移瞬时表达式
  • ¥15 如果要做一个老年人平板有哪些需求