2017-02-20 6 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'の間に相互再帰があります。そのうちの1人がもう1人を呼ぶことなく戻ることを許可する必要があります。終了時には何を決定したいですか? – Carcigenicate

+2

まずコードのインデントを開始します。 –

答えて

1

それは無限ループであり、間接再帰を作るget_inputを呼び出しis_valid呼び出す

main通話get_inputです。

あなたはのif-elseステートメントを使用すると、ブロックが単一並んでいない限り、あなたは、ブロックを作成するために} {使用する必要があります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

よう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();   

を使用する場合、)これは(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(); 

としてあなたは(IS_VALID呼び出すたびに読み込まれます)、 。 ループを防止するには、必要なときにのみget_input()を呼び出します。

さらに、ブロック(各{}の間の部分)が明確に定義されていることを確認してください。これは、特にループがある場所で間違っていると、ループを引き起こす可能性があります。

また、if-elseステートメントに関しては、最後のelse-ifは冗長です。 numが9より大きくなくても1よりも小さくない場合、それは正当な入力でなければならず、そこでif文を追加する必要はありません。

+0

条件付きで 'get_input()'を呼び出すのではなく、毎回呼び出すのではなく、プログラムを終了させて​​も、条件が満たされるたびに再帰深度が増加します...再帰の代わりにループを使う方が良いでしょう。 – Dmitri

関連する問題