| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 536 人关注过本帖
标题:好奇怪的程序,,,俺是菜鸟 ,,麻烦高手指出那里出错了
只看楼主 加入收藏
sj4004
Rank: 1
等 级:新手上路
帖 子:11
专家分:2
注 册:2010-6-8
收藏
 问题点数:0 回复次数:7 
好奇怪的程序,,,俺是菜鸟 ,,麻烦高手指出那里出错了
题目是  输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
我用tc和vc6编译都通过了 而且输入几组数据进去都正常运行了,但是当我输入这样一组数据:10,23,25,89,99,63,21,75,48,147时程序还是运行 ,但是结果是错误的。
源代码如下:
#include <stdio.h>

main()
{
    int i, temp;
    int digit[10];
    int *pointer, *max, *min;
    printf("the original array is:\n");

    for (i = 0; i < 10; i++)
    {
    scanf("%d", &digit[i]);
    }
   
    max = min = digit;

    for (pointer = digit + 1; pointer < digit + 10; pointer++)
    {
        if (*pointer > *max)
        {
            max = pointer;
        }

        else if (*pointer < *min)
        {
            min = pointer;
        }
    }

    temp = *max;
    *max = digit[0];
    digit[0] = temp;
    temp = *min;
    *min = digit[9];
    digit[9] = temp;
    printf("the new array is:\n");

    for (i = 0; i <10; i++)
    {
        printf("%d ", digit[i]);
    }
    getch();
}   

搜索更多相关主题的帖子: 麻烦 
2010-08-22 15:54
S_12s
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:110
专家分:670
注 册:2010-7-21
收藏
得分:0 
你的max和min指针分别指向了数组中的一个元素,当你利用对*max赋值时,就相当于改变了数组中元素的值。
2010-08-22 16:44
S_12s
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:110
专家分:670
注 册:2010-7-21
收藏
得分:0 
#include <stdio.h>

main()
{
    int i, temp;
    int digit[10];
    int *pointer, *max, *min;
    printf("the original array is:\n");

    for (i = 0; i < 10; i++)
    {
    scanf("%d", &digit[i]);
    }
   
    max = min = digit;

    for (pointer = digit + 1; pointer < digit + 10; pointer++)
    {
        if (*pointer > *max)
        {
            max = pointer;
        }

        if (*pointer < *min)
        {
            min = pointer;
        }
    }
    if (max==&digit[9]&&min==digit)
    {
        temp=*max;
        digit[9]=*min;
        digit[0]=temp;
    }
    else
    {   
        temp = *max;
        *max=digit[0];
        digit[0] = temp;
        temp = *min;
        *min=digit[9];
        digit[9] = temp;
    }


    printf("the new array is:\n");
    printf("%d\t%d\n",digit[0],digit[9]);
    for (i = 0; i <10; i++)
    {
        printf("%d ", digit[i]);
    }
    printf("\n");
}   
你看一下,我在VC下通过了,好像没什么问题……
2010-08-22 17:00
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
运行输出如下:

the original array is:
10 23 25 89 99 63 21 75 48 147
the new array is:
10 23 25 89 99 63 21 75 48 147 请按任意键继续. . .

我看不出有什么错,御坂疑惑中

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-08-22 17:03
sj4004
Rank: 1
等 级:新手上路
帖 子:11
专家分:2
注 册:2010-6-8
收藏
得分:0 
回复 4楼 御坂美琴
额 这个的错误之处就在于题目要求是讲最大的数与第一个数交换,最小的数与最后的一个交换,错误我找出来了,是因为没有考虑多种情况,因为在第一个数是最小最后一个是最大的特殊情况下,以下这个代码就相当于做了两次交换结果和原来输入的数一样
    temp = *max;
    *max = digit[0];
    digit[0] = temp;
    temp = *min;
    *min = digit[9];
    digit[9] = temp;
   
我后来加入了一个条件判断就搞定了ps:那种第一个数是最小的而且最大的数不是最后一个以及那种最后一个数是最大的而且第一个数不是最小的情况不计入在内
修改后的代码如果、如下
#include <stdio.h>

main()
{
    int i, temp;
    int digit[10];
    int *pointer, *max, *min;
    printf("the original array is:\n");

    for (i = 0; i < 10; i++)
    {
    scanf("%d", &digit[i]);
    }
   
    max = min = digit;

    for (pointer = digit + 1; pointer < digit + 10; pointer++)
    {
        if (*pointer > *max)
        {
            max = pointer;
        }

        else if (*pointer < *min)
        {
            min = pointer;
        }
    }
   
    if (max == digit + 9 && min == digit)
    {
    temp = digit[0];
    digit[0] = digit[9];
    digit[9] = temp;
    }

    else
    {
    temp = *max;
    *max = digit[0];
    digit[0] = temp;
    temp = *min;
    *min = digit[9];
    digit[9] = temp;
    }
   
    printf("the new array is:\n");
   
    for (i = 0; i <10; i++)
    {
        printf("%d ", digit[i]);
    }
   
    getch();
}   
2010-08-22 17:42
erikyo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:270
专家分:1154
注 册:2010-6-10
收藏
得分:0 
2楼正解,max和min都是指针变量,在你举得例子中min指向第一个元素及digit[0]=10,max指向的是最后一个元素digit[9]=147
当你执行*max=digit[0]时,其实等价于digit[9]=digit[0]=10,
digit[0]=temp执行之后,digit[0]=147
然后*min=digit[9]等价于digit[0]=digit[9]=10
digit[9]=temp等价于digit[9]=digit[0]=147
2010-08-22 22:44
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
哦,我看错了,以为是小的放前面,大的放后面。。。。御坂不好意思地说

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-08-22 22:46
唐小虎
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:46
专家分:119
注 册:2010-6-25
收藏
得分:0 
以下是引用sj4004在2010-8-22 17:42:10的发言:

额 这个的错误之处就在于题目要求是讲最大的数与第一个数交换,最小的数与最后的一个交换,错误我找出来了,是因为没有考虑多种情况,因为在第一个数是最小最后一个是最大的特殊情况下,以下这个代码就相当于做了两次交换结果和原来输入的数一样
    temp = *max;
    *max = digit[0];
    digit[0] = temp;
    temp = *min;
    *min = digit[9];
    digit[9] = temp;
   
我后来加入了一个条件判断就搞定了ps:那种第一个数是最小的而且最大的数不是最后一个以及那种最后一个数是最大的而且第一个数不是最小的情况不计入在内
修改后的代码如果、如下
#include

main()
{
    int i, temp;
    int digit[10];
    int *pointer, *max, *min;
    printf("the original array is:\n");

    for (i = 0; i < 10; i++)
    {
    scanf("%d", &digit);
    }
   
    max = min = digit;

    for (pointer = digit + 1; pointer < digit + 10; pointer++)
    {
        if (*pointer > *max)
        {
            max = pointer;
        }

        else if (*pointer < *min)
        {
            min = pointer;
        }
    }
   
    if (max == digit + 9 && min == digit)
    {
    temp = digit[0];
    digit[0] = digit[9];
    digit[9] = temp;
    }

    else
    {
    temp = *max;
    *max = digit[0];
    digit[0] = temp;
    temp = *min;
    *min = digit[9];
    digit[9] = temp;
    }
   
    printf("the new array is:\n");
   
    for (i = 0; i <10; i++)
    {
        printf("%d ", digit);
    }
   
    getch();
}   
力挺!!挺 挺 挺 !!
2010-08-23 00:23
快速回复:好奇怪的程序,,,俺是菜鸟 ,,麻烦高手指出那里出错了
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018045 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved