2016-04-23 2 views
2

Я не могу это объяснить, кроме того, что scanf() считывает только первое значение, а затем вычисления производятся исходя из этого.scanf() только чтение первого ввода (число)

int main() { 
    int i, students = 0; 
    char name[20]; 
    int tests; 
    float test_score; 
    int test_sum = 0; 
    char letter_grade; 
    double test_average; 

    printf("Number of students: "); 
    scanf("%d", &students); 

    for (i = 0; i < students; i++) { 
     printf("\nStudent name %d: ", i + 1); 
     scanf(" %s", &name); 
     fflush(stdin); 

     printf("Number of test(s) for %s: ", name); 
     scanf("%d", &tests); 
     fflush(stdin); 

     printf("Enter %d test score(s) for %s: ", tests, name); 
     if (i < students) { 
      scanf("%f", &test_score); 
      test_sum += test_score; 
      test_average = test_sum/(float)tests; 
     } 
     printf("Average test score: %.2f", test_average); 

     fflush(stdin); 

    } 
    return 0; 
} 

Say входит 2 студента, первый студент с 2 тестами, а затем ввести 45 87. Я должен получать 66.00, но я получаю 22.50. Для второго ученика я бы ввел 3 тестовых балла по 100 55 87, и я получил 48.33. Waaayyy выключен.

Я знаю, что я делаю что-то не так, но я не могу понять, потому что у меня было это раньше, но цикл не будет продолжаться до второго ученика.

+2

Знаете ли вы, что 'fflush (stdin)' делает? – EOF

+0

'if (i for (int j = 0; j BLUEPIXY

+0

@EOF Очищает буфер. Когда я не включаю его, моя программа заканчивается. Я вижу, насколько это избыточно, но я не знаю, почему мой код не будет стоять без них. – DSmith

ответ

0
if (i < students) { 
    scanf("%f", &test_score); 
    test_sum += test_score; 
    test_average = test_sum/(float)tests; 
} 

Должен быть:

test_sum = 0; 
for (int j = 0; j < tests; j++) { 
    scanf("%f", &test_score); 
    test_sum += test_score; 
} 
test_average = test_sum/(float)tests; 
+0

Это, кажется, единственный способ получить правильный расчет, но моя программа заканчивается сразу же и не доходит до ученика №2. Я также удалил fflush (stdin). Я занимаюсь кругами в течение нескольких часов ... – DSmith

+0

переменной test_sum должно быть установлено значение 0 перед циклом –

1

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

Непонятно, зачем вам нужно fflush(stdin) каждый раз.

0

посланного код содержит несколько проблем, в том числе

  1. можно ввести только один тест оценки
  2. случайного сочетания int и float и double переменных
  3. форматные строки карат для звонков в scanf()
  4. ряд неиспользуемых переменных
  5. неисправности проверить наличие ошибок на звонки в scanf()
  6. плохой переменной наименовании. Имена переменных должны указывать содержание или использование (или лучше оба)
  7. вызова fflush(stdin) конкретно указано, как непредсказуемое поведение в стандартном
  8. test_sum C повторно не инициализируется между студентами

Предлагаемая ниже код фиксирует все вышеуказанные проблемы и компилируется чисто

#include <stdio.h> 
#include <stdlib.h> // exit(), EXIT_FAILURE 

// prototypes 
void flushStdin(void); 

int main(void) 
{ 
    int numStudents = 0; 
    char studentName[20]; 
    int numTests; 

    double test_score; 
    double test_sum = 0.0; 
    //char letter_grade; 
    double test_average; 

    printf("Number of students: "); 
    if(1 != scanf("%d", &numStudents)) 
    { // then scanf failed 
     perror("scanf for number of students failed"); 
     exit(EXIT_FAILURE); 
    } 

    // implied else, scanf successful 

    flushStdin(); 

    for (int i = 0; i < numStudents; i++) 
    { 
     printf("\nStudent name %d: ", i + 1); 
     if(1 != scanf(" %s", studentName)) 
     { // then scanf failed 
      perror("scanf for student name failed"); 
      exit(EXIT_FAILURE); 
     } 

     // implied else, scanf successful 

     flushStdin(); 

     printf("Number of test(s) for %s: ", studentName); 
     if(1 != scanf("%d", &numTests)) 
     { // scanf failed 
      perror("scanf for number of tests failed"); 
      exit(EXIT_FAILURE); 
     } 

     // implied else, scanf successful 

     test_sum = 0.0; 
     printf("Enter %d test score(s) for %s: ", numTests, studentName); 
     for(int j=0; j<numTests; j++) 
     { 
      if(1 != scanf("%lf", &test_score)) 
      { // then scanf failed 
       perror("scanf for test score failed"); 
       exit(EXIT_FAILURE); 
      } 

      // implied else, scanf successful 

      flushStdin(); 

      test_sum += test_score; 
     } 

     test_average = test_sum/numTests; 
     printf("Average test score: %.2lf", test_average); 
    } 
    return 0; 
} // end function: main 


void flushStdin() 
{ 
    int ch; 
    while((ch = getchar()) != EOF && '\n' != ch); 
} 
Смежные вопросы