【发布时间】: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