| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1430 人关注过本帖
标题:老谭的习题10.10,自己想写的效率高点,然后改了好多遍还是不成功,求纠错, ...
取消只看楼主 加入收藏
Eg_a
Rank: 1
等 级:新手上路
帖 子:66
专家分:9
注 册:2011-4-23
结帖率:90%
收藏
已结贴  问题点数:40 回复次数:8 
老谭的习题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
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
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
Eg_a
Rank: 1
等 级:新手上路
帖 子:66
专家分:9
注 册:2011-4-23
收藏
得分:0 
回复 3楼 embed_xuel
不是,n<4对的,s[4]是我弄出来存储最大值的,你要是用n<5那最大值没了
2011-10-24 06:10
Eg_a
Rank: 1
等 级:新手上路
帖 子:66
专家分:9
注 册:2011-4-23
收藏
得分:0 
也许算不上效率高吧,只是将老谭写的那一串子找最小值的代码用多重循环代替了,还是要进行那么多运算,但是可以肯定的说这代码肯定比他的少很多,少了大半篇幅,就是他吗的出错了我没找着,NNd,暴怒了
2011-10-24 06:13
Eg_a
Rank: 1
等 级:新手上路
帖 子:66
专家分:9
注 册:2011-4-23
收藏
得分:0 
回复 14楼 simonfire
我加那句的意思是说有些我想到了,但是表达能力有限,说不明白,不会挑重点说,不过你爱咋理解咋理解,就算理解成我得瑟也随意,反正我用事实得瑟我也不怕人说,况且高一物理么。。。。。。
2011-10-25 01:41
Eg_a
Rank: 1
等 级:新手上路
帖 子:66
专家分:9
注 册:2011-4-23
收藏
得分:0 
回复 13楼 beyondyf
我知道,可是这题我想按他的方法来,只动那几个该动的,其他的都不动,现在发现了,找一个真心学习技术的程序员太难了,反正自己又不会这么写程序,爱咋咋地吧是吧,现在看了虽然没多少帖子,不过大部分都是坚持贴,再不就是丢三落四的直接给你加几个标点符号,再剩下的就是发源码的了,真有不懂的问题的时候人都哪去了?不管你们回帖的回复什么了,只要不是骂我,都谢谢你们了,不过我要是说错什么了,骂我我也接受。我想我还是去百度知道提问吧,多弄点悬赏分能有人就会有人回答,看了我这篇话该删就删吧,论坛没毛病,不过人心都长歪了
2011-10-25 01:53
快速回复:老谭的习题10.10,自己想写的效率高点,然后改了好多遍还是不成功,求 ...
数据加载中...
 
   



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

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