C++数据结构实验三 字符串和数

实验内容

1.定义任意两个字符串,完成以下操作:

(1)编写求字符串长度函数,显示该字符串长度;

(2)编写字符串拼接函数,将该字符串与键盘输入的另一字符串拼接,并显示拼接结果;

(3)编写比较大小函数,比较两字符串大小,并显示比较结果。

2.实现奇数阶幻方。在一个由若干个排列整齐的数组成的正方形中,图中任意一横行、一纵行的几个数之和都相等,具有这种性质的图表,称为“幻方”。按目前填写幻方的方法,是把幻方分成了三类,即奇数阶幻方、双偶阶幻方、单偶阶幻方。奇数阶幻方的方法比较简单,这里只考查奇数阶幻方的程序。输入 30 以内的任一奇数 n,自动输出 n*n 阶幻方。如:

C++数据结构实验三 字符串和数_第1张图片

奇数阶幻方口诀的口诀——一居上行正中央,依次斜填切莫忘;上出框时向下放,右出框时向左放;排重便在下格填,右上排重一个样。这是由法国人罗伯(do la loubere)总结出来的,所以都叫他罗伯法。

一居上行正中央:数字 1 放在首行最中间的格子中;

依次斜填切莫忘:向右上角斜行,依次填入数字;

上出框时向下放:如果右上方向出了上边界,就以出框后的虚拟方格位置为基准,将数字竖直降落至底行对应的格子中;

右出框时向左放:同上,向右出了边界,就以出框后的虚拟方格位置为基准,将数字平移至最左列对应的格子中;

排重便在下格填:如果数字 右上的格子已被其它数字占领,就将填写在下面的格子中;

右上排重一个样:如果朝右上角出界,和上面重复的情况做同样处理。


实验代码

1.
// 求字符串长度
int StringLength(char* str)
{
     
    int i = 0;
    while(str[i] != '\0')
    {
     
        i++;
    }
    return i;
}

// 字符串拼接
// 返回结果为str1 需要自行确保内存空间足够以防溢出
char* Stringcat(char* str1, char* str2)
{
     
    int i,j = 0;
    while(str1[i] != '\0')
    {
     
        i++;
    }
    while(str2[j] != '\0')
    {
     
        str1[i] = str2[j];
        i++;
        j++;
    }
    str1[i] = '\0';
    return str1;
}

// 字符串比较函数
// 当s1 < s2时返回-1 当s1 == s2时返回0 当s1 > s2时返回1
int StringCompare(char* s1, char* s2)
{
     
    int i = 0;
    while(s1[i] != '\0')
    {
     
        if(s1[i] > s2[i])
            return 1;
        else if(s1[i] < s2[i])
            return -1; 
        else
         i++;
    }
    // 能运行到这里 说明要么两字符串一样长且相等 要么s2比s1长
    if(StringLength(s1) == StringLength(s2))
        return 0;
    else
        return -1;
}

注意了,第一个实验我只实现了核心的三个功能函数,所以别问为什么运行不了,自己去写几句话打印结果就行了。

2.
#include

int main()
{
     
    // ------------- 实现30以内奇数阶幻方 ----------------

    // 幻方
    int MagicSquare[30][30];
    // 阶数
    int rank;
    // 当前操作的行,列
    int row = 0, col = 0;
    // 获得用户输入的奇数阶
    std::cin >> rank;
    col = (int)rank / 2;
    // 初始化幻方
    for (int i = 0; i < 30; i++)
    {
     
        for (int j = 0; j < rank; j++)
        {
     
            MagicSquare[i][j] = 0;
        }
        std::cout << std::endl;
    }

    // 放入数字
    for (int i = 1; i <= rank * rank; i++)
    {
     
        // 将数放到上一次循环找到的位置
        MagicSquare[row][col] = i;

        // 为下一个数找位置
        int tmp_row = row;
        int tmp_col = col;
        // 当前操作位置的移动
        // 尝试向右上角移动
        if (row - 1 < 0)
            tmp_row = rank - 1;
        else
            tmp_row -= 1;

        if (col - 1 < 0)
            tmp_col = rank - 1;
        else
            tmp_col -=  1;

        // 当前位置是否已经被填了
        if (MagicSquare[tmp_row][tmp_col] == 0)
        {
     
            row = tmp_row;
            col = tmp_col;
        }
        else 
        {
     
            // 填了就下移一行
            do
            {
     
                if (row + 1 >= rank)
                    row = 0;
                else
                    row += 1;
            }
            while (MagicSquare[row][col] != 0 && i < rank * rank);
        }


    }

    // 打印
    for (int i = 0; i < rank; i++)
    {
     
        for (int j = 0; j < rank; j++)
        {
     
            std::cout << MagicSquare[i][j] << " ";
        }
        std::cout << std::endl;
    }


    return 0;
}

你可能感兴趣的:(课程实验,数据结构)