C中的程序不计算特定输入的%和中断/退出

时间:2017-04-05 10:09:21

标签: c

我试图制作一个小程序,用户输入一个数字列表,最后显示数字的百分比是奇数还是偶数。

如果用户未输入任何值(只需按Enter键),它将停止请求一个数字并显示计算,但如果用户输入exit则退出。另外,我想检查输入的数字是否是整数。

这是我到目前为止所得到的:

    #include <stdio.h>

int main(void)
{
    int input, all [100], even[100], odd[100], even_counter, even_print, odd_counter, odd_print, total_counter, total_print, even_p, odd_p;
    char cinput;
    for (;;)
    {
        printf("Enter a number: ");
        if (scanf("%d", &cinput) != 1) break;
        input=(int)(cinput-0);
        all[total_counter]=input; //Insert number in all numbers array

        if (input % 2 == 0)
        {
            even[even_counter]=input; //Insert number in even numbers array
            even_counter++;
            total_counter++;
        }
        if (input % 2 != 0)
        {
            odd[odd_counter]=input; //Insert number in odd numbers array
            odd_counter++;
            total_counter++;
        }
    }

    printf("\n You entered the following numbers: ");
    for (total_print=0; total_print<total_counter; total_print++)
    {
        printf("%d ", all[total_print]); //Show all entered numbers
    }
    printf("\n Even numbers are: ");
    for (even_print=0; even_print<even_counter; even_print++)
    {
        printf("%d ", even[even_print]); //Show even numbers only
    }
    printf("\n Odd numbers are: ");
    for (odd_print=0; odd_print<odd_counter; odd_print++)
    {
        printf("%d ", odd[odd_print]); //show odd numbers only
    }

    printf("\n\n Total numbers entered: %d", total_counter); //Show count of all numbers
    printf("\n Even numbers entered: %d", even_counter); //Show count of even numbers
    printf("\n Odd numbers entered: %d", odd_counter); //Show count of odd numbers

    even_p=(even_counter/total_counter)*100; //Calculate % of even numbers
    odd_p=(odd_counter/total_counter)*100; //Calculate % of odd numbers

    printf("\n\n Even numbers are %d %% of total number (%d out of %d)", even_p, even_counter, total_counter);
    printf("\n Odd numbers are %d %% of total number (%d out of %d)", odd_p, odd_counter, total_counter);
}

什么有效:

  • 将所有输入的数字保存在一个数组中,偶数和奇数输入 单独的数组。
  • 计算输入的数量,数量是多少,以及如何输入 很多都很奇怪。
  • 一旦输入非数字字符,它就会显示 结果

什么不起作用:

  • %计算总是表示它是0%。
  • 奇数组中的第一个数字是0.

我无法弄清楚:

  • 如果没有输入任何内容,如何进入结果?试着 if (scanf("%d", &cinput) != "\n") break;,但它只是 卡在循环中请求另一个号码。
  • 如果输入exit,如何退出程序?
  • 如何检查是否输入了整数?

修改

计数器初始化。 scanf(&#34;%d&#34;,&amp; cinput)更改为scanf(&#34;%d&#34;,&amp; input)。将even_p和odd_p更改为float(来自int)。现在计算工作正常,odd_array中的第一个值很好。

#include <stdio.h>

int main(void)
{
    int input, all [100], even[100], odd[100], even_counter, even_print, odd_counter, odd_print, total_counter, total_print;

    even_counter=0;
    even_print=0;
    odd_counter=0;
    odd_print=0;
    total_counter=0;
    total_print=0;
    for (;;)
    {

        printf("Enter a number: ");
        if (scanf("%d", &input) != 1) break;
        all[total_counter]=input; //Insert number in all numbers array

        if (input % 2 == 0)
        {
            even[even_counter]=input; //Insert number in even numbers array
            even_counter++;
            total_counter++;
        }
        if (input % 2 != 0)
        {
            odd[odd_counter]=input; //Insert number in odd numbers array
            odd_counter++;
            total_counter++;
        }
    }

    printf("\n You entered the following numbers: ");
    for (total_print=0; total_print<total_counter; total_print++)
    {
        printf("%d ", all[total_print]); //Show all entered numbers
    }
    printf("\n Even numbers are: ");
    for (even_print=0; even_print<even_counter; even_print++)
    {
        printf("%d ", even[even_print]); //Show even numbers only
    }
    printf("\n Odd numbers are: ");
    for (odd_print=0; odd_print<odd_counter; odd_print++)
    {
        printf("%d ", odd[odd_print]); //show odd numbers only
    }

    printf("\n\n Total numbers entered: %d", total_counter); //Show count of all numbers
    printf("\n Even numbers entered: %d", even_counter); //Show count of even numbers
    printf("\n Odd numbers entered: %d", odd_counter); //Show count of odd numbers

    float even_p=((float)(even_counter)/total_counter)*100; //Calculate % of even numbers
    float odd_p=((float)(odd_counter)/total_counter)*100; //Calculate % of odd numbers

    printf("\n\n Even numbers are %f %% of total number (%d out of %d)", even_p, even_counter, total_counter);
    printf("\n Odd numbers are %f %% of total number (%d out of %d)", odd_p, odd_counter, total_counter);
}

现在我只需要检查输入是否为整数(显示消息,但继续询问数字),如果没有输入值则转到计算,如果exit是,则退出进入。我忘记了 - 如果用户输入的数字少于10个,用户就无法进行计算。 :(

3 个答案:

答案 0 :(得分:1)

even_p=(even_counter/total_counter)*100;

以上预制整数除法。你没有得到一个精确的除数,而是它前面的整数。由于even_counter始终小于total_counter,因此您将获得零。

一个简单的解决方法是先加倍,然后除以第二个:

even_p = even_counter * 100 / total_counter;

但是你的程序无论如何都有未定义的行为。您没有初始化所有变量。例如,odd_counter未初始化,但您可以放心地在此处读取其值:

    if (input % 2 != 0)
    {
        odd[odd_counter]=input; //Insert number in odd numbers array
        odd_counter++;
        total_counter++;
    }

你无法弄清楚的事情可以自己填写帖子。这都是关于解析的。您需要读取整行(比如fgets),然后尝试解析它(例如,重复应用sscanf)。

答案 1 :(得分:1)

代码中存在几个问题。

首先,您的变量,尤其是odd_counter等未初始化。因此,像odd[odd_counter]=input这样的表达式会产生未定义的行为(实际上,程序很可能会崩溃)。请注意,在C中,整数类型的局部变量默认情况下不会初始化,既不是0也不是任何其他值。所以你需要写int odd_counter=0, even_counter=0, ...等等。否则,您的程序可能会产生正确的输出(由于未定义的行为,正确的输出是数千种可能的输出之一),但肯定无法保证。

其次,even_p=(even_counter/total_counter)*100执行整数除法(不在逗号后面),因此如果even_counter/total_counter大于0,则total_counter将始终为even_counter。所以你可以写even_p=((even_counter*100)/total_counter)(((float)even_counter)/total_counter)*100。确定even_p是{J}}还是float

第三,使用double(即int)扫描到%d类型的变量。请改用signed char;格式说明符scanf("%hhd", &cinput)和长度子说明符%d告诉hh将数值扫描到已签名的字符目标(赋予printf/scanf reference)。或者:将变量scanf的类型更改为cinput

在解决了所有这些问题之后,主题&#34;为什么odd_array中的第一个值始终为0&#34;也应该解决。

答案 2 :(得分:0)

你宣布

    char cinput;

然后在

中使用它
    scanf("%d", &cinput)

那是坏事,非常糟糕......格式说明符"%d"期望指向int的指针作为对应参数,而不是指向char的指针。并且int长于char(通常为4对1字节),因此输入值存储在目标cinput变量中。

接下来会发生什么是未定义的行为。