注册 登录
编程论坛 VC++/MFC

指针问题,思考了很久,不知道哪里错了

chgtx 发布于 2015-09-13 08:47, 2693 次点击
//程序功能是将输入的5阶行列式中最大的数字放在中间,按照从上到下,从左到右的顺序,四个角分别放最小,第二小,第三小,第四小的值;

#include <stdio.h>

void main()
{
    void sort(int (*p)[5]);
   
    int a[5][5], i, j;
   
    printf("please input 5*5 array: \n");
   
    for(i = 0; i < 5; i++)                              //一个一个输入行列式的每一个值;
    {
        for(j = 0; j < 5; j++)
        {
            scanf("%d", &a[i][j]);
        }
    }
   
    printf("\nThe 5*5 array is: \n");                   //将行列式打印出来;
   
    for(i = 0; i < 5; i++)
    {
        for(j = 0; j < 5; j++)
        {
            printf("%4d", a[i][j]);
        }
        
        printf("\n");
    }
   
    printf("\nNow they are: \n");
   
    sort(a);                                           //调用sort函数
   
    printf("\n");
}

void sort(int (*p)[5])
{
    int i, j, temp;

    int *Max, *Min;   
   
    Max = p;                                 //将行列式第一个地址赋给Max,赋给Min
   
    Min = p;                              
   
    for(i = 0; i < 5; i++)                           //找出最大值地址;
    {
        for(j = 0; j < 5; j++)
        {
            if(*Max < *(*(p + i) + j))
            {
                Max = *(p + i) + j;
            }
            if(*Min > *(*(p + i) + j))             //找出最小值地址;
            {
                Min = *(p + i) + j;
            }
            
        }
    }
   
    temp = *(*(p + 2) + 2);                      //最大值与中间值交换;
    *(*(p + 2) + 2) = *Max;
    *Max = temp;
   
    temp = *Min;                                 //最小值与第一行第一列的值交换;
    *Min = p[0][0];
    p[0][0] = temp;
   
    Min = p + 1;
    for(i = 0; i < 5; i++)
    {
        for(j = 0; j < 5; j++)
        {
            if(*(*(p + i) + j) != p[0][0]) && (*Min > *(*(p + i) + j)))   //判断条件为循环值不等于最小值,且大于*Min;
            {
                Min = *(p + i) + j;                                   //找出第二小值地址;
            }
        }
    }

    temp = *Min;                                                      //将第二小值与第一行第五列值交换;
    *Min = p[0][4];
    p[0][4] = temp;
   
    Min = p + 1;
    for(i = 0; i < 5; i++)                                             //找出第三小值;
    {
        for(j = 0; j < 5; j++)
        {
            if(*(*(p + i) + j) != p[0][0]) && (*(*(p + i) + j) != p[0][4]) && (*Min > *(*(p + i) + j)))
            {
                Min = *(p + i) + j;
            }
        }
    }

    temp = *Min;                                                     //第三小值与第五行第一列值交换;
    *Min = p[4][0];
    p[4][0] = temp;

    Min = p + 1;                                                     //找出第四小值地址;
    for(i = 0; i < 5; i++)
    {
        for(j = 0; j < 5; j++)
        {
            if((*(*(p + i) + j) != p[0][0]) && (*(*(p + i) + j) != p[0][4]) && (*(*(p + i) + j) != p[4][0]) && (*Min > *(*(p + i) + j)))
            {
                Min = *(p + i) + j;
            }
        }
    }

    temp = *Min;                                                       //第四小值与第五行第五列值交换;
    *Min = *(*(p + 4) + 4);
    *(*(p + 4) + 4) = temp;

    for(i = 0; i < 5 ; i++)                                 //打印交换过后的行列式;
    {
        for(j = 0; j < 5; j++)
        {
            printf("%4d", *(*(p + i) + j));
        }

        printf("\n");
    }
   
   
}
13 回复
#2
林月儿2015-09-13 10:50
sort方法一个嵌套for就够了,然后再将特殊元素归位。
#3
林月儿2015-09-13 13:07
程序代码:
#include <stdio.h>

main()
{
    void sort(int (*p)[5]);
    void swap(int &a,int &b);
    int a[5][5], i, j;

    printf("please input 5*5 array: \n");
    for(i = 0; i < 5; i++){                              //一个一个输入行列式的每一个值;
        for(j = 0; j < 5; j++){
            scanf("%d", &a[i][j]);
        }
    }
    printf("\nThe 5*5 array is: \n");                   //将行列式打印出来;
    for(i = 0; i < 5; i++){
        for(j = 0; j < 5; j++){
            printf("%4d", a[i][j]);
        }
        printf("\n");
    }
    printf("\nNow they are: \n");
   
    sort(a);                                           //调用sort函数
   
    for(i = 0; i < 5 ; i++){                                 //打印交换过后的行列式;
        for(j = 0; j < 5; j++){
            printf("%4d", *(*(a + i) + j));
        }
        printf("\n");
    }
    printf("\n");
}
void swap(int &a,int &b){
    a=a^b; b=a^b; a=a^b;
}
void sort(int (*p)[5])
{
    int i, j, maxIn=0,tm=24;                             
    for(i = 0; i < 4; i++){
        for(j = 0; j < 25-i-1; j++){
            if(*(*(p + j/5) + j%5)< *(*(p + j/5) + j%5+1)){
                swap(*(*(p + j/5) + j%5)=*(*(p + j/5) + j%5),*(*(p + j/5) + j%5+1));
            }
        }
    }
    for(j = 0; j < 25; j++){
        if(*(*(p + j/5) + j%5)>*(*(p + maxIn/5) + maxIn%5)){
            maxIn=j;
        }
    }
    swap(*(*(p+(tm/2)/5)+(tm/2)%5),*(*(p+maxIn/5)+maxIn%5));
    for(int i=0;i<4;i++){
        swap(*(*(p+(i%2)*4)+(i/2)*4),*(*(p+tm/5)+tm%5-i));
    }
}


[ 本帖最后由 林月儿 于 2015-9-13 19:58 编辑 ]
#4
chgtx2015-09-13 23:09
回复 3楼 林月儿
编译不过,25个错误,6个提醒;
只有本站会员才能查看附件,请 登录
#5
林月儿2015-09-14 07:12
为什么我可以?我就问问为什么我可以?
你考虑过我们用的编译器可能不一样?
然后 要我按你的编译器改?

编译信息
General: MinGW GCC 4.7.2 32-bit Release
Executing g++.exe...
g++.exe "C:\Users\Administrator\Desktop\test.cpp" -o "C:\Users\Administrator\Desktop\test.exe" -g3   -static-libstdc++ -static-libgcc -g3
Compilation succeeded in 1.19 seconds
只有本站会员才能查看附件,请 登录


[ 本帖最后由 林月儿 于 2015-9-14 07:13 编辑 ]
#6
chgtx2015-09-14 08:02
回复 5楼 林月儿
不要那么激动,我没那个意思,也有想过可能是编译器的事,不过上次忘了问,我写的那段你在你的编译器上能不能编译过?
#7
林月儿2015-09-14 10:02
以下是引用chgtx在2015-9-14 08:02:45的发言:

不要那么激动,我没那个意思,也有想过可能是编译器的事,不过上次忘了问,我写的那段你在你的编译器上能不能编译过?


也想过还贴什么编译不通过的截图。。。
都说了编译器不一样还放什么代码,直接看就知道代码有待优化。
#8
chgtx2015-09-14 10:15
回复 7楼 林月儿
一看代码就知道我刚学,截图是想让你看看有没解决办法,你水平很高,看了一会才看懂你写的代码
#9
林月儿2015-09-14 10:17
以下是引用chgtx在2015-9-14 10:15:42的发言:

一看代码就知道我刚学,截图是想让你看看有没解决办法,你水平很高,看了一会才看懂你写的代码


来这里就是贴代码是为了解决问题收获经验,不是找什么我刚学的借口。
面试官会关心你是不是刚学吗?会的,然后开低一点的工资。
#10
chgtx2015-09-14 10:28
回复 9楼 林月儿
打嘴仗没意思,浪费时间,不能解决就算了
#11
embed_xuel2015-09-14 10:30
一个是.c文件,一个是.cpp文件,有编译问题正常
#12
embed_xuel2015-09-14 10:31
发完才发现是在C++版
#13
林月儿2015-09-14 10:37
回复 10楼 chgtx
程序代码:
void sort(int (*p)[5])
{
    int i, j, temp;

    int *Max, *Min;   
   
    *Max = *(*p);                                 //将行列式第一个地址赋给Max,赋给Min
   
    *Min = *(*p);                              
   
    for(i = 0; i < 5; i++)                           //找出最大值地址;
    {
        for(j = 0; j < 5; j++)
        {
            if(*Max < *(*(p + i) + j))
            {
                Max = *(p + i) + j;
            }
            if(*Min > *(*(p + i) + j))             //找出最小值地址;
            {
                Min = *(p + i) + j;
            }
            
        }
    }
   
    temp = *(*(p + 2) + 2);                      //最大值与中间值交换;
    *(*(p + 2) + 2) = *Max;
    *Max = temp;
   
    temp = *Min;                                 //最小值与第一行第一列的值交换;
    *Min = p[0][0];
    p[0][0] = temp;
   
    *Min = *(*(p)+ 1);
    for(i = 0; i < 5; i++)
    {
        for(j = 0; j < 5; j++)
        {
            if((*(*(p + i) + j) != p[0][0]) && (*Min > *(*(p + i) + j)))   //判断条件为循环值不等于最小值,且大于*Min;
            {
                Min = *(p + i) + j;                                   //找出第二小值地址;
            }
        }
    }

    temp = *Min;                                                      //将第二小值与第一行第五列值交换;
    *Min = p[0][4];
    p[0][4] = temp;
   
    *Min = *(*(p)+ 2);
    for(i = 0; i < 5; i++)                                             //找出第三小值;
    {
        for(j = 0; j < 5; j++)
        {
            if((*(*(p + i) + j) != p[0][0]) && (*(*(p + i) + j) != p[0][4]) && (*Min > *(*(p + i) + j)))
            {
                Min = *(p + i) + j;
            }
        }
    }

    temp = *Min;                                                     //第三小值与第五行第一列值交换;
    *Min = p[4][0];
    p[4][0] = temp;

    *Min = *(*(p)+ 3);;                                                     //找出第四小值地址;
    for(i = 0; i < 5; i++)
    {
        for(j = 0; j < 5; j++)
        {
            if((*(*(p + i) + j) != p[0][0]) && (*(*(p + i) + j) != p[0][4]) && (*(*(p + i) + j) != p[4][0]) && (*Min > *(*(p + i) + j)))
            {
                Min = *(p + i) + j;
            }
        }
    }

    temp = *Min;                                                       //第四小值与第五行第五列值交换;
    *Min = *(*(p + 4) + 4);
    *(*(p + 4) + 4) = temp;

    for(i = 0; i < 5 ; i++)                                 //打印交换过后的行列式;
    {
        for(j = 0; j < 5; j++)
        {
            printf("%4d", *(*(p + i) + j));
        }

        printf("\n");
    }
   
   
}

我没有和你斗嘴,我在2楼说过问题所在,而且不是说说而已
初步改了下,和预料的一样,代码量大了出错几率也就大了。
debug工作量也就大了
剩下的自己能解决吧?
#14
林月儿2015-09-14 10:39
回复 12楼 embed_xuel
大神给他说说吧
1