学校の課題
学校の課題
学校でやらされているだけの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]
課題は「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]
Re: 学校の課題
下の方、a=の式に
コードE0513 「型voidの値を型floatのテンティティに割り当てることはできません」
コードE0020「識別子paが定義されていません」
コードE0020「識別子pbが定義されていません」
b=の式に
コードE0513 「型voidの値を型floatのテンティティに割り当てることはできません」
とエラーが出ています。
main関数でpa,pbを定義しようとすると
コードE0167「型floatの引数は型floatのパラメーターと互換性がありません」
とエラーが出ます。
よく調べても対処方法がわからなかったので、詳しい回答をいただけると嬉しいです。
よろしくお願いいたします。
コードE0513 「型voidの値を型floatのテンティティに割り当てることはできません」
コードE0020「識別子paが定義されていません」
コードE0020「識別子pbが定義されていません」
b=の式に
コードE0513 「型voidの値を型floatのテンティティに割り当てることはできません」
とエラーが出ています。
main関数でpa,pbを定義しようとすると
コードE0167「型floatの引数は型floatのパラメーターと互換性がありません」
とエラーが出ます。
よく調べても対処方法がわからなかったので、詳しい回答をいただけると嬉しいです。
よろしくお願いいたします。
Re: 学校の課題
ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
全角の[]を使った[code]や[/code]は、BBCodeのcodeタグではありません。
また、大変残念ながら、この掲示板は[i]を対策なしで書くと、
終了タグが無くても斜体タグとして解釈されてしまう不親切設計となっています。
codeタグの外で書く場合は、できればU+200Bを入れたり、[ i ] のように空白を入れるなどの対策をお願いします。
エラーについては、確かに という部分が
・lmsqの戻り値はvoidなのに、その値を利用しようとしている
・未定義の識別子paおよびpbが使われている
という点で間違っていますね。
きちんと読み解いてチェックしていませんが、 とするといいかもしれません。
それ以外にも、
・未定義の識別子meanh, meanwが使われている (meanxとすると良さそう)
・lmsq関数内で、無駄にローカル変数pa, pb, x, y が定義され、同名の引数を隠してしまっている
(これらの余計なローカル変数を削除するべき)
・インデントが一般的でない
という問題がありそうですね。
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
全角の[]を使った[code]や[/code]は、BBCodeのcodeタグではありません。
また、大変残念ながら、この掲示板は[i]を対策なしで書くと、
終了タグが無くても斜体タグとして解釈されてしまう不親切設計となっています。
codeタグの外で書く場合は、できればU+200Bを入れたり、[ i ] のように空白を入れるなどの対策をお願いします。
エラーについては、確かに という部分が
・lmsqの戻り値はvoidなのに、その値を利用しようとしている
・未定義の識別子paおよびpbが使われている
という点で間違っていますね。
きちんと読み解いてチェックしていませんが、 とするといいかもしれません。
それ以外にも、
・未定義の識別子meanh, meanwが使われている (meanxとすると良さそう)
・lmsq関数内で、無駄にローカル変数pa, pb, x, y が定義され、同名の引数を隠してしまっている
(これらの余計なローカル変数を削除するべき)
・インデントが一般的でない
という問題がありそうですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 学校の課題
東上☆海美☆「
[ i ]とか、とりあえず、修正してみたみみ。
まだ、エラーが残っているみみ。
これ以上は、『回帰直線』について調べてからにするみみ。
プログラミングは、やらされてやっても、身につかないみみ。
単位、落とせばいいみみ。必修なら、学校やめるみみ。
」
[ 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, 電子ブロック 持ち。
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。
中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。
Re: 学校の課題
>>みけCAT様
回答ありがとうございます。
にしたことによりpa,pbの定義に関するエラーはなくなりましたが、lmsq関数内のローカル変数pa,pb,x,yを消去したところ、
a=の式に
コードE0513「型 "void" の値を型 "float" のエンティティに割り当てることはできません」
コードC2120「void型がほかの方と同時に使われました」
b=の式に
コードE0513「型 "void" の値を型 "float" のエンティティに割り当てることはできません」
コードC2120「void型がほかの方と同時に使われました」
のエラーが出ました。
どうすればよいでしょうか。
よろしくお願いいたします。
修正後↓
回答ありがとうございます。
にしたことにより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;
}
Re: 学校の課題
・boxさんの指摘通り余計な代入を消す学校でやらされている初心者 さんが書きました: ↑2年前どうすればよいでしょうか。
・lmsq関数の定義で何故か消えている引数を復活させる
・lmsq関数内で、初期化せずに値を参照しているローカル変数を消す (復活させた引数を参照できるようにする)
・lmsq関数の中のmean関数の宣言を消す (無害だけど、使われていないし紛らわしいので)
・main関数の中のlmsq関数の宣言を消す (lmsq関数の定義を不適切に書き換えたのに気づきにくい害が出ていると考えられるので)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 学校の課題
このコメントアウトした部分を削除します。
ところで、mx, my の値も未初期化のまま使われていますね…よくないですね…
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 学校の課題
ありがとうございます。このコメントアウトした部分を削除します。
お助けによりエラーと警告はなくなりましたが、回帰直線の係数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;
}