1時間ごとに更新!Amazon.co.jpで今売れている本トップ100   掲示板ランキング



掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.5712

関数に構造体を渡す方法
投稿者---かな(2006/05/11 22:23:48)


構造体の形が

番号
氏名
英語
国語
理科
社会

で、5人分のデータがあったとします。
このとき、関数に構造体をアドレスで渡し、各教科の平均をパラメタで、全体の平均を復帰値として返す場合。呼び出し側、関数側でどのようなプログラムにすれば良いのでしょうか。
よろしくお願いします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:関数に構造体を渡す方法 5713 RiSK 2006/05/11 22:49:04
<子記事> Re:関数に構造体を渡す方法 5714 REE 2006/05/12 09:25:09
<子記事> Re:関数に構造体を渡す方法 5756 かずま 2006/05/20 11:51:05


No.5713

Re:関数に構造体を渡す方法
投稿者---RiSK(2006/05/11 22:49:04)


>構造体の形が
>
>番号
>氏名
>英語
>国語
>理科
>社会
>
>で、5人分のデータがあったとします。
>このとき、関数に構造体をアドレスで渡し、
>各教科の平均をパラメタで、全体の平均を復帰値として返す場合。
>呼び出し側、関数側でどのようなプログラムにすれば良いのでしょうか。
typedef struct{
    int no;
    char name[16];
    int e,j,c,o;
}S;
S f(const S*a,const S*b,const S*c,const S*d,const S*e){
    S r={0};
    r.e=(a->e+b->e+c->e+d->e+e->e)/5;
    r.j=(a->j+b->j+c->j+d->j+e->j)/5;
    r.c=(a->c+b->c+c->c+d->c+e->c)/5;
    r.o=(a->o+b->o+c->o+d->o+e->o)/5;
    return r;
}
int main(void){
    S a,b,c,d,e;
    S r=f(&a,&b,&c,&d,&e);
}



この投稿にコメントする

削除パスワード

No.5714

Re:関数に構造体を渡す方法
投稿者---REE(2006/05/12 09:25:09)


>このとき、関数に構造体をアドレスで渡し、各教科の平均をパラメタで、全体の平均を復帰値として返す場合。呼び出し側、関数側でどのようなプログラムにすれば良いのでしょうか。
>よろしくお願いします。

構造体をSとした時の関数の型は、

int average(const S* data, int count, int *ave);
戻り値:全教科平均
data:人数分の構造体配列
count:人数 (固定なら無くてもいいが、あったほうが汎用的)
ave:教科分の平均を格納する配列

aveは配列をやめて科目別の4つのポインタにしてもよいです。

その他の回答は省略



この投稿にコメントする

削除パスワード

No.5715

Re:関数に構造体を渡す方法
投稿者---かな(2006/05/13 10:39:06)


>その他の回答は省略

関数内の処理についてですが、実際に科目の平均と全体の平均を出すにはどのようにプログラムにすれば良いのでしょうか。
よろしくお願いします。




この投稿にコメントする

削除パスワード

No.5716

Re:関数に構造体を渡す方法
投稿者---kz3(2006/05/13 11:08:27)


>実際に科目の平均と全体の平均を出すにはどのようにプログラムにすれば良いのでしょうか。

RiSKさんのコードを読んだら分かります。


この投稿にコメントする

削除パスワード

No.5717

Re:関数に構造体を渡す方法
投稿者---かな(2006/05/13 22:09:49)


>RiSKさんのコードを読んだら分かります。
この場合だと5人分のデータですが、これが10人とかそれ以上に多くなった場合大変ですよね。読み取るデータの人数が多くなっても対応できるようにするにはどのようなプログラムにすれば良いのでしょうか。



この投稿にコメントする

削除パスワード

No.5718

Re:関数に構造体を渡す方法
投稿者---kz3(2006/05/13 23:34:44)


>読み取るデータの人数が多くなっても対応できるようにするには

REEさんのコードを読んだら分かります。

>関数に構造体をアドレスで渡し、各教科の平均をパラメタで、全体の平均を復帰値として返す場合

この関数の仕様の解釈は人によって違ってくるので、
RiSKさんのコード、REEさんのコードを合わせて考えて、
自分の求める関数の仕様に仕上げたら良いです。


この投稿にコメントする

削除パスワード

No.5719

Re:関数に構造体を渡す方法
投稿者---かな(2006/05/14 15:32:00)


for (i=0; i<NUM; i++){
  sum_ave (&test[i], &each);
}
  printf ("国語の平均=%f\n",each);


/*平均を求める関数*/
float sum_ave (data *emp,float *ave)
{
  int all_jap ;
  all_jap = all_jap + emp->jap;
  *ave = all_jap / 10;
  return all;
}


呼び出し側と関数を上記のように作ってみたのですが、平均が計算できません。どこが違っていてどのように修正すれば良いのか教えてください。
※人数10人で国語の平均を求める場合です。


この投稿にコメントする

削除パスワード

No.5720

Re:関数に構造体を渡す方法
投稿者---RAPT(2006/05/14 16:51:18)


それだけじゃ分かりません。
肝心の変数の宣言も構造体の定義も、各変数の値もないうえ、
どの値を答とみなしているかも不明です。

ソースを掲載するときは、コンパイル可能な最小限のコードを
掲載してください。



この投稿にコメントする

削除パスワード

No.5721

Re:関数に構造体を渡す方法
投稿者---kz3(2006/05/14 23:12:39)


構造体の定義と変数の宣言、データのサンプルを載せてくださいね。

>(i=0; i< i++){
>	  sum_ave (&test[i], &each);
>}
>	  printf ("国語の平均=%f\n",each);
>
>
>/*平均を求める関数*/
>float sum_ave (data *emp,float *ave)
>{
>	  int all_jap ;
>	  all_jap = all_jap + emp->jap;
>	  *ave = all_jap / 10
>	  return all;
>}

sum_ave()を人数回呼び出して平均を求めようという意図のようですが、

1:all_japは初期化のされていない不定な値です。
2:eachには一人分の平均しか入りません。
3:国語しか対応していません。
4:10人のときしか対応できていません。
5:最初に提示した関数の仕様と大きく違うような...



この投稿にコメントする

削除パスワード

No.5722

Re:関数に構造体を渡す方法
投稿者---REE(2006/05/15 09:38:13)


>1:all_japは初期化のされていない不定な値です。
>2:eachには一人分の平均しか入りません。
>3:国語しか対応していません。
>4:10人のときしか対応できていません。
>5:最初に提示した関数の仕様と大きく違うような...

1と2は同意です。

ただ、まだ試行錯誤している途中段階でしょうし、
>>※人数10人で国語の平均を求める場合です。
とのことですので、3−5を指摘するのは的外れでは?



この投稿にコメントする

削除パスワード

No.5723

Re:関数に構造体を渡す方法
投稿者---kz3(2006/05/15 09:51:18)


>ただ、まだ試行錯誤している途中段階でしょうし、
>>>※人数10人で国語の平均を求める場合です。
>とのことですので、3−5を指摘するのは的外れでは?

あっと...一番下読んでいませんでした。
かなさん失礼しました。悪気はありませんでした...




この投稿にコメントする

削除パスワード

No.5756

Re:関数に構造体を渡す方法
投稿者---かずま(2006/05/20 11:51:05)


データをファイルから読まず、乱数で作るだけのサンプルプログラムです。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define DATA_SIZE  300

typedef struct {
    int  id;
    char *name;
    int  score[4]; /* 英語、国語、理科、社会 */
} Data;

int read_data(Data *data, int size)
{
    int i, j;
    size = 5;  // 5人分のデータを乱数で作る
    srand(time(0));
    for (i = 0; i < size; i++) {
        char name[32]; sprintf(name, "A%04d", i + 1);
        data[i].name = strdup(name);
        data[i].id = i + 1;
        for (j = 0; j < 4; j++) data[i].score[j] = rand() % 71 + 30;
    }
    return size;
}

void print_data(Data *data, int size)
{
    int i;
    for (i = 0; i < size; i++)
        printf("%3d  %-8s %4d %4d %4d %4d\n",
            data[i].id, data[i].name, data[i].score[0],
            data[i].score[1], data[i].score[2], data[i].score[3]);
}

double calc_data(Data *data, int size, double *score)
{
    int i, j;  double ave = 0;
    for (i = 0; i < 4; i++) {
        score[i] = 0;
        for (j = 0; j < size; j++) score[i] += data[j].score[i];
        ave += score[i] /= size;
    }
    return ave;
}

int main(void)
{
    Data data[DATA_SIZE];
    double ave, score[4];
    int n = read_data(data, DATA_SIZE);
    print_data(data, n);
    ave = calc_data(data, n, score);
    printf("英語:%.1f 国語:%.1f 英語:%.1f 社会:%.1f  合計:%.1f\n",
            score[0], score[1], score[2], score[3], ave);
    return 0;
}



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ