一段时间循环中的奇怪错误(C++)

Strange bug in a while loop (C++)

本文关键字:错误 C++ 循环 一段时间      更新时间:2023-10-16

我正在尝试制作一个与简单算法一起工作的程序。

但是由于某种原因,我遇到了一个奇怪的错误(下面是该程序的简化版本)。

#include "stdafx.h"
#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 to 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 << arr[t] << 'n';
    for (int b = 0; b < 2; ++b)
    {
        if (t == arr[b])
        {
            v = b;
        }
    }
    /* Again, arr[v] gets what looks like a random number */
    cout << "The cheapest " << name << " is number " << arr[v] << ".";
}

int main()
{
    /* [0] = "Cost for Steve"
       [1] = "Cost for Mark"
       [2] = "Cost for Andrew" */
    int cleaning[] = { 5, 4, 7 };
    int cooking[] = { 3, 6, 4 };
    int babysitting[] = { 7, 6, 3 };
    cout << "Number 1: Steve, Number 2: Mark, Number 3: Andrew.n";
    find(cleaning, "cleaner");
    find(cooking, "cook");
    find(babysitting, "babysitter");


/* This is to prevent the console application from quitting */
    while (true)
    {
    }
}

我确定 for 和 while 循环中有问题,但是什么?

如果您正在阅读我的代码并且某些文本或变量名称对您来说似乎很陌生,那么很可能我忘记翻译它(这最初是用意大利语编写的)。

感谢您抽出宝贵时间阅读本文。

编辑:多亏@Tar我修复了程序的第一部分,The (name) that costs less is n. (arr[v]).的部分仍然给我一个随机数,我编译并运行了该程序,输出是:

Number 1: Steve, Number 2: Mark, Number 3: Andrew.
4
The cheapest cleaner is number 4.
3
The cheapest cook is number 3.
3
The cheapest babysitter is number 7.

这显然是错误的,因为它应该说最便宜的清洁工是2号,最便宜的厨师是1号,最便宜的保姆是3号。

PS:一旦一切都解决了,我将把打印出最便宜价格的部分拿出来。

问题出在find的第一个while循环中:

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

在这里,您可以连续评估arr中的元素是否0。这是不正确的。您已将数组声明为:

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

这些都不包含0,所以你的while循环将无限期运行,你将读取每个数组的内存,这不是好消息。

考虑改用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);
}

首先,我想声明一下:我不是说英语的人,所以如果我说错了话,请原谅我。
我认为这个问题不是很困难。我修复了您的算法和输出格式。实际上,我几乎重写了它。
在我看来,你的代码似乎有点幼稚。如果你只学习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