2022.10.08
字符串04-石头剪刀布
题目描述:
石头剪子布,是一种猜拳游戏。起源于中国,然后传到日本、朝鲜等地,随着亚欧贸易的不断发展它传到了欧洲,到了近现代逐渐风靡世界。简单明了的规则,使得石头剪子布没有任何规则漏洞可钻,单次玩法比拼运气,多回合玩法比拼心理博弈,使得石头剪子布这个古老的游戏同时用于“意外”与“技术”两种特性,深受世界人民喜爱。
游戏规则:石头打剪刀,布包石头,剪刀剪布。
现在,需要你写一个程序来判断石头剪子布游戏的结果。
输入:
输入包括N+1行:
第一行是一个整数N,表示一共进行了N次游戏。1 <= N <= 100。
接下来N行的每一行包括两个字符串,表示游戏参与者Player1,Player2的选择(石头、剪子或者是布):
S1 S2
字符串之间以空格隔开S1,S2只可能取值在{“Rock”, “Scissors”, “Paper”}(大小写敏感)中。
输出:
输出包括N行,每一行对应一个胜利者(Player1或者Player2),或者游戏出现平局,则输出Tie。
样例输入:
3
Rock Scissors
Paper Paper
Rock Paper
样例输出:
Player1
Tie
Player2
代码如下:
#include<iostream>
#include<map>//定义映射函数的头文件
#include<cstring>
using namespace std;
int main() {
map<string, int>a;//定义名字为a的映射函数,串映射到数字
//0-Rock, 1-Scissors, 2-Paper
a["Rock"] = 0;
a["Scissors"] = 1;
a["Paper"] = 2;
int n;
string s1, s2;
cin >> n;
while (n--) {
cin >> s1 >> s2;
//做比较时,表示形式为:映射函数名[字符串名]
if ((a[s1] == 0 && a[s2] == 1) ||
(a[s1] == 1 && a[s2] == 2) ||
(a[s1] == 2 && a[s2] == 0)) {
cout << "Player1" << endl;
}
else if ((a[s1] == 0 && a[s2] == 2) ||
(a[s1] == 1 && a[s2] == 0) ||
(a[s1] == 2 && a[s2] == 1)){
cout << "Player2" << endl;
}
else cout << "Tie" << endl;
}
return 0;
}
字符串05-输出亲朋字符串
题目描述:
编写程序,求给定字符串s的亲朋字符串s1。
亲朋字符串s1定义如下:给定字符串s的第一个字符的ASCII值加第二个字符的ASCII值,得到第一个亲朋字符; 给定字符串s的第二个字符的ASCII值加第三个字符的ASCII值,得到第二个亲朋字符;依此类推,直到给定字符串s的倒数第二个字符。亲朋字符串的最 后一个字符由给定字符串s的最后一个字符ASCII值加s的第一个字符的ASCII值。
输入:
输入一行,一个长度大于等于2,小于等于100的字符串。字符串中每个字符的ASCII值不大于63。
输出:
输出一行,为变换后的亲朋字符串。输入保证变换后的字符串只有一行。
样例输入:
1234
样例输出:
cege
代码如下:
#include<iostream>
#include<cstring>
using namespace std;
int main(){
string a,b;
//cin>>a; //使用cin报错
getline(cin,a);//读入字符串a
int len = a.length();
for(int i = 0;i < len;i++){
if(i == len-1){
//a[i]为int类型,b为string类型
b = a[i]+a[0];
}
else
b = a[i]+a[i+1];
cout<<b;
}
return 0;
}
说明:
当读入一串含有空格的字符串的时候,cin是干不了的,因为cin读不了空格。
遇到这种情况时,引入getline()函数,这个函数有三个参数,第一个是输入流如cin,第二个是写入的地方,第三个是输入结束标志,就是告诉程序遇到什么字符停止读入,也可以不写,默认遇到回车符停止读入。如:
#include <iostream>
using namespace std;
int main()
{
string a;
getline(cin,a,'\n');
cout<<a;
}
一般写成getline(cin,a)。
#include <iostream>
using namespace std;
int main()
{
string a;
getline(cin,a);
cout<<a;
}
getline()只能用于string类,要读char的一串,就要用cin.getline()。
#include <iostream>
using namespace std;
int main()
{
char a[90];
cin.getline(a,80);
cout<<a;
}
字符串06-合法C标识符
题目描述:
给定一个不包含空白符的字符串,请判断是否是C语言合法的标识符号(注:题目保证这些字符串一定不是C语言的保留字)。
C语言标识符要求:
-
非保留字;
-
只包含字母、数字及下划线(“_”)。
-
不以数字开头。
输入:
一行,包含一个字符串,字符串中不包含任何空白字符,且长度不大于20。
输出:
一行,如果它是C语言的合法标识符,则输出yes,否则输出no。
样例输入:
RKPEGX9R;TWyYcp
样例输出:
no
代码如下:
#include<iostream>
#include<cstring>
using namespace std;
int main(){
int flag;
string s;
cin>>s;
for(int i = 0;s[i];i++){
if(s[0] >= '0' && s[0] <= '9'){
flag = 0;
break;
}
else if((s[i] >= 'A' && s[i] <= 'Z')
|| (s[i] >= 'a' && s[i] <= 'z')
|| (s[i] >= '0' && s[i] <= '9')
|| s[i] == '_'){
flag = 1;
}
else{
flag = 0;
break;
}
}
if(flag == 1){
cout<<"yes"<<endl;
}
else
cout<<"no"<<endl;
return 0;
}
说明:
使用循环方法解决问题时一定要想到break,break作用是跳出循环。
本题中,当第一个字符为数字时,执行语句flag=0之后,如果不使用break跳出循环,i增加进入接下来的循环,后面的字符满足条件就会改变flag的值。只要最后一个字符满足要求,flag的值就为1,可见这样的判断是错误的。
if(表达式1)…else if(表达式2)…else: 依次执行表达式1,表达式2…只要碰到一个表达式为真,则执行该if中的语句,后面的表达式不再被计算,若所有表达式都为假,则执行else中的语句。