関数について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
覇龍

関数について

#1

投稿記事 by 覇龍 » 9年前

この掲示板を初めて利用させてもらう者です。
今学校のc言語の課題であらかじめ組んであったプログラムを関数ごとにわけて作るというようなものをやっています。
そこであらかじめ組んでいたプログラムをばらして下記のようなプログラムを作りました。

コード:

#include <stdio.h>

float input_data(float data[5][5]);
float calculate_data(float[5][5],float[2]);
void output_data(float[5][5],float[2]);

float input_data(float data[5][5]){
        int i;
        for(i=0;i<5;i++){
                printf("学生番号:\t");
                scanf("%lf",&data[i][0]);
                printf("身長:\t");
                scanf("%lf",&data[i][1]);
                printf("体重:\t");
                scanf("%lf",&data[i][3]);
                printf("\n");
        }
        return data[5][5];
}

float calculate_data(float data[5][5],float ave[2]){
        int i;
        float sum1=0,sum2=0,ave1,ave2;
        for(i=0;i<5;i++){
                sum1+=data[i][1];
                sum2+=data[i][3];
        }
        ave1=sum1/5.0;
        ave2=sum2/5.0;
        for(i=0;i<5;i++){
                data[i][2]=data[i][1]-ave1;
                data[i][4]=data[i][3]-ave2;
        }
        ave[0]=ave1;
        ave[1]=ave2;

        return ave[2];
}

void output_data(float data[5][5],float ave[2]){
        int i;
        float ave1,ave2;
        printf("学生番号\t 身長\t\t 平均身長との差\t 体重\t\t 平
;
        for(i=0;i<5;i++){
                printf("%6.f\t\t",data[i][0]);
                printf("%6.1f\t\t",data[i][1]);
                printf("%6.1f\t\t",data[i][2]);
                printf("%6.1f\t\t",data[i][3]);
                printf("%6.1f\n",data[i][4]);
        }
        printf("\n");
        printf("平均値\t\t %5.1lf\t\t\t\t %5.1lf",ave1,ave2);

}

main(void){
        float data[5][5],ave[2];
        float ave1,ave2;

        data[5][5]=input_data(data);
        ave[2]=calculate_data(data,ave);
        output_data(data,ave);

        return 0;
}
このプログラムを試しにコンパイル、実行しようとすると、コンパイルはできるのですが実行した際にscanfで入力した後の数字の部分の出力結果がすべて0、0.0になってしまいます。
これはcalculate_dataの計算の所がおかしいのでしょうか、それともoutput_dataの出力の所がおかしいのでしょうか。

アバター
little
記事: 44
登録日時: 13年前
連絡を取る:

Re: 関数について

#2

投稿記事 by little » 9年前

覇龍さん初めましてー。
覇龍 さんが書きました:このプログラムを試しにコンパイル、実行しようとすると、コンパイルはできるのですが
43行目が

コード:

printf("学生番号\t 身長\t\t 平均身長との差\t 体重\t\t 平均体重との差\n")
だとして進めます。
覇龍 さんが書きました:これはcalculate_dataの計算の所がおかしいのでしょうか、それともoutput_dataの出力の所がおかしいのでしょうか。
calculate_dataの計算の所はおかしくは無いと思います。output_dataの出力の所はおかしいです。
53行目

コード:

printf("平均値\t\t %5.1lf\t\t\t\t %5.1lf",ave1,ave2);
ave1,ave2が初期化されていないため出力内容が不明です。(ave[0]、ave[1]の打ちミスだと思います。)
覇龍 さんが書きました:scanfで入力した後の数字の部分の出力結果がすべて0、0.0になってしまいます。
全て0になる問題として、11、13、15行目の

コード:

scanf("%lf",&data[i][0]);
のフォーマット指定子に問題があります。
dataはfloat型の為、%lfではなく%fのはずです。 フォーマット指定子

実行結果
↑全て0ではなく出力を確認できています。
百聞は~

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 関数について

#3

投稿記事 by みけCAT » 9年前

data[5][5]およびave[2] (それぞれ2箇所)は確保された範囲外であり、アクセス(読み書き)してはいけません。

関数の引数として宣言された配列はその配列の要素の型のデータを指すポインタに変換され、実引数として渡す配列もその先頭要素へのポインタに変換されるので、戻り値を使わなくても実引数として渡した「配列のデータを直接書き換えることができます。
したがって、input_data関数およびcalculate_data関数の戻り値の型はvoidにし、無駄な代入式やreturn文は消すといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

覇龍

Re: 関数について

#4

投稿記事 by 覇龍 » 9年前

little様、みけCAT様、回答ありがとうございます。
今回は最初に回答してくださったlittle様のご指摘通りプログラムを組みなおしてみるときちんと出力結果がでました。
%lfの部分は途中でfloat文に書き換えた際に直すのを忘れていたようです。
みけCAT様のご指摘してくださったポインタについてはまだよく理解してない状態ですのでそのあたりはきちんと勉強をしようと思います。
あと、ソースコードが途中みきれてしまってたようで申し訳ありませんでした。
お二人様、回答してくださり本当に助かりました。ありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る