質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1485閲覧

プログラムが正しく動かない

46hm

総合スコア20

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/05/04 11:28

編集2020/05/04 11:35

###実現したいこと
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_10_D&lang=ja
この問題を解いてみたのですが、正しく動作せず、どこが違うか全くわかりません。教えていただけると幸いです。

###作成したコード

#include<iostream> #include<cmath> #include<cstdlib> using namespace std; int main(){ int n; double a, b, p1, p2, p3, p4; double x[1001]={}; double y[1001]={}; cin>>n; for(int i=0; i<n; i++){ cin>>x[i]; cin>>y[i]; a = 0; b = 0; p1 = 0; p2 = 0; p3 = 0; p4 = 0; p1 += fabs(x[i]-y[i]); a += fabs(x[i]-y[i])*fabs(x[i]-y[i]); p2 = sqrt(a); b += fabs(x[i]-y[i])*fabs(x[i]-y[i])*fabs(x[i]-y[i]); p3 = cbrt(b); p4 =max(fabs(x[0]-y[0]), fabs(x[i]-y[i])); } cout<<p1<<endl; cout<<p2<<endl; cout<<p3<<endl; cout<<p4<<endl; return 0; }

###現状
input
3
1 2 3
2 0 4

output
4
4
4
4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/05/04 11:32

正しく動作しないとはどういうふうに動作するんでしょうか。 質問を編集し、そこらへんの詳しい説明を追記してください
y_waiwai

2020/05/04 12:11

あと、あなたが思う正しく動いたときにどうなる(ハズ) というのも追記しましょう。 #どこに飛ばされるやわからんリンクは極力踏みたくないもので。
guest

回答2

0

ひとつのfor文で配列xとyの値を入力とp1からp4までの算出を一緒に行っていることが原因かなと思います。
解答案としては、入力と計算式を分けるのがよいのかなと思います。
//以下の変数は、ループの外に出します。ループの中に入れていると、ループを回すたびに初期化されて
//しまうと思うので
a = 0;
b = 0;
p1 = 0;
p2 = 0;
p3 = 0;
p4 = 0;

  //xの値を入力
for(int i=0; i<n; i++){
cin>>y[i];
}
//yの値を入力
for(int i=0; i<n; i++){
cin>>y[i];
}

  for(int i=0; i< n;i++){
p1 += fabs(x[i]-y[i]);

a += fabs(x[i]-y[i])*fabs(x[i]-y[i]); p2 = sqrt(a); b += fabs(x[i]-y[i])*fabs(x[i]-y[i])*fabs(x[i]-y[i]); p3 = cbrt(b); p4 =max(fabs(x[0]-y[0]), fabs(x[i]-y[i]));

}

ご質問にあるコードでは、ループの中は下記のように動いています。
i=0のとき、
a += fabs(x[0]-y[0])*fabs(x[0]-y[0]);
p2 = sqrt(a);
となりますが、

i=3のとき、
x[3]とy[3]の値を入力
a += fabs(x[3]-y[3])*fabs(x[3]-y[3]);
p2 = sqrt(a);
となるため、期待している結果と異なってしまいます。

また、
p4 =max(fabs(x[0]-y[0]), fabs(x[i]-y[i]));
について、私はC++は詳しくないのですが、最初にp4=0と定義しているので、max関数?を使わずに以下の処理でもよいのかなと思います。
//最初にp4が最大値であると仮定。
if(p4<fabs(x[i]-y[i])){
p4 = fabs(x[i]-y[i]);//i番目の値が最大値であれば、p4に代入
}

以上となります。
説明がわかりづらいと思いますが、ご参考までに。。。m(_ _)m

投稿2020/05/04 13:36

danbo

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

間違っている点が3点あります。

  1. 入力の受け取り方が間違い

 forループ内にx[i], y[i]への値の受け取りが書かれているため、
入力の値をx, yに交互に入力してしまっています。正しくは、下記のように書かないといけません。

C++

1for(int i=0;i<n;i++)cin >> x[i]; 2for(int i=0;i<n;i++)cin >> y[i];
  1. p2, p3のsqrt, cbrtの記述の位置が間違い

 forループの各iについて和を取った後にsqrt, cbrtをとらないといけません。

C++

1for(int i=0;i<n;i++)a += fabs(x[i]-y[i])*fabs(x[i]-y[i]); 2p2 = sqrt(a);
  1. p4のmaxの取り方が間違い

 p4は「これまでの最大値」と「今見ている値」との比較をしなければいけません。
下記のようなかんじです。

C++

1p4 =max(p4, fabs(x[i]-y[i]));

投稿2020/05/04 12:16

gnbrganchan

総合スコア438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問