题目
目标:
- 掌握字符串的基本操作
- 熟悉如何利用map建立映射
实验内容:
[必做]题目 1—字符串基本操作(课上完成)
给 定一 串 身份 证 号码 , 请将 其 中的 年 月 日抽 取 出来 , 如对 于 身份 证 号码 字 符串 “330226196605054190”,抽取出来的应该是 19660505,然后将其转为 1966-05-05,并 返回。编写 string ExtractDateFromID(string id)
参考资料:
- “字符串参考(简易版).cpp”
- “c++中的 string(包含 cin 处理字符串示例).txt”,
[必做]题目 2—全在其中(考核+1)
题目:http://jmunetds.openjudge.cn/ex3/402/
- 编写函数 bool isExist(string s1, string s2) 判断 s1 是否 s2 的”子列”。
- 提示:使用 string 的 find 函数
- 处理输入输出见右图参考代码。 中 isExist 是需要编写的函数。
- 测试输入输出:首先在本机测试,可以使用复制粘贴的方式测试。然后再测试如下输入:
aaab a ,应该输出什么?
int main()
{
string str1,str2;
while (cin >> str1 >> str2)
{
if (isExist(str1, str2))
cout << "Yes" << endl;
else
cout << "No" << endl;
}
return 0;
}
[必做]题目 3—英语数字转换器(考核+2)
题目:http://jmunetds.openjudge.cn/ex3/402/2
思路:
使用 map, 需要#include
#include <iostream>
#include <string>
#include <map>
using namespace std; void main()
{
map<string, int> str2intMap;
str2intMap["one"] = 1;//建立map
string key = "one";
int x = str2intMap[key];//使用map
cout << "key=" << key << " value=" << x << endl;//找到了key对应的value
cout << str2intMap["AAAAA"] << endl;//没找到,返回0
}
处理输入输出:
int main()
{
string str; while(getline(cin,str))//从控制台获取一行并赋值给变量str
{
cout<<"您刚输入的字符串为:"<<str<<endl;
}
return 0;
}
碰到 negative 如何处理?碰到 million、thousand、hundred,如何处理?碰到其它单词如何处理?
选做:题目 4—统计单词的出现次数并输出(特别加分)
题目:http://jmunetds.openjudge.cn/ex3/403/
提示:
使用map<string,int>dict存放每个单词与其对应的存放次数。其中key值为单词,value值为单词出现次数。
遍历字典相关代码:
map<string,int>dict;
map<string,int>::iterator iter;
int n=0;
for(n=0,iter=dict.begin();iter!=dict.end();iter++,n++)
cout<<"key="<<iter->first<<"value="<<iter->second<<endl;
编写:stringupperToLower(stringstr),将str转化为小写并返回。编写:结构体WordPair存放单词与其对应的出现次数。
structWordPair
{
string word;
int count;
};
PTA: 《数据结构》实验三 数组和字符串
提交要求:
- 对于要求课上完成的题目,请在实验课结束前提交代码至课堂派,并在课后完成实验报告,在实验报告中描述算法流程;
- 对于不要求课上完成的题目,请在实验课结束后提交代码至课堂派,同时完成实验报告(描述算法流程);
- PTA上的题目,只需要提交测试通过即可;
- 提交时,每道题目单独一个文件(代码),实验报告为一个word、ppt或pdf文档。
实验报告
实验步骤:
题目 1—字符串基本操作
题目 2—全在其中
题目 3—英语数字转换器
题目 4—统计单词的出现次数并输出
题目1 字符串基本操作
流程:
1. 定义ans,储存从id中提取出的字符
2. 将id中第6个到第14个字符提取出来
3. 进行到第四次和第六次的时候,向ans中插入‘-’
string ExtractDateFromID(string id)
{
string ans = "";
for (int i = 0; i < 8; i++)
{
ans += id[i + 6];
if (i == 3 || i == 5)
ans += "-";
}
return ans;
}
题目2 全在其中
![](http://akavjht.top/image/0009/image1.png)
bool isExist(string s1, string s2)
{
int index = 0;
for (int i = 0; i < s1.size(); i++)
{
index = s2.find(s1[i], index);
if (index == -1)
return false;
}
return true;
}
题目3 英语数字转换器
流程:
1. 先将对应的英文和数字存入map中 【get_map()函数】
2. 输入句子,将句子分割为单词【split()函数】
3. 将单词转化为数字【Eng2Num()函数】
//将{英文,数字}插入map中
void get_map()
{
string word[] = { "negative","zero","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen","twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety","hundred","thousand","million" };
int number[] = { -1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,30,40,50,60,70,80,90,100,1000,1000000 };
for (int i = 0; i < 32; i++)
EngToNum.insert({ word[i], number[i] });
}
//将字符串按空格分开,返回分开的string
vector<string> split(string a)
{
a += " ";
vector<string>ans;
int blank = 0, begin = 0;
while (1)
{
blank = a.find(' ', blank) + 1;
if (blank == 0)
break;
ans.push_back(a.substr(begin, blank - begin - 1));
begin = blank;
}
return ans;
}
int Eng2Num(vector<string>res)
{
int ans = 0, temp = 0;
for (int i = 0; i < res.size(); i++)
{
int num = EngToNum[res[i]];
if (num == -1)
cout << "-";
else if (num == 100)
temp *= num;
else if (num >= 1000)
{
temp *= num;
ans += temp;
temp = 0;
}
else
temp += num;
}
ans += temp;
return ans;
}
int main()
{
get_map();
string str;
while (1)
{
getline(cin, str);
cout << "您刚输入的字符串为:" << str << endl;
if (str.empty())
break;
vector<string>res = split(str);
int ans=Eng2Num(res);
cout << ans << endl;
}
return 0;
}
参考资料
1. 字符串参考
#include <iostream>
#include <string>
using namespace std;
int main()
{
/************************字符串演示************************/
string name = "zhang",name1 = "wang",result = "This is a book from "+name;//字符串相加(连接)
if (name != name1)//字符串比较
cout << name << "!=" << name1 << endl;
cout << "result的长度为" << result.length() << endl;//字符串长度
for (int i = 0; i < result.length(); i++)//遍历字符串。注意:对中文兼容性不好
{
cout << "第" << i + 1 << "字符为" << result[i] << endl;
}
result += " "+name1;//字符串的相加(拼接)
string str1;
cout << "请输入你要查找的字符" << endl;//字符串输入
getline(cin, str1);//获得一行(可包含空格)
int pos = result.find(str1);
if (pos != -1)//字符串查找,在result字符串中从第0个位置开始查找str1,如果找不到返回-1
cout << "在'" << result << "'中,第"<<pos<<"个位置发现 " << str1 << endl;
else
cout << "没找到 " << str1<<endl;
return 0;
}
2. c++中的string(包含cin处理字符串示例)
主要用法:
1.遍历字符串的例子
//遍历字符串例子
string str6;
cout << "输入字符串 str6" << endl;
cin >> str6;
int i;
for( i= 0; i< str6.size(); ++i )//size()获取字符串中字符个数
cout << str6[i];
cout << endl << endl;
2.读入一行到字符串
string str1
cout << "输入字符串 str1" << endl;
getline( cin, str1 );
cout << str1 <<" length="<<str1.length()<<endl;
其他关于string的用法
链接:http://www.cppblog.com/Darren/archive/2009/03/13/76474.html
#include <string> // 使用 string 类时须包含这个文件
#include <iostream>
#include "stdio.h"
#include "stdlib.h"
using namespace std;
int main()
{
string str1;
//主讲这个:输入与输出
cout << "输入字符串 str1" << endl;
cin >> str1;
getchar();//消耗掉行尾回车换行
cout << str1 << endl << endl << endl;
//截取子串
string srcStr = "0123456789";
cout<<"substr="<<srcStr.substr(1, 5)<<endl;//从位置1开始向后截取长度为5的子串。
//主讲这个: 读入一行
cout << "输入字符串 str1" << endl;
getline( cin, str1 );
cout << str1 << endl;
// 与c字符数组转换
string str2("Hello World!"), str3;
char str4[50];
cout << "输入 C 字符串" << endl;
scanf("%s",str4);
str3= str4;
cout << "str2 is " << str2 << endl;
cout << "str3 is " << str3 << endl << endl << endl;
// 求字符串的长度
string str5;
cout << "输入字符串 str5" << endl;
cin >> str5;
int len = str5.size();//或者str5.length()
cout << "字符串 str5的长度为" << len << endl << endl << endl;
// 主讲这个:遍历字符串例子
string str6;
cout << "输入字符串 str6" << endl;
cin >> str6;
int i;
for( i= 0; i< str6.size(); ++i )
cout << str6[i];
cout << endl << endl;
// 比较两个字符串 比较规则同 c字符串比较规则
string str7, str8;
cout << "输入字符串 str7, str8 , 中间用空格格开" << endl;
cin >> str7 >> str8;
if( str7< str8 ) cout << str7 << " 小于 " << str8 << endl;
else if( str7> str8 ) cout << str7 << " 大于 " << str8 << endl;
else cout << str7 << " 等于 " << str8 << endl;
// 字符串与字符相加(字符串的拼接)
string str9= "Darren";
char ch1= 'a', ch2= 'b';
str9= str9+ ch1; cout << str9 << endl << endl;
str9= ch2+ str9; cout << str9 << endl << endl << endl;
// 字符串与字符串相加
string str10= "Acm", str11= "ICPC";
str10.append( str11 );
cout << str10 << endl << endl;
// 字符串是否包含子串 如果包含 则返回子串在目标串中第一次出现的位置
string str12= "I am a student", str13= "student", str14= "aaaaaaa";
if( str12.find( str13 )!= -1 ) //未找到,返回-1
cout << "Find " << str13 << endl;
if( str12.find( str14 )== -1 )
cout << "Not Find " << str14 << endl;
// 转换成 c_字符串
string str15= "Hello World";
printf("%s\n", str15.c_str() );
system("pause");
return 0;
}
//另外一个演示例子
void test()
{
/************************字符串演示************************/
string name = "zhang",name1 = "wang",result = "This is a book from "+name;//字符串相加
if (name != name1)//字符串比较
cout << name << "!=" << name1 << endl;
cout << "result的长度为" << result.length() << endl;//字符串长度
for (int i = 0; i < result.length(); i++)//遍历字符串。注意:对中文兼容性不好
{
cout << "第" << i + 1 << "字符为" << result[i] << endl;
}
result += " "+name1;
string str1;
cout << "请输入你要查找的字符" << endl;//字符串输入
getline(cin, str1);//读取一行
cout << "你要从第几个位置开始查找(从0开始)" << endl;//字符串输入
int index;
cin>>index;
cout<<"您现在从第"<<index<<"个位置开始查找"<<endl;
if (result.find(str1,index) != -1)//字符串查找
cout << "在'" << result << "'中发现 " << str1 << endl;
else
cout << "没找到 " << str1<<endl;
}