2017-04-05 45 views
0

不计算%和休息/退出我试图做一个小程序,在用户输入号码的清单,并在年底就显示多少在数字%是奇数或偶数。计划在C对特定输入

如果用户输入没有值(刚按下回车)它停止请求的数目,并显示该计算,但如果用户输入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(“%d”,&输入)更改为scanf(“%d”,&输入)。将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

您应该扫描一个字符串和解析它根据您的需要[有用链接](http://stackoverflow.com/questions/5406935/reading-a-string-with-scanf) –

+0

“如果(scanf函数(“% d“,&cinput)!= 1)'no。cinput是一个字符,你读取一个int :( – ThingyWotsit

+0

)你应该初始化计数器为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)。

+0

odd_counter在开始时被初始化 将even_p和odd_p修改为浮动并运行 –

+0

@KaralisArtūrs - 不,它被声明, – StoryTeller

+0

好的,我改了 int input,all [100],even [100],odd [100],even_counter = 0,even_print = 0,odd_counter = 0,odd_print = 0,total_counter = 0,total_print = 0; 但是,即使没有初始化%计算,当我将其更改为even_p和odd_p时,它们也会浮动。 这留下了“为什么odd_array中的第一个值总是为0?” –

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应该是float还是double

第三,您使用%d(即int)扫描类型为signed char的变量。改为使用scanf("%hhd", &cinput);格式说明符%d与长度子标识符hh一起告诉scanf将数值扫描为有符号字符目标(赋予printf/scanf reference)。或者:将变量类型cinput更改为int

解决了所有这些问题之后,还应该解决“为什么odd_array中的第一个值始终为0”主题。

0

您声明

char cinput; 

,然后在

scanf("%d", &cinput) 

这是不好的,非常不好用它...格式说明"%d"需要一个指向int为相应的参数,而不是一个指针char。并且intchar长(通常为4比1字节),所以输入值被存储在之外目的地cinput变量。

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