アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語について質問です
画像のようにエラーが出てしまうのですが、どこが間違っているのか分かりません
教えていただけるとありがたいです。
※プログラミング初心者です

・構造体→point、
・関数
→input_cordinate
点の座標を構造体pointに入れる
→center_point
2点の中点を求める
<実行例>
点S
X座標:○
Y座標:○
点T
X座標:○
Y座標:○
点Sと点Tの中点は(○,○)です

ーーーーーーーーーーーーーー

#include <stdio.h>

typedef struct
{
double x;
double y;
}point;

point input_cordinate();
point center_point(point point1,point point2);

int main()
{
point cordinate;
point tyuutenn;

cordinate = input_cordinate();
tyuutenn = center_point(tyuutenn.x, tyuutenn.y);
printf("点Sと点Tの中点は(%f,%f)です",tyuutenn.x,tyuutenn.y);
}

point input_cordinate()
{
point point1,point2;
point center_point;

printf("点S\n");
printf("x座標:");
scanf("%lf",&point1.x);
printf("y座標:");
scanf("%lf",&point1.y);

printf("点T\n");
printf("x座標:");
scanf("%lf",&point2.x);
printf("y座標:");
scanf("%lf",&point2.y);

return center_point;
}

point center_point(point point1,point point2)
{
point tyuutenn;

tyuutenn.x = (point1.x + point2.x)/2;
tyuutenn.y = (point1.y + point2.y)/2;
return tyuutenn;
}

「C言語について質問です 画像のようにエラ」の質問画像

質問者からの補足コメント

  • 書き直すとしたら、どのように書き直せば良いのか分からないので、教えていただけるとありがたいです

    追記し忘れてしまったのですが、
    条件として
    ・プロトタイプ宣言をする
    ・input_cordinate
    点の座標を入力させて構造体に格納する関数
    引数は
    なし
    戻り値
    点の座標<構造体>
    ・center_point
    2点の中点の座標を求める関数
    引数は
    1つ目の点の座標<構造体>
    2つ目の点の座標<構造体>
    戻り値
    2点の中点の座標<構造体>

      補足日時:2021/05/19 13:44

A 回答 (5件)

> 書き直すとしたら、どのように書き直せば良いのか分からないので、教えていただけるとありがたいです



それはおかしいんですけどね。
#3と自分の書いたコードを見比べて「どうすれば良いのか」方針くらい付けられないといけない。
少なくとも、各関数の「計算目的」はハッキリせなアカン、ってのは他の人も言ってる通りです。
関数を書く際には「何をやりたいのか」「何をやらせたいのか」明確になってないといけないんだけど、その明確さがない。
今書いて見せてるプログラムを書き直す、っつったって、その方針がハッキリしてない限り「良いプログラム」にはなりません。

> 条件として
>・プロトタイプ宣言をする

プロトタイプ宣言は別に条件、って言うほど条件にはなりませんよ。
単にmain関数をどこに書くとか、関数同士の呼び合いがどうなるのか、制御させる程度の意味しかありません。

貴方の書いたプログラムをただ単に「エラーが出ない」ようにする程度だったら次程度の書き換えで充分です。「良いプログラムかどうか」ってのは置いておきますがね。

/* ここから */

#include <stdio.h>

typedef struct
{
 double x;
 double y;
} point;

point input_coordinate(void); /* 無引数の場合、引数には void を指定 */
point center_point(point point1, point point2);

int main()
{
 point coordinate; /* 皆言ってるけど、座標のスペルは *Coordinate* */
 // point center_point; 以下の関数定義より必要ない。

 coordinate = input_coordinate();
 // tyuutenn = center_point(tyuutenn.x, tyuutenn.y); 以下の関数定義より必要ない
 printf("点Sと点Tの中点は(%f,%f)です",coordinate.x,coordinate.y);
}

point input_coordinate(void) /* 無引数の場合、引数には void を指定 */
{
 point point1,point2;
 // point center_point; これは要らんだろ。

 printf("点S\n");
 printf("x座標:");
 scanf("%lf",&point1.x);
 printf("y座標:");
 scanf("%lf",&point1.y);

 printf("点T\n");
 printf("x座標:");
 scanf("%lf",&point2.x);
 printf("y座標:");
 scanf("%lf",&point2.y);

 return center_point(point1, point2); /* ここでcenter_point呼び出したいの? */
}

point center_point(point point1, point point2)
{
 point tyuutenn;

 tyuutenn.x = (point1.x + point2.x)/2;
 tyuutenn.y = (point1.y + point2.y)/2;
 return tyuutenn;
}

/* ここまで */
    • good
    • 0
この回答へのお礼

何とか出来ました!!
ありがとうございますm(_ _)m

お礼日時:2021/05/20 18:04

なんか、メチャクチャだけど



①input_cordinate()は2点の座標を入力してるけど
それを捨てて未初期化の座標を返してる。メチャクチャ

②center_pointの実装は正しいが、入力は2つの座標(point)なのに
tyuutenn = center_point(tyuutenn.x, tyuutenn.y);
では未初期化の座標 tyuutennのxとyを渡している。
もうメチャメチャ、グチャグチャです。


ついでに、座標つづりは coordinateです。
    • good
    • 1
この回答へのお礼

書き直すとしたら、どのように書き直せば良いのか分からないので、教えていただけるとありがたいです

追記し忘れてしまったのですが、
条件として
・プロトタイプ宣言をする
・input_cordinate
点の座標を入力させて構造体に格納する関数
引数は
なし
戻り値
点の座標<構造体>
・center_point
2点の中点の座標を求める関数
引数は
1つ目の点の座標<構造体>
2つ目の点の座標<構造体>
戻り値
2点の中点の座標<構造体>

お礼日時:2021/05/19 13:40

#include <stdio.h>


#include <stdlib.h>

typedef struct
{
 double x;
 double y;
} point_t;

point_t input_coordinate(double x, double y) {
 point_t p = {x, y};
 return p;
}

point_t center_point(point_t point1, point_t point2) {
 point_t p = {(point1.x + point2.x)/2, (point1.y + point2.y)/2};
 return p;
}

int main(void) {
 char s[10], *names0 = "ST", *names1 = "XY";
 double num[2];
 point_t points[2], chuutenn;
 for (int i = 0; i < 2; i++) {
  printf("点%c\n", names0[i]);
  for (int j = 0; j < 2; j++) {
   printf("%c座標: ", names1[j]);
   scanf("%9s%*[^\n]%*c",s);
   num[j] = strtod(s,NULL);
  }
  points[i] = input_coordinate(num[0], num[1]);
 }
 chuutenn = center_point(points[0], points[1]);
 printf("点Sと点Tの中点は(%lf, %lf)です\n", chuutenn.x, chuutenn.y);
 return EXIT_SUCCESS;
}
    • good
    • 0
この回答へのお礼

書き直すとしたら、どのように書き直せば良いのか分からないので、教えていただけるとありがたいです

追記し忘れてしまったのですが、
条件として
・プロトタイプ宣言をする
・input_cordinate
点の座標を入力させて構造体に格納する関数
引数は
なし
戻り値
点の座標<構造体>
・center_point
2点の中点の座標を求める関数
引数は
1つ目の点の座標<構造体>
2つ目の点の座標<構造体>
戻り値
2点の中点の座標<構造体>

わざわざ細かく書いてくださり申し訳ありませんが、こちらの条件での書き方を改めて教えていただけるとありがたいですm(_ _)m

お礼日時:2021/05/19 13:42

引数として point を要求する関数に double の値を渡すことが間違っている.



というか, それ以前にそれぞれの関数で「するべきこと」を認識できていないような気がする. あと cordinate ってなんだ.
    • good
    • 1
この回答へのお礼

書き直すとしたら、どのように書き直せば良いのか分からないので、教えていただけるとありがたいです

追記し忘れてしまったのですが、
条件として
・プロトタイプ宣言をする
・input_cordinate
点の座標を入力させて構造体に格納する関数
引数は
なし
戻り値
点の座標<構造体>
・center_point
2点の中点の座標を求める関数
引数は
1つ目の点の座標<構造体>
2つ目の点の座標<構造体>
戻り値
2点の中点の座標<構造体>

お礼日時:2021/05/19 13:42

>tyuutenn = center_point(tyuutenn.x, tyuutenn.y);



関数center_point()の引数は二つのpoint型の値ですね。
でもこの右辺ではtyuutenn.xとtyuutenn.yというdouble型の値が引数に使われています。

吐き出されているエラーはこの点について説明しています。

まあ。そのほかにも突っ込みどころが多い。
input_cordinate()関数が何をしているのか、二つの座標の入力を受けているということはわかるが、何を出力しているのだろうか。
中点の座標か?そんな計算しているそぶりもない。
戻り値となるcenter_pointに何か値を代入しているでもない。何をやっているのだろうか?
    • good
    • 0
この回答へのお礼

書き直すとしたら、どのように書き直せば良いのか分からないので、教えていただけるとありがたいです

追記し忘れてしまったのですが、
条件として
・プロトタイプ宣言をする
・input_cordinate
点の座標を入力させて構造体に格納する関数
引数は
なし
戻り値
点の座標<構造体>
・center_point
2点の中点の座標を求める関数
引数は
1つ目の点の座標<構造体>
2つ目の点の座標<構造体>
戻り値
2点の中点の座標<構造体>

お礼日時:2021/05/19 13:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!