なぜ表示されるのか "そのようなオプションはありません" まだオプションを選択していないときは? 私のコードのエラーはなぜ/何ですか?


このプログラムには 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);

はるかに優れたシンプルな出力が生成されます。



Source link

コメント

タイトルとURLをコピーしました