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

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

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

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

解決済

for文の中の辿り方を知りたい。

SmaSTATION
SmaSTATION

総合スコア16

C++

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

4回答

0グッド

1クリップ

629閲覧

投稿2022/11/16 02:08

編集2022/11/18 10:05

前提

<追記>
実は、以下(リンク)のダーツ問題と向き合っています。
リンク
下記のプログラムの10~14行目で行われていることを目で見たいです。
入力と出力は以下です。
〇入力

4 50 3 14 15 9

〇出力

0 3 3 6 48

繰り返しのあとの配列Sを見てもなぜ入力データを足して配列に入れていくだけなのにこの出力になるのか理解に苦しんでいます。

また、for文のなかの追い方も出力したいのですが、方法が見つからずといった具合です。

該当のソースコード

C++

1#include <bits/stdc++.h> 2using namespace std; 3 4int main() { 5 long long N, M; 6 cin >> N >> M; 7 vector<long long> P(N); 8 for (int i = 0; i < N; ++i) cin >> P[i]; 9 P.push_back(0); 10 vector<long long> S; 11 for (int i = 0; i < P.size(); ++i) 12 for (int j = 0; j < P.size(); ++j) 13 S.push_back(P[i] + P[j]); 14 sort(S.begin(), S.end()); 15 16 for(int i=0;i<N;++i){ 17 cout << S[i] << endl; 18 } 19 20 21 22 long long res = 0; 23 for (long long a : S) { 24 auto it = upper_bound(S.begin(), S.end(), M-a); 25 if (it == S.begin()) continue; 26 --it; 27 res = max(res, a + *it); 28 } 29 cout << res << endl; 30}

試したこと

  • 配列Sの出力・・・中を見ればわかると思ったため。
  • push_backの意味・・・配列に挿入するコマンド

補足情報(FW/ツールのバージョンなど)

・for文の中のi、jの推移と**S.push_back(P[i] + P[j]);**の過程の見方など細かいことでも構いません。ご指導、お願いしたいです。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2022/11/16 23:17依頼された後にこの質問は修正されています

こちらの質問が他のユーザーから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました。

Crimson_Tide

2022/11/18 10:30 編集

> 引用テキスト配列Sを見てもなぜ入力データを足して配列に入れていくだけなのにこの出力になるのか ではどのような出力になると想像していますか? 色々と処理の見落としがあるように思えます。
pig_vba

2022/11/17 00:05 編集

そうですね…コードを追ってみた限り想像していた処理と見当違いの方向に進んで行っているように見えます。(そもそもSの要素数はP^2になるのにN個しか表示してない時点で想定通りの仕様ではないと推察されます) 例として、自分が出力されると思った結果を提示していただけませんか?それによって回答が変わってきますので…
pig_vba

2022/11/17 00:09

とりあえず、なんでそういう出力になったかは見当ついたのでそちらだけ回答しておきますね。
SmaSTATION

2022/11/20 01:52

ご回答ありがとうございました。 追加の質問になってしまうのですが、したのfor文の「it」も出力させたいと思い、以下のプログラムを組んでみたところ演算子のエラー?が出てきてしまいました。 long long res = 0; for (long long a : S) { cout <<"a=" << a << endl; auto it = upper_bound(S.begin(), S.end(), M-a); cout << "it=" << it << endl; if (it == S.begin()) continue; --it; res = max(res, a + *it); } %%d的なものが必要なのでしょうか... 何かコメント頂けると幸いです。
pig_vba

2022/11/20 16:43

返信遅れました。もう解決してるかもしれませんがコメントしときます upper_bound関数の返り値はイテレータです。なのでITの中身を出力させたいなら*itにする必要があります このサイトとかわかりやすいと思いますので共有しときますね https://qiita.com/ganyariya/items/33f1326154b85db465c3
SmaSTATION

2022/11/21 04:56

すみません、丁寧にありがとうございます。確認してみます!

回答4

1

VisualStudio、あるいはEclipseを使っているなら、ブレークポイントを設定することで任意の行で実行を止めて、変数のナカミを見ることができます。
そこからワンステップづつ実行して、コードの流れを見ることもできます。

そうやって動作を確かめていってはどうでしょうか

投稿2022/11/16 02:26

y_waiwai

総合スコア86013

BeatStar👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

SmaSTATION

2022/11/18 11:45

ご回答ありがとうございます。 VScodeを使ってみようと思い、拡張機能をインストールするとこまで行ったのですが、そのあとにするファイルを作る段階つまずいております…
y_waiwai

2022/11/18 22:05

VSCodeでデバッグできるようにするためにはいろいろ設定の必要があります 初心者の方にはハードルが高いかと。 まあしかし、それでデバッグできるようになればそのメリットは計り知れません
SmaSTATION

2022/11/20 01:24

そうなんですね... 丁寧にお答えいただきありがとうございます。

0

ベストアンサー

なんでこんな出力になったのか

C

1 for (int i = 0; i < P.size(); ++i) 2 for (int j = 0; j < P.size(); ++j) 3 S.push_back(P[i] + P[j]);

まずここで、Pの要素を個別に合算した配列をP.size個*P.size個=P^2個分生成してます。 
もっと簡潔に言うと、このfor文は
P[0]+P[0]~P[N]+P[N]の結果を順番にSに挿入している形になってます。
S=3+3,3+14,3+15~0+0っていう動きなんですね。
この時点で質問者の想定外なのはわかりました。
ここで見てほしいのは最後で、

P.push_back(0);

これにより、Pの最後は0なんです。
だから、Sの中には
0+0,3+0,0+3が含まれます。
こいつが

cpp

1sort(S.begin(), S.end());

によって先頭3枠に移動しています。4枠目は3+3ですね。
今回Nには4が入っているので、先頭4要素である0,3,3,6だけが出力されたということです。

最後の48ですが、それは最後のコードの

cpp

1 for (long long a : S) { 2 auto it = upper_bound(S.begin(), S.end(), M-a); 3 if (it == S.begin()) continue; 4 --it; 5 res = max(res, a + *it); 6 }

こちらでresの中に48が格納され、

cpp

1 cout << res << endl;

で最後に出力された結果、あのような出力となった、というわけです。

となると考えられるミスは

C

1 for (int i = 0; i < P.size(); ++i) 2 for (int j = 0; j < P.size(); ++j) 3 S.push_back(P[i] + P[j]);

まぁ、ここだと思います。
本来やりたかったのは

C

1 for (int i = 0; i < P.size(); ++i) 2 if(i!=0) 3 S.push_back(P[i-1] + P[i]);

なんだろうなぁ。と思っていますが、こればかりは質問者が意図する出力次第なのであくまで提案のみにとどめさせていただきます。

投稿2022/11/17 00:42

編集2022/11/18 07:00
pig_vba

総合スコア648

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

fana

2022/11/18 06:58

すっごく些細なことですが, > if(i<>0) C言語として示すなら,C言語の文法で書くのが良いのではないでしょうか.
pig_vba

2022/11/18 07:01

報告ありがとうございます。無意識的にVBAの比較文で書いてたの全く気付いてなかったです

0

IDEのデバッグ機能使ってもいいし、

c++

1 for (int i = 0; i < P.size(); ++i) 2 for (int j = 0; j < P.size(); ++j) { 3 S.push_back(P[i] + P[j]); 4 cout << "(i j):" << i << " " << j << " P[i] P[j]:" << P[i] << " " << P[j] << " P[i]+P[j]:" << P[i] + P[j] << endl; 5 }

のように、一時的にfor文中に追加してもいいかと思います。

投稿2022/11/16 04:10

Crimson_Tide

総合スコア506

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

S の中味を全部見たいのであれば、
for(int i=0;i<N;++i){ ではなく、
for(int i=0;i<S.size();++i){ でしょう。

投稿2022/11/16 03:33

kazuma-s

総合スコア8080

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

SmaSTATION

2022/11/20 01:52

ご回答ありがとうございました。 追加の質問になってしまうのですが、したのfor文の「it」も出力させたいと思い、以下のプログラムを組んでみたところ演算子のエラー?が出てきてしまいました。 long long res = 0; for (long long a : S) { cout <<"a=" << a << endl; auto it = upper_bound(S.begin(), S.end(), M-a); cout << "it=" << it << endl; if (it == S.begin()) continue; --it; res = max(res, a + *it); } 何か、%%d的なものが必要なのでしょうか... 何かコメント頂けると幸いです。
kazuma-s

2022/11/20 05:52

it の型はイテレータであり、それを直接表示することはできません。 it は vector S の要素を指すので、 cout << "it=" << it - S.begin() << endl; で、S の何番目の要素であるのかを表示したらどうでしょうか。

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C++

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