2016-10-10 5 views
-4

私は下のコードを実行しようとしているが、私は出ることができないループに入っている。誰かが私のwhileループを修正するのに役立つことができますか?それは永遠に実行し続ける

ユーザーは正しい範囲値を入力できると思われるエラーメッセージが表示されるはずです。

この無限ループを修正して、用途が範囲外の値を入力したときにのみ表示されるようにすることはできますか。

#include<stdio.h> 

int main(void) { 

    int students, counter, total; 
    int marks[40]; 
    int stdno[40]; 
    total = 0; 

    printf("  ---=== IPC mark Analyser V2.0 ===---\n"); 
    printf("Please enter the number of students(between 3 and 40):"); 
    scanf("%d", &students); 

    while (students < 3 || students >40) { 
     printf("Invalid number, enter a number between 3 and 40 inclusive:"); 
     scanf("%d", &students); 
    } 

    printf("Row Std No Mrk\n"); 
    printf("--- --------- ---\n"); 

    for (counter = 0; counter < students; counter++) { 
     printf(" _________ ___\r"); 
     printf("%03d ", counter + 1); 
     scanf("%09d %3d", &stdno[counter], &marks[counter]); 

     while (marks < 0 || marks >100 || stdno < 10000000 || stdno > 999999999) { 
      printf("Error: Enter values between 0 and 100 inclusive.\n"); 
      scanf("%09d %3d", &stdno[counter], &marks[counter]); 
     } 

     return 0; 
    } 
} 
+4

ような配列の各要素を比較することができますフォーマットしてください。あなたのコードを最初に正しく。 –

+2

あなたのコードはあまりにも形式がわかりません。 – Lundin

+0

すべての警告を有効にしてコンパイルし、コンパイラが吐き出す警告を読み、エラーとして処理します。 –

答えて

2
  1. は、まずあなたがwhile (marks < 0 || marks >100 || stdno < 10000000 || stdno > 999999999)を持って誘い込むループ条件が正しくありません。 marksおよびstdnoは配列であり、数値と比較することはできません。あなたはそれについてコンパイラの警告を受けることさえできます。あなたがする必要があるのは、配列要素marks[counter]stdno[counter]と比較することです。これは、ループに入力する各値が条件と照合されるようにするためです。

  2. whileループは、printfscanfの2つのステートメントで実行する必要があります。現在のコードでは、whileループはたびにprintfを実行します。 2つのステートメントの前後に中括弧{が必要です。

    while (marks[counter] < 0 || marks[counter] >100 || stdno[counter] < 100000000 || stdno[counter] > 999999999) 
    { 
        printf("Error: Enter values between 0 and 100 inclusive.\n"); 
        scanf("%09d %3d", &stdno[counter], &marks[counter]); 
    } 
    

あなたは、さらに、ユーザに指示を与えるために上記と同じ番号を印刷することによって、これを改善することができます。

while (marks[counter] < 0 || marks[counter] >100 || stdno[counter] < 100000000 || stdno[counter] > 999999999) 
{ 
    printf("Error: Enter values between 0 and 100 inclusive.\n"); 
    printf(" _________ __\r"); 
    printf("%03d ", counter + 1); 
    scanf("%09d %3d", &stdno[counter], &marks[counter]); 
} 
0

while (marks < 0 || marks >100 || stdno < 10000000 || stdno > 999999999)

この行は、犯人のようです。まず、marks[]は配列であり、プリミティブ型ではありません。 marksは、メモリ内の配列のベースアドレスを表します。常に同じです。それを変更することはできません。

C言語では、配列はidentifier[]で表されます。同種の要素の集合です。各要素は、括弧の中の[]を使用して参照する必要があります。だから、(あなたはポインタにない場合)任意の評価や比較は、これらの要素ではなく、配列のベースアドレスを使用して行う必要があり

あなたは

while (marks[counter] < 0 || marks[counter] >100 || stdno[counter] < 10000000 || stdno[counter] > 999999999)

関連する問題