我试图制作一个小程序,用户输入一个数字列表,最后显示数字的百分比是奇数还是偶数。
如果用户未输入任何值(只需按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);
}
什么有效:
什么不起作用:
我无法弄清楚:
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个,用户就无法进行计算。 :(
答案 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
变量中。
接下来会发生什么是未定义的行为。