2011-07-02 6 views
0
#include <stdio.h> 

int main(void) { 
    int numStudents; 
    int i = 0 ; 

    printf("How many students are in your class? \n"); 
    scanf("%d", &numStudents); 

    int grade[numStudents]; 

    while (i > numStudents){ 
     scanf("%d", &grade[i]); 
     printf("\n"); 
     i++; 
    } 
} 

私がしたいことは、生徒の数を取得し、多くのスキャナが成績を取得できるようにすることです。ありがとう。初心者からCへ。グレードブックアプリケーションの開始

+2

コードを使用し、各行の前に(4つのスペースをフォーマットしますか、それをすべて強調表示し、UIの '{}'ボタンをクリックして)コードを読みやすくします。そして、あなたが何をする必要があるかを私たちに伝えるのではなく、あなたが立ち往生している場所と試したことを正確に教えてください。 –

+1

また、 'while(i> numStudents)'を 'while(i

答えて

4
while (i > numStudents){ 
    scanf("%d", &grade[i]); 
    printf("\n"); 
    i++; 
} 

whileの状態は後方です。ループ本体は決して実行されません。

1

コードに2つの主な問題があります。まず、コンパイル時に配列gradeのサイズを知っていなければなりません。また、どれくらいの量が必要なのかを知った後に割り当てる必要があります。例えば

#define MAX_STUDENTS 100 
    int grade[MAX_STUDENTS]; 

    scanf("%d", &numStudents); 
    if (numStudents > MAX_STUDENTS) { 
     printf("Sorry, cannot handle %d students, I can only handle %d\n", 
       numStudents, MAX_STUDENTS); 
     exit(1); 
    } 

または:

int *grade; 
    grade = malloc(sizeof(int) * numStudents); 
    if (!grade) { 
     printf("Failed to allocate memory for grades\n"); 
     exit(1); 
    } 

その他の問題があなたのwhileループです。あなたはi < numStudentsの間反復したいと思う。

+4

C99 VLAsは 'int grade [numStudents];を受け入れます。 – icktoofay

+1

旧式のコンパイラを使用している場合に備えて、それを投げました。また、彼がCを学んでいるだけであれば、すべての落とし穴を理解することなく入り込むのは悪い習慣です。 – unpythonic

+1

あなたはCで様々な方法で自分自身を噛むことができます。多くのことに落とし穴があります。それを使う方法を学ぶかもしれない。 – icktoofay

1
while (i > numStudents){ 
    scanf("%d", &grade[i]); 
    printf("\n"); 
    i++; 
} 

inumStudentsしたがってi > numStudents最初チェックイン時に偽となり、本体は実行されない以上iに等しい第ANSで0です。条件は次のようになります。

while (i < numStudents){ 
    scanf("%d", &grade[i]); 
    printf("\n"); 
    i++; 
} 

はまた、あなたはブロックの先頭にメモリのいずれかを割り当てるか、必要なサイズのメモリのブロックを割り当てることmallocを使用する必要があります

+0

C99では、ブロック内の任意の場所に自動変数割り当てが可能です。ブロックの先頭で割り当てで書かれたコードを読むほうが簡単ですが、この場合、手作業によるメモリ管理をスキップするのは簡単ですし、書かれている通りに正確なサイズの配列を取得する方が簡単です。 – sarnold

+0

しかしどちらの場合でも、numStudentsの最大数を確認することができます....スタック上またはヒープ上で2G学生がいるのは面倒です... – ShinTakezou

+0

@ sarnold:はいC99は許可します。 – phoxis