【问题标题】:How do i make a code return to the start in C我如何使代码返回到 C 中的开头
【发布时间】:2022-09-22 21:04:44
【问题描述】:

我目前正在尝试制作一个数字伪计算器,它应该添加任意数量的整数,直到给出负数,然后将添加的整数数量、最大、最小、平均值相加,并计算给定的整数数量.我已经设法做到了所有这些,现在我应该在不使用无限循环的情况下循环它,我已经尝试了几个小时,但我就是想不通。我尝试让代码回到开头,但这似乎不起作用。我想知道是否有可能使代码返回到开头,或者是否存在另一种使其循环的方法。

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

int main(void)
{
    int number = 0;
    int big = -1;
    int small = -1;
    float average = 0;
    int sum = 0;
    int counter = 0;

    do
    {
    

printf(\"Enter a number: \");
        scanf_s(\"%d\", &number);

        if (number < 0)
            break;

        sum += number;

        if (big == -1 || number > big)
        {
            big = number;
        }

        if (small == -1 || number < small)
        {
            small = number;
        }

        counter++;

        average = (float) sum / counter;


        printf(\"sum =%d, big = %d, small = %d, counter = %d\", sum, big, small, counter);
        printf(\"average = %.2f\", average);

    } while (number >= 0);

    int yes = 1;
    int no = 0;
    

    printf(\"Would you like to run the program again (1 for yes, 0 for no)?: \");
    scanf_s(\"%d, %d\", &yes, &no);

    if (yes == 1 || no != 1)
    {
        goto main;
    }
    else


    return 0;
}
  • 像其他人一样使用 while 循环
  • “回到起点”是什么意思?如果您尝试递归调用main,那将是一个坏主意。循环是你的朋友。使用goto 被广泛反对。仅在有充分理由的情况下使用它。更换一个简单的循环不是这样的原因。
  • 另外:我不明白最后一个scanf_s(\"%d, %d\", &amp;yes, &amp;no); 的意图,它需要像1,0 这样的输入,而不是提示要求的简单10
  • @pmg:\“...不使用无限循环\”。 ;)
  • 正如pmg 所指出的,您可以提取一个方法并使用forwhile 循环多次调用该方法。您将在主循环中留下“您想再次运行程序吗”部分并将其结果用作循环的退出条件;您也可以使用 breakdo...while 构造。

标签: c loops nested-loops do-while


【解决方案1】:

两种最简单的机制是:

int main(void) {
    start:
    /* code here */
    goto start;
    /* ... */
}

int main(void) {
    int yes = 1; int no = 0;
    while( yes == 1 || no == 0 ){
        /* ... */
    }
    /* ... */
}

请注意,使用两个标志(yesno)有点奇怪。你可能宁愿做这样的事情:

int response = 'y';
while( response == 'y' || response == 'Y' ){
    ...
    if( scanf(' %c', &response) != 1 ){
        break;
    }
}

【讨论】:

    【解决方案2】:

    对于初学者main 不是标签所以这个goto 声明

    goto main;
    

    没有意义。

    这些陈述

    average = (float) sum / counter;
    
    printf("sum =%d, big = %d, small = %d, counter = %d", sum, big, small, counter);
    printf("average = %.2f", average);
    

    必须在 do-while 循环之后移动。

    在这个 if 语句中

        if (big == -1 || number > big)
        {
            big = number;
        }
    

    表达式big == -1 是多余的。

    并且您只需要在 scanf 调用中为一个变量输入一个值

    scanf_s("%d, %d", &yes, &no);
    

    至于您的问题,当您需要使用另外一个外部 do-while 或 while 循环时。

    例如

    int yes;
    
    do
    {
        do 
        {
            //...
        } while ( number >= 0 );
    
        average = (float) sum / counter;
        printf("sum =%d, big = %d, small = %d, counter = %d", sum, big, small, counter);
        printf("average = %.2f", average);
    
        printf("Would you like to run the program again (1 for yes, 0 for no)?: "); 
    } while ( scanf_s("%d", &yes ) == 1 && yes == 1 );
    

    您还需要检查用户是否立即输入了负数。在这种情况下,例如counter 将等于0。在这种情况下,您应该发出用户没有输入数字的消息,而不是输出sumbigsmallcounteraverage

    【讨论】:

      猜你喜欢
      • 2013-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-07
      • 1970-01-01
      • 2021-04-06
      相关资源
      最近更新 更多