一.对昨天的素数完全分解做了小改动,试了试其他循环语句。
之前保留了一点想当然的想法,认为在原结构中(x在最后位置得出值)判断语句应该放在后边。
今天尝试了for语句和while,发现这想法纯属多余。
这时给x赋了个初值。而最后的语句空下。运行结果正常。
while语句,运行也正常。
P.S. 切记想当然和人为敏感。。
二.剪刀石头布。
这是书上一道习题。
要求:s表示剪刀,r表示石头,p表示布,两个玩家交替输入“字符”,然后程序给出输赢结果。
这个题的主要难点在于,如何处理字母。这是遇到的第一个要考虑输入字母的问题。也借此察觉到自己对相关知识的生疏和浮于表面。
考虑到之前接触过的例子。计算机是不会认识字母的,这题一定是把字母和数字对应。那么,定义三个变量自己赋值吗?有点玄乎。
想到ASCII码,这可有现成的数字。
查阅得:p,r,s分别对应112,114,115。
两两做差可知出题人意图:三个差正好分别是:1,2,3。
心中有底了。
于是大体思路就是,定义char类型变量储存玩家输入的字母,强制转换将其变成ASCII,作差,用差的值判断输赢。
考虑到同样两个字母组合有两种输赢情况(即结果有正负两个)于是引进if..else语句协助判断大小。
而三种差的对应正好可以用一下还没用过的switch语句。这样的话就要写一共六种情况。。虽然就算穷举也就才9种,但暂时想不到优化的办法。原码如下:
#include<iostream>
using namespace std;
int main()
{
char a,b;int m,n,x;
cout<<"玩家甲输入:"<<endl;
cin>>a;
cout<<"玩家乙输入:"<<endl;
cin>>b;
m=int(a);
cout<<m<<n;
n=int(b) ;
if(m>n)
{
x=m-n;
switch(x)
{
case 1: cout<<"乙胜!"; break;
case 2: cout<<"乙胜!"; break;
case 3: cout<<"甲胜!"; break;
}
}
else
{
x=n-m;
switch(x)
{
case 1: cout<<"甲胜!"; break;
case 2: cout<<"甲胜!"; break;
case 3: cout<<"乙胜!"; break;
}
}
}
P.P.S 字符s写在代码里的时候要加‘’,这里单引号是常量,字符常量。比如,定义一个char类型变量并赋值,就要写成:char a=’s’,
而在用键盘输入时则不用加单引号。
另外,这是第一次用强制转换把字母变成数字。在做之前还有些许怀疑可行否,果然实践才出真知。