Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

C++ 数式を求めるプログラム

解決したいこと

image.png
この問題に適しているプログラムを書きたいと考えています。
上手く実行することができないのですが、どこがおかしいですかね?
また、問題に適しているプログラムを書けているのか教えてください。

該当するソースコード

#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);

}

image.png

このようなエラーが出てしまいます。
お願いします。

0

5Answer

エラーで「定義されていません」と言われたら定義すれば良いだけのことです.

そもそも,問題分の要件全然満たしてなくてツッコミどころが多すぎます.「プロトタイプ宣言」とか「グローバル変数」でなければならないことすら満たせないようでは,どこに定義するかを言っても理解頂けないと思うので,解答致しかねます.

足し算が分からない人に掛け算を教えることは無理です

3Like

初めて数式書いてみたよ!書けることに感動!
\sum_{i=0}^N x_i w_i

 \sum_{i=0}^N x_i w_i

goukei = x[i] + w[i] + goukei;

107.94が答え、入力値が小数点第一位を合算しても 107.9 となります。4は何処から???
 
goukei += x[i] * w[i]; なのでは?

1Like

該当するソースコードのコードブロックが壊れちゃって見づらいので一旦書き直します

該当するソースコード
#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文の記述が中途半端になっています
printfscanf_sを使っていることですしstdio.hをインクルードします

- #include
+ #include <stdio.h>

変数xwはグローバル変数にして欲しいようなので定義を変更します

+ /* グローバル変数 */
+ 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内の変数xwが配列に変わるので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;
+   }
+ }

関数の計算結果のgoukeimainで受け取れるようします
goukeiの型はxwに合わせて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;
}
1Like

cでこの問題にトライします。暇人x
 1)数式の演算部は関数定義するの解釈 数式は関数定義する? 演算部をxiwiとした。
 2)グローバル変数を用いる意味?
   xw += Sig(x[i],w[i]); では?
 3)Nの数だけ入力で実行例がデータ管理の欠如が伺えるのでx 空白・タブ wを1行で入力
 4)プロトタイプ宣言の直下に
   float Sig(int i) {を記述するのは大人気ないのでmainの下にした。
 5)関数名はアッパー・・・は※からの下りなのでvoid Main(void) とするのを止めた。

include <stdio.h>
float x[9], w[9];
float Sig(int);
void main(void) {
   int n;
     float xw = 0.0;
     scanf("%d", &n);
     for(int i=0; i<n; i++) {
        scanf("%f %f", &x[i], &w[i]);
        xw += Sig(i);
     }
     printf("%7.2f \n", xw);
     return;
}
float Sig(int i) {
     return x[i] * w[i];
}

完成?
2
2.0 2.0
3.0 3.0
13.00

```c としてみたら色が付いた。感動!

1Like

This answer has been deleted for violation of our Terms of Service.

Your answer might help someone💌