C语言随机数与Switch语句使用

img



#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    srand((unsigned) time(NULL)); // 使用当前时间作为随机数种子
    char fk[10][10];
    int i,j;
    for (i=0;i<10;i++)
    {
        for (j=0;j<10;j++)
        {
            fk[i][j]='.';
        }
    }
    fk[0][0]='A';
    char alp[100]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
    int m=0,n=0,count=0;
    int on=0,und=0,left=0,right=0;
    while (true)
    {
        if (m-1<0 || fk[m-1][n]!='.') on=1;
        if (m+1>9 || fk[m+1][n]!='.') und=1;
        if (n-1<0 || fk[m][n-1]!='.') left=1;
        if (n+1>9 || fk[m][n+1]!='.') right=1;
        if (on==1 && und==1 && left==1 && right==1) break;
        else 
        {
             
            int a = rand()%4;
            switch(a){
                case 0:
                    if (right!=1)
                    {
                        count+=1;
                        n+=1;
                        fk[m][n]=alp[count];
                    }
                    break;
                case 1:
                    if (und!=1)
                    {
                        count+=1;
                        m+=1;
                        fk[m][n]=alp[count];
                    }
                    break;
                case 2:
                    if (left!=1)
                    {
                        count+=1;
                        n-=1;
                        fk[m][n]=alp[count];
                    }
                    break;
                case 3:
                    if (on!=1)
                    {
                        count+=1;
                        m-=1;
                        fk[m][n]=alp[count];
                    }
                    break;
            }
        }
    }
    for (i=0;i<10;i++)
    {
        for (j=0;j<10;j++)
        {
            printf("%c ",fk[i][j]);
            if (j>0 && j%9==0) printf("\n");
        }
    }
    return 0;
}

代码写出后到“S”就结束了,而且运行结果就只有几种,不知道是哪里出错了。

由于一开始的位置on和left都是1,导致后续不可能向上/左,走到最下面正好上S,所以你需要每次循环重置四个方向参数,比如在else末尾增加:

on = und = left = right = 0;

实测引入了一个新的问题,数据显示不完整,原因是没有在输出所有'A-Z'的字母后退出循环,所以需要在退出的判断中增加一个条件:

if (on==1 && und==1 && left==1 && right==1 || count > 24) break;

经测试无故障,完整代码如下:

 
 
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
    srand((unsigned) time(NULL)); // 使用当前时间作为随机数种子
    char fk[10][10];
    int i,j;
    for (i=0;i<10;i++)
    {
        for (j=0;j<10;j++)
        {
            fk[i][j]='.';
        }
    }
    fk[0][0]='A';
    char alp[100]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
    int m=0,n=0,count=0;
    int on=0,und=0,left=0,right=0;
    while (1)
    {
        if (m-1<0 || fk[m-1][n]!='.') on=1;
        if (m+1>9 || fk[m+1][n]!='.') und=1;
        if (n-1<0 || fk[m][n-1]!='.') left=1;
        if (n+1>9 || fk[m][n+1]!='.') right=1;
        if (on==1 && und==1 && left==1 && right==1 || count > 24) break;
        else 
        {
            int a = rand()%4;
            switch(a){
                case 0:
                    if (right!=1)
                    {
                        count+=1;
                        n+=1;
                        fk[m][n]=alp[count];
                    }
                    break;
                case 1:
                    if (und!=1)
                    {
                        count+=1;
                        m+=1;
                        fk[m][n]=alp[count];
                    }
                    break;
                case 2:
                    if (left!=1)
                    {
                        count+=1;
                        n-=1;
                        fk[m][n]=alp[count];
                    }
                    break;
                case 3:
                    if (on!=1)
                    {
                        count+=1;
                        m-=1;
                        fk[m][n]=alp[count];
                    }
                    break;
            }
            on = und = left = right = 0;
        }
    }
    for (i=0;i<10;i++)
    {
        for (j=0;j<10;j++)
        {
            printf("%c ",fk[i][j]);
            if (j>0 && j%9==0) printf("\n");
        }
    }
    return 0;
}
 

【以下回答由 GPT 生成】

我可以为您提供解答。下面是问题的解决方案:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    srand((unsigned) time(NULL)); // 使用当前时间作为随机数种子
    char fk[10][10];
    int i, j;
    for (i = 0; i < 10; i++)
    {
        for (j = 0; j < 10; j++)
        {
            fk[i][j] = '.';
        }
    }
    fk[0][0] = 'A';
    char alp[26] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
    int m = 0, n = 0, count = 0;
    int on = 0, und = 0, left = 0, right = 0;
    while (count < 26)
    {
        on = 0;
        und = 0;
        left = 0;
        right = 0;

        if (m - 1 < 0 || fk[m - 1][n] != '.') on = 1;
        if (m + 1 > 9 || fk[m + 1][n] != '.') und = 1;
        if (n - 1 < 0 || fk[m][n - 1] != '.') left = 1;
        if (n + 1 > 9 || fk[m][n + 1] != '.') right = 1;

        if (!on && !und && !left && !right)
        {
            int randomIndex = rand() % 26;

            switch (alp[randomIndex])
            {
                case 'A':
                    fk[m][n] = 'A';
                    break;
                case 'B':
                    fk[m][n] = 'B';
                    break;
                case 'C':
                    fk[m][n] = 'C';
                    break;
                case 'D':
                    fk[m][n] = 'D';
                    break;
                case 'E':
                    fk[m][n] = 'E';
                    break;
                case 'F':
                    fk[m][n] = 'F';
                    break;
                case 'G':
                    fk[m][n] = 'G';
                    break;
                case 'H':
                    fk[m][n] = 'H';
                    break;
                case 'I':
                    fk[m][n] = 'I';
                    break;
                case 'J':
                    fk[m][n] = 'J';
                    break;
                case 'K':
                    fk[m][n] = 'K';
                    break;
                case 'L':
                    fk[m][n] = 'L';
                    break;
                case 'M':
                    fk[m][n] = 'M';
                    break;
                case 'N':
                    fk[m][n] = 'N';
                    break;
                case 'O':
                    fk[m][n] = 'O';
                    break;
                case 'P':
                    fk[m][n] = 'P';
                    break;
                case 'Q':
                    fk[m][n] = 'Q';
                    break;
                case 'R':
                    fk[m][n] = 'R';
                    break;
                case 'S':
                    fk[m][n] = 'S';
                    break;
                case 'T':
                    fk[m][n] = 'T';
                    break;
                case 'U':
                    fk[m][n] = 'U';
                    break;
                case 'V':
                    fk[m][n] = 'V';
                    break;
                case 'W':
                    fk[m][n] = 'W';
                    break;
                case 'X':
                    fk[m][n] = 'X';
                    break;
                case 'Y':
                    fk[m][n] = 'Y';
                    break;
                case 'Z':
                    fk[m][n] = 'Z';
                    break;
            }

            count++;
        }

        n++;
        if (n == 10)
        {
            n = 0;
            m++;
        }
        if (m == 10)
        {
            break;
        }
    }

    for (i = 0; i < 10; i++)
    {
        for (j = 0; j < 10; j++)
        {
            printf("%c ", fk[i][j]);
        }
        printf("\n");
    }

    return 0;
}

这段代码首先使用 srand() 函数将当前时间作为随机数种子,然后初始化一个二维数组 fk 用来存储生成的随机字母。 接下来,利用两个嵌套循环将数组的所有元素初始化为 '.'。然后,在数组的左上角设置初始值为 'A'。 在 while 循环中,我们检查上、下、左、右四个方向的相邻格子的内容,并根据条件判断是否填充随机字母。 具体实现步骤如下: - 创建变量 onundleftright,并将其初始化为 0。 - 检查上方格子: 如果 m-1<0(即没有上方格子)或上方格子不为空(即 fk[m-1][n]!='.'),则将变量 on 设为 1。 - 检查下方格子: 如果 m+1>9(即没有下方格子)或下方格子不为空(即 fk[m+1][n]!='.'),则将变量 und 设为 1。 - 检查左边格子: 如果 n-1<0(即没有左边格子)或左边格子不为空(即 fk[m][n-1]!='.'),则将变量 left 设为 1。 - 检查右边格子: 如果 n+1>9(即没有右边格子)或右边格子不为空(即 fk[m][n+1]!='.'),则将变量 right 设为 1。 - 如果 onundleftright 都为 0,则表示该格子可以填充随机字母。 - 生成一个随机数 randomIndex,取值范围是 0 到 25,用来在字母数组 alp 中选择一个字母。 - 使用 switch 语句将 alp[randomIndex] 映射到相应的字母,并将其填充到 fk[m][n] 格子中。 - 将随机字母的数量 count 加 1。 - 将 n 加 1,如果 n 等于 10,则将 n 设为 0,并将 m 加 1。 - 如果 m 等于 10,则退出循环。 最后,使用两个嵌套循环打印二维数组 fk,并以空格作为分隔符分隔每个元素。 请注意,switch 语句的代码会根据实际情况略有冗长,但其实可以使用更简洁的方式实现,这里只是给出了一种可能的实现方法。 希望这个解决方案可以帮助到您。如果您还有其他问题需要解答,请随时告诉我。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^