【问题标题】:Problem with logic when usng if statements使用 if 语句时的逻辑问题
【发布时间】:2019-07-31 00:27:07
【问题描述】:

我正在编写一个小程序来接受名称和分数。该程序将数据存储在向量中。然后程序将打印每个条目的名称和分数。然后程序应该能够搜索存储的名称,如果找到显示名称和相应的分数,如果没有找到它应该显示“未找到”消息。该程序运行良好,直到输入要搜索的名称为止,如果存储了名称,它将打印名称并正确评分。如果未找到该名称,它也会正确显示“未找到”。问题是如果找到名字,程序还会显示“未找到”消息以及名字和分数。我不确定我的逻辑哪里有缺陷。

我尝试过使用 else if,我尝试过单独的循环,我尝试过将 if 语句放在同一个循环中。我尝试过使用 break 语句。找到记录时,我尝试的任何方法都不会删除“未找到”消息。由于这只是一个帮助我学习的程序,所以没什么大不了的,但是我想了解发生了什么问题以帮助我了解更多信息并解决这个烦人的问题。

#include<iostream>
#include<vector>
#include<string>
using namespace std;
inline void keep_window_open() { char ch; cin >> ch; }
vector<string> listOfNames{};
vector<int> listOfScores{};
string name = " ";
int score = 0;

int main()
{
    cout << "Please enter a name followed by a score: \n";
        cout << "Press enter when finished\n";
    cout << "To quit enter NoName 0\n";     
    while (cin >> name >> score && name != "NoName")
    {
        for (int i = 0; i < listOfNames.size(); ++i)
        {
            if (name == listOfNames[i])
            {
                cout << "error name is a duplicate: \n";
            }
        }
            listOfNames.push_back(name);
            listOfScores.push_back(score);      
    }
        cout << "\nlist of names and scores entered\n";
    for (int i = 0; i < listOfNames.size(); ++i)
    {
        cout << listOfNames[i] << ',' << listOfScores[i] << "\n";
    }
    cout <<"Please enter a name to search for\n";
    string searchName = " ";
    cin >> searchName;
    for (int i = 0; i < listOfNames.size(); ++i)
    {
        if (searchName == listOfNames[i])
        {
     cout << listOfNames[i] << ',' << listOfScores[i]<< "\n";
        break;          
            }   
        }

    for (int i = 0; i < listOfNames.size(); ++i)
    {       
        if (searchName != listOfNames[i])
        {
            cout << "Not found\n";
            break;
        }
    }       
    keep_window_open();

    return 0;
}

如果用户输入 John 22 和 Tim 28,它将打印列表,然后当用户搜索名称时,如果没有找到该名称,它将打印“未找到”,但是如果找到该名称,它将按原样打印名称和分数,但它打印的下一行是“未找到”。此行仅应在未找到记录时打印。

在做了一些测试后发现,如果我只输入一个值,一个名称和一个分数,然后进行搜索,它不会在名称和分数后打印“未找到”消息,只有在出现时才会出现是多个条目。这让我更加困惑。我不知道为什么它只使用一个值而不是多个值就可以正常工作。

【问题讨论】:

  • 在第二个循环中,您只检查名字。我建议您在检查 bool var 时替换第二个循环,如果名称已找到则设置为 true,如果未找到则设置为 false。
  • 这将是您学习使用调试器的绝佳机会。代码很容易单步执行,以了解为什么它没有按预期工作,学习使用调试器是学习自己解决未来问题的最佳投资之一。
  • 我不确定我是否完全理解如何使用 bool 语句。
  • 是的,我知道我需要学习如何使用调试器,但这对我当前的问题没有帮助。

标签: c++ for-loop if-statement logic


【解决方案1】:

你犯了一个小的语义/逻辑错误。

在获得包含名称和分数的列表后,将列表中的所有值与搜索字符串进行比较。如果你找到了它,那么你就展示它。这很好用。没问题。

但是在您的第二个循环中,您遇到了一个逻辑问题。在您的列表中有大量不相等的名称。只有一个是平等的。所以如果你遍历你的循环,你总是会找到不相等的名字。然后你会看到你不想拥有的输出。

因此,您的循环询问:列表中的 any 条目是否“不等于”搜索字符串。是的,任何人都是。

您需要将您的逻辑修改为:列表中的所有值是否不等于搜索字符串。

但从逻辑上讲,这也没有必要。您无需再次运行完整循环。如果您检查了列表中的某个人并找到了某个人,那么他不在列表中。反之亦然。所以,他要么在名单上,要么不在。

您应该添加一个布尔变量来检查状态,然后添加一个 if/else 语句。

我为你修改了一部分代码:

    cout << "Please enter a name to search for\n";
    string searchName = " ";
    cin >> searchName;

    // In this variable, we will store the result of our search, this can be true or false
    bool weFoundSomebody = false;
    // If we find somebody, then we will remember the index, where we found him.
    int indexForFoundGuy = 0;
    for (int i = 0; i < listOfNames.size(); ++i)
    {
        if (searchName == listOfNames[i])
        {
            weFoundSomebody = true;
            indexForFoundGuy = i;
            break;
        }
    }

    // Could we find somebody or not. Only one is possible  
    if (weFoundSomebody)
    {
        cout << listOfNames[indexForFoundGuy] << ',' << listOfScores[indexForFoundGuy] << "\n";
    }
    else
    {
        cout << "Not found\n";
    }

    keep_window_open();

【讨论】:

  • 感谢 Armin Montigny 似乎解决了这个问题。感谢您的详细解释和代码,这是一个很大的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多