查询首都或国名-映射关系
查询首都或国名-映射关系
一、目的
-掌握map
-掌握vector
-掌握cin与getline输入的区别
-掌握substr
二、实验内容与设计思想
查询首都或国名
编写程序实现:首先从键盘输入若干个国名与首都的偶对,以空行作结束标记。然后输入一个国名或首都,输出对应的首都或国名;若不存在该国名或首都,则输出“查无此名”。
输入格式:
每行输入一对国名与首都,以空格分隔。
输出格式:
在一行中输出结果。
输入样例1:
中国 北京
日本 东京
美国 华盛顿
英国 伦敦
德国 柏林
法国 巴黎
俄罗斯 莫斯科
英国
输出样例1:
伦敦
输入样例2:
中国 北京
日本 东京
美国 华盛顿
英国 伦敦
德国 柏林
法国 巴黎
俄罗斯 莫斯科
巴黎
输出样例2:
法国
函数相关伪代码
1.定义两个map/一个vector
2.getline输入国家和首都
3.找到空格
4.空格前为country1,空格后为capital1
5.查找输出
函数代码
1.map实现
#include<iostream>
#include<string>
#include<map>
using namespace std;
int main() {
map<string, string> capital;
map<string, string> country;
string country1, capital1;
while (getline(cin, country1)) {
if (country1.empty()) break;
size_t spacePos = country1.find(' ');//找到空格的地方
capital1 = country1.substr(0, spacePos);//把空格前的字符串赋值
country1 = country1.substr(spacePos + 1);
country[country1] = capital1;
capital[capital1] = country1;
}
string s;
getline(cin, s);
if (country.count(s) > 0) {//找到为1,没找到为0
cout << country[s] << endl;
}
else if (capital.count(s) > 0) {
cout << capital[s] << endl;
}
else {
cout << "查无此名" << endl;
}
return 0;
}
2.vector实现
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main() {
vector<vector<string>> capital;//二维数组
string country1, capital1;
int i = 0,a;
while (getline(cin, country1)) {
if (country1.empty()) break;
size_t spacePos = country1.find(' ');//找到空格的地方
capital1 = country1.substr(0, spacePos);
country1 = country1.substr(spacePos + 1);
capital.push_back({ country1, capital1 });
}
string s;
cin >> s;
for (i = 0;i < capital.size();i++) {
if (capital[i].front() == s) {
cout << capital[i].back()<< endl;
a = 0;
break;
}
else if (capital[i].back() == s) {
cout << capital[i].front() << endl;
a = 0;
break;
}
}
if (a == 1) {
cout << "查无此名" << endl;
}
return 0;
}
三、实验使用环境
以下请根据实际情况编写
- 操作系统:Windows 11专业版
- 编程语言:C++
- 开发工具:[Visual stdio 2022]
四、实验步骤和调试过程
查询首都或国名
本机运行截图
五、实验小结
遇到的问题及解决方法:
- 问题:cin的输入问题
- 解决方法:转换为getline输入
实验体会和收获:
这两个C++程序段都是用于存储国家及其首都的对应关系,并允许用户查询输入的名称是国家还是首都。第一个程序使用两个map容器来快速检索,并使用cout来确定是否有此名,也可以用capital.find(s)来查找,只要返回值不为captial.end(),就是找到。第二个程序则使用vector的vector来存储数据,不直接定义char capital[][]是因为不确定有多少个,而使用vector是因为其可以做到动态输入,用front函数来对比country1,用back函数来寻找capital1。
使用getline来输入,而不是用cin输入,是因为在以空行结束时,cin会跳过空行,并且也不会输入空格,因此使用cin会陷入死循环当中,而使用getline就可以避免这个问题,因为它是整行输入,但正因这个,我需要把它分为两段,country1和capital1,这需要使用find函数找到‘ ’来进行分我需要的两个分段,再使用substr函数使分段的两个字符赋值给country1和capital1
实现用户输入一系列国家-首都对应,然后输入一个名称进行查询,如果名称在存储的数据中找到,则输出对应的国家或首都名称;如果未找到,则输出“查无此名”。