2017-01-23 9 views
0

これは私のCのプログラミングの最初の割り当てです。乱数の実装方法は非常に混乱しています。私のプログラムでは、すでにstruct studentを作成しており、そのうち10人の学生が配列を作成しました。今私はランダムなID番号を生成し、それらの10人の学生のためのテストのスコアをしなければならないが、私の先生は正確にそれを行う方法を決して決してなかった。私は変数や関数の宣言を変更することも許されていません。ここに私のコードは、これまでです:ランダムなIDを生成する方法と10人の学生の構造体のテストのスコア

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

struct student { 
    int id; 
    int score; 
}; 

struct student *allocate() { 
    return calloc(sizeof(struct student), 10); 
} 

void generate(struct student* students){ 
    /* 
     *Generate random ID and scores for 10 students, ID being between 0 and 
     * scores equal to (id* 10 % 50) 
     */ 
} 
int main() { 
    struct student *stud = allocate(); 
    generate(stud); 

    return 0; 
} 

彼はまた、この命令を与える: は、「IDを移入機能void generate(struct student* students)を書くと、引数として渡された10人の列のフィールドをスコア各学生は、IDを持っている必要があります。 (つまり配列の最初の生徒はid 0でなければなりません)各生徒のIDがxの場合、生徒の得点は(10 * x) % 50になります。

+2

ここで、命令に「ランダム」と表示されていますか?いいえ。 「配列のインデックスに対応するID」はランダムではなく、「スコアは(10 * x)%50」である必要もありません。 – kaylum

+2

命令で「乱数」とは言わない。具体的には、数値は配列のインデックスに基づいていると言います。 –

+0

これは私が混乱していた場所です。スケルトンのコメントでは、学生にランダムに言いましたが、実際の手順ではそうではありません。 – McGradyMan

答えて

1

以下を試してください。 struct student*は、10人の生徒を反復するために使用されます.は、10人の連続して保存された生徒のうちの最初の生徒を指します。 s++struct studentのサイズによってポインタを増加することに注意してください:

void generate(struct student* students){ 
    /* 
    *Generate random ID and scores for 10 students, ID being between 0 and 
    * scores equal to (id* 10 % 50) 
    */ 
    struct student* s = &students[0]; 
    for (int i=0; i<10; i++) { 
     s->id = i; 
     s->score = (i*10)%50; 
     s++; 
    } 
} 

注こと - DYZで指摘したように - あなたはまた、直接変数studentsを使用して反復処理ができ、

void generate(struct student* students){ 
    for (int i=0; i<10; i++) { 
     students->id = i; 
     students->score = (i*10)%50; 
     students++; 
    } 
} 
+1

'struct student * s =&students [0];'がなぜ必要ですか?この行を削除すれば、すべてが機能します。 – DyZ

+0

@DYZ:あなたは正しいです。パラメータを直接操作しないようにしてください。 –

+0

変更するパラメータではなく、そのコピーです。 – DyZ

関連する問題