C语言 函数被多次调用,尽管我只调用了一次

q1qsirdb  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(166)

我必须创建一个程序,根据用户的选择,找到一个数字的阶乘或数字的总和。如果用户按下“N”,则可以退出程序。直到用户按下'N'退出,我必须一遍又一遍地启动程序,直到用户最终退出。
我已经完成了所有必需的任务,但是当他/她找到阶乘或数字之和后调用函数时,程序会连续调用两次。这不是我期望的行为。它应该只被调用一次。
这里是代码

#include <stdio.h>
#include <stdlib.h>

void getFactorial(void);
void getSumOfDigits(void);
void startProgram();

int main() {
        startProgram();
        return 0;
}

void startProgram() {
        char operation = ' ';

        printf(
          "Select operation: \n"
          "\t1 For Factorial of a number\n"
          "\t2 For Sum of digits in a number\n\n"
          "\tPress N' to exit program\n\n"
          "\t"
        );
        operation = getchar();

        if(operation == 49)
                getFactorial();
        else if(operation == 50)
                getSumOfDigits();
        else if(operation == 78 || operation == 110)
                exit(0);
        startProgram();
}

void getFactorial() {
        int facto = 1, n1 = 0;

        printf("\n\tEnter the number you want to get factorial of: ");
        scanf("%d", &n1);

        for(int i = 1; i <= n1; i++) {
                facto*=i;
        }

        printf("\n\tFactorial: %d\n\n\t", facto);
}

void getSumOfDigits() {
        int lastDigit = 0, digit = 0, sum = 0;

        printf("\n\tEnter a digit: ");
        scanf("%d", &digit);

        while(digit) {
                lastDigit = digit % 10;
                sum += lastDigit;
                digit /= 10;
        }

        printf("\n\tSum: %d\n\n\t", sum);
}

我试图调用函数不是当startProgram()结束时,但当阶乘或数字总和程序结束时,但我没有效果。当我开始写程序时,我正在调用main,但在这个错误之后,我试图使它成为自己的独立函数,并使用main来调用它。不工作,它仍然是连续调用两次。
这是我得到一个数的阶乘后的输出。提示符将打印两次。

Select operation: 
        1 For Factorial of a number    
        2 For Sum of digits in a number

        Press N' to exit program       

        1

        Enter the number you want to get factorial of: 5

        Factorial: 120

        Select operation:
        1 For Factorial of a number
        2 For Sum of digits in a number

        Press N' to exit program

        Select operation:
        1 For Factorial of a number
        2 For Sum of digits in a number

        Press N' to exit program
qyswt5oh

qyswt5oh1#

因此,每次输入既不是“n”也不是“N”时,您都会意外地连续观察到两次提示。
但是你提供的日志(在评论中,格式阻碍了你......)我解释为
输出量:
阶乘按1数字和按2
输入:
1
输出量:
输入数字:
输入:
2
输出量:
阶乘:2
阶乘按1数字和按2
阶乘按1数字和按2
幕后发生的是:

  • 开始执行main()
  • 呼叫startProgram()
  • 开始执行main()调用的startProgram()
  • 输出:“选择操作:\n\t1对于数字的阶乘\n\t2对于数字中的位数和\n\n\t按N'退出程序\n\n\t”。
  • 读取输入,单个字符:'1'.
  • 与幻数49相比(顺便说一下,最好使用'1')是相同的。
  • 呼叫getFactorial()
  • 开始执行getFactorial()
  • 输出"\n\tEnter the number you want to get factorial of: "
  • 将输入的整数读入n1
  • 输入仍然包含您必须输入以使scanf()做出React的“return”。
  • 计算...
  • 输出"\n\tFactorial: %d\n\n\t",编号2。
  • 返回getFactorial()
  • 回到startProgram(),结束if-else-tree。
  • 递归调用startProgram()(这是你应该循环的地方.)。开始执行startProgram(),从startProgram()调用。
  • 再次输出提示,"Select operation: \n\t1 For Factorial of a number\n\t2 For Sum of digits in a number\n\n\tPress N' to exit program\n\n\t"
  • 读单个字符输入,仍挥之不去的回报。
  • 它会在你的if-else-tree中失败,因为你没有一个纯粹的else来处理你没有想到的事情。
  • 调用startProgram,从recursviely startProgram()
  • 再次输出提示符。
  • 现在输入为空,输入阅读等待某些东西。

相关问题