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