从头到尾捋了很多遍,真没发现逻辑错误,求指出我的错误


#ifndef _GAME_H_
#define _GAME_H_

#define ROW 9
#define COL 9

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

void title();
void upd_bd(char arr[ROW][COL]);
void init(char arr[ROW][COL]);//初始化棋盘or清空棋盘
void display(char arr[ROW][COL]);//打印棋盘


#endif

void title()
{
    printf("*********** 数独游戏 **********\n");

}

void display(char arr[ROW][COL]) //打印棋盘
{
    int row = 1;
    printf("  ");
    for (int k = 1; k <= COL; k++)
    {
        printf(" %d  ", k);
        if (k == COL)
            printf("\n");
    }
    for (int l = 0; l <= COL; l++)
    {
        printf(" ");
        if (l == COL)
            printf("\n");
    }
    for (int i = 0; i < ROW; i++)
    {
        for (int j = 0; j < COL; j++)
        {
            if (i > 0 && j == 0)
            {
                printf("  ");
                for (int k = 0; k < COL; k++)
                {
                    if (k > 0)
                        printf("|");
                    printf("---");
                }
                printf("\n");
            }
            if (j == 0)
                printf("%d ", row++);
            if (j > 0)
                printf("|");
            printf(" %c ", arr[i][j]);
            if (j == COL - 1)
                printf("\n");
        }
    }
}

void init(char arr[ROW][COL])//初始化棋盘or清空棋盘
{
    for (int i = 0; i < ROW; i++)
    {
        for (int j = 0; j < COL; j++)
            arr[i][j] = ' ';
    }
}

void upd_bd(char arr[ROW][COL])//生成9X9棋盘
{
    srand(time(0));
    char element[10] = { '1','2','3','4','5','6','7','8','9','\0' };
    int row, col, count = 0;
    int num, count_r = 0, count_c = 0;
    int Flag_r = 0, Flag_c = 0;
    while (1)
    {
        count_r = 0, count_c = 0;
        Flag_r = 0, Flag_c = 0;
        do {                                //循环直到随机出一个满足条件的坐标
            row = rand() % 9;
            col = rand() % 9;
            for (int i = 0; i < ROW; i++)
            {
                if (arr[i][col] != ' ')
                    count_c++;             //记录坐标所在列被赋值元素个数
            }
            for (int j = 0; j < COL; j++)
            {
                if (arr[row][j] != ' ')
                    count_r++;             //记录坐标所在行被赋值元素个数
            }
        } while (arr[row][col] != ' ' || count_r == 2 || count_c == 2);//当该坐标值不为0或坐标所在行列有数值位数量达到2,不满足条件,继续循环

        do {                                 //坐标确定,循环直到随机出一个满足条件的数值填入坐标
            num = rand() % 9;            //数字1-9对应的ASCLL表值
            for (int i = 0; i < ROW; i++)
            {
                if (arr[i][col] == element[num])
                    Flag_c = 1;             //坐标对应列整列有相同值,Flag_c赋值为1
            }
            for (int j = 0; j < COL; j++)
            {
                if (arr[row][j] == element[num])
                    Flag_r = 1;             //坐标对应行整行有相同值,Flag_r赋值为1
            }
        } while (Flag_r == 1 || Flag_c == 1);//行或列中有相同值则继续循环
        arr[row][col] = element[num];
        count++;
        if (count == 9)//9(可按游戏规则难度等设置)个位置被复制后,九宫格生成完毕,结束循环
            break;
    }
}

int main()
{
    char board[ROW][COL];
    init(board);
    display(board);
    upd_bd(board);
    display(board);
    return 0;
}

img


正常情况应该再输出一个9个随机位置被赋予随机值的表格,但只有一个初始化的表格打印出来了

代码里面有死循环,下面这两个flag只要有一次变成1,就永远在这个红框里面循环了

img

编译器没报错啊,而且你的Board都没用啊

你的board数组都没有赋值啊!

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7729308
  • 这篇博客你也可以参考下:个有10个元素的整型一维数组,用户输入9个数据,调用函数,对数组元素进行从小到大排序后,在函数中输入一个数,插入到数组中正确的位置,并输出
  • 除此之外, 这篇博客: 输入两个已经按照升序排列好的字符串,将两个字符串合并成一个字符串,新字符串中的字符仍然按照升序排列。中的 测试说明 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    平台会对你编写的代码进行测试: 输入: 输入排好序的字符串1 abcdefg 输入排好序的字符串2 1234567 输出: 1234567abcdefg

    #include<stdio.h>
    #include<string.h>
    #define SIZE 100 
    void resort(char *a)
    {
    	int i=0,j=0;
    	int len=strlen(a);
    	char temp;
    	for(i=0;i<len-1;i++)
    	{
    		for(j=0;j<len-1-i;j++)
    		{
    			if(a[j]>a[j+1])
    			{
    				temp=a[j];
    				a[j]=a[j+1];
    				a[j+1]=temp;	
    			}
    		}
    	}	  
    
    }
    
        
    int main()
    {
    	char arr1[SIZE];	
    	char arr2[SIZE];
    	int n;
    	puts("输入排好序的字符串1");
    	gets(arr1);
    	puts("输入排好序的字符串2");
    	gets(arr2);
    	n=strcmp(arr1,arr2);
    	if(n<0)
    	{
    		strcat(arr1,arr2);
    		resort(arr1);
    		puts(arr1);
    	}
    	else
    	{
    		strcat(arr2,arr1);
    		resort(arr2);
    		puts(arr2);
    	}
    	return 0;
    }

  • 您还可以看一下 郑逊敏老师的抖音快手短视频自媒体制作引流运营兼职创业赚钱盈利实战教程课程中的 巧妙借势热点,实现快速涨粉小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    问题分析: 根据给出的参考资料和问题描述,我们可以分析出以下问题: 1. 代码中使用了gets()函数进行输入,但这个函数在C11中被弃用,在C14中被移除。应该使用更安全的fgets()函数进行输入。 2. 代码中计算出现次数最多的整数及其出现次数,但只输出了其中一个整数和次数,没有输出其他整数的出现次数。

    解决方案: 根据问题分析,我们可以采取以下步骤来解决问题:

    步骤1: 修改输入部分 将代码中使用的gets()函数改为fgets()函数进行输入,并对输入进行处理,列出需要输入的整数的个数和整数本身。 代码示例:

    #include <stdio.h>
    
    void fun(char *str) {
        // 获取输入的整数个数
        int n;
        sscanf(str, "%d", &n);
        // 打印整数个数用于测试
        printf("n = %d\n", n);
    
        // 获取整数并打印
        int nums[n];
        for (int i = 0; i < n; i++) {
            sscanf(str + 3 + 2 * i, "%d", &nums[i]);
            printf("nums[%d] = %d\n", i, nums[i]);
        }
    }
    
    int main() {
        char str[100];
        fgets(str, sizeof(str), stdin);
        fun(str);
        return 0;
    }
    

    步骤2: 修改计算出现次数最多的整数部分 根据题目要求,我们需要计算出现次数最多的整数及其出现的次数,并按整数升序输出。修改代码,使用一个数组来统计每个整数出现的次数,再遍历数组找到出现次数最多的整数,并打印出相应的次数。 代码示例:

    #include <stdio.h>
    
    void fun(char *str) {
        int n;
        sscanf(str, "%d", &n);
    
        int nums[n];
        for (int i = 0; i < n; i++) {
            sscanf(str + 3 + 2 * i, "%d", &nums[i]);
        }
    
        // 统计每个整数出现的次数
        int count[n];
        for (int i = 0; i < n; i++) {
            // 初始化次数为0
            count[i] = 0;
            for (int j = 0; j < n; j++) {
                if (nums[j] == nums[i]) {
                    count[i]++;
                }
            }
        }
    
        // 找到出现次数最多的整数
        int maxCount = 0;
        for (int i = 1; i < n; i++) {
            if (count[i] > count[maxCount]) {
                maxCount = i;
            }
        }
    
        // 打印出现次数最多的整数及其出现次数
        for (int i = 0; i < n; i++) {
            if (count[i] == count[maxCount]) {
                printf("%d %d\n", nums[i], count[i]);
            }
        }
    }
    
    int main() {
        char str[100];
        fgets(str, sizeof(str), stdin);
        fun(str);
        return 0;
    }
    

    以上代码中,我们使用一个数组count[]来存储每个整数出现的次数,然后找到出现次数最多的整数并记录索引maxCount,最后再遍历数组找到所有出现次数等于最大次数的整数并打印出来。

    通过以上两个步骤的修改,可以解决问题。

    注意事项: - 为了保证程序的安全性,应该根据输入字符串的长度进行越界检查,避免数组溢出。 - 在解决问题的过程中,要充分理解题目要求和给出的代码,避免思路上的偏差和操作上的错误。


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