Исправление ошибок НАЗНАЧЕНИЕ.все еще над моей головой (обновленный код) - PullRequest
0 голосов
/ 21 сентября 2010

Прежде всего, это домашнее задание. Я пытался избавиться от ошибок и, как правило, испортить код дальше и в конечном итоге вернуться к исходному коду. Если бы вы могли дать мне какое-то направление (в терминах, которые я могу понять), я был бы очень признателен. Я не думаю, что наш инструктор действительно ожидает, что мы получим это, но я все еще должен попытаться. Я отправляю сообщение, но некоторое время буду отсутствовать на компьютере, поэтому не могу сразу же ответить, спасибо.

#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 ]

3 голосов
/ 21 сентября 2010

Вот еще одна проблема.

scanf возвращает количество успешных преобразований из стандартного ввода или EOF. Но что происходит, когда вы вводите пустую строку или неверный ввод?

например. ввод следующего

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

То, что вы хотите сделать, это изменить вашу программу, чтобы убедиться, что scanf возвращает 3 или EOF, а не только EOF. Если он не вернул ни одного из них, вам нужно распечатать сообщение об ошибке и снова ввести данные.

Так как это домашнее задание, я позволю тебе немного поработать.

2 голосов
/ 21 сентября 2010

Одна из проблем заключается в том, что вы усекаете и делаете целочисленное деление:

average[i] - это число с плавающей точкой, но вы косвенно присваиваете ему значение total, которое является целым числом, которое вызывает усечение. Это также означает, что вы позже делаете целочисленное деление.

Измените total на float.

Вы также не инициализируете его, поэтому сделайте:

float total = 0;
0 голосов
/ 21 сентября 2010

Мои попытки исправить вашу программу:

  1. http://ideone.com/b8LT1 Ваш код с окончательной } добавлено
    ошибки компиляции не публиковать код, который не компилируется!
  2. http://ideone.com/c8TNa добавлен тип возврата int в основную и измененные переменные в int Ошибка выполнения (SIGSEGV) - возможно, программа пытается прочитать слишком много строк
  3. http://ideone.com/iD4Lk изменено определение макроса MAX
    Это работает. Это выводит вещи! Но форматы все перепутаны
  4. http://ideone.com/ZrZMZ выглядит хорошо: -)

Вам все еще нужно проверить правильность вывода и исправить любые логические ошибки, если это не так.

0 голосов
/ 21 сентября 2010

Хорошо, самая большая проблема заключалась в том, что #define max не был равен 10, поэтому большинство ответов облажались.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...