C++入门习题求助:重复姓名输入报错实现及判断逻辑失效问题
C++入门第四章习题19:姓名重复判断问题解答
嘿,我明白你现在卡在姓名重复判断的问题上了,咱们就用你目前学到的第四章知识来解决这个问题,绝对不超纲~
首先,你说if(name == names[i])判断不生效,大概率是检查重复的时机不对——比如你可能是先把姓名加到vector里再去检查,或者循环的范围没覆盖所有已有的姓名。咱们先明确需求:每次输入一对姓名和分数时,先检查这个姓名是不是已经在names里了,如果是就输出错误提示,不添加;如果不是,再把姓名和分数分别存入对应的vector。
下面是符合你当前水平的代码,我加了详细注释:
#include <iostream> #include <vector> #include <string> using namespace std; // 第四章应该已经学了这个用法,没问题 int main() { vector<string> names; vector<int> scores; string name; int score; cout << "请输入姓名和分数(如:Joe 17),输入NoNo 0结束:\n"; while (cin >> name >> score) { // 先判断是否是结束指令 if (name == "NoNo" && score == 0) { break; } // 核心:检查当前输入的姓名是否已经存在 bool is_duplicate = false; for (int i = 0; i < names.size(); ++i) { if (name == names[i]) { // 这里的判断逻辑本身是有效的,string支持直接用==比较内容 is_duplicate = true; break; // 找到重复就跳出循环,不用继续检查了 } } if (is_duplicate) { cout << "错误:姓名" << name << "已经存在!\n"; } else { // 没有重复,才添加到两个vector中 names.push_back(name); scores.push_back(score); cout << "已添加:" << name << " " << score << "\n"; } } // 可选:输出所有存储的内容,验证结果 cout << "\n所有存储的姓名和分数:\n"; for (int i = 0; i < names.size(); ++i) { cout << names[i] << " " << scores[i] << "\n"; } return 0; }
关键知识点说明(都是第四章的内容):
- string的相等判断:C++的
string类型可以直接用==来比较两个字符串的内容是否完全一致,你之前的判断逻辑本身是对的,只是时机不对。 - 检查时机:必须在把姓名添加到
names之前检查,不然重复的姓名已经被存进去了,再查就晚了。 - 循环范围:
for (int i = 0; i < names.size(); ++i)——这里names.size()是当前已经存储的姓名数量,刚好覆盖所有已有的元素,不会出现越界问题。
你可以把这段代码替换你原来的代码试试,输入重复姓名的时候就会输出错误提示啦~
内容的提问来源于stack exchange,提问作者Vladar Akos
相关产品推荐
相关产品推荐

