学校の課題

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

学校の課題

#1

投稿記事 by 学校でやらされている初心者 » 2年前

学校でやらされているだけのc言語初心者です。
課題は「10名の体重と身長を調べ平均値を算出し,作成したプログラムを用いて体重と身長の間の相関を示す回帰直線の係数a,bを求めよ。ただし、関数を用いる(平均値と係数の算出は副プログラム)。また、a= (x - mx) * (y - my) / (x - mx) * (x - mx)、b = my - a * mxで求める。mxは10名の平均身長、myは10名の平均体重。」です。
自分でもやってみたのですがエラーが出てしまい出来ません。
ご回答よろしくお願いいたします。

[code]
#include<stdio.h>
float meanx(float x[], int n)
{ float mx, sumheight = 0;
int i;
for (i = 0; i <n; i++) { sumheight += x; }
mx = sumheight / n; return mx; }

float meany( float y[], int n)
{ float my, sumweight = 0;
int i;
for (i = 0; i <n; i++) { sumweight += y; }
my = sumweight / n; return my; }

void lmsq( float x[10], float y[10], int n, float* pa, float* pb)
{ float mean(float[], int i);
{ float mx, my, * pa, * pb, u = 0, v = 0, x[10], y[10];
int i;
for (i = 0; i <n; i++) { u += (x - mx) * (y - my);
v += (x - mx) * (x - mx); }
*pa = u / v;
*pb = my - *pa * mx; } }

int main(void) { int n, i; float x[10], y[10], mx, my, a, b;
void lmsq(float[], float[], int, float*, float*);
printf("人数=");
scanf_s("%d", &n);
for (i = 0; i <n; i++) {
printf("%d人目の身長(cm)=\n", i + 1); scanf_s("%f", &x[i]); printf("%d人目の体重(kg)=\n", i + 1); scanf_s("%f", &y[i]); }
mx = meanh(x, n); my = meanw(y, n);
a = lmsq(x, y, n, *pa, *pb); b = lmsq(x, y, n, *pa, *pb);
printf("身長の平均(cm)=%.1f\n", mx);
printf("体重の平均(kg)=%.1f\n", my);
printf("回帰直線の係数a=%f\n", a);
printf("回帰直線の係数b=%f\n", b);
return 0; }
[/code]

box
記事: 2002
登録日時: 13年前

Re: 学校の課題

#2

投稿記事 by box » 2年前

自分でもやってみたのですがエラーが出てしまい出来ません。
何をしたときにどんなエラーが出たかを詳しく示してください。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

学校でやらされている初心者

Re: 学校の課題

#3

投稿記事 by 学校でやらされている初心者 » 2年前

下の方、a=の式に
コードE0513 「型voidの値を型floatのテンティティに割り当てることはできません」
コードE0020「識別子paが定義されていません」
コードE0020「識別子pbが定義されていません」

b=の式に
コードE0513 「型voidの値を型floatのテンティティに割り当てることはできません」
とエラーが出ています。


main関数でpa,pbを定義しようとすると
コードE0167「型floatの引数は型floatのパラメーターと互換性がありません」
とエラーが出ます。

よく調べても対処方法がわからなかったので、詳しい回答をいただけると嬉しいです。

よろしくお願いいたします。

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

Re: 学校の課題

#4

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

ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
全角の[]を使った[code]や[/code]は、BBCodeのcodeタグではありません。

また、大変残念ながら、この掲示板は[​i]を対策なしで書くと、
終了タグが無くても斜体タグとして解釈されてしまう不親切設計となっています。
codeタグの外で書く場合は、できればU+200Bを入れたり、[ i ] のように空白を入れるなどの対策をお願いします。

エラーについては、確かに

コード:

a = lmsq(x, y, n, *pa, *pb);  b = lmsq(x, y, n, *pa, *pb);
という部分が
・lmsqの戻り値はvoidなのに、その値を利用しようとしている
・未定義の識別子paおよびpbが使われている
という点で間違っていますね。
きちんと読み解いてチェックしていませんが、

コード:

lmsq(x, y, n, &a, &b);
とするといいかもしれません。

それ以外にも、
・未定義の識別子meanh, meanwが使われている (meanxとすると良さそう)
・lmsq関数内で、無駄にローカル変数pa, pb, x, y が定義され、同名の引数を隠してしまっている
 (これらの余計なローカル変数を削除するべき)
・インデントが一般的でない
という問題がありそうですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
あたっしゅ
記事: 663
登録日時: 13年前
住所: 東京23区
連絡を取る:

Re: 学校の課題

#5

投稿記事 by あたっしゅ » 2年前

東上☆海美☆「
[ i ]とか、とりあえず、修正してみたみみ。
まだ、エラーが残っているみみ。
これ以上は、『回帰直線』について調べてからにするみみ。

コード:

//
// https://dixq.net/forum/viewtopic.php?f=3&t=21221&sid=af563bd4e2f248e3753f3fa3c73f75ac
// 学校の課題 by 学校でやらされている初心者 - ミクプラ(ja)
//
// for VS2019
//
#include<stdio.h>


float
meanx(float x[], int n)
{
	float mx, sumheight = 0;
	int i;

	for (i = 0; i < n; i++) { sumheight += x[ i ]; }

	mx = sumheight / n; return mx;
}


float
meany(float y[], int n)
{
	float my, sumweight = 0;
	int i;

	for (i = 0; i < n; i++) { sumweight += y[ i ]; }

	my = sumweight / n; return my;
}


void
lmsq(float x[10], float y[10], int n, float* pa, float* pb)
{
	//float mean(float[], int i);
	//{ float mx, my, * pa, * pb, u = 0, v = 0, x[10], y[10];
	float mx, my, u = 0, v = 0;
	int i;

	for (i = 0; i < n; i++) {
		u += (x[ i ] - mx) * (y[ i ] - my);
		v += (x[ i ] - mx) * (x[ i ] - mx);
	}
	*pa = u / v;

	//*pb = my - *pa * mx;}
	*pb = my - *pa * mx;
}


int
main(void) {
	int n, i; float x[10], y[10], mx, my, a, b;
	//void lmsq(float[], float[], int, float*, float*);

	printf("人数=");
	scanf_s("%d", &n);
	for (i = 0; i < n; i++) {
		printf("%d人目の身長(cm)=\n", i + 1); scanf_s("%f", &x[i]); printf("%d人目の体重(kg)=\n", i + 1); scanf_s("%f", &y[i]);
	}
	//mx = meanh(x, n); my = meanw(y, n);
	mx = meanx(x, n); my = meany(y, n);

	float pa, pb;
	//a = lmsq(x, y, n, *pa, *pb); b = lmsq(x, y, n, *pa, *pb);
	a = lmsq(x, y, n, &pa, &pb); b = lmsq(x, y, n, &pa, &pb);

	printf("身長の平均(cm)=%.1f\n", mx);
	printf("体重の平均(kg)=%.1f\n", my);
	printf("回帰直線の係数a=%f\n", a);
	printf("回帰直線の係数b=%f\n", b);

	return 0;
}


// end.
プログラミングは、やらされてやっても、身につかないみみ。
単位、落とせばいいみみ。必修なら、学校やめるみみ。
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

学校でやらされている初心者

Re: 学校の課題

#6

投稿記事 by 学校でやらされている初心者 » 2年前

>>みけCAT様

回答ありがとうございます。

コード:

lmsq(x,y,n,&a,&b);
にしたことによりpa,pbの定義に関するエラーはなくなりましたが、lmsq関数内のローカル変数pa,pb,x,yを消去したところ、

a=の式に
コードE0513「型 "void" の値を型 "float" のエンティティに割り当てることはできません」
コードC2120「void型がほかの方と同時に使われました」

b=の式に
コードE0513「型 "void" の値を型 "float" のエンティティに割り当てることはできません」
コードC2120「void型がほかの方と同時に使われました」

のエラーが出ました。

どうすればよいでしょうか。
よろしくお願いいたします。

修正後↓

コード:

#include<stdio.h>

float meanx(float x[], int n) {

	float mx, sumheight = 0;
	int i;

	for (i = 0; i < n; i++) {
		sumheight += x[ i ];
	}
	mx = sumheight / n;

	return mx;
}

float meany( float y[], int n) {

	float my, sumweight = 0;
	int i;

	for (i = 0; i < n; i++) {
		sumweight += y[ i ];
	}
	my = sumweight / n;

	return my;
}


void lmsq(int n)
{
	float mean(float[], int i); {

		float mx, my, * pa, * pb, u = 0, v = 0, x[10], y[10];
		int i;

		for (i = 0; i < n; i++) {
			u += (x[ i ] - mx) * (y[ i ] - my);
			v += (x[ i ] - mx) * (x[ i ] - mx);
		}
		*pa = u / v;

		*pb = my - *pa * mx;


	}
}




int main(void) {
	int n, i;
	float x[10], y[10], mx, my, a, b,*pa,*pb;

	void lmsq(float[], float[], int, float*, float*);

	printf("人数=");
	scanf_s("%d", &n);

	for (i = 0; i < n; i++) {
		printf("%d人目の身長(cm)=\n", i + 1);
		scanf_s("%f", &x[ i ]);

		printf("%d人目の体重(kg)=\n", i + 1);
		scanf_s("%f", &y[ i ]);
	}

	mx = meanx(x, n);
	my = meany(y, n);
	a = lmsq(x, y, n, &a, &b);
	b = lmsq(x, y, n, &a, &b);


	printf("身長の平均(cm)=%.1f\n", mx);
	printf("体重の平均(kg)=%.1f\n", my);
	printf("回帰直線の係数a=%f\n", a);
	printf("回帰直線の係数b=%f\n", b);

	return 0;

}

box
記事: 2002
登録日時: 13年前

Re: 学校の課題

#7

投稿記事 by box » 2年前

コード:

	a = lmsq(x, y, n, &a, &b);
	b = lmsq(x, y, n, &a, &b);
何度も指摘されているように、lmsq関数の型はvoidなので、戻り値を取れません。
つまり、右辺に来ることはできません。

コード:

lmsq(x, y, n, &a, &b);
lmsq(x, y, n, &a, &b);
としたらどうですか?と言われています。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

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

Re: 学校の課題

#8

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

学校でやらされている初心者 さんが書きました:
2年前
どうすればよいでしょうか。
・boxさんの指摘通り余計な代入を消す
・lmsq関数の定義で何故か消えている引数を復活させる
・lmsq関数内で、初期化せずに値を参照しているローカル変数を消す (復活させた引数を参照できるようにする)
・lmsq関数の中のmean関数の宣言を消す (無害だけど、使われていないし紛らわしいので)
・main関数の中のlmsq関数の宣言を消す (lmsq関数の定義を不適切に書き換えたのに気づきにくい害が出ていると考えられるので)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

学校でやらされている初心者

Re: 学校の課題

#9

投稿記事 by 学校でやらされている初心者 » 2年前

・lmsq関数内で、初期化せずに値を参照しているローカル変数を消す (復活させた引数を参照できるようにする)
申し訳ございませんが、この操作は具体的に何を削除したら良いのか教えていただけると助かります。

よろしくお願いいたします。

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

Re: 学校の課題

#10

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

このコメントアウトした部分を削除します。

コード:

float mx, my, /* * pa, * pb, */ u = 0, v = 0 /* , x[10], y[10] */ ;
ところで、mx, my の値も未初期化のまま使われていますね…よくないですね…
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

学校でやらされている初心者

Re: 学校の課題

#11

投稿記事 by 学校でやらされている初心者 » 2年前

このコメントアウトした部分を削除します。
ありがとうございます。
お助けによりエラーと警告はなくなりましたが、回帰直線の係数a,bの値がサイトで計算した値と異なってしまいます。

計算式はこのプログラムに記載されているもので間違いありませんでした。


解決策をいただけると嬉しいです。


コード:

#include<stdio.h>

float meanx(float x[], int n) {

	float mx, sumheight = 0;
	int i;

	for (i = 0; i < n; i++) {
		sumheight += x[i];
	}
	mx = sumheight / n;

	return mx;
}

float meany(float y[], int n) {

	float my, sumweight = 0;
	int i;

	for (i = 0; i < n; i++) {
		sumweight += y[i];
	}
	my = sumweight / n;

	return my;
}


void lmsq(
	float x[10], float y[10], int n, float* pa, float* pb)
{
	{

		float mx = 0, my = 0, u = 0, v = 0;
		int i;

		for (i = 0; i < n; i++) {
			u += (x[i] - mx) * (y[i] - my);
			v += (x[i] - mx) * (x[i] - mx);
		}
		*pa = u / v;

		*pb = my - *pa * mx;


	}
}




int main(void) {
	int n, i;
	float x[10], y[10], mx, my, a, b;

	printf("人数=");
	scanf_s("%d", &n);

	for (i = 0; i < n; i++) {
		printf("%d人目の身長(cm)=", i + 1);
		scanf_s("%f", &x[i]);

		printf("%d人目の体重(kg)=", i + 1);
		scanf_s("%f", &y[i]);
	}

	mx = meanx(x, n);
	my = meany(y, n);
	lmsq(x, y, n, &a, &b);
	lmsq(x, y, n, &a, &b);


	printf("身長の平均(cm)=%.1f\n", mx);
	printf("体重の平均(kg)=%.1f\n", my);
	printf("回帰直線の係数a=%.1f\n", a);
	printf("回帰直線の係数b=%.1f\n", b);

	return 0;

}

box
記事: 2002
登録日時: 13年前

Re: 学校の課題

#12

投稿記事 by box » 2年前

lmsq関数に、meanxやmeanyで計算した
mxやmyの値を渡さなくていいんですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

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

Re: 学校の課題

#13

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

box さんが書きました:
2年前
lmsq関数に、meanxやmeanyで計算した
mxやmyの値を渡さなくていいんですか?
それほど重い処理じゃないでしょうし、lmsq関数内で(meanxやmeanyで)計算しなおせば、
値を渡す必要は無いでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

学校でやらされている初心者

Re: 学校の課題

#14

投稿記事 by 学校でやらされている初心者 » 2年前

lmsq関数に、meanxやmeanyで計算した
mxやmyの値を渡さなくていいんですか?
出来ました!!
みなさん、本当にありがとうございました。

ebiko
記事: 1
登録日時: 2年前

Re: 学校の課題

#15

投稿記事 by ebiko » 2年前

みなさん、本当にありがとうございました。
Internet Security and VPN Service

返信

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