2 mingye1234 mingye1234 于 2016.03.20 15:41 提问

C语言新手问题...老鸟莫嫌弃``

编写函数(无返回有三个参数), 向函数传递三个浮点数, 函数中实现(指针完成):1) 求得最大值和最小值(2) 交换最大值和最小值(3) 打印三个数

void MaxMinChangeEachOtherNew(float a,float b,float c){
    float *max;
    float *min;
    max = &(a > b ? a : b > c ? a > b ? a : b : c);         //这两行报错```为什么呢??
    min = &(a < b ? a : b < c ? a < b ? a : b : c);

    float s = *max;
    *max = *min;
    *min = s;

}

3个回答

cxsmarkchan
cxsmarkchan   2016.03.20 17:44
已采纳

前一个答案没解决交换问题,附上新答案。注意和原先程序的区别。要实现函数外的交换,重点是函数定义里面的参数列表要用指针。

#include <stdio.h>
void MaxMinChangeEachOtherNew(float *a,float *b,float *c){ //注意这里的参数用的是指针类型,这样才能修改a/b/c的值
    float *max;
    float *min;
    max = min = a;
    if(*b > *max) max = b;
    if(*c > *max) max = c;
    if(*b < *min) min = b;
    if(*c < *min) min = c;

    float s = *max;
    *max = *min;
    *min = s;
}

int main(){
    //测试代码
    float a = 1.2, b = 3.0, c = 2.1;
    MaxMinChangeEachOtherNew(&a, &b, &c);
    printf("%f\n%f\n%f\n", a, b, c);
    return 0;
}
cxsmarkchan
cxsmarkchan 回复mingye1234: 学堂在线(www.xuetangx.com)或者coursera上有一些不错的课程,可以听一下。我听过coursera上李戈老师的C程序设计进阶,如果你有兴趣的话,可以听听里面的第2周和第6周内容,相对来说介绍地还不错。
一年多之前 回复
mingye1234
mingye1234 回复cxsmarkchan: 说实话,是在自学要是有老师 我也不用上网来问了
一年多之前 回复
cxsmarkchan
cxsmarkchan 回复mingye1234: 事实上是不等价的,你编译后也能看到结果不一样,所以需要修改输入参数的时候,按这份答案里面传入指针就好。不过,这个原理解释起来有一些麻烦,因为会涉及一些稍微深入的内容。我觉得你跟老师讨论一下就会清楚啦^_^
一年多之前 回复
mingye1234
mingye1234 谢谢你的帮助 但是我觉得你给的第一个答案应该可以修改a/b/c的值啊我觉得你给的这两份答案应该是能用不同方式得到的等价答案啊
一年多之前 回复
ZLK961543260
ZLK961543260   2016.03.20 15:57

你这个max = &(a > b ? a : b > c ? a > b ? a : b : c);什么意思,?:这个的格式是a>b?a:b,a>b结果真返回a,假返回b,你要是想连续判断也应该是max = &(a > b ? a : b > c ? a : b > a ? b : c);这样吧!意思是a与b中大的与c比较,其中大的在与a比较,你这个程序是不是想找a,b,c的最大值啊,max=&(a > b ? a : b > c ? (a > b ? a : b) : c);程序应该是这样的吧,下面那个跟这个同理!!

mingye1234
mingye1234 是比较a和b谁大,,再和c比较
一年多之前 回复
cxsmarkchan
cxsmarkchan   2016.03.20 16:04

在g++编译器中没有报错。
不过写这么长的条件表达式,可读性不太好啊。建议改写成if/else的形式,如下:

void MaxMinChangeEachOtherNew(float a,float b,float c){
    float *max;
    float *min;
    max = min = &a;
    if(b > *max) max = &b;
    if(c > *max) max = &c;
    if(b < *min) min = &b;
    if(c < *min) min = &c;

    float s = *max;
    *max = *min;
    *min = s;
}
cxsmarkchan
cxsmarkchan 回复mingye1234: 开了新答案,希望对你有帮助啦^_^
一年多之前 回复
mingye1234
mingye1234 兄弟......指教一下啊
一年多之前 回复
mingye1234
mingye1234 那个,,.......最后这三行 float s = *max; *max = *min; *min = s; 不应该是通过指针交换的吗?在主函数里最大值和最小值应该交换了啊
一年多之前 回复
cxsmarkchan
cxsmarkchan 回复mingye1234: 因为你的提问是对报错进行改正,所以我并没有修正你的交换最大值和最小值的bug。不过我看你的代码,感觉你是有能力解决交换的问题的。如果需要的话再回复我,我可以新开一个回答。
一年多之前 回复
cxsmarkchan
cxsmarkchan 回复mingye1234: 关于不能交换最大值和最小值的问题:如果你学过指针,应该知道“值传递”的问题,这个函数只是在内部交换了最大值和最小值,在函数外部就不存在了。如果你在函数内部输出a/b/c,就能看到正确的结果,在函数返回之后,abc的值并没有真实地交换。
一年多之前 回复
cxsmarkchan
cxsmarkchan 回复mingye1234: 首先回答你程序报错的问题:cannot take the address of an rvalue of type 'float',这句话的意思是不能对条件运算符的结果(rvalue)取地址。“对条件运算符结果取地址”是一个很复杂的行为,C++11标准里面对这个操作是否能执行,分不同情况给了十几条注释。所以,老一些的编译器不能编译通过是很正常的。所以建议你改成if/else。
一年多之前 回复
mingye1234
mingye1234 你的这个代码并没能交换最大值和最小值啊
一年多之前 回复
mingye1234
mingye1234 cannot take the address of an rvalue of type 'float'
一年多之前 回复
cxsmarkchan
cxsmarkchan 回复mingye1234: 报什么错误?
一年多之前 回复
mingye1234
mingye1234 程序要求交换最大和最小值 我用了一下你写的代码,并没有交换啊
一年多之前 回复
mingye1234
mingye1234 为啥我这个就报错啊
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!