| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1767 人关注过本帖
标题:代码有问题!
只看楼主 加入收藏
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
结帖率:96.43%
收藏
已结贴  问题点数:60 回复次数:17 
代码有问题!
问题:将一个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
Tomorrw_I
Rank: 10Rank: 10Rank: 10
等 级:禁止访问
威 望:6
帖 子:406
专家分:1712
注 册:2018-10-16
收藏
得分:0 
指针用的很乱啊!全是指针错误

学C有用吗?
学C++有前途吗?
数据库有必要学吗?
……
别问,你还什么都不会,学就对了
……
2018-11-05 22:08
lxk1732942
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:450
专家分:425
注 册:2018-9-4
收藏
得分:0 
确实,不过看了很久,依然找不到问题所在
2018-11-05 22:31
Tomorrw_I
Rank: 10Rank: 10Rank: 10
等 级:禁止访问
威 望:6
帖 子:406
专家分:1712
注 册:2018-10-16
收藏
得分:0 
代码有其他要求没,把原题发出来吧

学C有用吗?
学C++有前途吗?
数据库有必要学吗?
……
别问,你还什么都不会,学就对了
……
2018-11-05 22:34
Tomorrw_I
Rank: 10Rank: 10Rank: 10
等 级:禁止访问
威 望:6
帖 子:406
专家分:1712
注 册:2018-10-16
收藏
得分:25 
程序代码:
#include "stdafx.h"
#include <stdio.h>
void chuli(int* point);
void sortA1(int a[], int length);       //一维数组选择排序
int _tmain(int argc, _TCHAR* argv[])
{
    int a[5][5];
    int i, j;
    int m = 1;
    printf("输入一个5*5的矩阵\n");
    for (i = 0; i<5; i++)
    for (j = 0; j < 5; j++)
        //scanf("%d", &a[i][j]);
        a[i][j] = m++;                    //懒得输入,直接从1开始给二位数组赋值
    chuli(*a);
    for (i = 0; i<5; i++)
    {
        for (j = 0; j<5; j++)
            printf("\t%d", a[i][j]);
        printf("\n\n");
    }
    return 0;
}
void sortA1(int a[], int length)          //一维数组选择排序
{
    int temp;
    for (int i = 0; i < length; i++)
    {
        for (int j = i+1; j < length; j++)
        {
            if (a[j] < a[i])
            {
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }

    }
}

void chuli(int* point)
{
    int *p = point;
    int a[25], b[25];                   //传参进来的数组的数组副本!a数组用来排序,方便寻找最大值最小值!b数组用来调换位置!
    int temp;
    int Mix[4],Mix_i[4];
    int Max,Max_i;
    for (int i = 0,x=0; i<25; i++,x++)
    {
        a[i] = *(p + x);                //数组副本复制
        b[i] = *(p + x);
    }
    sortA1(a, 25);                      //a副本进行排序
    for (int i = 0; i < 4; i++)
    {
        Mix[i] = a[i];                   //Mix数组存储最小的4个数
    }
    Max = a[24];                         //Max存储最大的数

    //查找最小4个数,在原数组的下标
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 25; j++)
        {
            if (Mix[i] == b[j])
                Mix_i[i] = j;            //将最小值的下标依次存入Mix数组
        }
    }
    //查找最大值,在原数组的下标
    for (int i = 0; i < 25; i++)
    {
        if (Max == b[i])
            Max_i = i;                   //将最大值的下标依次存入Max
    }
    //交换最小值的位置
    temp = b[0];
    b[0] = b[Mix_i[0]];
    b[Mix_i[0]] = temp;
    //交换第二小值的位置
    temp = b[4];
    b[4] = b[Mix_i[1]];
    b[Mix_i[1]] = temp;
    //交换第三小值的位置
    temp = b[20];
    b[20] = b[Mix_i[2]];
    b[Mix_i[2]] = temp;
    //交换第四小值的位置           //从这里开始出现问题!!!    由于测试代码是1-25的递增数列!    第四最小值需要换的位置,正好是最大值得位置!                  
    temp = b[24];                  //把最大值换走的了!导致后续最大值交换位置时出错                    
    b[24] = b[Mix_i[3]];
    b[Mix_i[3]] = temp;

    //交换最大的位置
    temp = b[12];
    b[12] = b[Max_i];
    b[Max_i] = temp;

    //讲排列好的副本数据传回原数组指针
    for (int i = 0, x = 0; i<25; i++, x++)
    {                
       *(p + x) = b[i];
    }
}


学C有用吗?
学C++有前途吗?
数据库有必要学吗?
……
别问,你还什么都不会,学就对了
……
2018-11-06 00:11
Tomorrw_I
Rank: 10Rank: 10Rank: 10
等 级:禁止访问
威 望:6
帖 子:406
专家分:1712
注 册:2018-10-16
收藏
得分:0 
今晚有点事!在外面用平板打的代码!回家测试了一下!  发现问题!
针对你的代码,我的代码, 并没有给你解决最终问题!
给你提供了一个函数形参为二位数组时,用副本实现的方法吧!

你看下,如果这个思路能帮你解决的话!最好不过,如果还是不行!
你在下面追问,明天抽空帮你看看吧

二维数组,完全可以当做一维数组来处理,不需要你用那么多的指针

晚安

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


学C有用吗?
学C++有前途吗?
数据库有必要学吗?
……
别问,你还什么都不会,学就对了
……
2018-11-06 00:16
kfyniriu
Rank: 6Rank: 6
等 级:侠之大者
威 望:9
帖 子:105
专家分:426
注 册:2018-7-6
收藏
得分:10 
#include<stdio.h>

void chuli(int *p);

int main()
{
    int a[5][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25};
    int i,j;

    chuli(*a);

    for(i=0;i<5;i++)
    {
        for(j=0;j<5;j++)
            printf("%d\t",a[i][j]);
        printf("\n");
    }

    return 0;
}

void chuli(int *p)
{
    int max=0,min[4];
    int i,j,temp;
    //求最大值
    for(i=0;i<5;i++)
        for(j=0;j<5;j++)
            if(*(p+i*5+j)>=max)
                max = *(p+i*5+j);

    //求最小值
    for(i=0;i<4;i++)
    {
        temp = *(p+i);
        for(j=i+1;j<25;j++)
            if(*(p+i) > *(p+j))
                temp = *(p+j);
        min[i] = temp;
    }

    *(p+2*5+2) = max;
    *(p+0) = min[0];
    *(p+4) = min[1];
    *(p+20) = min[2];
    *(p+24) = min[3];
}


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

2018-11-06 09:39
kfyniriu
Rank: 6Rank: 6
等 级:侠之大者
威 望:9
帖 子:105
专家分:426
注 册:2018-7-6
收藏
得分:0 
#include<stdio.h>

void chuli(int p[5][5]);

int main()
{
    int a[5][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25};
    int i,j;

    chuli(a);

    for(i=0;i<5;i++)
    {
        for(j=0;j<5;j++)
            printf("%d\t",a[i][j]);
        printf("\n");
    }

    return 0;
}

void chuli(int p[5][5])
{
    int max=0,min[4];
    int i,j,temp;
    //求最大值
    for(i=0;i<5;i++)
        for(j=0;j<5;j++)
            if(*(*(p+i)+j)>=max)
                max = *(*(p+i)+j);

    //求最小值
    for(i=0;i<4;i++)
    {
        temp = *(*p+i);
        for(j=i+1;j<25;j++)
            if(*(*p+i) > *(*p+j))
                temp = *(*p+j);
        min[i] = temp;
    }

    *(*(p+2)+2) = max;
    *(*p+0) = min[0];
    *(*p+4) = min[1];
    *(*(p+4)+0) = min[2];
    *(*(p+4)+4) = min[3];
}
2018-11-06 10:01
Tomorrw_I
Rank: 10Rank: 10Rank: 10
等 级:禁止访问
威 望:6
帖 子:406
专家分:1712
注 册:2018-10-16
收藏
得分:0 
这道题,要考虑特殊情况问题!
比如输入是1-25的递增,25-1的递减序列!  
楼主以及楼上的这个兄弟,代码里面,只是用目标值将4个角、以及中心点的值覆盖!  这5个点的值,直接消失!

我的代码,序列元素不变的情况,互换位置!  但是出现bug,遇到上面提到的特殊情况,就会出错!
我的代码,稍微改一下!不要一次性,直接求出所有目标值!  一个个来,一个一个进行互换后,再重新找一下目标值,进行互换,就可以解决我上述的bug问题!

学C有用吗?
学C++有前途吗?
数据库有必要学吗?
……
别问,你还什么都不会,学就对了
……
2018-11-06 12:35
Tomorrw_I
Rank: 10Rank: 10Rank: 10
等 级:禁止访问
威 望:6
帖 子:406
专家分:1712
注 册:2018-10-16
收藏
得分:25 
程序代码:
#include "stdafx.h"
#include <stdio.h>
void chuli(int* point);
void sortA1(int a[], int length);       //一维数组选择排序
int _tmain(int argc, _TCHAR* argv[])
{
    int a[5][5];
    int i, j;
    int m = 1;
    printf("输入一个5*5的矩阵\n");
    for (i = 0; i<5; i++)
    for (j = 0; j < 5; j++)
        //scanf("%d", &a[i][j]);
        a[i][j] = m++;                    //懒得输入,直接从1开始给二位数组赋值
    chuli(*a);
    for (i = 0; i<5; i++)
    {
        for (j = 0; j<5; j++)
            printf("\t%d", a[i][j]);
        printf("\n\n");
    }
    return 0;
}
void sortA1(int a[], int length)          //一维数组选择排序
{
    int temp;
    for (int i = 0; i < length; i++)
    {
        for (int j = i+1; j < length; j++)
        {
            if (a[j] < a[i])
            {
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }

    }
}

void chuli(int* point)
{
    int *p = point;
    int a[25], b[25];                   //传参进来的数组的数组副本!a数组用来排序,方便寻找最大值最小值!b数组用来调换位置!
    int temp;
    int Mix[4],Mix_i[4];
    int Max,Max_i;
    for (int i = 0,x=0; i<25; i++,x++)
    {
        a[i] = *(p + x);                //数组副本复制
        b[i] = *(p + x);
    }
    sortA1(a, 25);                      //a副本进行排序
    for (int i = 0; i < 4; i++)
    {
        Mix[i] = a[i];                   //Mix数组存储最小的4个数
    }
    Max = a[24];                         //Max存储最大的数

    //查找最小数,在原数组的下标
     for (int j = 0; j < 25; j++)
     {
       if (Mix[0] == b[j])
       Mix_i[0] = j;            //将最小值的下标存入Mix_i[0]数组
     }
    //交换最小值的位置
    temp = b[0];
    b[0] = b[Mix_i[0]];
    b[Mix_i[0]] = temp;         //将最小值与b[0]位置互换
     for (int j = 0; j < 25; j++)
     {
       if (Mix[1] == b[j])
       Mix_i[1] = j;            //将第二小值的下标存入Mix_i[1]数组
     }
     //交换第二小值的位置
    temp = b[4];
    b[4] = b[Mix_i[1]];
    b[Mix_i[1]] = temp;         //将第二小值值与b[4]位置互换
     for (int j = 0; j < 25; j++)
     {
       if (Mix[2] == b[j])
       Mix_i[2] = j;            //将第三小值的下标存入Mix_i[2]数组
     }
    temp = b[20];
    b[20] = b[Mix_i[2]];
    b[Mix_i[2]] = temp;         //将第三小值值与b[20]位置互换
     for (int j = 0; j < 25; j++)
     {
       if (Mix[3] == b[j])
       Mix_i[3] = j;            //将第四小值的下标存入Mix_i[3]数组
     }
    temp = b[24];                                
    b[24] = b[Mix_i[3]];         
    b[Mix_i[3]] = temp;         //将第四小值与b[24]位置互换 

    //最小值位置已经全部排列完毕,在排列完毕的数组中,查找最大值,以及位置
    for (int i = 0; i < 25; i++)
    {
        if (Max == b[i])
            Max_i = i;           //将最大值的下标存入Max_i
    }
    temp = b[12];
    b[12] = b[Max_i];
    b[Max_i] = temp;             //将最大值与b[12]互换

//每次交换目标值之后,下一次交换前,进行重新查找目标值的位置,避免特殊序列将原本定位的目标值换走

    //讲排列好的副本数据传回原数组指针
    for (int i = 0, x = 0; i<25; i++, x++)
    {                
       *(p + x) = b[i];
    }
}



运行结果测试没有问题!
图片附件: 游客没有浏览图片的权限,请 登录注册

学C有用吗?
学C++有前途吗?
数据库有必要学吗?
……
别问,你还什么都不会,学就对了
……
2018-11-06 14:24
快速回复:代码有问题!
数据加载中...
 
   



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

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