合計 昨日 今日

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

[このトピックは解決済みです]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: ロミオ
[URL]
Date: 2017年8月08日(火) 01:09
No: 1
(OFFLINE)

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

プログラミングで分からない事があります。
以下のC++のプログラム文があります。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#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[i]] << endl; //3が表示される
↑でbottles[fromId[i]] に3が代入されていることが分かるかと思いますが、return文で帰ってくる
配列は{3, 10 }ではなく{0, 10 }です。どこかでbottles[fromId[i]]の値が0になっているようなので
すがどこで0になっているのかわかりません。

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

Name: box
[URL]
ハッカー(263,673 ポイント)
Date: 2017年8月08日(火) 01:13
No: 2
(OFFLINE)

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

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

Name: ロミオ
[URL]
Date: 2017年8月08日(火) 01:17
No: 3
(OFFLINE)

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

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

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

Name: みけCAT
[URL]
伝説なるハッカー(677,332 ポイント)
Date: 2017年8月08日(火) 01:27
No: 4
(OFFLINE)

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

ロミオ さんが書きました:上記のプログラム文に対して引数として次の値を渡します。
{10, 10}
{5, 8}
{0}
{1}

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

Offtopic :
クラス名にEasyって付いているのが特徴的な気がする…TopCoder SRMかな?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: たいちう
[URL]
ハッカー(141,708 ポイント)
Date: 2017年8月08日(火) 01:30
No: 5
(OFFLINE)

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

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

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

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

Name: ロミオ
[URL]
Date: 2017年8月08日(火) 01:41
No: 6
(OFFLINE)

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

[解決!]

みけCAT 様

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

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

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

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

Name: ロミオ
[URL]
Date: 2017年8月08日(火) 01:53
No: 7
(OFFLINE)

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

[解決!]

たいちう様

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

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

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

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

Name: たいちう
[URL]
ハッカー(141,708 ポイント)
Date: 2017年8月08日(火) 02:11
No: 8
(OFFLINE)

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

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

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

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

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

Name: ロミオ
[URL]
Date: 2017年8月08日(火) 02:53
No: 9
(OFFLINE)

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

たいちう 様

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

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


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[34人]