修复ASSIGNMENT时出错。还在我头上(更新的代码)

时间:2010-09-21 00:05:18

标签: c

首先,这是家庭作业。我一直试图摆脱错误,并通常将代码拧得更远,最终回到原始代码。如果你能给我一些方向(我能理解的话),我真的很感激。我不认为我们的教练实际上希望我们得到它,但我仍然要尝试。我现在正在发帖,但是会暂时离开电脑,所以我不能马上发表评论,谢谢。

#include <stdio.h> 

#define MAX 10

main () {
  int i; 
  int num_students; 
  float total;
  long id[MAX];                // Student ID
  short midterm[MAX];          // Midterm Grade
  short final[MAX];            // Final Grade
  float average[MAX];          // Average Grade
  float avg_average;           // Average of the averages
  float diff;                    // Student's average minus class average

  // The average grade is 60% final and 40% midterm
  // Compute the course grades, the average course grade,
  // and for each student, print out their id, midterm and final grades,
  // the average grade, and their difference

  i = 0;
  // The syntax of this while loop is correct
  while (scanf("%i %i %i",&id[i], &midterm[i], &final[i]) != EOF) {
    average[i] = midterm[i]*.4 + final[i]*.6;
    i++;
  }

  num_students = i;

  for (i = 0; i < num_students; i++) {
    total = total + average[i];
  }
  avg_average = total/num_students;

  printf("ID\tMidterm\tFinal\tAvg\tAvgAvg\tDiff\n");
  printf("---\t--------\t------\t----\t-------\t-----\n");
  for (i = 0; i < num_students; i++) { 
    diff = avg_average - average[i];
    printf("%d\t", id[i]);
    printf("%i\t", midterm[i]);
    printf("%i\t", final[i]);
    printf("%f2.2\t", average[i]);
    printf("%f2.2\t",avg_average);
    printf("%f2.2\t",diff);

    printf("\n");
  }

这是我传递的数据文件:

0 94 93 
1 88 84
2 99 79
3 78 64
4 66 83
5 78 90
6 90 87
7 23 18
8 55 76
9 48 26
10 87 67
11 97 89
12 100 89
13 88 78
14 67 78
15 87 76
16 77 65
17 83 87
18 89 87

我只是没有在任何类别中获得正确的输出。

4 个答案:

答案 0 :(得分:3)

这是另一个问题。

scanf返回标准输入或EOF成功转换的次数。 但是当您输入空行或输入无效时会发生什么?

e.g。进入以下

"50 80 60" - this line OK
"garbage 3 7"  - scanf returns 2. 1st conversion fails. id[i] could contain anything.

您要做的是修改您的程序以检查scanf返回3或EOF而不仅仅是EOF。 如果它没有返回其中任何一个,那么你需要打印出错误再次请求输入。

因为它是家庭作业,所以我会让你解决这个问题。

答案 1 :(得分:2)

其中一个问题是你正在截断并进行整数除法:

average[i]是一个浮点数,但是你间接地将它分配给total,这是一个int,导致截断。这也意味着你以后要进行整数除法。

total更改为浮动。

你也没有初始化它,所以:

float total = 0;

答案 2 :(得分:0)

好吧,最大的问题是#define max不等于10,这搞砸了大部分答案。

答案 3 :(得分:0)

我尝试修复您的计划:

  1. http://ideone.com/b8LT1您的代码添加了}编译错误 不发布无法编译的代码!
  2. http://ideone.com/c8TNa将返回类型int添加到主变量并将变更更改为int 运行时错误(SIGSEGV) - 可能程序试图读取太多行
  3. http://ideone.com/iD4Lk更改了MAX宏定义
    它运行。它输出的东西!但格式都搞砸了
  4. http://ideone.com/ZrZMZ现在看起来不错: - )
  5. 您仍然需要查看输出是否正确,如果不是,则修复任何逻辑错误。