鱼C论坛

 找回密码
 立即注册
查看: 5599|回复: 12

[已解决]程序死循环,找不出原因

[复制链接]
发表于 2022-4-19 12:59:36 | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 孤不冷cing 于 2022-4-19 20:33 编辑
  7 int main()
  8 {
  9         int a[3][18]={0};// 用于存放54个不重复的、[1,54]内的整数,并把他们分成三组
 10         int (*p)[3][18]=&a;// 用于修改数组a中的值
 11         int i,j,m,n;
 12         int t;
 13         int s=100;
 14         int count=-1;// 后面用来与i比较,作为判断条件。因为是与i比较,所以初始化为-1。
 15         
 16         for(i=0; i<3; i++)// 为每一个a中的元素赋值
 17         {
 18                 srand(s++);
 19                 for(j=0; j<18; j++)
 20                 {
 21                         t = rand()%54+1;// 用中间变量t存储获得的随机数
 22                         for(m=i; m>=0; m--)// 靠n的值来判断随机数是否与之前获得的所有>    随机数都不相同
 23                         {
 24                                 for(n=17; n>=0; n--)
 25                                 {
 26                                         if(t==a[m][n])
 27                                                 break;
 28                                 }
 29                                 if(n==-1)// 说明这一层里没有重复
 30                                         count++;// 说明处理完了一层数组
 31                         }
 32                         if(n==-1 && count==i)
 33                         // 这个地方的判断有问题,单纯这一个条件,检测一维数组是否全部不相同没问题,但检测多维数组不行,因为m>0时,每次循环完,n必然为-1
 34                         // 这里的count表示n==-1条件满足了count+1次
 35                         {
 36                                 (*p)[i][j]=t;
 37                         }
 38                                 
 39                         else
 40                         {
 41                                 srand(s++);
 42                                 j--;
 43                         }
 44                 }
 45         }
 46 
 47         for(i=0; i<3; i++)// 打印a中所有元素
 48         {
 49                 for(j=0; j<18; j++)
 50                 {
 51                         printf("%d\n", a[i][j]);
 52                 }
 53         }
 54 
 55         return 0;
 56 }
  8 int main()
  9 {
 10         int a[54]={0};// 用于存放54个不重复的、[1,54]内的整数
 11         int (*p)[54]=&a;// 用于修改数组a中的值
 12         int i,j;
 13         int t;
 14         int s=100;
 15         //int count=-1;// 后面用来与i比较,作为判断条件。因为是与i比较,所以初始化为-1    。
 16 
 17         for(i=0; i<54; i++)// 为每一个a中的元素赋值
 18         {
 19                 srand(s++);// 刷新seed,为了防止程序执行太快,把刷新放在循环外
 20                 t = rand()%54+1;// 用中间变量t存储获得的随机数
 21                 for(j=i; j>=0; j--)// 靠j的值来判断随机数是否与之前获得的所有随机数都>    不相同
 22                 {
 23                         if(t==a[j])
 24                                 break;
 25                 }
 26                 if(j==-1)
 27                 {
 28                         (*p)[i]=t;
 29                         //printf("%d\n", t);
 30                 }
 31                 else
 32                 {
 33                         srand(s++);
 34                         i--;
 35                 }
 36         }
 37 
 38         for(i=0; i<54; i++)// 打印a中所有元素
 39         {
 40                 printf("%d ", a[i]);
 41         }
 42         putchar('\n');
 43 
 44         // 以下代码用于排序数组,以便检查是否满足无重复并且数量正好的要求
 45         int b,c,d;
 46         for(b=54;b>=0;b--)
 47         {
 48                 for(c=0;c<b;c++)
 49                 {
 50                         if(a[c]>a[c+1])
 51                         {
 52                                 d=a[c];
 53                                 a[c]=a[c+1];
 54                                 a[c+1]=d;
 55                         }
 56                 }
 57         }
 58 
 59         for(i=0; i<54; i++)// 打印a中所有元素
 60         {
 61                 printf("%d ", a[i]);
 62         }
 63         putchar('\n');
 64 
 65         return 0;
 66 }
为什么第一个程序一直在循环啊,我找不出来死循环的原因
第二个就可以成功,啪一下就出结果了

最佳答案
2022-4-19 12:59:37
本帖最后由 jhq999 于 2022-4-19 22:50 编辑

在内存里都是一维数组,多维数组声明只不过是给编译器看的,你也可以理解成一根绳子长54(p[54]),折成3段,每段长18(a[3][18]),其实就是同一根绳子
反过来
int p[54];
int (*a)[18]=(int(*)[18])p;

最佳答案

查看完整内容

在内存里都是一维数组,多维数组声明只不过是给编译器看的,你也可以理解成一根绳子长54(p[54]),折成3段,每段长18(a[3][18]),其实就是同一根绳子 反过来 int p[54]; int (*a)[18]=(int(*)[18])p;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-19 12:59:37 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jhq999 于 2022-4-19 22:50 编辑

在内存里都是一维数组,多维数组声明只不过是给编译器看的,你也可以理解成一根绳子长54(p[54]),折成3段,每段长18(a[3][18]),其实就是同一根绳子
反过来
int p[54];
int (*a)[18]=(int(*)[18])p;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-19 13:12:57 | 显示全部楼层
想问一下,2*1的矩阵为什么能存放54个整数?三组是怎么分出来的,按行分也只有两行而已
 int a[2][1]={0};// 用于存放54个不重复的、[1,54]内的整数,并把他们分成三组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-4-19 20:31:43 | 显示全部楼层
风车呼呼呼 发表于 2022-4-19 13:12
想问一下,2*1的矩阵为什么能存放54个整数?三组是怎么分出来的,按行分也只有两行而已

啊,本来是3*18的,我后面怀疑是不是因为程序运行时间太久了,所以把3*18改成了2*1,然后运行程序还是没反应
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-19 20:50:59 | 显示全部楼层
42                                 j--;//这里所有条件没变,j减一无限循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-4-19 20:55:47 | 显示全部楼层
jhq999 发表于 2022-4-19 20:50
42                                 j--;//这里所有条件没变,j减一无限循环

什么意思,这个j--不是随机数不满足条件才会执行吗。
它上面的srand不是会刷新seed吗,总该有随机数满足条件,这个j--不执行的时候吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-19 21:29:44 | 显示全部楼层
本帖最后由 jhq999 于 2022-4-19 21:38 编辑
孤不冷cing 发表于 2022-4-19 20:55
什么意思,这个j--不是随机数不满足条件才会执行吗。
它上面的srand不是会刷新seed吗,总该有随机数满足 ...


题外话随机种子一次就够了,想每次运行不同用srand(time(0));
我就看到这一个在for循环的循环体里改变循环数的,出毛病应该是它,至于为啥可能随机数重复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-4-19 21:43:17 | 显示全部楼层
jhq999 发表于 2022-4-19 21:29
题外话随机种子一次就够了,
我就看到这一个在for循环的循环体里改变循环数的,出毛病应该是它,至于为 ...

随机种子不更新的话,每次出来的rand()不都是一样的吗,我看网上的讲解是这样说的。
可是我第一个和第二个的逻辑一样的呀,第二个没问题,第一个不应该会死循环呀。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-4-19 21:44:40 | 显示全部楼层
我好像知道为什么死循环了,因为我没有重置count。
第一次进行完之后,后面都不会满足i==count,所以一直在j--。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-19 21:46:07 | 显示全部楼层
本帖最后由 jhq999 于 2022-4-19 21:57 编辑

斗地主洗牌?不是斗地主,没有扣3张牌
#include <stdlib.h>
#include <time.h>
int main() {
        int a[3][18]={0};
        int *p=(int*)a,i=0,j=0,tmp=0;
        for (i = 0; i < 54; i++)
        {
                p[i]=i+1;
        }
        srand(time(0));
        for (i = 0; i <54; i++)
        {
                j=rand()%(54-i)+i;
                tmp=p[i];
                p[i]=p[j];
                p[j]=tmp;
        }
        for(i=0; i<3; i++)// 打印a中所有元素
        {
                for(j=0; j<18; j++)
                {
                        printf("%d\n", a[i][j]);
                }
        }
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-4-19 22:04:19 | 显示全部楼层
jhq999 发表于 2022-4-19 21:46
斗地主洗牌?不是斗地主,没有扣3张牌

我发现我那个为什么死循环了,我没重置count。
你这个是把a强制转换成指针了赋给p,然后以一维数组形式给a赋值是吗。
int *p=(int *)a这里我有点陌生,是怎么个道理啊,让类型一致是吗。我只知道int *p=a会说把整数赋给整型指针这样的警告,没试过你这样的写法。
能解释一下吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-4-19 23:43:52 | 显示全部楼层
jhq999 发表于 2022-4-19 12:59
在内存里都是一维数组,多维数组声明只不过是给编译器看的,你也可以理解成一根绳子长54(p[54]),折成3段 ...

多维数组在内存里是一维数组我知道,我不是问这个
我不明白的点是:像(int *)这样的强制类型转换,什么时候能用,用了有什么效果,可能会出什么错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-20 05:56:44 | 显示全部楼层
孤不冷cing 发表于 2022-4-19 23:43
多维数组在内存里是一维数组我知道,我不是问这个
我不明白的点是:像(int *)这样的强制类型转换,什么 ...

需要时候就用呗,就像我的那个,如果是用2维数组,多麻烦,计算好数组长度别越界。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-2 03:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表