程序死循环,找不出原因
本帖最后由 孤不冷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 22:50 编辑
在内存里都是一维数组,多维数组声明只不过是给编译器看的,你也可以理解成一根绳子长54(p),折成3段,每段长18(a),其实就是同一根绳子
反过来
int p;
int (*a)=(int(*))p; 想问一下,2*1的矩阵为什么能存放54个整数?三组是怎么分出来的,按行分也只有两行而已
int a={0};// 用于存放54个不重复的、内的整数,并把他们分成三组 风车呼呼呼 发表于 2022-4-19 13:12
想问一下,2*1的矩阵为什么能存放54个整数?三组是怎么分出来的,按行分也只有两行而已
啊,本来是3*18的,我后面怀疑是不是因为程序运行时间太久了,所以把3*18改成了2*1,然后运行程序还是没反应 42 j--;//这里所有条件没变,j减一无限循环 jhq999 发表于 2022-4-19 20:50
42 j--;//这里所有条件没变,j减一无限循环
什么意思,这个j--不是随机数不满足条件才会执行吗。
它上面的srand不是会刷新seed吗,总该有随机数满足条件,这个j--不执行的时候吧。 本帖最后由 jhq999 于 2022-4-19 21:38 编辑
孤不冷cing 发表于 2022-4-19 20:55
什么意思,这个j--不是随机数不满足条件才会执行吗。
它上面的srand不是会刷新seed吗,总该有随机数满足 ...
题外话随机种子一次就够了,想每次运行不同用srand(time(0));
我就看到这一个在for循环的循环体里改变循环数的,出毛病应该是它,至于为啥可能随机数重复
jhq999 发表于 2022-4-19 21:29
题外话随机种子一次就够了,
我就看到这一个在for循环的循环体里改变循环数的,出毛病应该是它,至于为 ...
随机种子不更新的话,每次出来的rand()不都是一样的吗,我看网上的讲解是这样说的。
可是我第一个和第二个的逻辑一样的呀,第二个没问题,第一个不应该会死循环呀。 我好像知道为什么死循环了,因为我没有重置count。
第一次进行完之后,后面都不会满足i==count,所以一直在j--。 本帖最后由 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;
} jhq999 发表于 2022-4-19 21:46
斗地主洗牌?不是斗地主,没有扣3张牌
我发现我那个为什么死循环了,我没重置count。
你这个是把a强制转换成指针了赋给p,然后以一维数组形式给a赋值是吗。
int *p=(int *)a这里我有点陌生,是怎么个道理啊,让类型一致是吗。我只知道int *p=a会说把整数赋给整型指针这样的警告,没试过你这样的写法。
能解释一下吗 jhq999 发表于 2022-4-19 12:59
在内存里都是一维数组,多维数组声明只不过是给编译器看的,你也可以理解成一根绳子长54(p),折成3段 ...
多维数组在内存里是一维数组我知道,我不是问这个
我不明白的点是:像(int *)这样的强制类型转换,什么时候能用,用了有什么效果,可能会出什么错误 孤不冷cing 发表于 2022-4-19 23:43
多维数组在内存里是一维数组我知道,我不是问这个
我不明白的点是:像(int *)这样的强制类型转换,什么 ...
需要时候就用呗,就像我的那个,如果是用2维数组,多麻烦,计算好数组长度别越界。
页:
[1]