ページ 11

データ構造と動的配列について

Posted: 2017年12月24日(日) 22:45
by gumi
お世話になっております。

現在データ構造と動的配列の使い方を学ぶ課題に取り組んでおり、
生徒の名前を入力すると、得点順(乱数発生)に並び替えができるようなコードを書きたいと考えています。
もともと書かれていたコードに、少し自身で書き加えてみたのですが、
これ以上どこに手を付けていいか分からないレベルのため、サポートいただけますと幸いです。

特に現在のコードの中で解読ができないのは以下のところです。
①student* scoresort(student* students)//studentの後ろの*は何か? scoresortの中の第一引数student*と、第二引数studentsはどんな仮引数を受け取るのか?
②student* students = (numData*) malloc(sizeof(student) * 10); //動的配列の確保??studentが何を指すのか分からない

コード:

#include <stdio.h>
#include <time.h> // for random seed
#include <stdlib.h> // for random

#define NUM_STUDENT 20

typedef struct student student;
{
    char name[];
    int score;
}

student* scoresort(student* students) //studentの後ろの*は何か? scoresortの中の第一引数student*と、第二引数studentsはどんな仮引数を受け取るのか?
{
    // 得点順に並び替えをしたい
}

int main(int argc, char** args)
{
    srand((unsigned)time(NULL));
    student* students = (numData*) malloc(sizeof(student) * 10); //動的配列の確保??studentが何を指すのか分からない
    for (int i = 0; i < NUM_STUDENT; i++)
    {
        student s;
        // ここで入力から、生徒の名前と
        // rand() % 100を使って得点を設定するコードを書く
       
        students[i] = s;
    }
    
    // 得点の高い順に並び替える
    students = scoresort(students);
    :q
    // 得点の高い順に生徒の名前と得点が出る
    for (int i = 0; i < NUM_STUDENT; i++)
    {
        
    }

    free(students);
    
    return 0;
}

Re: データ構造と動的配列について

Posted: 2017年12月24日(日) 23:30
by みけCAT
gumi さんが書きました:①student* scoresort(student* students)//studentの後ろの*は何か? scoresortの中の第一引数student*と、第二引数studentsはどんな仮引数を受け取るのか?
*はポインタ型を作る宣言子(N1570 6.7.6.1 Pointer declarators)ですね。
「第一引数student*」も「第二引数students」も存在せず、第一引数studentsがソートする配列の先頭要素へのポインタを受け取ると予想できます。
gumi さんが書きました:②student* students = (numData*) malloc(sizeof(student) * 10); //動的配列の確保??studentが何を指すのか分からない
studentは2個ありますが、どちらもtypedefされた構造体を指すと考えられます。

Re: データ構造と動的配列について

Posted: 2017年12月25日(月) 00:02
by gumi
回答ありがとうございます!!

>*はポインタ型を作る宣言子(N1570 6.7.6.1 Pointer declarators)ですね。
>「第一引数student*」も「第二引数students」も存在せず、第一引数studentsがソートする配列の先頭要素へのポインタを受け取ると予想できます。

そもそものところでつまづいているのですが、
これは関数ですよね??

自分が本で見た関数は
int 関数の名前 (仮引数)
もしくは
void 関数の名前 (仮引数)
のどちらかしかありませんでした。

今回のような書き方をするメリットはどのようなものが考えられるでしょうか?(答えづらかったら申し訳ありません)

>studentは2個ありますが、どちらもtypedefされた構造体を指すと考えられます。

そうなのですね、ありがとうございます。


取り急ぎ自分で続きにとりかかってみますが、もしにっちもさっちもいかなくなった場合、またこのスレッドで質問させていただければと思います。よって、しばらくスレッドはオープンしたままにさせていただきます。

Re: データ構造と動的配列について

Posted: 2017年12月25日(月) 00:43
by みけCAT
gumi さんが書きました:これは関数ですよね??
scoresortは関数です。
gumi さんが書きました: 自分が本で見た関数は
int 関数の名前 (仮引数)
もしくは
void 関数の名前 (仮引数)
のどちらかしかありませんでした。

今回のような書き方をするメリットはどのようなものが考えられるでしょうか?
ポインタを返せる、ということでしょうか?
gumi さんが書きました:取り急ぎ自分で続きにとりかかってみますが、
現状のコードには、
・typedefの行の後に不自然なブロック?がある
・struct studentやnumDataが定義されていない
・ゴミ:qがある
という問題があり、コンパイルが通りません。
まずはコンパイルが通る状態にしてから動作を改善していくことをおすすめします。