星痕࿐ 2024-06-18 16:07 采纳率: 46.2%
浏览 4

问大家一个C语言问题。为甚么出错了

img


#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;
}
  • 写回答

1条回答 默认 最新

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

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

    在你提供的代码中,存在几个问题导致程序可能不会按预期工作。下面将详细指出这些问题,并提供修改后的代码。

    首先,注意到几个关键点:

    1. 输入学号和成绩时,使用了错误的数据类型和分隔符。
    2. 逻辑判断中的 || 应用于检查是否应该停止输入,但其后没有正确更新学生数量。
    3. 扫描成绩时,没有考虑到负数作为输入结束的条件被正确处理。
    4. 打印不及格学生名单的部分缺失。

    修改后的代码

    #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 && scanf("%ld %f", &num[i], &score[i]) == 2) {
            if (score[i] < 0) {
                // 结束输入
                break;
            }
            i++;
        }
        
        return i; // 返回有效输入的学生数量
    }
    
    // 打印不及格学生名单
    void PrintFailures(long num[], float score[], int n) {
        printf("Failed students:\n");
        for (int i = 0; i < n; i++) {
            if (score[i] < 60.0) {
                printf("Student %ld with score %.2f\n", num[i], score[i]);
            }
        }
    }
    

    解释

    1. 数据类型和分隔符:学号应使用 %ld 格式化字符读取 long 类型,成绩使用 %f 读取 float 类型。输入时使用空格而不是换行符或 \n 分隔。
    2. 逻辑判断:修改了 ReadScore 函数中的循环,使其在读取到负数成绩时跳出。
    3. 学生数量:函数返回的是实际输入的学生数量,而非不及格学生数量。
    4. 打印不及格学生:添加了一个额外的函数 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 如果要做一个老年人平板有哪些需求