《数组与指针程序设计》——小组作业(11-20)

本文介绍如何用C++实现凯撒密码加密和解密功能,包括用户输入密钥的程序,并展示了成绩查找、字符串回文判断、矩阵运算和数据转换等技术的应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

⒒编写两个程序:        

⑴实现通过凯撒密码对字符串加密,密钥通过键盘输入。        

⑵实现上一程序的解密。

#include <iostream>

using namespace std;

char *Encrypty (char *str, int offset);
char *Decode (char *str, int offset);

int main (void)
{
    char str[80];
    cout << "Please enter what you want to encrypt (< 80): " << endl;
    cin.getline (str, 80);

    int offset;
    cout <<  "Please input the value of offset: " << endl;
    cin >> offset;

    cout << "The encrypted content is "<< '\n' << Encrypty (str, offset);

    printf ("\n\n");
    system ("pause");
    printf ("\n\n");

    char Str[80];
    cout << "Please enter what you want to decode (< 80): " << endl;
    cin >> Str;

    int key;
    cout <<  "Please input the value of offset: " << endl;
    cin >> key;

    cout << "The encrypted content is "<< '\n' << Decode (Str, key) << endl;

    system ("pause");
    return 0;
}

char
*Encrypty (char *str, int offset)
{
    char *p = NULL;
    p = str;

    while (*p != '\0')
    {
        if (*p >= 'a' && *p <= 'z')
        {
            *p = ((*p - 'a') + offset) % 26 + 'a';
        }
        else if (*p >= 'A' && *p <= 'Z')
        {
            *p = ((*p - 'A') + offset) % 26 + 'A';
        }

        p ++;
    }

    return str;
}

char
*Decode (char *str, int offset)
{
    char *p = NULL;
    p = str;

    while (*p != '\0')
    {
        if (*p >= 'a' && *p <= 'z')
        {
            *p = ((*p - 'a') + (26 - offset)) % 26 + 'a';
        }
        else if (*p >= 'A' && *p <= 'Z')
        {
            *p = ((*p - 'A') + (26 - offset)) % 26 + 'A';
        }

        p ++;
    }

    return str;
}

⒓输入一个二十人班级的一门课程的成绩,输入一个分数查找是否有该成绩,如果有则输出序号,没有打印提示!

#include <iostream>

using namespace std;

#define MAXN 20

void GetPos (double array[],  double target);

int main (void)
{
    double score[MAXN];

    printf ("Please input %d students' scores: \n", MAXN);

    for (int i = 0; i < MAXN; i ++)
    {
        scanf ("%f", &score[i]);
    }

    double target;
    printf ("Please input the target number: ");
    scanf ("%f", &target);

    GetPos (score, target);

    system ("pause");
    return 0;
}

void
GetPos (double array[], double target)
{
    bool bFlag = false;
    double *p = NULL;

    for (p = array; p < array + MAXN; p ++)
    {
        if (target == *p)
        {
            printf ("The score located in %d \n", p - array);

            bFlag = true;
        }
    }

    if (bFlag == false)
    {
        printf ("Not found this score! \n");
    }
}

⒔判断一个字符串是否为回文,如果是输出“Yes”,不是输出 “No”。        

如:  ABCDCBA、ABCCBA是回文。

#include <iostream>

using namespace std;

int MyStrlen (char *str);
bool isPalindrome (char *str);

const char * msg[] = {"No", "Yes"};

int main (void)
{
    char str[80];

    cout << "Please input string (< 80): " << endl;
    cin.getline (str, 80);

    bool bFlag = isPalindrome (str);

    printf ("%s. \n\n", msg[bFlag]);

    system ("pause");
    return 0;
}

int
MyStrlen (char *str)
{
    if (str == NULL)
    {
        return -1;
    }

    int returnSize = 0;

    while (*str != '\0')
    {
        returnSize ++;
        *str ++;
    }

    return returnSize;
}

bool
isPalindrome (char *str)
{
    int len = MyStrlen (str);

    for (int i = 0; i <= len / 2; i ++)
    {
        if (str[i] != str[len - 1 - i])
        {
            return false;
        }
    }

    return true;
}

 ⒕输入4×4的矩阵,求该矩阵周边元素之和,输出结果。

#include <iostream>

using namespace std;

#define MAXN 4

void MatrixSum (double (*p)[MAXN]);

int main (void)
{
    double matrix[MAXN][MAXN];

    printf ("Please input numbers in %d x %d matrix: \n", MAXN, MAXN);
    for (int i = 0; i < MAXN; i ++)
    {
        for (int j = 0 ; j < MAXN; j ++)
        {
            cin >> matrix[i][j];
        }
    }

    MatrixSum (matrix);

    system ("pause");
    return 0;
}

void
MatrixSum (double (*p)[MAXN])
{
    double dSum = 0.0;

    for (int i = 0; i < MAXN; i ++)
    {
        for (int j = 0; j < MAXN; j ++)
        {
            if (i == 0 || j == 0 || i == MAXN - 1 || j == MAXN - 1)
            {
                dSum += *(*(p + i) + j);
            }
        }
    }

    printf ("\n");
    printf ("The sum of the elements around the matrix is %.2f \n", dSum);
}

⒖输入5×4的数组a,计算每行数据元素的最大值存入一维数组b[5]中,输出结果.

#include <iostream>

using namespace std;

#define ROW 5
#define COL 4

void GetMax (double (*p)[COL]);

int main (void)
{
    double a[ROW][COL];

    printf ("Please input numbers in %d x %d matrix: \n", ROW, COL);

    for (int i = 0; i < ROW; i ++)
    {
        for (int j = 0; j < COL; j ++)
        {
            cin >> a[i][j];
        }
    }

    GetMax (a);

    system ("pause");
    return 0;
}

void
GetMax (double (*p)[COL])
{
    double b[ROW] = {0.0};
    int index = 0;

    for (int i = 0; i < ROW; i ++)
    {
        for (int j = 0; j < COL; j ++)
        {
            if (*(*(p + i) + j) > b[index])
            {
                b[index] = *(*(p + i) + j);
            }
        }

        index ++;
    }

    double *q = NULL;

    for (q = b; q < b + ROW; q ++)
    {
        printf ("The maximum value of the %d row of the matrix is %.2f \n", q - b, *q);
    }
}

 ⒗输入5×4的数组a,计算每列数据元素的平均值存入一维数组b[4]中,输出结果。

#include <iostream>

using namespace std;

#define ROW 5
#define COL 4

void GetAverage (double (*p)[COL]);

int main (void)
{
    double a[ROW][COL];

    printf ("Please input numbers in %d x %d matrix: \n", ROW, COL);

    for (int i = 0; i < ROW; i ++)
    {
        for (int j = 0; j < COL; j ++)
        {
            cin >> a[i][j];
        }
    }

    GetAverage (a);

    system ("pause");
    return 0;
}

void
GetAverage (double (*p)[COL])
{
    double b[COL] = {0.0};
    int index = 0;

    for (int i = 0; i < COL; i ++)
    {
        double dSum = 0.0;

        for (int j = 0; j < ROW; j ++)
        {
            dSum += *(*(p + j) + i);
        }

        b[index ++] = dSum / ROW;
    }

    double *q = NULL;

    for (q = b; q < b + COL; q ++)
    {
        printf ("The average value of the %d column of the matrix is %.2f \n", q - b, *q);
    }
}

⒘  将如下定义的表示十六进制的字符串,转化为对应的十进制整形输出(不使用系统函数)。      字符串定义如下:          

char  szStr[ ] = “1a2b”;

#include <iostream>

using namespace std;

#define HEX 16

int MyPow (int num, int n);
int MyStrlen (char *str);
int HexToDec (char *str);

int main (void)
{
    char szStr[] = "1a2b";

    printf ("The Hex: %s to Dec: %d \n", szStr, HexToDec (szStr));

    system ("pause");
    return 0;
}

int
MyPow (int num, int n)
{
    int iRes = 1;

    for (int i = 0; i < n; i ++)
    {
        iRes *= num;
    }

    return iRes;
}

int
MyStrlen (char *str)
{
    if (str == NULL)
    {
        return -1;
    }

    int returnSize = 0;

    while (*str != '\0')
    {
        returnSize ++;
        *str ++;
    }

    return returnSize;
}


int
HexToDec (char *str)
{
    int len = MyStrlen (str);
    int iAns = 0;

    char *p = NULL;
    p = str + len - 1;

    while (p - str >= 0)
    {
        if (*p >= 'A' && *p <= 'F')
        {
            iAns += (10 + (*p - 'A')) * MyPow (HEX, len - (p - str) - 1);
        }
        else if (*p >= '0' && *p <= '9')
        {
            iAns += (*p - '0') * MyPow (HEX, len - (p - str) - 1);
        }
        else if (*p >= 'a' && *p <= 'f')
        {
            iAns += (10 + (*p - 'a')) * MyPow (HEX, len - (p - str) - 1);
        }

        p --;
    }

    return iAns;
}

⒙输入一个四阶方阵,求原矩阵与其转置之和,输出结果。

#include <iostream>

using namespace std;

#define ROW 4
#define COL 4

int **Transpose (int **p);
int GetSum (int **p, int **q);
void MatrixPrint (int **p);

int main (void)
{
    int **matrix = (int **)malloc (sizeof (int *) * ROW);

    for (int i = 0; i < COL; i ++)
    {
        matrix[i] = (int *)malloc (sizeof (int) * COL);
    }

    printf ("Please input number in %d x %d matrix: \n", ROW, COL);

    for (int i = 0; i < ROW; i ++)
    {
        for (int j = 0; j < COL; j ++)
        {
            cin >> *(*(matrix + i) + j);
        }
    }

    printf ("\nAfter transpose: \n");

    int **p = NULL;

    p = Transpose (matrix);

    MatrixPrint (p);

    printf ("\nThe sum of the two matrices is %d \n", GetSum (matrix, p));

    system ("pause");
    return 0;
}

int
**Transpose (int **p)
{
    int **q = NULL;
    q = p;

    for (int j = 0; j < ROW; j ++)
    {
        for (int i = 0; i <= j; i ++)
        {
            int temp = *(*(p + j) + i);
            *(*(p + j) + i) = *(*(p + i) + j);
            *(*(p + i) + j) = temp;
        }
    }

    return q;
}

int
GetSum (int **p, int **q)
{
    int iSum = 0;

    for (int i = 0; i < ROW; i ++)
    {
        for (int j = 0; j < COL; j ++)
        {
            iSum += (*(*(p + i) + j) + *(*(q + i) + j));
        }
    }

    return iSum;
}

void
MatrixPrint (int **p)
{
    for (int i = 0; i < ROW; i ++)
    {
        for (int j = 0; j < COL; j ++)
        {
            printf ("%d ", *(*(p + i) + j));
        }

        printf ("\n");
    }
}

19.输入一个二进制字符串,将其转换为有符号整数。

#include <iostream>

using namespace std;

#define BIN 2

int MyPow (int num, int n);
int MyStrlen (char *str);
int BinToDec (char *str);

int main (void)
{
    char szStr[20];
    printf ("Please input binary number (< 20): \n");
    cin.getline (szStr, 20);

    printf ("The Bin: %s to Dec: %d \n", szStr, BinToDec (szStr));

    system ("pause");
    return 0;
}

int
MyPow (int num, int n)
{
    int iRes = 1;

    for (int i = 0; i < n; i ++)
    {
        iRes *= num;
    }

    return iRes;
}

int
MyStrlen (char *str)
{
    if (str == NULL)
    {
        return -1;
    }

    int returnSize = 0;

    while (*str != '\0')
    {
        returnSize ++;
        *str ++;
    }

    return returnSize;
}

20. 输入一个无符号短整型,输出其对应的二进制。

#include <iostream>

using namespace std;

#define MAXN 16

char *DecToBin (unsigned short int Dec);

int main (void)
{
    unsigned short int dec;
    cout << "Enter an unsigned short integer: ";
    cin >> dec;

    printf ("The result to Bin is %s \n", DecToBin (dec));

    system ("pause");
    return 0;
}

char
*DecToBin (unsigned short int Dec)
{
    char *bin = (char *)malloc (sizeof (char) * MAXN);
    int index = 0;

    for (int i = 16; i >= 0; i --)
    {
        if (Dec & (1 << i))
        {
            *(bin + index) = '1';
        }
        else
        {
            *(bin + index) = '0';
        }

        index ++;
    }

    return bin;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神秘的企鹅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值