标题:函数能正常运行但结果不对,请各位师兄帮忙诊断
只看楼主
小戏
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2012-7-11
结帖率:83.33%
已结贴  问题点数:20 回复次数:4 
函数能正常运行但结果不对,请各位师兄帮忙诊断
题目:将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小元素(顺序为从左到右,从上到下的顺序依次从小到大存放)。
#include<stdio.h>
void main()

{
    void change(int *) ;
    int a[5][5];
    int *p,i,j;
    printf("input matrix:\n");
    for(i=0;i<5;i++)
   
    for(j=0;j<5;j++)   
        scanf("%d",&a[i][j]);
    for(i=0;i<5;i++)
            {printf("\n");
            for(j=0;j<5;j++)
                printf("%4d",a[i][j]);}
                printf("\n");
                p=a;
        
        change(a);
        printf("Now,matix:\n");
            for(i=0;i<5;i++)
            {printf("\n");
            for(j=0;j<5;j++)
                printf("%4d",a[i][j]);}
                    printf("\n");
}
         
void dz(int *p)
{ int i,j,temp;
int *min,*max;
max=p;
min=p;
for(i=0;i<5;i++)
   for(j=0;j<5;j++)
   if(*max<*(p+i*5+j)) max=p+i*5+j;
           else if(*min>*(p+i*5+j)) min=p+i*5+j;
           temp=*max;
           *max=*(p+12);
           *(p+12)=temp;
           temp=*p;
           *p=*min;
           *min=temp;
    min=p+1;
for(i=0;i<5;i++)
   for(j=0;j<5;j++)
      
   if((*min>*(p+i*5+j))&&((p+i*5+j)!=p))
       min=p+i*5+j;
   temp=*(p+4);
 *(p+4)=*min;
*min=temp;

for(i=0;i<5;i++)
   for(j=0;j<5;j++)
      
   if((*min>*(p+i*5+j))&&((p+i*5+j)!=p)&&((p+i*5+j)!=(p+4)))
       min=p+i*5+j;
   temp=*(p+20);
   *(p+20)=*min;
*min=temp;
 
for(i=0;i<5;i++)
   for(j=0;j<5;j++)
      
 if((*min>*(p+i*5+j))&&((p+i*5+j)!=p)&&((p+i*5+j)!=(p+4))&&((p+i*5+j)!=(p+20)))
       min=p+i*5+j;
   temp=*(p+24);
   *(p+24)=*min;
*min=temp;

       }
搜索更多相关主题的帖子: change include 最大的 元素 
2012-08-12 23:03
rokatu
Rank: 1
等 级:新手上路
帖 子:2
专家分:7
注 册:2012-8-13
得分:5 
兄弟建议你把一个大的功能分成几个函数模块去实现,不但容易让其他人看明白,而且也易于debug。
一下使我的方法,希望对你有帮助
程序代码:
#include<stdio.h>
#include<string.h>
#define MAX_X 5
#define MAX_Y 5
int list_print(int *);
int sort_from_small(int *);
int make_tower(int *);
int main(){
        int a[5][5];
        int i,j;
        printf("input matrix:\n");
        for(i=0;i<5;i++){
                for(j=0;j<5;j++){
                        scanf("%d\n", &a[i][j]);
                }
        }
        list_print(&a[0][0]);
        sort_from_small(&a[0][0]);      //排序二维数组
        make_tower(&a[0][0]);           //按要求构建输出
        printf("Now,matix:\n");
        list_print(&a[0][0]);
        return 0;
}
int list_print(int *p){                 //显示函数
        int i,j;
        for(i=0; i<MAX_X; i++){
                for(j=0; j<MAX_Y; j++){
                        printf("%4d", *(p + i*MAX_X + j) );
                }
                printf("\n");
        }
        return 0;
}
int sort_from_small(int *p){            //排序函数
        int i,j,tmp;
        for(j=0; j<MAX_X*MAX_Y; j++){
                for(i=0; i<MAX_X*MAX_Y-j-1; i++){
                        if( *(p+i) > *(p+i+1) ){
                                tmp = *(p+i);
                                *(p+i) = *(p+i+1);
                                *(p+i+1) = tmp;
                        }
                }
        }
        return 0;
}
int make_tower(int *p){                 //构造函数
        int* tmp;
        tmp = (int*)malloc(MAX_X*MAX_Y*sizeof(int)); //为临时空间分配动态内存
        memset(tmp, 0, MAX_X*MAX_Y);
        *(tmp + (MAX_X/2)*MAX_Y+ MAX_Y/2) = *(p+(MAX_X-1)*MAX_Y + (MAX_Y-1));//把排序的最大值放入矩阵中央
        /*    
        按照具体的规则将排好序的p,放入临时空间中。
        ....
        */
        memcpy(p, tmp, MAX_X*MAX_Y*sizeof(int)); //将动态内存里的内容复制到二维数组中
        free(tmp);      //释放动态内存
        return 0;
}

2012-08-13 19:25
netlin
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:24
帖 子:544
专家分:4308
注 册:2012-4-9
得分:5 
楼主,这一段写得很精彩:
void dz(int *p)
{ int i,j,temp;
int *min,*max;
max=p;
min=p;
for(i=0;i<5;i++)
   for(j=0;j<5;j++)
   if(*max<*(p+i*5+j)) max=p+i*5+j;
           else if(*min>*(p+i*5+j)) min=p+i*5+j;
           temp=*max;
           *max=*(p+12);
           *(p+12)=temp;
           temp=*p;
           *p=*min;
           *min=temp;

本人对上面的代码进行一些修改,
只是一个思路,楼主你调试一下:

void px(int *min[]){        //冒泡法排序:从小到大
    int i,j,*tmp;
    for(i=1;i<4;i++)        
        for(j=0;j<4-i;j++)
            if(*min[j]>*min[j+1]){tmp=min[j];min[j]=min[j+1];min[j+1]=tmp;}
}
void change(int *p){
int i,j,temp,*tmp;
int *min[4],*max;
for(i=0;i<4;i++)min[i]=p+i;    //初始化的最小值指针数组
px(min);        //对初始的4个最小值进行从小到大排序
max=min[3];
for(i=0;i<5;i++)
   for(j=0;j<5;j++){
       if(i*5+j<4)continue;    //对于前面的4个数,不用做处理
       if(*max<*(p+i*5+j)) max=p+i*5+j;
       else
            if(*min[3]>*(p+i*5+j)){
                min[3]=p+i*5+j;
                px(min);
            }
    }
}

做自己喜欢的事!
2012-08-15 11:54
ip想你
Rank: 1
等 级:新手上路
帖 子:1
专家分:5
注 册:2012-8-15
得分:5 
学习了
2012-08-15 12:43
xchieftain
Rank: 2
等 级:论坛游民
帖 子:5
专家分:12
注 册:2012-7-19
得分:5 
#include <stdio.h>
#include <time.h>
#define N 5
void getnum(int *a)
{
    int i;
    for(i=0;i<N*N;i++)
            a[i] = rand() % 50 ;
}
void sort(int *a)
{
    int i,j,k,temp;
    for(i=0;i<N*N-1;i++)
    {
        k=i;
        for(j=i+1;j<N*N;j++)
            if(a[k]>a[j])
                k=j;
        if(k != i)
        {
            temp=a[i];
            a[i]=a[k];
            a[k]=temp;
        }
    }
}
void result(int *a,int *b)
{
    int i,j,k=4,*p,*q;
    p=a; q=b;
    for(i=0;i<N;i++)
        for(j=0;j<N;j++)
        {
            if(i==0 && j==0) continue;    //遇到四角和中心就跳过
            if(i==0 && j==N-1) continue;
            if(i==N-1 && j==0) continue;
            if(i==N-1 && j==N-1) continue;
            if(i==(N-1)/2 && j==(N-1)/2) continue;
            *(q+N*i+j) = *(p+k);
            k++;
        }
        *(q+0+0) = *(p+0);  //最后对四角和中心赋值
        *(q+0+N-1) = *(p+1);
        *(q+N*(N-1)+0) = *(p+2);
        *(q+N*(N-1)+N-1) = *(p+3);
        *(q+N*(N-1)/2+(N-1)/2) = *(p+N*N-1);
}
void print(int *a)
{
    int i,*p;
    p=a;
    for(i=0;i<N*N;i++)
        printf("%d%c",*(p+i),i%N==N-1?'\n':'\t');
    printf("\n");
}
int main()
{
    int a[N*N]={0},b[N][N]={0};
   
    srand(time(NULL));
    getnum(a);
    print(a);
    sort(a);
    print(a);
    result(a,b);
    print(b);
    system("puase");
    return 0;
}
2012-08-15 15:51



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-375155-1-1.html




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

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