回 帖 发 新 帖 刷新版面

主题:求高手,改错!!

#include <stdio.h>
#include <stdlib.h>
int main()
{int highest(int array[x][y],int x,int y);
int a[4][5];
int i,j,t;
printf ("请输入每个学生各门课的成绩:"); 
for (i=0;i<4;i++)
    for (j=0;j<5;j++)
    scanf ("%d",&a[i][j]);
t=highest(a,4,5);
printf ("max=%d\n",t);
system("pause");
return 0;
}
int highest(int array[x][y],int x,int y)
{int i,j,max=0;
for (i=0;i<x;i++)
    for (j=0;j<y;j++)
    {if (a[i][j]>max) max=array[i][j];}
return (max);
}

回复列表 (共20个回复)

11 楼

如果大家不嫌弃我学C的时间短,
而我又有大块的时间的话
本人乐意总结下我对一维,二维指针以及数组的理解。

12 楼

[quote]如果大家不嫌弃我学C的时间短,
而我又有大块的时间的话
本人乐意总结下我对一维,二维指针以及数组的理解。[/quote]
这非常欢迎,开帖交流吧~
不过估计能看懂的人就有限了,这是C的时代悲哀:(

13 楼

即便是const指针,对于不严格的编译器而言仍然可以篡改其值。记得以前在某个地方看到过,专门有人讲篡改const值的方法……

14 楼

不是不理解,只是用得比较少(或者说不愿意用,或者说没遇到什么地方必须要用),对于多维数组来说主要就是理解如何把多维数组元素放到线性的内存地址上.

15 楼

[quote]不是不理解,只是用得比较少(或者说不愿意用,或者说没遇到什么地方必须要用),对于多维数组来说主要就是理解如何把多维数组元素放到线性的内存地址上.[/quote]
多维指针用的比较少(其实二维指针已经足够解决所有的问题,因为对于超过二维的指针,你永远可以借助void**来组合出来)主要还是因为相应的代码不容易调试,如果你不断地去做指针++,你可能不能意识到什么时候已经出界,什么时候指针停在哪里这样的问题。

16 楼

mywaylgh,我来具体说明一下const的问题
以下观点引用的资料来自于http://www.wangchao.net.cn/bbsdetail_39580.html
注意到你声明的是const int *p
那么实际上p并不是不可修改的,只是*p不可修改而已
也就是说,如果代码里出现了
const int b[3]={0,1,2};
p=b;
这样的语句的话,p还是会发生对应关系的变化
虽然在函数形参上,指针只是一个拷贝,本身不会发生变化,但是还是在这里提出这个问题,请打算学习多维指针和const指针的同学们注意

17 楼

[quote]#include <stdio.h>
#include <stdlib.h>

int highest(const int *p,int x,int y);

int main()
{
    int a[4][5];
    int i,j,t;

    printf (" 请输入每个学生各门课的成绩:"); 

    for (i=0;i<4;i++)
        for (j=0;j<5;j++)
            scanf ("%d",&a[i][j]);

    t=highest(a[0]+0,4,5);

    printf ("max=%d\n",t);
    system("pause");
    return 0;
}

int highest(const int *p,int x,int y)
{
    int i,j,max=0;

    for (i=0;i<x;i++)
        for (j=0;j<y;j++)
            if (p[i*y+j]>max) max=p[i*y+j];

    return max;
}


不要说我把简单问题复杂化,因为楼主提出这样的问题表示对C已有基本了解
楼主如果能看懂上面的解决方案,那你对指针和数组的了解就更进一步了。

请注意书写规划
注意const的使用,这是避免指针不乱指,以及避免使用指针时产生
不可预料的结果的法宝之一[/quote]

法宝也得看怎么用才行。
t=highest(a[0]+0,4,5);
if (p[i*y+j]>max) max=p[i*y+j];
int highest(const int *p,int x,int y)
代码这么写,我真的没看出一点好处来,除了能把“初学者”再搞的糊涂点外,其他一无是处。要效率实际并没增加加什么效率,反而人为故意增加些开销,单就额外增加了两个参数x,y要传进函数内,有什么用呢?至于const,可以保留。 如果喜欢指针,很好。用在改用的地方,权衡下代码的可读性和效率,你就会觉得上面的那三句纯属垃圾。我不知道这么做的必要性在哪里?对于int ia[][]的形式,编译器最终会作为int (*p)[]的形式。OK.指针出来了。如果你喜欢指针,请尊重下指针。如果你喜欢C,请尊重下C。
另附,雪光风剑的意见很中肯。也许谨慎总是和尊重系在一起的吧。
个人意见仅供参考。


[code=c]
#include <stdio.h>
#include <stdlib.h>

#define ROW        4
#define COL        5

int FindHighest(int (*pArray)[COL]);

int main()
{
    int ia[ROW][COL];
    
    printf (" 请输入每个学生各门课的成绩:"); 
    for (int i = 0; i < ROW; i++)
        for (int j = 0; j < COL; j++)
            scanf ("%d",&ia[i][j]);
        
    int nHighest = FindHighest(ia);
    printf ("Highest grade == %d\n",nHighest);
    system("pause");

    return EXIT_SUCCESS;
}

int FindHighest(int (*pArray)[COL])
{
    static int nHighest = 0;
    
    for (int i = 0; i < ROW; i++)
        for (int j = 0; j < COL; j++)
            if (pArray[i][j] > nHighest) 
                nHighest = pArray[i][j];
            
    return nHighest;
}

[/code]

18 楼

一如既往,小意见时间~
注意
    for (int i = 0; i < 4; i++)
        for (int j = 0; j < 5; j++)
这里的i和j的循环终值写的有点小问题
而函数中的
    for (int i = 0; i < ROW; i++)
        for (int j = 0; j < COL; j++)
是对的

注意保持一致性:)呵呵

19 楼

[quote]mywaylgh,我来具体说明一下const的问题
以下观点引用的资料来自于http://www.wangchao.net.cn/bbsdetail_39580.html
注意到你声明的是const int *p
那么实际上p并不是不可修改的,只是*p不可修改而已
也就是说,如果代码里出现了
const int b[3]={0,1,2};
p=b;
这样的语句的话,p还是会发生对应关系的变化
虽然在函数形参上,指针只是一个拷贝,本身不会发生变化,但是还是在这里提出这个问题,请打算学习多维指针和const指针的同学们注意[/quote]



const int *....
在标准g++/gcc编译器中是永远不可能改变的,其它非标准的编译器无视。
const 不仅“const”了指针本身而且也"const"了指针作用的范围。

so ...
像这样的语句:
const int b[3]={0,1,2};
int *p;
p=b;
p[2]=5;

是无法通过g++/gcc编译的
会出现诸如”error: invalid conversion from `const int*' to `int*'“
的错误。

请那个啥[em5]

20 楼

[quote]一如既往,小意见时间~
注意
    for (int i = 0; i < 4; i++)
        for (int j = 0; j < 5; j++)
这里的i和j的循环终值写的有点小问题
而函数中的
    for (int i = 0; i < ROW; i++)
        for (int j = 0; j < COL; j++)
是对的

注意保持一致性:)呵呵[/quote]


说的很对。疏忽了。已修改。

我来回复

您尚未登录,请登录后再回复。点此登录或注册