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

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

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: C++のプログラム文の結果が変なのでは?

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

#9

by ロミオ » 1年前

たいちう 様

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

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

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

#8

by たいちう » 1年前

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

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

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

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

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

#7

by ロミオ » 1年前

たいちう様

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

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

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

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

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

#6

by ロミオ » 1年前

みけCAT 様

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

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

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

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

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

#5

by たいちう » 1年前

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

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

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

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

#4

by みけCAT » 1年前

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

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

#3

by ロミオ » 1年前

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

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

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

#2

by box » 1年前

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

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

#1

by ロミオ » 1年前

プログラミングで分からない事があります。
以下の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になっているのかわかりません。

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

ページトップ