【问题标题】:How to use a loop function with user input in C?如何在C中使用带有用户输入的循环函数?
【发布时间】:2013-04-27 05:54:09
【问题描述】:

这是我创建的平均程序。

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

 int main()
 {
    float f1,f2,f3;

    /* Program to calculate averages. */

    /*Asks for the numbers.*/

    printf(" Please enter three numbers.\n");
    printf ("\t" "First number please.\n");
    scanf("%f", &f1);
    printf ("\t" "Second number please.\n");
    scanf ("%f", &f2);
    printf("\t" "Third number please.\n");
    scanf("%f", &f3);

    /* Now it averages it.*/
    printf(" Thank you, wait one.\n");
    printf(" Excellent, your sum is.\n");
    printf("%f""\n", f1+f2+f3);


    printf("Your average of the sum is now!!!!\n");
    printf("%f", (f1+f2+f3)/3);

    return 0;
}

现在我会把它变成一个do-while吗?还是 if else?

【问题讨论】:

  • int i = 0;做{printf... scanf... i = i + 1}while(i
  • 除了@sashkello 的观点之外,您还可以自动保留输入值的总和,以及输入的数量。然后你可以在最后做适当的数学运算(小心除以0,如果它是一个真实世界的项目,那么小心值溢出)。 for (i = 0; i &lt; COUNT; ++i) { /* ... */ } 如果你真的知道前面的计数会更好。
  • @pickypg 在您提交评论的那一刻编辑了评论 :)
  • 通过反复试验学习 C 是一个坏主意,因为 C 有一个称为“未定义行为”的概念,它允许错误相对不被注意,因为 代码似乎可以工作。巧合的是,升级到编译器或将代码移植到其他系统会发现未定义的行为会以毁灭性的方式破坏,您想避免它!阅读一本书是学习如何编写明确定义的好方法代码。你在看哪本书?
  • 所以像 int sum sum = 我的数字除以三?正如我所说,非常新手,对于我可能会问的问题数量表示歉意。你为什么要做 i=i+1?那会是 (i=i+1) 在我加注 while (1

标签: c loops


【解决方案1】:

如果你想重复整个输入和平均过程,你可以在代码周围环绕一个循环:

#include <stdio.h>

int main(void)
{
    float f1,f2,f3;

    while (1)
    {
        printf("Please enter three numbers.\n");
        printf("\tFirst number please.\n");
        if (scanf("%f", &f1) != 1)
            break;
        printf("\tSecond number please.\n");
        if (scanf("%f", &f2) != 1)
            break;
        printf("\tThird number please.\n");
        if (scanf("%f", &f3) != 1)
            break;

        printf("Your sum     is %f\n", f1+f2+f3);
        printf("Your average is %f\n", (f1+f2+f3)/3);
    }

    return 0;
}

请注意,此代码每次使用时都会检查来自scanf() 的返回值,如果出现问题则中断循环。不需要字符串连接,单个printf()当然可以打印一个字符串和一个值。

这是一个简单的第一阶段;有更精细的技术可以使用。例如,您可以创建一个函数来提示并读取数字:

#include <stdio.h>

static int prompt_and_read(const char *prompt, float *value)
{
    printf("%s", prompt);
    if (scanf("%f", value) != 1)
        return -1;
    return 0;
}

int main(void)
{
    float f1,f2,f3;

    while (printf("Please enter three numbers.\n") > 0 &&
           prompt_and_read("\tFirst number please.\n", &f1) == 0 &&
           prompt_and_read("\tSecond number please.\n", &f2) == 0 &&
           prompt_and_read("\tThird number please.\n", &f3) == 0)
    {
        printf("Your sum     is %f\n", f1+f2+f3);
        printf("Your average is %f\n", (f1+f2+f3)/3);
    }

    return 0;
}

如果你想摆脱一组固定的三个值,那么你可以迭代直到遇到 EOF 或错误:

#include <stdio.h>

static int prompt_and_read(const char *prompt, float *value)
{
    printf("%s", prompt);
    if (scanf("%f", value) != 1)
        return -1;
    return 0;
}

int main(void)
{
    float value;
    float sum = 0.0;
    int   num = 0;

    printf("Please enter numbers.\n");

    while (prompt_and_read("\tNext number please.\n", &value) == 0)
    {
        sum += value;
        num++;
    }

    if (num > 0)
    {
        printf("You entered %d numbers\n", num);
        printf("Your sum     is %f\n", sum);
        printf("Your average is %f\n", sum / num);
    }

    return 0;
}

您可能还决定用空格替换提示字符串末尾的换行符,以便在与提示相同的行上键入值。

如果要检查是否重复计算,可以在第一版或第二版代码上使用次要变体:

#include <stdio.h>

static int prompt_and_read(const char *prompt, float *value)
{
    printf("%s", prompt);
    if (scanf("%f", value) != 1)
        return -1;
    return 0;
}

static int prompt_continue(const char *prompt)
{
    printf("%s", prompt);
    char answer[2];
    if (scanf("%1s", answer) != 1)
        return 0;
    if (answer[0] == 'y' || answer[0] == 'Y')
    {
        int c;
        while ((c = getchar()) != EOF && c != '\n')      // Gobble to newline
            ;
        return 1;
    }
    return 0;
}

int main(void)
{
    float f1,f2,f3;

    while (printf("Please enter three numbers.\n") > 0 &&
           prompt_and_read("\tFirst number please.\n", &f1) == 0 &&
           prompt_and_read("\tSecond number please.\n", &f2) == 0 &&
           prompt_and_read("\tThird number please.\n", &f3) == 0)
    {
        printf("Your sum     is %f\n", f1+f2+f3);
        printf("Your average is %f\n", (f1+f2+f3)/3);
        if (prompt_continue("Do you want to try again?") == 0)
            break;
    }

    return 0;
}

【讨论】:

  • :/ 我认为我的问题没有被正确提出,我很抱歉,我非常感谢。我想要的是,在平均之后,让我的程序说类似 printf(“你想再次使用这个程序吗?y/n?”然后在用户输入后循环程序。
  • 哦,伙计,乔纳森·莱弗勒,你肯定刚刚回答了我的问题!我非常感谢它,虽然它在我的脑海中很复杂,但我会研究它,并查找某些关键字,也就是 void、static int 等。我会从里到外学习这个,非常感谢!
  • 我想知道这些数字是否可以存储在数组中,以便在代码中进一步排序?我不经常使用 C,但如果可能的话,我需要实现您的示例以及插入排序。我已经有了排序,但在标准输入的输入方面遇到了问题。我可能会在一分钟内发布一个问题。
  • @RichardScriven:是的,你可以。您可能会使用循环,例如:for (int i = 0; i &lt; 10; i++) { if (prompt_and_read("Next number please: ", &amp;a[i]) != 0) { …handle error… } }
  • 我的有点像。我已经发布了question
【解决方案2】:

你可以这样做:

int main()
{
    float number, sum=0.0f;
    int index=0;
    do
    {
        printf ("\t" "Enter number please.\n");  //Asking for a number from user
        scanf("%f", &number); //Getting a number from a user
        sum+=number; //Add number entered to the sum
        i++;
    } while (i < 3);
    printf("Excellent, your average is %f\n", sum/3);
    return 0;
}

【讨论】:

  • 感谢您的所有回复,我很高兴你们在这方面为我提供了帮助,我将采用这些示例并围绕它们构建程序。谢谢大家!
  • @MarkusAndrewWhite :有很多方法可以改进你的代码,不要害怕花时间去改进
  • @Houssem Bdr 非常感谢,一开始我真的很害怕,因为我看到人们在这里因为他们是多么“愚蠢”而被撕裂,但我每天晚上都在努力工作,我实际上真的很享受这一切。
【解决方案3】:
#include <stdio.h>
#include <stdlib.h>

int main()
{
float f1,f2,f3;
char c='Y';

/* Program to calculate averages. */

/*Asks for the numbers.*/
do
{

printf(" Please enter three numbers.\n");
printf ("\t" "First number please.\n");
scanf("%f", &f1);
printf ("\t" "Second number please.\n");
scanf ("%f", &f2);
printf("\t" "Third number please.\n");
scanf("%f", &f3);

/* Now it averages it.*/
printf(" Thank you, wait one.\n");
printf(" Excellent, your sum is.\n");
printf("%f""\n", f1+f2+f3);

printf("Your average of the sum is now!!!!\n");
printf("%f", (f1+f2+f3)/3);

printf ("Do you wana continue [Y/N]...\n");
scanf("%c", &c);

}while(c!='N'&&c!='n');


return 0;
}

【讨论】:

  • 此解决方案的一个问题是scanf("%c", &amp;c) 将拾取前一个scanf("%f", &amp;f3) 在输入中留下的换行符,而换行符不会是Nn 所以循环将继续(实际上,它不会等待用户在继续之前输入)。这就是为什么我的类似代码使用%1s 代替格式的原因; %s 转换说明符跳过 %c 没有的前导空格(例如换行符)。您也可以在%c 之前的格式中放置一个空格:scanf(" %c", &amp;c)。您也应该检查scanf() 返回的值。
猜你喜欢
  • 2017-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
相关资源
最近更新 更多