C++のプログラム文の結果が変なのでは?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ロミオ

C++のプログラム文の結果が変なのでは?

#1

投稿記事 by ロミオ » 6年前

プログラミングで分からない事があります。
以下のC++のプログラム文があります。

コード:

#include <iostream>
#include <vector>

using namespace std;

class KiwiJuiceEasy
{
	public:
		vector <int> thePouring(vector <int> capacities, vector <int> bottles, vector <int> fromId, vector <int> toId)
		{	
			for(int i=0; i<capacities.size(); i++ ){
				if( bottles[fromId[i]] + bottles[toId[i]] <= capacities[toId[i]] ){
					bottles[toId[i]] += bottles[fromId[i]];
					bottles[fromId[i]] = 0;
				}else if( bottles[fromId[i]] + bottles[toId[i]] > capacities[toId[i]] ){
					cout << bottles[fromId[i]] << endl;                            //5が表示される
					bottles[fromId[i]] = bottles[fromId[i]] - ( capacities[toId[i]] - bottles[toId[i]] );
					cout << capacities[toId[i]] - bottles[toId[i]] << endl;  //2が表示される
					cout << bottles[fromId[i]] << endl;                            //3が表示される
					bottles[toId[i]] = capacities[toId[i]];
				}
			}
			
			return bottles;
		}
};
上記のプログラム文に対して引数として次の値を渡します。
{10, 10}
{5, 8}
{0}
{1}
その結果
{0, 10}
が返されます。本当は
{3, 10 }
が返されてほしいのです。
coutで途中の値を出力してみると上から順番に
5
2
3
が出力されます。上記のプログラム文のコメント部分にも書いています。

cout << bottles[fromId] << endl; //3が表示される
↑でbottles[fromId] に3が代入されていることが分かるかと思いますが、return文で帰ってくる
配列は{3, 10 }ではなく{0, 10 }です。どこかでbottles[fromId]の値が0になっているようなので
すがどこで0になっているのかわかりません。

どなたかわかる方は教えてもらえないでしょうか?

box
記事: 2002
登録日時: 13年前

Re: C++のプログラム文の結果が変なのでは?

#2

投稿記事 by box » 6年前

とりあえず言えることは、「プログラムは書いたとおりにしか動かない」ということです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

ロミオ

Re: C++のプログラム文の結果が変なのでは?

#3

投稿記事 by ロミオ » 6年前

>> とりあえず言えることは、「プログラムは書いたとおりにしか動かない」ということです。

コメントありがとうございます。僕もそう思うのですが、思った通りに出力してくれません。
何かバグがあるのではないかと思うのですがどこが間違っているのか分かりません。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: C++のプログラム文の結果が変なのでは?

#4

投稿記事 by みけCAT » 6年前

ロミオ さんが書きました:上記のプログラム文に対して引数として次の値を渡します。
{10, 10}
{5, 8}
{0}
{1}
この値が上からcapacities, bottles, fromId, toIdに割り当てられるとすると、
fromIdやtoIdは1要素しか無いのに、capacities.size()は2なので、
範囲外のfromId[1]やtoId[1]の値を読み取ってしまい、変なことになりそうです。
オフトピック
クラス名にEasyって付いているのが特徴的な気がする…TopCoder SRMかな?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

たいちう
記事: 418
登録日時: 13年前

Re: C++のプログラム文の結果が変なのでは?

#5

投稿記事 by たいちう » 6年前

forループはcapacities.size()を基準にしているので、iは0と1の値を取りますよね。
それで、bottles[fromId]とか書いているのですが、fromIdは長さ1のvector。
fromId[1]は何を指しているのですか?

> 上記のプログラム文に対して引数として次の値を渡します。

と、書いてもらっていますが、その説明と実行結果が一致していないような。
main関数を書いてもらえませんか?

ロミオ

Re: C++のプログラム文の結果が変なのでは?

#6

投稿記事 by ロミオ » 6年前

みけCAT 様

>>fromIdやtoIdは1要素しか無いのに、capacities.size()は2なので、
>>範囲外のfromId[1]やtoId[1]の値を読み取ってしまい、変なことになりそうです。

コメントありがとうございます。みけCAT 様がおっしゃる通りでした。
capacities.size()ではなくfromId.size()にしたらちゃんと{3, 10 }が返されて
ほかのテストも間違うことなく通過しました。

>>クラス名にEasyって付いているのが特徴的な気がする…TopCoder SRMかな?

あ、そうですそうです。よくわかりましたね。しかし本当に単純な思い込みでお恥ずかしいです。
どうもありがとうございました。

ロミオ

Re: C++のプログラム文の結果が変なのでは?

#7

投稿記事 by ロミオ » 6年前

たいちう様

コメントありがとうございます。ご指摘の通りfromId[1]というのは範囲外で存在しないので、それで
おかしなことになっていたようです。かなり単純なミスですが気が付きませんでした。

>>main関数を書いてもらえませんか?

このプログラムはTopCorderというプログラミング力を競うサイトの問題に対応して作ったもので、
main関数はありません。

どうもありがとうございました。

たいちう
記事: 418
登録日時: 13年前

Re: C++のプログラム文の結果が変なのでは?

#8

投稿記事 by たいちう » 6年前

解決したようで何よりですが、、、

> このプログラムはTopCorderというプログラミング力を競うサイトの問題に対応して作ったもので、
> main関数はありません。

どのように「手元で」実行しているのですか?
動くかどうかわからないプログラムの断片をサイトにアップロードするだけ?
それで期待通りの結果が得られなかったら、自分で検証することなく、質問しているのですか?

(自分で検証しないで質問することをダメと言っているのではなく、
効率悪くないですか色々と、という意味です)

ロミオ

Re: C++のプログラム文の結果が変なのでは?

#9

投稿記事 by ロミオ » 6年前

たいちう 様

>>どのように「手元で」実行しているのですか?
>>動くかどうかわからないプログラムの断片をサイトにアップロードするだけ?
>>それで期待通りの結果が得られなかったら、自分で検証することなく、質問しているのですか?

僕のパソコンにはvisual studio 2017が入っているのですが、C++言語はまだ日が浅くどのようにしてmain関数から
クラスを引数付きで呼び出せばいいのかもわからない状態です。ただC言語はわかりますのでC++の簡単な式なら
分かるのでそれでアルゴリズムの問題を解いていました。しかし、たいちう様のおっしゃるように、効率の点などを
考えてvisual studioでmain関数を書いて検証できるようにしてみたいと思います。入門のサイトを参考にしながら
main関数から作ってみたいと思います。
ありがとうございました。

返信

“C言語何でも質問掲示板” へ戻る