引言
今天继续回答作业中的程序题。
题目
题目1
题目
编写一个简单加密程序。输入一个6位整数的明码,按以下方法加密:首先,将每位数字替换成它与7相加之和再用10求模的结果;然后逆置;最后输出密码。再编写程序,把这个密码还原成明码。若输入错误,则显示错误信息后退出程序。
例如,输入原码数据n为:200911,则显示密码n1为:886779,解密后的原码n2为:200911。
注:密码n1不一定是6位整数,但明码n和n2是相等的6位整数。
作答
这一题题目已经给出了做题步骤:输入整数,加密,逆置后输出,再还原,输出。
那我们就按照这个步骤一点点来,首先定义整形变量用于存储输入整数,在输入后,判断是否合法,不合法程序应该报错并结束进程,为了对每位的数字加密,我们需要将这个6位整数每一位都分离出来,如果对这一步不知道如何操作,请阅读juejin.cn/post/727636…这篇文章的题目1作答部分。在分离出来之后,我们就可以按照题目提示进行处理数据实现加密,加密完成后我们就该考虑输出了,那这时候我们就要将这些加密后的数字再变成一个整数,也就是将每一位的数字乘上对应的倍数(如十位数上面的数字要乘上10),完成后直接输出就可以了。
我们现在继续设计还原程序,不难发现,原码中的0——2在加上7之后,取模操作可以忽略;而原码中的3——9就不可以,他们在加上7之后,取模操作使他们减小了10。在明确这些之后,我们就可以使用判断语句,判断每一位的数字范围,如果是0——2,我们只需要减去7就可以还原了;但是如果是3——9,我们则需要再加上一个10。这样每个位置上的数字还原之后,我们和刚刚的处理方法一致,把他们变成一个整数就可以了。
整个程序也就设计好了,下面的代码供参考:
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int n = 0, n1 = 0, n2 = 0;
int a[6];
cout << "请输入原码数据n:" << endl;
cin >> n;
if (n < 100000 || n > 1000000)
{
cout << "错误信息" << endl;
return -1;
}
for (int i = 0; i < 6; i++)
{
a[i] = int(n / pow(10, i)) % 10;
a[i] = (a[i] + 7) % 10;
}
for (int i = 0; i < 6; i++)
{
n1 = n1 + int(a[i] * pow(10, 6 - i - 1));
}
cout << "密码n1为:" << n1 << endl;
//还原
for (int i = 0; i < 6; i++)
{
if (a[i] >= 7)
a[i] = a[i] - 7;
else
a[i] = 10 + a[i] - 7;
n2 = n2 + int(a[i] * pow(10, i));
}
cout << "解密后的原码n2为:" << n2 << endl;
return 0;
}
题目2
题目
编程模拟剪刀、石头和布游戏。游戏规则为:剪刀剪纸,石头砸剪刀,布包石头。玩游戏者从键盘输入s(表示剪刀)或r(表示石头)或p(表示布),要求两个游戏者交替输入,计算机给出输赢的信息。
作答
这一题步骤也很清晰:输入字符,判断输赢。
我们首先需要定义两个字符变量用于区分两个游戏者输入的字符,这里需要对玩家输入的字符进行判断,判断是否合法,如果不合法就让玩家重新输入,为了让两个玩家交替输入,我们需要让他们分别输入。输入后,我们继续判断输赢。当两个玩家输入一致的时候,是平局;如果玩家1想赢,那么玩家1输入布的时候玩家2要输入石头,或者玩家1输入石头的时候玩家2要输入剪刀,又或者玩家1输入剪刀的时候玩家2要输入布;玩家2与玩家1想赢的方式一致。而游戏只有这三种结局,且判断赢的时候要输入的表达式过多,所以我们使用 if , else if , else ,这样可以稍微减少一点代码长度。
#include<iostream>
using namespace std;
int main()
{
char player_1, player_2;
cout << "请玩家1输入:(s代表剪刀,r代表石头,p代表布)" << endl;
cin >> player_1;
while (player_1 != 's' && player_1 != 'r' && player_1 != 'p')
{
cout << "玩家1输入错误,请重新输入" << endl;
cin >> player_1;
}
cout << "请玩家2输入:(s代表剪刀,r代表石头,p代表布)" << endl;
cin >> player_2;
while (player_2 != 's' && player_2 != 'r' && player_2 != 'p')
{
cout << "玩家2输入错误,请重新输入" << endl;
cin >> player_2;
}
if (player_1 == player_2)
cout << "平局!!!" << endl;
else if ((player_1 == 's' && player_2 == 'p') || (player_1 == 'r' && player_2 == 's') || (player_1 == 'p' && player_2 == 'r'))
cout << "玩家1赢!!!" << endl;
else
cout << "玩家2赢!!!" << endl;
return 0;
}
结语
在作答题目1的时候,我不是特别理解为什么还要还原,所以我刚开始作答的时候,选择了直接输出原始的存储变量用来当做我“还原”后的结果,但是后来想到程序中明确要求我进行还原,所以放弃了这种方法。