2017-02-20 5 views
0

, поэтому я закончил с моим кодом, и он дает требуемый результат, но он не заканчивается! как я могу это исправить? Я попытался вернуться, но не нашел нужное место, чтобы сохранить его , поэтому я закончил с моим кодом, и он дает требуемый результат, но он не заканчивается! как я могу это исправить? я попытался вернуться, но не нашли правильное место, чтобы держать егоКак завершить программу в c?

#include<stdio.h> 

void get_input(); 
void is_valid(int num); 
void print_pattern(int num); 

void main() 
{ 
    get_input();  
} 

void get_input() 
{ 
    int a; 
    printf("Enter an odd number less than or equal to 9 and greater than 0 > "); 
    scanf("%d",&a); 
    is_valid(a); 
} 

void is_valid(int num) 
{ 
    if(num > 9) 
     printf("You have entered a number greater than 9. Please try again.\n\n"); 
    else if (num < 1) 
     printf("You have entered a number less than 1. Please try again.\n\n"); 
    else if (num % 2 == 0) 
     printf("You have entered an even number. Please try again\n\n"); 
    else if (num >= 1 && num <= 9 && num%2!=0)  
     print_pattern(num); 
    get_input();    
} 

void print_pattern(int num) 
{ 
    int j,k,l; 
    for (j = 0; j<num/2 ; j++){ 
     for (k = 0; k<num/2 - j; k++){ 
      printf(" "); 
     } 
     for(l=0; l < (2*j + 1); l++){ 
      printf("%2d",l+1); 
     } 
     printf("\n");  
    }  

    for(l=0; l <num; l++) // to print middle 
    { 
     printf("%2d",l+1); 
    } 
    printf("\n"); 

    // to print bottom 
    for (j = 0; j<num/2 ; j++){ 
     for (k = 0; k<j+1 ; k++){ 
      printf(" "); 
     } 
     for (l=1; l< num - (2*j + 1); l++){ 
      printf("%2d",l); 
     } 
     printf("\n"); 
    }   
} 
+0

Что он делает вместо прекращения? Где он застрял? – Carcigenicate

+4

У вас есть взаимная рекурсия между 'get_input' и' is_valid'. Вы должны разрешить одному из них возвращаться без вызова другого. Что вы хотите решить, когда выйти? – Carcigenicate

+2

Начните сначала отступать от своего кода. –

ответ

1

Это в бесконечном цикле

main вызовы get_input который называет is_valid который вызывает get_input делает косвенную рекурсию там.

Если вы хотите прекратить, ввести некоторые, если условие NUM как if (num < 0) return

-3

main() должен заканчиваться return 0 если ваша программа успешно. Вот краткое объяснение некоторых кодов состояния Вы можете вернуться: https://stackoverflow.com/a/22604382/1137699

+3

Основная программа завершает, имеет ли он явный «возврат» или нет - если только он не имеет случая бесконечного цикла или бесконечной рекурсии. – DyZ

+2

Фактически 'main()' неявно возвращает 0, если нет 'return' (если его конец достигнут) – Dmitri

+1

@Dmitri Это верно только в C99/C11. В других стандартах возвращаемое значение не определено. – DyZ

1

При использовании если-другое заявление, вы должны использовать {}, чтобы создать блок, если блок не одного подкладке.

Например, при использовании

if(num > 9) 
printf("You have entered a number greater than 9. Please try again.\n\n"); 
else if (num < 1) 
printf("You have entered a number less than 1. Please try again.\n\n"); 
else if (num % 2 == 0) 
printf("You have entered an even number. Please try again\n\n"); 
else if (num >= 1 && num <= 9 && num%2!=0) 
print_pattern(num); 
get_input();   

будет читаться как

if(num > 9) 
{ 
    printf("You have entered a number greater than 9. Please try again.\n\n"); 
} 
else if (num < 1) 
{ 
    printf("You have entered a number less than 1. Please try again.\n\n"); 
} 
else if (num % 2 == 0) 
{ 
    printf("You have entered an even number. Please try again\n\n"); 
} 
else if (num >= 1 && num <= 9 && num%2!=0) 
{ 
    print_pattern(num); 
} 
get_input(); 

Это приведет к вызывая get_input() каждый раз, когда вы называете is_valid(), заканчивающийся в бесконечном цикле , , чтобы предотвратить цикл, вставьте вызов get_input() только при необходимости.

Кроме того, убедитесь, что ваши блоки (части между каждым {}) четко определены, и вы не закрываете их преждевременно или не открываете блоки, не закрывая их. Это также может привести к циклу, особенно если все сделано неправильно, когда у вас есть петли.

Кроме того, в отношении утверждений if-else последнее else-if является избыточным. Если num не больше 9 и даже не меньше 1, то это должен быть юридический ввод, и нет необходимости добавлять там инструкцию if.

+0

Даже если условный вызов 'get_input()' вместо того, чтобы вызывать его каждый раз, разрешит программе завершить работу, глубина рекурсии будет по-прежнему увеличиваться каждый раз, когда это условие будет выполнено ... он будет лучше использовать цикл вместо рекурсии , – Dmitri

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