鱼C论坛

 找回密码
 立即注册
查看: 1614|回复: 21

[已解决]作用域和链接属性

[复制链接]
发表于 2018-10-16 18:57:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

int in_order(int array[], int length);
void shuffle(int array[], int length);
void bogo_sort(int array[], int length);

int in_order(int array[], int length)
{
        int i = 0;

       while (array[i] <= array[i+1] && ++i < length - 1)
                ;

        if (i == length - 1)
        {
                return 1;
        }
        else
        {
                return 0;
        }
}

void shuffle(int array[], int length)
{
        int index, temp, i;
        static int t1, t2;

        srand(t1);
        t1 = rand();

        t2 = time(NULL);
        srand(t1+t2);

        for (i = 0; i < length; i++)
        {
                index = rand() % (length - i) + i;
                if (index != i)
                {
                        temp = array[i];
                        array[i] = array[index];
                        array[index] = temp;
                }
        }
}

void bogo_sort(int array[], int length)
{
        while (!in_order(array, length))
        {
                shuffle(array, length);
        }
}

int main(void)
{
        int array[] = {73, 108, 111, 118, 101, 70, 105, 104, 67};
        int i, length;
        time_t begin, end;

        begin = time(NULL);

        length = sizeof(array) / sizeof(array[0]);
        bogo_sort(array, length);

        printf("排序后的结果是:");
        for (i = 0; i < length; i++)
        {
                printf("%d ", array[i]);
        }
        putchar('\n');

        end = time(NULL);
        printf("总共耗时:%ld秒\n", end - begin);

        return 0;
}

无法正常运行,打开没有东西,会陷入死循环!

程序目的是实现无限猴子定理,用随机的方法打乱数组,总有一次数组会按照从小到大的顺序排列。

严重怀疑问题出在红色语句
最佳答案
2018-10-16 20:25:37


有执行
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int in_order(int array[], int length);
void shuffle(int array[], int length);
void bogo_sort(int array[], int length);

int in_order(int array[], int length)
{
    int i = 0;
        
    while (array[i] <= array[i+1] && ++i < length - 1)
        ;

    if (i == length - 1)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

void shuffle(int array[], int length)
{
    int index, temp, i;
    static int t1, t2;

    srand(t1);
    t1 = rand();

    t2 = time(NULL);
    srand(t1+t2);

    for (i = 0; i < length; i++)
    {
        index = rand() % (length - i) + i;
        if (index != i)
        {
            temp = array[i];
            array[i] = array[index];
            array[index] = temp;
        }
    }
}

void bogo_sort(int array[], int length)
{
        int c = 0;
    while (!in_order(array, length))
    {
        shuffle(array, length);
        printf("%d\n",c++);
    }
}

int main(void)
{
    int array[] = {73, 108, 111, 118, 101, 70, 105, 104, 67};
    int i, length;
    time_t begin, end;

    begin = time(NULL);

    length = sizeof(array) / sizeof(array[0]);
    bogo_sort(array, length);

    printf("排序后的结果是:");
    for (i = 0; i < length; i++)
    {
            printf("%d ", array);
    }
    putchar('\n');

    end = time(NULL);
    printf("总共耗时:%0.4lf秒\n", (double)(end - begin)/CLOCKS_PER_SEC);

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-10-16 19:11:38 | 显示全部楼层
你这是要排序吗???为何选猴子?慢死了~~算法好像有问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-16 19:17:40 | 显示全部楼层
哎呦,这个小甲鱼的课后作业,他是让实现这个算法呢,而且这个还是小甲鱼的正确答案,算法就是有问题,就在红字哪里,我自己试验了试验,后来发现好像第一个函数就不会进入 if 语句 ,只会进入 else
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-16 19:19:11 | 显示全部楼层
本帖最后由 claws0n 于 2018-10-16 19:20 编辑
啊涂涂 发表于 2018-10-16 19:17
哎呦,这个小甲鱼的课后作业,他是让实现这个算法呢,而且这个还是小甲鱼的正确答案,算法就是有问题,就在 ...

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

int in_order(int array[], int length);
void shuffle(int array[], int length);
void bogo_sort(int array[], int length);

int in_order(int array[], int length)
{
        int i = 0;
        
        while (array[i] <= array[i+1] && ++i < length - 1)
        ;

        if (i == length - 1)
        {
        return 1;
        }
        else
        {
        return 0;
        }
}

void shuffle(int array[], int length)
{
    int index, temp, i;
    static int t1, t2;

    srand(t1);
    t1 = rand();

    t2 = time(NULL);
    srand(t1+t2);

    for (i = 0; i < length; i++)
    {
        index = rand() % (length - i) + i;
        if (index != i)
        {
            temp = array[i];
            array[i] = array[index];
            array[index] = temp;
        }
    }
}

void bogo_sort(int array[], int length)
{
    while (!in_order(array, length))
    {
        shuffle(array, length);
    }
}

int main(void)
{
    int array[] = {73, 108, 111, 118, 101, 70, 105, 104, 67};
    int i, length;
    time_t begin, end;

    begin = time(NULL);

    length = sizeof(array) / sizeof(array[0]);
    bogo_sort(array, length);

    printf("排序后的结果是:");
    for (i = 0; i < length; i++)
    {
            printf("%d ", array);
    }
    putchar('\n');

    end = time(NULL);
    printf("总共耗时:%0.4lf秒\n", (double)(end - begin)/CLOCKS_PER_SEC);

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-16 19:23:22 | 显示全部楼层

怎么又复制了一遍?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-16 19:25:46 | 显示全部楼层
啊涂涂 发表于 2018-10-16 19:23
怎么又复制了一遍?

?可以执行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-16 19:49:36 | 显示全部楼层

啊,我的电脑为啥不行呢?而且你看这个程序,如果从第一个函数进去的话是:
第一个i                      第二个i            第三个i            length == 10
    0                              1                    2   <   length - 1
    2                              3                    4
    4                              5                    6
你看像这个第一次拿0和1比,第二次就直接是2和3比了,那假如说2比一大那不就出问题了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-16 19:57:01 | 显示全部楼层
啊涂涂 发表于 2018-10-16 19:49
啊,我的电脑为啥不行呢?而且你看这个程序,如果从第一个函数进去的话是:
第一个i                    ...

这个算法是不保证收敛的,每一次进行打乱,然后结束,如果不是排序好的,重复……
跟你那个 i 不 i 的没有关系。他没有比较关系,哪一行? 26~47 只有赋值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-16 20:03:15 | 显示全部楼层
claws0n 发表于 2018-10-16 19:57
这个算法是不保证收敛的,每一次进行打乱,然后结束,如果不是排序好的,重复……
跟你那个 i 不 i 的没 ...

嗯嗯,那第一个函数就是检测是否是按照顺序排列的嘛,那就像我刚才说的那样,那岂不是检测的不准确?而且最后退出 i 的时候结果 i 会比 length大,我拿纸推算了好几遍,就是一直不理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-16 20:06:26 | 显示全部楼层
你看我推算的那个,拿数组的第0个数和第一个比,然后第一个不和第二个比,直接跳到第二个和第三个比去了

那个array【i】-> array[i++] -> ++i   看这个 i 变了好多次呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-16 20:08:57 | 显示全部楼层
啊涂涂 发表于 2018-10-16 20:06
你看我推算的那个,拿数组的第0个数和第一个比,然后第一个不和第二个比,直接跳到第二个和第三个比去了

...

那个对呀,遍历数组的所有元素
第一跟第二比,第二跟第三比……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-16 20:15:00 | 显示全部楼层
claws0n 发表于 2018-10-16 20:08
那个对呀,遍历数组的所有元素
第一跟第二比,第二跟第三比……

哦哦,哈哈,我迷糊了。那这个程序都没问题,在我的电脑上为啥不能运行呢?和系统有关?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-16 20:22:40 | 显示全部楼层
啊涂涂 发表于 2018-10-16 20:15
哦哦,哈哈,我迷糊了。那这个程序都没问题,在我的电脑上为啥不能运行呢?和系统有关?

你什么编译器?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-16 20:23:14 | 显示全部楼层

Dev C++
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-16 20:24:25 | 显示全部楼层

就小甲鱼视频上让推荐下载的那个,我是win10系统
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-16 20:25:37 | 显示全部楼层    本楼为最佳答案   


有执行
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int in_order(int array[], int length);
void shuffle(int array[], int length);
void bogo_sort(int array[], int length);

int in_order(int array[], int length)
{
    int i = 0;
        
    while (array[i] <= array[i+1] && ++i < length - 1)
        ;

    if (i == length - 1)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

void shuffle(int array[], int length)
{
    int index, temp, i;
    static int t1, t2;

    srand(t1);
    t1 = rand();

    t2 = time(NULL);
    srand(t1+t2);

    for (i = 0; i < length; i++)
    {
        index = rand() % (length - i) + i;
        if (index != i)
        {
            temp = array[i];
            array[i] = array[index];
            array[index] = temp;
        }
    }
}

void bogo_sort(int array[], int length)
{
        int c = 0;
    while (!in_order(array, length))
    {
        shuffle(array, length);
        printf("%d\n",c++);
    }
}

int main(void)
{
    int array[] = {73, 108, 111, 118, 101, 70, 105, 104, 67};
    int i, length;
    time_t begin, end;

    begin = time(NULL);

    length = sizeof(array) / sizeof(array[0]);
    bogo_sort(array, length);

    printf("排序后的结果是:");
    for (i = 0; i < length; i++)
    {
            printf("%d ", array);
    }
    putchar('\n');

    end = time(NULL);
    printf("总共耗时:%0.4lf秒\n", (double)(end - begin)/CLOCKS_PER_SEC);

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-16 20:27:24 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-16 20:39:28 | 显示全部楼层

麻烦我再问下,正确答案里,第一个函数 && 后面的 ++i < length - 1

这里++i的值之后,i 会变化吗?假如说 i 是1,++完之后会不会变成2呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-16 20:43:44 | 显示全部楼层
啊涂涂 发表于 2018-10-16 20:39
麻烦我再问下,正确答案里,第一个函数 && 后面的 ++i < length - 1

这里++i的值之后,i 会变化吗? ...

当然会改变
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-16 20:57:42 | 显示全部楼层

#include <stdio.h>

int main(void)
{
                int array[] = {1, 2, 3, 4, 5};
                int length = 3;
                int i = 0;
               
                while (array[i] <= array[i+1] && ++i < length - 1)
                {
                                printf("%d", i);
                }
               
                return 0;
}

这是我又专门把刚才那个给划了出来,结果打印的是1, 不应该是2嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-30 13:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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