[ad_1]
このプログラムには 2 つの部分があります。 最初の部分は、最小値と最大値を入力し、それらの間で乱数を生成するようにユーザーに促していました。 ユーザーに 3 つのオプションを表示する 2 番目の部分に問題があり、switch ステートメントを使用して while ループを実行する必要があります。
私が試したこと:
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(){ //declare variables int max, min, amount, num; int sum = 0; char opt; float mean; //prompt user to enter the minimum possible value printf("Enter the minimum random number to be generated: "); scanf("%d",&min); //prompt user to enter the maximum possibe value printf("Enter the maximum random number to be generated: "); scanf("%d",&max); //promt user to enter the number of random numbers printf("Enter the number of random numbers: "); scanf("%d",&amount); //time function to generate random numbers srand(time(NULL)); printf("----------\n"); //prints table with the serial number and the value of the generated random number for(int i=001;i<=amount;i++){ num = (rand() % (max - min + 1)) + min; //generates random numbers if(i<=9){ //prints the first number to the ninth number printf("|00"); printf("%d | %d|\n",i,num); } else{ //prints numbers after the ninth number printf("|0"); printf("%d | %d|\n",i,num); } } printf("----------"); //performs operations multiple times do{ //displays options printf("\nSelect the option\n"); printf("a - mean of all random numbers\n"); printf("b - sum of all random numbers\n"); printf("c - Exit\n"); scanf("%c",&opt); //switch case for multiple choices switch(opt){ case 'a': for(int i=0;i<amount;i++){ sum += num; } mean=sum/amount; printf("Mean is %f\n", mean); break; case 'b': for(int i=0;i<amount;i++){ sum += num; } printf("Sum is %d\n", sum); break; case 'c': printf("Thank you!\n"); break; default: printf("No such option\n"); } }while(opt);
解決策 1
あなたの問題は、あなたが使用していることです scanf()
. の場合 scanf("%d", &var)
、scanf は、整数 (+/- を含む) を構成できるすべての ASCII 文字を読み取り、最初の非数値文字で読み取りを停止します。 この場合、それは行末の改行文字になります '\n'
. だから今、あなたがするとき scanf("%c", &opt)
、 scanf() は改行を見て、それを opt
変数。 これは、非文字形式 (%d、%f、%s など) の場合、scanf が先頭の空白 (‘ ‘、’\t’、’\n’ など) をスキップするという事実によってさらに混乱します。 %c に対しては行わないでください。
しかし、プログラムの開始時に 1 キーを押すのではなく、誤って ‘q’ を押してしまったらどうなるか見てみましょう。 何が起こるかというと、すべての scanf(“%d”, &var) 呼び出しが入力を調べ、それが空白または数字の有効な文字ではないことを確認するので、それを押し戻します。 最終的に scanf(“%c”, &opt) が呼び出され、「q」文字が読み取られて opt 変数に格納されます。 それは良いデザインではありません。 あなたがしなければならないことは、ユーザーからテキスト行を読み取り、それを解析して有効な入力 (または有効な入力をそこから抽出できるかどうか) を確認し、不正な入力に対して必要に応じて再プロンプトを出すことです。
解決策 2
あなたはあなたのオプションを読んで
scanf("%c", &opt);
最初の呼び出しで、scanf は行末文字 (\n) を読み取りますが、これは有効なオプションではありません。
最も簡単な解決策は、行末文字を無視することです
case '\n': break;
do – while ループは、実際には ‘c’ の後で終了する必要がありますが、そうではありません。
さらに、計算されたランダム値を覚えていないため、後で合計値も平均値も覚えていないことに注意してください。
このコードは非常に非効率的であり、if クエリは不要です。
for (int i = 001; i <= amount; i++) { num = (rand() % (max - min + 1)) + min; //generates random numbers if (i <= 9) { //prints the first number to the ninth number printf("|00"); printf("%d | %d|\n", i, num); } else { //prints numbers after the ninth number printf("|0"); printf("%d | %d|\n", i, num); } }
ここで簡単な
printf("%03d | %3d|\n", i, num);
はるかに優れたシンプルな出力が生成されます。
[ad_2]
Source link
コメント