我的C++程序作业题(2)

186 阅读4分钟

引言

今天继续回答作业中的程序题。

题目

题目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的时候,我不是特别理解为什么还要还原,所以我刚开始作答的时候,选择了直接输出原始的存储变量用来当做我“还原”后的结果,但是后来想到程序中明确要求我进行还原,所以放弃了这种方法。