2017-02-02 11 views
-3

シンプルなアルゴリズムで動作するプログラムを作ろうとしています。whileループの不思議なバグ(C++)

しかし何らかの理由で、私は奇妙なバグを得ました(以下、プログラムの簡略版です)。

#include "stdafx.h" 
/* I'm using visual studio as you can see */ 
#include <iostream> 
#include <string> 

using std::cout; 
using std::string; 

void find(int arr[], string& name) { 
    int t = 8; 
    int i = 0; 
    int v = 0; 

    // t SHOULD become equal the smallest int of the array after this 


    while (arr[i]) { 
     if (arr[i] < t) { 
      t = arr[i]; 
     } 
     i++; 
    } 

    /* When this statement below gets executed t gets what looks like a     
    random value for some reason */ 
    cout << "\n" << arr[t]; 
    for (int b = 0; b < 2; b++) { 
     if (t == arr[b]) { 
      v = b; 
     } 
    } 

    /* Again, arr[v] gets what looks like a random number */ 
    cout << "\nThe " << name << " that costs less is n. " << arr[v] << "."; 
} 



int main() { 

    /* [0] = "Cost for steve" 
     [1] = "Cost for mark" 
     [2] = "Cost for andrew" */ 

    int cleaning[3] = { 5, 4, 7 }; 
    int cooking[3] = { 3, 6, 4 }; 
    int babysitting[3] = { 7, 6, 3 }; 

    cout << "Number 1 = Steve, Number 2 = Mark, Number 3 = Andrew."; 

    string name = "cleaner"; 
    find(cleaning, name); 
    name = "cook"; 
    find(cooking, name); 
    name = "babysitter"; 
    find(babysitting, name); 




/* This is to prevent the console application from quitting */ 

    while (true) { 

    } 

} 

forループとwhileループに間違いがありますが、何ですか?

私のコードを読んでいて、いくつかのテキストや変数名が外国人のように見える場合は、翻訳するのを忘れている可能性があります(これは元々イタリア語で書かれています)。

お読みいただきありがとうございます。

編集:私はThe (name) that costs less is n. (arr[v]).はまだ私に乱数を与えると言う部分は、私がコンパイルされ、プログラムを実行した、プログラムの最初の部分を固定ではなく @Tarのおかげで、出力は次のとおりです。

Number 1 = Steve, Number 2 = Mark, Number 3 = Andrew. 
4 
The cleaner that costs less is n. 4. 
3 
The cook that costs less is n. 3. 
3 
The babysitter that costs less is n. 7. 

これは、より安価なクリーナーが2番、1番は料理人、3番はベビーシッターであると言えるはずです。

PS:すべてが修正されるとすぐに、私は最も安い価格をプリントアウトする部分を取ります。

+0

'find'、あなたはパラメータとして' arr'を渡すが、その後、 'figo'を使用しています。私は間違いだと思っていますか? – Tas

+0

'figo'どこに定義されていますか? – Raindrop7

+2

「奇妙なバグ」とは何ですか? [MCVE](http://stackoverflow.com/help/mcve)を投稿してください。 –

答えて

2

問題がfindにあなたの最初のwhileループ内にある:

while (arr[i]) // while the element at arr[i] is NOT 0 
{ 
    if (arr[i] < t) 
    { 
     t = arr[i]; 
    } 
    i++; 
} 

ここでは、継続的に、彼らは0ないかどうかのためにarrの要素を評価します。これは正しくありません。あなたのwhileループが無期限に実行されますので、これらの

int cleaning[3] = { 5, 4, 7 }; 
int cooking[3] = { 3, 6, 4 }; 
int babysitting[3] = { 7, 6, 3 }; 

なし0を含まない、あなたは良いニュースではありません各アレイのメモリを過ぎて読んだことがあります:あなたは、あなたのよう配列を宣言しました。

代わりstd::vectorの使用を検討し、あなたのコードになるどれだけ明確にし、安全に参照してください。なかでも

#include <vector> 
#include <iostream> 

void find(const std::vector<int>& numbers) 
{ 
    auto t = 8; 
    // Look through each element in the container: 
    for(auto number : numbers) 
    { 
     if (number < t) 
     { 
      t = number; 
     } 
    } 
    std::cout << t << std::endl; 
} 

int main() 
{ 
    std::vector<int> cleaning = {5, 4, 7}; 
    find(cleaning); 
} 
+0

ありがとうございますが、これをコンパイルしようとすると、tについて3つのコンパイラエラーが発生します。また、私は 'auto'と 'vectors'について聞いたことがあります。 –

+0

問題を解決するためのヒントを教えてください。 –

+0

決して気にしないでください –

0

を、私は声明を作りたい:私は、英語話者ではないよ、私は間違って言ったので、もし言葉、私を許してください。
この質問はあまり難しくないと思います。アルゴリズムと出力フォーマットを修正しました。実際、私はそれをほとんど書き直しました。
私の見解では、あなたのコードは素朴なようです。 C++の構文を学んだだけの場合、アルゴリズムを学ぶための長い道のりがあります。

#include <iostream> 
#include <string> 
#include <vector> 
using namespace std; 

int find(const vector<int>& numbers) { 
    int minVul = numbers[0]; 
    int rank = 0; 

    for (int i = 1; i < numbers.size(); i++) 
    { 
     if (minVul > numbers[i]) 
     { 
      minVul = numbers[i]; 
      rank = i; 
     } 
    } 
    return rank; 
} 



int main() { 

    vector<string> name = { "steve","mark","andrew" }; 
    /* [0] = "Cost for steve" 
    [1] = "Cost for mark" 
    [2] = "Cost for andrew" */ 

    vector<int> cleaning = { 5, 4, 7 }; 
    vector<int> cooking = { 3, 6, 4 }; 
    vector<int> babysitting = { 7, 6, 3 }; 

    int cleaner = find(cleaning); 
    cout << "Cleaning:" << name[cleaner] << " costs least in " << cleaning[cleaner] << endl; 
    int cooker = find(cooking); 
    cout << "Cooking:" << name[cooker] << " costs least in " << cooking[cooker] << endl; 
    int babysitter = find(babysitting); 
    cout << "Babysitter:" << name[babysitter] << " costs least in " << babysitting[babysitter] << endl; 

    system("pause"); //This is a common skill to prevent the console application from quitting. 
    return 0; 
} 

出力:あなたの関数で

Cleaning:mark costs least in 4 
Cooking:steve costs least in 3 
Babysitter:andrew costs least in 3 
+0

私はシステム(「一時停止」)について知っていますが、シンプルな中で(真実)は私にとってはよりクリーンであるようです。 –

+0

このコードを完全に理解しようとしたら、これははるかにクリーンであると言わなければなりません。ありがとう。 –

関連する問題