孤不冷cing 发表于 2022-4-19 12:59:36

程序死循环,找不出原因

本帖最后由 孤不冷cing 于 2022-4-19 20:33 编辑

7 int main()
8 {
9         int a={0};// 用于存放54个不重复的、内的整数,并把他们分成三组
10         int (*p)=&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)
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)=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);
52               }
53         }
54
55         return 0;
56 }


8 int main()
9 {
10         int a={0};// 用于存放54个不重复的、内的整数
11         int (*p)=&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)
24                                 break;
25               }
26               if(j==-1)
27               {
28                         (*p)=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);
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>a)
51                         {
52                                 d=a;
53                                 a=a;
54                                 a=d;
55                         }
56               }
57         }
58
59         for(i=0; i<54; i++)// 打印a中所有元素
60         {
61               printf("%d ", a);
62         }
63         putchar('\n');
64
65         return 0;
66 }
为什么第一个程序一直在循环啊,我找不出来死循环的原因
第二个就可以成功,啪一下就出结果了

jhq999 发表于 2022-4-19 12:59:37

本帖最后由 jhq999 于 2022-4-19 22:50 编辑

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

风车呼呼呼 发表于 2022-4-19 13:12:57

想问一下,2*1的矩阵为什么能存放54个整数?三组是怎么分出来的,按行分也只有两行而已
int a={0};// 用于存放54个不重复的、内的整数,并把他们分成三组

孤不冷cing 发表于 2022-4-19 20:31:43

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

啊,本来是3*18的,我后面怀疑是不是因为程序运行时间太久了,所以把3*18改成了2*1,然后运行程序还是没反应

jhq999 发表于 2022-4-19 20:50:59

42                                 j--;//这里所有条件没变,j减一无限循环

孤不冷cing 发表于 2022-4-19 20:55:47

jhq999 发表于 2022-4-19 20:50
42                                 j--;//这里所有条件没变,j减一无限循环

什么意思,这个j--不是随机数不满足条件才会执行吗。
它上面的srand不是会刷新seed吗,总该有随机数满足条件,这个j--不执行的时候吧。

jhq999 发表于 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循环的循环体里改变循环数的,出毛病应该是它,至于为啥可能随机数重复

孤不冷cing 发表于 2022-4-19 21:43:17

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

随机种子不更新的话,每次出来的rand()不都是一样的吗,我看网上的讲解是这样说的。
可是我第一个和第二个的逻辑一样的呀,第二个没问题,第一个不应该会死循环呀。

孤不冷cing 发表于 2022-4-19 21:44:40

我好像知道为什么死循环了,因为我没有重置count。
第一次进行完之后,后面都不会满足i==count,所以一直在j--。

jhq999 发表于 2022-4-19 21:46:07

本帖最后由 jhq999 于 2022-4-19 21:57 编辑

斗地主洗牌?不是斗地主,没有扣3张牌
#include <stdlib.h>
#include <time.h>
int main() {
        int a={0};
        int *p=(int*)a,i=0,j=0,tmp=0;
        for (i = 0; i < 54; i++)
        {
                p=i+1;
        }
        srand(time(0));
        for (i = 0; i <54; i++)
        {
                j=rand()%(54-i)+i;
                tmp=p;
                p=p;
                p=tmp;
        }
        for(i=0; i<3; i++)// 打印a中所有元素
        {
                for(j=0; j<18; j++)
                {
                        printf("%d\n", a);
                }
        }
      return 0;
}

孤不冷cing 发表于 2022-4-19 22:04:19

jhq999 发表于 2022-4-19 21:46
斗地主洗牌?不是斗地主,没有扣3张牌

我发现我那个为什么死循环了,我没重置count。
你这个是把a强制转换成指针了赋给p,然后以一维数组形式给a赋值是吗。
int *p=(int *)a这里我有点陌生,是怎么个道理啊,让类型一致是吗。我只知道int *p=a会说把整数赋给整型指针这样的警告,没试过你这样的写法。
能解释一下吗

孤不冷cing 发表于 2022-4-19 23:43:52

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

多维数组在内存里是一维数组我知道,我不是问这个
我不明白的点是:像(int *)这样的强制类型转换,什么时候能用,用了有什么效果,可能会出什么错误

jhq999 发表于 2022-4-20 05:56:44

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

需要时候就用呗,就像我的那个,如果是用2维数组,多麻烦,计算好数组长度别越界。
页: [1]
查看完整版本: 程序死循环,找不出原因