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

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

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

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

Q&A

解決済

4回答

1290閲覧

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

SmaSTATION

総合スコア29

C++

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

0グッド

1クリップ

投稿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]);**の過程の見方など細かいことでも構いません。ご指導、お願いしたいです。

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

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

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

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

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

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

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

回答4

0

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

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

投稿2022/11/16 02:26

y_waiwai

総合スコア87774

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

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

SmaSTATION

2022/11/18 11:45

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

2022/11/18 22:05

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

2022/11/20 01:24

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

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

総合スコア807

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

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

fana

2022/11/18 06:58

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

2022/11/18 07:01

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

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

総合スコア509

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

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

0

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

投稿2022/11/16 03:33

kazuma-s

総合スコア8224

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

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

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 の何番目の要素であるのかを表示したらどうでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問