数据结构 4-二叉树

题目

目标:

  • 掌握字符串的基本操作
  • 熟悉如何利用map建立映射

实验内容:

[必做]题目 1—字符串基本操作(课上完成)
给 定一 串 身份 证 号码 , 请将 其 中的 年 月 日抽 取 出来 , 如对 于 身份 证 号码 字 符串 “330226196605054190”,抽取出来的应该是 19660505,然后将其转为 1966-05-05,并 返回。编写 string ExtractDateFromID(string id)
参考资料

  1. “字符串参考(简易版).cpp”
  2. “c++中的 string(包含 cin 处理字符串示例).txt”,

[必做]题目 2—全在其中(考核+1)
题目:http://jmunetds.openjudge.cn/ex3/402/

  1. 编写函数 bool isExist(string s1, string s2) 判断 s1 是否 s2 的”子列”。
  2. 提示:使用 string 的 find 函数
  3. 处理输入输出见右图参考代码。 中 isExist 是需要编写的函数。
  4. 测试输入输出:首先在本机测试,可以使用复制粘贴的方式测试。然后再测试如下输入:
    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 。 map<string,int>为建立 string 到 int 的映射,即建 立英文单词到数字的映射。可通过”one”能找到 1,参考代码如下:

#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: 《数据结构》实验三 数组和字符串
提交要求:

  1. 对于要求课上完成的题目,请在实验课结束前提交代码至课堂派,并在课后完成实验报告,在实验报告中描述算法流程;
  2. 对于不要求课上完成的题目,请在实验课结束后提交代码至课堂派,同时完成实验报告(描述算法流程);
  3. PTA上的题目,只需要提交测试通过即可;
  4. 提交时,每道题目单独一个文件(代码),实验报告为一个word、ppt或pdf文档。
 

实验报告

实验步骤:

题目 1—字符串基本操作
题目 2—全在其中
题目 3—英语数字转换器
题目 4—统计单词的出现次数并输出

题目1 字符串基本操作
题目 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 全在其中
题目 2—全在其中
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 英语数字转换器
题目 3—英语数字转换器
流程: 1. 先将对应的英文和数字存入map中 【get_map()函数】 2. 输入句子,将句子分割为单词【split()函数】 3. 将单词转化为数字【Eng2Num()函数】
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 &lt; res.size(); i++)
{
    int num = EngToNum[res[i]];
    if (num == -1)
        cout &lt;&lt; "-";
    else if (num == 100)
        temp *= num;
    else if (num &gt;= 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;
}

3. 参考资料-C++ string 字符串详解

http://blog.sina.com.cn/s/blog_453a02280100r8tv.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值