| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1860 人关注过本帖
标题:代码有问题!
取消只看楼主 加入收藏
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
结帖率:96.43%
收藏
已结贴  问题点数:60 回复次数:8 
代码有问题!
问题:将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从左到右,从上到下依次从小到大存放),写一函数实现之。用main函数调用。

这是我写的代码:

[code#include<stdio.h>
void chuli(int (*)[]);
int main(void)
{
    int a[5][5];
    int i,j;
    printf("输入一个5*5的矩阵\n");
    for(i=0;i<5;i++)
        for(j=0;j<5;j++)
            scanf("%d",&a[i][j]);
    chuli(a);
    for(i=0;i<5;i++)
    {
        for(j=0;j<5;j++)
            printf("%5d",a[i][j]);
        printf("\n\n");
    }
    return 0;
}
void chuli( int (*point)[5] )
{
    int *p=*point;
    int i,max,min,n,temp;//max用于记录最大值下标,min用于记录最小值下标

    //先将四个最小值放在前四个位置,最大值不作处理,只记录其位置
    for(n=0;n<4;n++)
    {
        min=n;
        if(n==0)
            max=0;

        //找最大值以及最小值
        for(i=n;i<25;i++)
        {
            if( n==0 && *(p+i)>*(p+max) )//最大值只需要找一次
                max=i;
            if( *(p+i)<*(p+min) )
                min=i;
        }

        //将最小值放在最前面
        if(min!=n)
        {
            temp=*(p+i);
            *(p+i)=*(p+min);
            *(p+min)=temp;
        }
    }

    //将最大值放在中间
    temp=*(*(point+2)+2);
    *(*(point+2)+2)=*(p+max);
    *(p+max)=temp;

    //将4个最小值放在4个角,第一个就不用动了
    for(n=3;n>0;n--)
    {
        temp=*( *(point+(n>1)?4:0) + (n%2)?4:0 );
        *( *(point+(n>1)?4:0) + (n%2)?4:0 )=*(p+n);
        *(p+n)=temp;
    }
}][/code]

下面是错误:
D:\安装包\Microsoft Visual Studio\MyProjects\b\1.cpp(11) : error C2664: 'chuli' : cannot convert parameter 1 from 'int [5][5]' to 'int (*)[]'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
D:\安装包\Microsoft Visual Studio\MyProjects\b\1.cpp(59) : error C2100: illegal indirection
D:\安装包\Microsoft Visual Studio\MyProjects\b\1.cpp(59) : error C2100: illegal indirection
D:\安装包\Microsoft Visual Studio\MyProjects\b\1.cpp(59) : error C2106: '=' : left operand must be l-value
执行 cl.exe 时出错.
1.obj - 1 error(s), 0 warning(s)

看了很久,无法解决,特来求助,望大神帮助。
搜索更多相关主题的帖子: int for max min temp 
2018-11-05 21:42
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
收藏
得分:0 
确实,不过看了很久,依然找不到问题所在
2018-11-05 22:31
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
收藏
得分:0 
经过几个小时的努力,终于将程序改好了,大家看一下有哪些地方还可以进行改进。

程序代码:
#include<stdio.h>
void chuli(int (*)[5]);
void shuchu(int (*)[5]);
int main(void)
{
    int a[5][5]={{2,5,6,3,7},{8,9,10,11,12},{13,14,1,15,16},{17,18,19,20,21},{4,22,23,24,25}};
    int i,j;
    shuchu(a);
    printf("\n\n");
    chuli(a);
    shuchu(a);
    return 0;
}
void chuli( int (*point)[5] )
{
    int *p=*point,m,n,i,temp,a[5]={0,1,2,3,0};//a[0]到a[3]表示最小值位置,a[4]表示最大值位置
    for(n=0;n<5;n++)
        for(i=0;i<25;i++)//遍历二维数组,寻找目标值位置
        {
            if( n<4 && *(p+i)<*(p+a[n]) )//标记最小值
            {
                for(m=n-1;a[m]!=i && m>=0;m--);
                if(m<0)//m<0说明该位置上的值未被标记,又因该值小于第n个最小值,应将其标记
                    a[n]=i;
            }
            if( n==4 && *(p+i)>*(p+a[n]) )//标记最大值
                a[n]=i;
        }
    for(n=0;n<5;n++)//将目标值从当前位置移至目标位置
    {
        temp=*(p+a[n]); 
        *(p+a[n])=*(p+5*(n<4?(n>1?4:0):2)+(n<4?(n%2?4:0):2));
        *(p+5*(n<4?(n>1?4:0):2)+(n<4?(n%2?4:0):2))=temp;
        //移动当前目标值至目标位置时,有概率影响其他目标值的位置,用以下代码避免此影响带来的错误
        for(m=n+1;m<5;m++)
            if( a[m]==5*(n<4?(n>1?4:0):2)+(n<4?(n%2?4:0):2) )
                a[m]=a[n];
    }
}
void shuchu(int (*p)[5])
{
    int i,j;
    for(i=0;i<5;i++)
    {
        for(j=0;j<5;j++)
            printf("%5d",*(*(p+i)+j));
        printf("\n\n");
    }
}




[此贴子已经被作者于2018-11-6 16:58编辑过]

2018-11-06 16:49
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
收藏
得分:0 
经过几个小时的努力,终于将程序改好了,大家看一下有哪些地方还可以进行改进。

程序代码:
#include<stdio.h>
void chuli(int (*)[5]);
int main(void)
{
    int a[5][5]={{2,5,6,3,7},{8,9,10,11,12},{13,14,1,15,16},{17,18,19,20,21},{4,22,23,24,25}};
    int i,j;
    for(i=0;i<5;i++)
    {
        for(j=0;j<5;j++)
            printf("%5d",a[i][j]);
        printf("\n\n");
    }
    printf("\n\n");
    chuli(a);
    for(i=0;i<5;i++)
    {
        for(j=0;j<5;j++)
            printf("%5d",a[i][j]);
        printf("\n\n");
    }
    return 0;
}
void chuli( int (*point)[5] )
{
    int *p=*point,m,n,i,temp,a[5]={0,1,2,3,0};//a[0]到a[3]表示最小值位置,a[4]表示最大值位置
    for(n=0;n<5;n++)
        for(i=0;i<25;i++)//遍历二维数组,寻找目标值位置
        {
            if( n<4 && *(p+i)<*(p+a[n]) )//标记最小值
            {
                for(m=n-1;a[m]!=i && m>=0;m--);
                if(m<0)//m<0说明该位置上的值未被标记,又因该值小于第n个最小值,应将其标记
                    a[n]=i;
            }
            if( n==4 && *(p+i)>*(p+a[n]) )//标记最大值
                a[n]=i;
        }
    for(n=0;n<5;n++)//将目标值从当前位置移至目标位置
    {
        temp=*(p+a[n]); 
        *(p+a[n])=*(p+5*(n<4?(n>1?4:0):2)+(n<4?(n%2?4:0):2));
        *(p+5*(n<4?(n>1?4:0):2)+(n<4?(n%2?4:0):2))=temp;
        //移动当前目标值至目标位置时,有概率影响其他目标值的位置,用以下代码避免此影响带来的错误
        for(m=n+1;m<5;m++)
            if( a[m]==5*(n<4?(n>1?4:0):2)+(n<4?(n%2?4:0):2) )
                a[m]=a[n];
    }
}


2018-11-06 16:49
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
收藏
得分:0 
经过几个小时的努力,终于将程序改好了,大家看一下有哪些地方还可以进行改进。

程序代码:
#include<stdio.h>
void chuli(int (*)[5]);
int main(void)
{
    int a[5][5]={{2,5,6,3,7},{8,9,10,11,12},{13,14,1,15,16},{17,18,19,20,21},{4,22,23,24,25}};
    int i,j;
    for(i=0;i<5;i++)
    {
        for(j=0;j<5;j++)
            printf("%5d",a[i][j]);
        printf("\n\n");
    }
    printf("\n\n");
    chuli(a);
    for(i=0;i<5;i++)
    {
        for(j=0;j<5;j++)
            printf("%5d",a[i][j]);
        printf("\n\n");
    }
    return 0;
}
void chuli( int (*point)[5] )
{
    int *p=*point,m,n,i,temp,a[5]={0,1,2,3,0};//a[0]到a[3]表示最小值位置,a[4]表示最大值位置
    for(n=0;n<5;n++)
        for(i=0;i<25;i++)//遍历二维数组,寻找目标值位置
        {
            if( n<4 && *(p+i)<*(p+a[n]) )//标记最小值
            {
                for(m=n-1;a[m]!=i && m>=0;m--);
                if(m<0)//m<0说明该位置上的值未被标记,又因该值小于第n个最小值,应将其标记
                    a[n]=i;
            }
            if( n==4 && *(p+i)>*(p+a[n]) )//标记最大值
                a[n]=i;
        }
    for(n=0;n<5;n++)//将目标值从当前位置移至目标位置
    {
        temp=*(p+a[n]); 
        *(p+a[n])=*(p+5*(n<4?(n>1?4:0):2)+(n<4?(n%2?4:0):2));
        *(p+5*(n<4?(n>1?4:0):2)+(n<4?(n%2?4:0):2))=temp;
        //移动当前目标值至目标位置时,有概率影响其他目标值的位置,用以下代码避免此影响带来的错误
        for(m=n+1;m<5;m++)
            if( a[m]==5*(n<4?(n>1?4:0):2)+(n<4?(n%2?4:0):2) )
                a[m]=a[n];
    }
}


2018-11-06 16:50
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
收藏
得分:0 
回复 10楼 Tomorrw_I
我是自学的c语言,看不懂你这个代码,第一行应该是一个文件包含吧,可是这个程序的主函数在哪
2018-11-06 17:02
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
收藏
得分:0 
回复 10楼 Tomorrw_I
我是自学的c语言,看不懂你这个代码,第一行应该是一个文件包含吧,可是这个程序的主函数在哪
2018-11-06 17:03
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
收藏
得分:0 
哦,我的是vs6.0,怪不得不一样
2018-11-06 21:19
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
收藏
得分:0 
哦,我的是vs6.0,怪不得不一样
2018-11-06 21:20
快速回复:代码有问题!
数据加载中...
 
   



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

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