2017-04-05 29 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變量。

接下來會發生什麼是未定義的行爲。