2017-02-20 123 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

主程序終止是否有顯式的'return',除非它有無限循環或無限遞歸的情況。 – DyZ

+2

實際上'main()'在沒有'return'的情況下隱式返回0(如果它已經到達尾部) – Dmitri

+1

@Dmitri只有在C99/C11中才是真的。在其他標準中,返回值是未定義的。 – DyZ

1

當您使用if-else語句,你應該使用{}來創建塊,除非塊是單內襯。

例如,當您使用

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()被解讀爲

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()。

此外,請確保您的塊(每個{}之間的部分)定義良好,並且不會過早關閉它們,也不會關閉它們而是關閉它們。這也會導致循環,特別是如果在有循環的地方做錯了。

此外,關於if-else語句,最後的else-if是多餘的。如果num不大於9,甚至不小於1,那麼它必須是合法的輸入,並且不需要在那裏添加if語句。

+0

即使有條件地調用'get_input()'而不是每次調用都會允許程序終止,每次滿足條件時遞歸深度仍會增加......他會更好地使用循環而不是遞歸。 – Dmitri