| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1430 人关注过本帖
标题:老谭的习题10.10,自己想写的效率高点,然后改了好多遍还是不成功,求纠错, ...
只看楼主 加入收藏
Eg_a
Rank: 1
等 级:新手上路
帖 子:66
专家分:9
注 册:2011-4-23
结帖率:90%
收藏
已结贴  问题点数:40 回复次数:15 
老谭的习题10.10,自己想写的效率高点,然后改了好多遍还是不成功,求纠错,着实无语了
结果有一部分出错,总是又一个被其他数覆盖

题目如下:

将一个5*5的矩阵中最大的元素放在中心,四个角分别放四个最小的元素(顺序为从左到右,从上到下顺序一次从小到大存放,编写一个函数实现之,用main函数调用

自编代码如下,求纠错,运行结果不对,自测后感觉应该为move函数中的第一个while循环赋值出错,但找了好多遍,测试了好多遍也没有弄清楚,是否是我基础未学好有的写法不可以被我忽略了?
程序代码:
#include<stdio.h>
#define N 5
#define P *(p+N*i+j)/* 指针p当前指向元素的地址 */
#define P0 *p
#define P1 *(p+N-1)
#define P2 *(p+N*(N-1))
#define P3 *(p+N*N-1)
#define P4 *(p+(N*N-1)/2)/* 最大值应放的位置的指针 */
#define P5 *(p+is[n]*N+js[n])/* 应放到四角的数字未整理时的位置的指针 */
int i,j;
void move(int *p)
{
    int n=0,s[5],is[5],js[5],t,ps[5];/* 数组s依次存放最小值、 数组is,js存放最小值的对应坐标、数组ps存放四角以及二维数组中心点的值  */
    s[0]=P0;
    ps[0]=P0;/* 存储应放到四角以及放到中心点的值 */
    ps[1]=P1;
    ps[2]=P2;
    ps[3]=P3;
    ps[4]=P4;
    while(n<4)/* 三重循环寻找最小的四个数及其标号以及最大数数值及标号 */
    {
        for(i=0;i<N;i++)
            for(j=0;j<N;j++)
            {
                if(s[n]>P) {is[n]=i;js[n]=j;s[n]=P;}
                if((n==0)&&(s[4]<P)) {is[4]=i;js[4]=j;s[4]=P;} /* 筛选最大值,一次即够,故条件(n==0) */
            }
        P5=s[4];                /* 将当前数组的最小值赋为最大值 (排出当前最小值,下一次循环为倒数第二小) */
        s[++n]=s[4];  /* 将下一个s[n]赋为最大值 */
    }
    while(n>=0) /* 将四个最小值依大小顺序排放在四角、将最大值放在中间 */
    {
        P5=ps[n];
        ps[n]=s[n];
        n--;
    }
    P0=ps[0];
    P1=ps[1];
    P2=ps[2];
    P3=ps[3];
    P4=ps[4];
}

void main()
{
    void move();
    int s[N][N];
    printf("input matrix:\n");
    for(i=0;i<N;i++)
        for(j=0;j<N;j++)
            scanf("%d",&s[i][j]);
    move(s);
    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
            printf("%4d",s[i][j]);
        printf("\n");
    }
    getch();
}
搜索更多相关主题的帖子: 成功 测试 最大的 while 元素 
2011-10-23 02:03
Eg_a
Rank: 1
等 级:新手上路
帖 子:66
专家分:9
注 册:2011-4-23
收藏
得分:0 
为什么我在线的时候人就这么少。。。。。。
2011-10-23 02:43
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:7 
回复 2楼 Eg_a
没看懂,怀疑while(n<4)有问题,应该吧n<5吧,另外你用这么多这么复杂的宏定义看得我心惊胆战的

总有那身价贱的人给作业贴回复完整的代码
2011-10-23 07:32
gball
Rank: 3Rank: 3
等 级:禁止发言
帖 子:56
专家分:192
注 册:2011-9-23
收藏
得分:7 
提示: 作者被禁止或删除 内容自动屏蔽

在网吧通宵泡论坛发贴子,挣齐所有大学学费,详情请点击:   http://www.vikkk.tk/
2011-10-23 16:10
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:7 
回复 3楼 embed_xuel
老谭书都这样教的?

授人以渔,不授人以鱼。
2011-10-23 23:00
yj269172025
Rank: 2
等 级:论坛游民
帖 子:41
专家分:81
注 册:2011-9-29
收藏
得分:7 
今晚先睡觉,明天给你答复
2011-10-23 23:32
Eg_a
Rank: 1
等 级:新手上路
帖 子:66
专家分:9
注 册:2011-4-23
收藏
得分:0 
回复 5楼 TonyDeng
不是,自己想写个不同思路的代码,呵呵,还需要再加油啊
2011-10-23 23:58
Eg_a
Rank: 1
等 级:新手上路
帖 子:66
专家分:9
注 册:2011-4-23
收藏
得分:0 
回复 3楼 embed_xuel
额,我的这个宏定义除了N其他都是为了写着好写点,呵呵,不需要以后改动什么的
2011-10-24 00:00
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你这个代码的清晰性不好。用文字描述一下你的思路吧。尽量多用函数,这个题目的需求,你只用一个函数无论如何是不足够的,结果就是现在这样,到处都是循环,都不知道干什么的,看着就头大。你说要改出效率,言下之意,是曾经做出正确的了,那么我给你的建议是:在正确的基础上去把它改快,不要大动手术。过分追求效率的结果就是现在的结果,出错反而连正确性都丢失了,那是全盘皆输。写程序不要沾染这种习气。把原先对的程序找回来吧。

[ 本帖最后由 TonyDeng 于 2011-10-24 00:13 编辑 ]

授人以渔,不授人以鱼。
2011-10-24 00:11
Eg_a
Rank: 1
等 级:新手上路
帖 子:66
专家分:9
注 册:2011-4-23
收藏
得分:0 
回复 9楼 TonyDeng
老谭的那个例子很麻烦,写了五部分代码,第一个求最大,第二个求最小,紧接着比最小大点的,也是一个函数完成的,代码很多,感觉运算起来效率不是很高(我是这么感觉的,效率这东西还不是很清楚,但是他的代码肯定没人喜欢敲的)
我的这个move函数的重点就是第一个while四次循环,第一次循环也就是当n==0时,找出最大值以及最小值,将最大值赋给s[4],最小值赋给s[0],以下是其他几次循环的思路:   
    将指针p指向的数组里的当前循环最小值用s[n]记录,用最大值s[5]覆盖指针p指向的数组的最小值替换,把s[n+1]也用最大值s[5]赋值,下一次循环即可找出最小值,大体上说就是找到最小值后消掉最小,重复四次,依次找出四个最小值,再用第二个while循环将各个值都放到应该放的位置上

以上就是我的具体思路,这个函数改了好久,不过没改几次,我用printf函数输出每个部分的值测试过,应该是第一个while循环第一或第二次循环将s[n]值处理错误,不过我研究这段代码好几个小时,实在是找不出,我也没时间在这道题上耽搁了,就来问问具体怎么回事?可能是哪里出错了我没找到,研究研究,我有时间也看看,不过最近这个些练习耽误我太长时间了,必须要进行下去了。。。。。。悲催的大夜,做特么两三道稍大点的题一宿就过去了。。。。。。时间紧任务重啊!!!!!!



那个。。。。。我再加一句啊,我上高一时物理一个月没学自己看两小时书中定理,考试满分,语文英语么。。。。。。73 30。。。。。。。。。。。。语文英语150满分的。。。。。。。

[ 本帖最后由 Eg_a 于 2011-10-24 06:17 编辑 ]
2011-10-24 06:06
快速回复:老谭的习题10.10,自己想写的效率高点,然后改了好多遍还是不成功,求 ...
数据加载中...
 
   



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

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