2016-03-31 2 views
-1

Я пытаюсь завершить программу, когда пользователь вводит 1 в часть решения, но он все еще продолжает запрашивать ввод даже после ввода пользователем 1. Что я сделал неправильно или пропустил код? Пожалуйста, помогите, я не понимаю, что с этим не так.Как завершить программу?

#include <stdio.h> 

int main() 

{ 
    int H, N, mark, s, n, last; 
    /*Student Marks Input, Grade Output/Loop*/ 
    do 
    { 
    printf("Please enter your marks:"); 
    scanf("%i", &mark);  

    if(mark>100) 
    { 
     printf("Invalid Input\n"); 
     printf("Re-enter your marks:"); 
     scanf("%i",&mark); 
    } 

    if(mark>=80) 
    { H++; 
     printf("You got a H\n"); 
    } 
    else 
    if(mark>=70) 
    { 
     printf("You got a D\n"); 
    } 
    else 
    if(mark>=60) 
    { 
     printf("You got a C\n"); 
    } 
    else  
    if(mark>=50) 
    { 
     printf("You got a P\n"); 
    } 
    else  
    if(mark<=49) 
    { 
     N++; 
     printf("You got an N\n"); 
    } 

    /*Decisions*/ 

    printf("Are you the last student?(Y=1/N=0):"); 
    scanf("%i", &last); 


    if(last==0) 
    { 
     n++; 
    } 
    else if (last==1) 
    { 
     s++; 
    } 
    } 

    while(s>0); 

    /*Results*/ 

    if(H>N) 
     printf("Good Results"); 
    else 
     printf("Bad Results"); 




    return 0; 
} 
+0

'в то время как (s> 0);' выглядит подозрительно к бесконечному циклу. –

+1

@AlterMann Я не думаю, что это возможно для того, чтобы что-либо сделать, если 's' не изменяется в другом потоке. – Carcigenicate

+1

Правильно форматируйте и отступайте свой код. Это трудно читать. – Olaf

ответ

0

Для начала, у вас есть неопределенного поведения в вашем коде, как вы делаете операции по неинициализированному переменному.

Неинициализированные локальные переменные, такие как, например, s, имеют значение неопределенное значение и т. Д. s++ приведет к неопределенному поведению. Переменная s не является единственной, которую вы не инициализируете, а затем выполняете операции.

Тогда при инициализации s, помните, что петля держится на переборе while (s > 0), так что если вы инициализировать s до нуля, а затем сделать s++, что означает, что sбудет быть больше нуля, и цикл продолжается.

Вы должны инициализировать (я рекомендую) s до нуля, а затем цикл while (s == 0).

Или, вы знаете, просто break из цикла:

if (last == 1) 
    break; 
// No else, no special loop condition needed, loop can be infinite 
0

Ваш отступы сделал делать ... в то время как петля выглядеть, как это представляет собой бесконечный цикл. У вас также была дополнительная закрытая скобка после очков, которые удаляли время от времени ... пока. Это фактически сделало его бесконечным циклом.

#include <stdio.h> 

int main() 

{ 
    int H, N, mark, s, n=0, last; 
    /*Student Marks Input, Grade Output/Loop*/ 
    do 
    { 
     // processing 
     if(last==0) 
     { 
      n++; 
     } 
     else if (last==1) 
     { 
      s++; 
     } 
    } // This converts the do ... while into an infinite loop 

    while(s>0); // This is an invalid while since it never gets here 

Изменить это время в начале

#include <stdio.h> 

int main() 
{ 
    int H, N, mark, last; 
    int s = 0; 
    int mark = 0; 
    /*Student Marks Input, Grade Output/Loop*/ 

    while (s < 1) // First loop runs sinc s is initialized to 0. 
    { 
     // Get the entry for the next pass through the loop. 
     printf("Please enter your marks:"); 
     scanf("%d", &mark); 

     // Perform your processing 

     /*Decisions*/ 

     printf("Are you the last student?(Y=1/N=0):"); 
     scanf("%i", &last); 


     if(last==0) 
     { 
      n++; 
     } 
     else if (last==1) 
     { 
      s++; 
     } 
     // This is the end of the while loop 
     } 

     /*Results*/ 

     if(H>N) 
     printf("Good Results"); 
     else 
     printf("Bad Results"); 

     return 0; 
}   

Теперь она будет выйти из цикла, как вы хотели, когда последний студент входит в знак

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