2015-08-09 3 views
2

В моей программе я возился с ней, она просто спрашивает, сколько тестов написано, а затем возвращает среднее. Однако я немного изменил его, чтобы он спрашивал, правильно ли введены метки.для освобождения памяти цикла в C

Задача 1: Она не позволяет вводить ваши оценки для всех ваших тестов.
Проблема 2. Если метки ошибочны, она начинается, но сохраняет предыдущие входы в ее памяти? Как я могу исправить?

Вот код:

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) { 

    //int variables for grade 
    unsigned int counter; //number of grades to be entered next 
    int grade; 
    int total; 
    float average; 
    // user input 
    int userInput; // amount of tests 
    int yesNo; 
    //amount of test passed 
    unsigned int pass = 0; 
    unsigned int fail = 0; 
    int doCount = 1; 
    //unsigned int test; 

//---------------------------------------------------------------------------------------------------// 

    //standards for program to abide to 
    total = 0; //Total amount of test to be set to zero, until while statement 
    counter = 1; //Loop counter to start from one 

//---------------------------------------------------------------------------------------------------// 

    printf ("Please enter amount of test you've written so far: "); 
    scanf ("%d", &userInput); 
    //printf ("%d", userInput); 

//---------------------------------------------------------------------------------------------------// 

    do { 
     //Body of calculations of program 
     for(counter = 0; counter <= userInput; ++counter) { //for loop that correlates to userInput for amount of passes and test marks 
      printf ("Please enter percentage mark: "); //prompt for test mark 
      scanf("%d", &grade); 
      total = total + grade; 
      counter = counter + 1; 
      if (grade >= 40) { //if statement for pass or fail 
       pass = pass + 1; 
      } else { 
       fail = fail + 1; 
       } 
     }//end of for loop 
     printf ("Are the grades entered correct? (1 = yes, 2 = no): "); // user input for yesNo - are inputs correct  
     scanf ("%d", &yesNo); 
     if (yesNo == 2) { 

     } else { 
      average = ((float)total/userInput); //Getting average for tests so far 
       //if statement to clarify if you're passing 
      if (average < 40) { 
       printf ("\nYou are below sub minimum!\n"); 
       printf ("Your overall average is: %.2f %\n", average); 
       printf ("Passed: %d\n", pass); 
       printf ("Failed: %d", fail); 
      } else if (average >= 75){ 
       printf ("\nYou have a distinction agregate!\n"); 
       printf ("Your overall average is: %.2f %\n", average); 
       printf ("Passed: %d\n", pass); 
       printf ("Failed: %d", fail); 
      } else { 
       printf ("\nYour overall average is: %.2f %\n", average); 
       printf ("Passed: %d\n", pass); 
       printf ("Failed: %d", fail); 
      } 
     doCount = 2;  
     } 
    } while (doCount == 1); 

    average = ((float)total/userInput); //Getting average for tests so far 
//---------------------------------------------------------------------------------------------------//  

    getch(); 
    return 0; 
} 
+0

Обратите внимание, что ваш цикл 'для (счетчик = 0; счетчик <= UserInput; ++ счетчик)' сомнительна. Обычно вы будете использовать 'for (counter = 0; counter

+0

ваш код не удается скомпилировать. как указано, это заставляет компилятор выводить 7 предупреждений. Настоятельно рекомендуем всегда включать все предупреждения при компиляции. Затем исправьте предупреждения. Среди прочего, прототипа для 'getch()' не является прототипом, который не является переносной системной функцией. предложите вместо этого использовать 'getchar()'. – user3629249

+0

Эта строка: 'if (average <40) {' и this line: '} else if (average> = 75) {' сравнивает float с целым числом. предложите использовать: 'if (average <40.f) {', поэтому он сравнивает float с float. Аналогично '} else if (average> = 75.f) {' – user3629249

ответ

2

В ваших делах в то время как петли, когда вы приходите вокруг вашего второго прохода вам нужно сбросить переменные. В частности, полная переменная должна быть сброшена до нуля. Вы делаете это в первый раз за пределами цикла do while, но как только он находится в цикле для второго прохода, он не получает сброс до 0. Что касается не чтения всех тестовых входов, если он запрашивает 9, но вам нужно 10, то это, вероятно, проблема с циклом for. Обычно я использую счетчик counter ++, а не ++, поскольку он увеличивает счетчик после операции, а не до операции. Это может быть и не быть причиной, так как я не запускал ваш код, но стоит посмотреть.

+0

Также, как указал Виктор, ниже счетчик = счетчик + 1 не нужен. Причина в том, что цикл for делает это для вас, то есть counter ++. В результате вы могли испытать эффект пропуски каждого другого теста. Удачи. – Mark

1

Я редактировал свой код и прокомментировал изменения:

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) { 

    //int variables for grade 
    unsigned int counter; //number of grades to be entered next 
    int grade; 
    int total; 
    float average; 
    // user input 
    int userInput; // amount of tests 
    int yesNo; 
    //amount of test passed 
    unsigned int pass = 0; 
    unsigned int fail = 0; 
    int doCount = 1; 
    //unsigned int test; 

    //---------------------------------------------------------------------------------------------------// 

    //standards for program to abide to 
    total = 0; //Total amount of test to be set to zero, until while statement 
    counter = 0; //Loop counter to start from zero, It's always better to start from zero 

       //---------------------------------------------------------------------------------------------------// 

    printf("Please enter amount of test you've written so far: "); 
    scanf("%d", &userInput); 
    //printf ("%d", userInput); 

    //---------------------------------------------------------------------------------------------------// 

    do { 
     //Body of calculations of program 
     total = 0; //You need to reset total pass and fail 
     pass = 0; 
     fail = 0; 
     for (counter = 0; counter < userInput; ++counter) { //for loop that correlates to userInput for amount of passes and test marks 
      printf("Please enter percentage mark: "); //prompt for test mark 
      scanf("%d", &grade); 
      total = total + grade; 
      //counter = counter + 1; You DON't need that 
      if (grade >= 40) { //if statement for pass or fail 
       pass = pass + 1; 
      } 
      else { 
       fail = fail + 1; 
      } 
     }//end of for loop 
     printf("Are the grades entered correct? (1 = yes, 2 = no): "); // user input for yesNo - are inputs correct  
     scanf("%d", &yesNo); 
     if (yesNo == 2) { 

     } 
     else { 
      average = ((float)total/userInput); //Getting average for tests so far 
                //if statement to clarify if you're passing 
      if (average < 40) { 
       printf("\nYou are below sub minimum!\n"); 
       printf("Your overall average is: %.2f %\n", average); 
       printf("Passed: %d\n", pass); 
       printf("Failed: %d", fail); 
      } 
      else if (average >= 75) { 
       printf("\nYou have a distinction agregate!\n"); 
       printf("Your overall average is: %.2f %\n", average); 
       printf("Passed: %d\n", pass); 
       printf("Failed: %d", fail); 
      } 
      else { 
       printf("\nYour overall average is: %.2f %\n", average); 
       printf("Passed: %d\n", pass); 
       printf("Failed: %d", fail); 
      } 
      doCount = 2; 
     } 
    } while (doCount == 1); 

    average = ((float)total/userInput); //Getting average for tests so far 
              //---------------------------------------------------------------------------------------------------//  

    getch(); 
    return 0; 
} 
+0

Спасибо, ребята! очень признателен –

Смежные вопросы