該当するソースコードのコードブロックが壊れちゃって見づらいので一旦書き直します
該当するソースコード
#include
void Keisan(double x[], double w[]) {
int goukei;
for (int i = 0; i < n; i++) {
goukei = x[i] + w[i] + goukei;
}
}
int main() {
int n;
double x, w;
printf("データ数Nを入力して下さい:"); scanf_s("%d", &n);
for (int i = 0; i < n; i++) {
printf("x[%d]:", i); scanf_s("%.1f", &x);
}
for (int i = 0; i < n; i++) {
printf("w[%d]:", i); scanf_s("%.1f", &w);
}
void Keisan(double x[], double w[]);
printf("結果は%.2fです\n", goukei);
return(0);
}
最初のinclude文の記述が中途半端になっています
printfやscanf_sを使っていることですしstdio.hをインクルードします
- #include
+ #include <stdio.h>
変数xとwはグローバル変数にして欲しいようなので定義を変更します
+ /* グローバル変数 */
+ double x[100], w[100]; /* とりあえず100個の配列を確保(nの上限は100) */
- void Keisan(double x[], double w[]) {
+ void Keisan() {
int goukei;
for (int i = 0; i < n; i++) {
goukei = x[i] + w[i] + goukei;
}
}
int main() {
int n;
- double x, w;
printf("データ数Nを入力して下さい:"); scanf_s("%d", &n);
上の変更によりmain内の変数xとwが配列に変わるのでscanf_sの第2引数もそれに合わせて添字をつけます
あとdouble型の値を受け取るのでscanf_sの第1引数は"%lf"です
for (int i = 0; i < n; i++) {
- printf("x[%d]:", i); scanf_s("%.1f", &x);
+ printf("x[%d]:", i); scanf_s("%lf", &x[i]);
}
for (int i = 0; i < n; i++) {
- printf("w[%d]:", i); scanf_s("%.1f", &w);
+ printf("w[%d]:", i); scanf_s("%lf", &w[i]);
}
Keisan関数の呼び出し方の文法が間違っているので関数呼び出しを書き直します
for (int i = 0; i < n; i++) {
printf("w[%d]:", i); scanf_s("%lf", &w[i]);
}
- void Keisan(double x[], double w[]);
+ Keisan();
printf("結果は%.2fです\n", goukei);
関数はプロトタイプ宣言してほしいそうなのでプロトタイプ宣言します。
また、わざわざプロトタイプ宣言する意味がないのでKeisan関数の定義はmainの後ろに移しておきます。
- void Keisan() {
- int goukei;
- for (int i = 0; i < n; i++) {
- goukei = x[i] + w[i] + goukei;
- }
- }
+ /* プロトタイプ宣言 */
+ void Keisan();
int main() {
int n;
...中略...
printf("結果は%.2fです\n", goukei);
return(0);
}
+ /* 関数の定義 */
+ void Keisan() {
+ int goukei;
+ for (int i = 0; i < n; i++) {
+ goukei = x[i] + w[i] + goukei;
+ }
+ }
関数の計算結果のgoukeiをmainで受け取れるようします
goukeiの型はxとwに合わせてdoubleにします
/* プロトタイプ宣言 */
- void Keisan();
+ double Keisan();
int main() {
...中略...
- Keisan();
+ double goukei = Keisan();
printf("結果は%.2fです\n", goukei);
return(0);
}
/* 関数の定義 */
- void Keisan() {
- int goukei;
+ double Keisan() {
+ double goukei;
for (int i = 0; i < n; i++) {
goukei = x[i] + w[i] + goukei;
}
+ return goukei;
}
mainでローカル変数として定義されている変数nは、Keisan関数内で参照できないので、Keisan関数の引数にして渡します。
/* プロトタイプ宣言 */
- double Keisan();
+ double Keisan(int n);
int main() {
...中略...
- double goukei = Keisan();
+ double goukei = Keisan(n);
printf("結果は%.2fです\n", goukei);
return(0);
}
/* 関数の定義 */
- double Keisan() {
+ double Keisan(int n) {
double goukei;
for (int i = 0; i < n; i++) {
goukei = x[i] + w[i] + goukei;
}
return goukei;
}
for文初回のループで未初期化のgoukei変数の値が参照されてしまう(未初期化のローカル変数の値は不定)ので、0.0で初期化しておきます。
/* 関数の定義 */
double Keisan(int n) {
- double goukei;
+ double goukei = 0.0;
for (int i = 0; i < n; i++) {
goukei = x[i] + w[i] + goukei;
}
return goukei;
}
以上をまとめたものが下のコードです。
あとは@HalHaradaさんの投稿より数式が間違っていますのでそれを修正してください。
#include <stdio.h>
/* グローバル変数 */
double x[100], w[100]; /* とりあえず100個の配列を確保(nの上限は100) */
/* プロトタイプ宣言 */
double Keisan(int n);
int main() {
int n;
printf("データ数Nを入力して下さい:"); scanf_s("%d", &n);
for (int i = 0; i < n; i++) {
printf("x[%d]:", i); scanf_s("%lf", &x[i]);
}
for (int i = 0; i < n; i++) {
printf("w[%d]:", i); scanf_s("%lf", &w[i]);
}
double goukei = Keisan(n);
printf("結果は%.2fです\n", goukei);
return(0);
}
/* 関数の定義 */
double Keisan(int n) {
double goukei = 0.0;
for (int i = 0; i < n; i++) {
goukei = x[i] + w[i] + goukei;
}
return goukei;
}