C言語関係掲示板

過去ログ

No.15. 構造体を引数にする


こんにちは
構造体を引数にして関数を作り
その関数で入力してもらい
それをmain関数で表示したいのですが
できません!!
誰か教えてください!!


ソースはこれです。


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

struct SEITO{

int no;
char name[81];
int point;
};

#define SEITO_MAX 3

int GetData(struct SEITO *sei[]);

void main()
{

struct SEITO seito[3];
int i;
int total;

total=GetData(seito);

printf("平均点は%d点\n",total/3);

for(i=0;i<SEITO_MAX;i++)
{
printf("出席番号%d 名前:%s 点数:%d\n"
,seito[i].no,seito[i].name,seito[i].point);
}
}



int GetData(struct SEITO *sei[])

{

int i;
int f=0;
char ss[81];

for(i=0;i<SEITO_MAX;i++)
{
printf("%d人目の生徒番号を入力してください",i+1);

sei[i]->no=atoi(gets(ss));

printf("%d人目の生徒の名前を入力してください",i+1);

gets(sei[i]->name);

printf("%d人目の生徒の点数を入力してください",i+1);

sei[i]->point=atoi(gets(ss));

f+=sei[i]->point;
}
return f;
}

張りつけたのでちょっと汚いのですが
よろしくお願いします。


/*
できれば何をするためのプログラムかとか、
何に使う変数、関数なのか書いてもらいたいです。
とにかくコメントは書きましょう。
*/
#include<stdio.h>
#include<stdlib.h>

#define SEITO_MAX 3

struct SEITO{

int no;
char name[81];
// 81というサイズはどこから来たの?
// サイズをとるときは2の乗数にする。この場合*nameでもok
int point;
};

// int GetData(struct SEITO *sei[]);が
int GetData(struct SEITO *); // ()の中は型だけでもOK

///////////////
void main(void)
{
struct SEITO seito[3]; // せっかくだからSEITO_MAXを使う
int i;
int total;

//
total = GetData(seito);
//
printf("平均点は%d点\n", total/3); // ここもSEITO_MAX
//
for(i=0; i<SEITO_MAX; i++) {
printf("出席番号%d 名前:%s 点数:%d\n",
seito[i].no, seito[i].name, seito[i].point);
}

return;
}

////////////////////////////////
// int GetData(struct SEITO *sei[])が
int GetData(struct SEITO *sei)
{
int i;
int f = 0;// fじゃ解りづらい
char ss[81]; // ss or 81・・・?

//
for(i=0; i<SEITO_MAX; i++) {
printf("%d人目の生徒番号を入力してください", i+1);
sei->no = atoi(gets(ss));

printf("%d人目の生徒の名前を入力してください", i+1);
gets(sei->name);

printf("%d人目の生徒の点数を入力してください", i+1);
sei->point = atoi(gets(ss));

f += sei->point; // fじゃ解りづらい
++sei;
}

return f;
}


ポインタを相対的に用いると、以下のようになります。

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

struct SEITO{
int no;
char name[81];
int point;
};

#define SEITO_MAX 3

/* int GetData(struct SEITO *sei[]); */
int GetData(struct SEITO *sei);

void main()
{

struct SEITO seito[SEITO_MAX];
int i;
int total;

total=GetData(seito);

printf("平均点は%d点\n",total/3);

for(i=0;i<SEITO_MAX;i++)
{
printf("出席番号%d 名前:%s 点数:%d\n"
,seito[i].no,seito[i].name,seito[i].point);
}
}



/*int GetData(struct SEITO *sei[])*/
/* ポインタの配列ではなく、ポインタで受けてください */
int GetData(struct SEITO *sei)

{

int i;
int f=0;
char ss[81];

for(i=0;i<SEITO_MAX;i++)
{
printf("%d人目の生徒番号を入力してください",i+1);

/* sei[i]->no=atoi(gets(ss)); */
(sei+i)->no=atoi(gets(ss));

printf("%d人目の生徒の名前を入力してください",i+1);

/* gets(sei[i]->name); */
gets((sei+i)->name);

printf("%d人目の生徒の点数を入力してください",i+1);

/* sei[i]->point=atoi(gets(ss)); */
(sei+i)->point=atoi(gets(ss));

/* f+=sei[i]->point; */
f+=(sei+i)->point;
}
return f;
}


// ともじさんこれじゃダメですか

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

#define SEITO_MAX 3 // 生徒数の最大

// 生徒のデータ
struct SEITO {
int no; // 生徒番号
char name[128]; // 名前
int point; // 点数
};

// データ入力関数: 戻り値 点数の合計
int GetData(struct SEITO *sei);

void main()
{
struct SEITO seito[SEITO_MAX];
int i;
int total;

// データ入力
total = GetData(seito);

// 結果表示
printf("平均点は%d点\n", total/3);
for(i=0; i<SEITO_MAX; i++) {
printf("出席番号%d 名前:%s 点数:%d\n",
seito[i].no,seito[i].name,seito[i].point);
}

return;
}

// データ入力関数
int GetData(struct SEITO *sei)
{
/*
絶対的でもコピー取っとけば問題ないし
スッキリしませんか?
*/
struct SEITO *copy = sei;

int i;
int ret_total = 0;
char get_str[128];

// 入力
for(i=0; i<SEITO_MAX; i++) {
printf("%d人目の生徒番号を入力してください", i+1);
copy->no = atoi(gets(get_str));

printf("%d人目の生徒の名前を入力してください", i+1);
gets(copy->name);

printf("%d人目の生徒の点数を入力してください", i+1);
copy->point = atoi(gets(get_str));

ret_total += copy->point;
copy++;
}

return ret_total;
}


shuさんどうも有難うございました。
今度からちゃんとコメントを書いて
分かりやすいソースコードを心がけます。


もちろんOKです。

shuさんが絶対的にポインタを使っていたので、参考程度に相対的な例を書いてみました。
#そう、書いておけばよかったんですよね。すみません。

> 絶対的でもコピー取っとけば問題ないしスッキリしませんか?

絶対的な使い方の方がスッキリすると思います。私も絶対的に使う方が好きです。

> ta-tinさん
絶対的に使うときは、コピーを取るなど、ポインタがどこのアドレスを指しているのか、
きちんと把握しておく必要があります。
まだ曖昧なところがあるようですが、C言語を学習し始めてたった2ヶ月で、
ポインタと構造体を使ったプログラムをなんとか形にしているのは立派です。


ともじさん、どうもありがとうございました。
構造体とポインタってとて難しくて・・・
最近Cを始めたばかりなので、まだまだこれからですが
がんばります。

戻る


「初心者のためのポイント学習C言語」 Last modified:2001.7.25
Copyright(c) 2000-2002 TOMOJI All Rights Reserved