| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3538 人关注过本帖
标题:调试过程监视到全局变量的值是正确的,输出的时候却都是0,麻烦帮忙看看。
只看楼主 加入收藏
lzh253739255
Rank: 2
等 级:论坛游民
帖 子:32
专家分:24
注 册:2013-10-8
收藏
得分:0 
感谢各位指导,
尝试了一下。
把max/min从result函数分离出来单独输出结果输出是正确的。
各位大神指出的一些细节上的部分错误已更正。

代码如下:

#include <stdio.h>
double average,max,min;
double result(double x[])
{
    int i;
    for(i=0,average=0.0;i<10;i++)
    {
        average+=x[i];
    }
    average/=i;
    max=x[0];
    for(i=0;i<10;i++)
    {
        if(x[i]>max)
        {
            max = x[i];
        }
    }
    min=x[0];
    for(i=0;i<10;i++)
    {
        if(x[i]<min)
        {
            min = x[i];
        }
    }
    return average;
}
int main()
{
    double array[10]={98,77,43,95,83,94,88,81,73,88.5};
    printf("the average is:%lf\n",result(array));
    printf("the max is:%f\nthe min is:%f\n",max,min);
}

程序员应该足够懒,追求一劳永逸,写出来的代码,应是可以反复使用的.
2016-03-30 14:35
lzh253739255
Rank: 2
等 级:论坛游民
帖 子:32
专家分:24
注 册:2013-10-8
收藏
得分:0 
回复 2楼 qq1023569223
谢谢解答。
多了很多分号是因为......
早上起床迷迷糊糊的,重新写了一遍昨天晚上的练习题。
然后编译器提示我缺少了很多分号,我就按着提示一个一个的加分号。
虽然自己都感觉很奇怪为什么要加这么多分号....

由于没睡醒,所以也没太在意。
哈哈哈。


程序员应该足够懒,追求一劳永逸,写出来的代码,应是可以反复使用的.
2016-03-30 14:38
lzh253739255
Rank: 2
等 级:论坛游民
帖 子:32
专家分:24
注 册:2013-10-8
收藏
得分:0 
回复 3楼 TonyDeng
我在家用的是vs2010.
在办公室用devc++5.11.

程序员应该足够懒,追求一劳永逸,写出来的代码,应是可以反复使用的.
2016-03-30 14:40
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
不要假定和依赖参数的求值顺序!我前面一直都刻意不说应该是什么顺序,也是这个原因,不同的编译器有不同的处理方式,没有标准答案。你最后改的,还有改进空间,比如不需3次循环。

授人以渔,不授人以鱼。
2016-03-30 14:49
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
规范的写法,是用临时变量储存函数的返回值,再输出语句中统一使用,尽力避免依赖求值顺序的情况。这个陷阱在某经典书中是有讲的,本质它跟多项i++表达式是同一性质,只是这个写成函数的更隐蔽。

授人以渔,不授人以鱼。
2016-03-30 15:12
lzh253739255
Rank: 2
等 级:论坛游民
帖 子:32
专家分:24
注 册:2013-10-8
收藏
得分:0 
回复 14楼 TonyDeng
#include <stdio.h>
double average,max,min;
double result(double x[])
{
    int i;
    max=x[0];
    min=x[0];
    for(i=0;i<10;i++)
    {
        if(x[i]>max)
        {
            max = x[i];
        }
        else if(x[i]<min)
        {
            min = x[i];
        }
        average+=x[i];
    }
    average/=i;
    return average;
}
int main()
{
    double array[10]={98,77,43,95,83,94,88,81,73,88.5};
    printf("the average is:%lf\n",result(array));
    printf("the max is:%lf\nthe min is:%lf\n",max,min);
}

做了一些尝试。
如果是将调用result(array)的printf放在max/min变量输出语句后面,max/min的值还是0.
可见,需要先调用result(array),让全局变量max/min进行运算才会得到预期的值。
如上是经一些思考修改的代码。
max.min,average都使用了for(i=0;i<10;i++)语句,组合起来使用看起来代码精炼了很多。

多谢指导!

程序员应该足够懒,追求一劳永逸,写出来的代码,应是可以反复使用的.
2016-03-30 15:29
lzh253739255
Rank: 2
等 级:论坛游民
帖 子:32
专家分:24
注 册:2013-10-8
收藏
得分:0 
回复 15楼 TonyDeng
刚开始学习函数的时候我的确是会声明一个临时变量用来存储函数的返回值。
但是。。
受到你那句话的影响.....程序员应该要足够懒。。
所以。。觉得直接写在printf语句中方便多了。

程序员应该足够懒,追求一劳永逸,写出来的代码,应是可以反复使用的.
2016-03-30 15:31
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
回复 17楼 lzh253739255
尽量把全局变量都去掉的好

DO IT YOURSELF !
2016-03-30 15:34
lzh253739255
Rank: 2
等 级:论坛游民
帖 子:32
专家分:24
注 册:2013-10-8
收藏
得分:0 
回复 18楼 wp231957
...
我是初学者。还在基础学习阶段。
刚学到全局变量和局部变量的区别。
要求必须使用全局变量。

...

程序员应该足够懒,追求一劳永逸,写出来的代码,应是可以反复使用的.
2016-03-30 15:37
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 17楼 lzh253739255
我那个懒是指代码可重复使用,不是指这个。即写不依赖于特定情形的、通用的、多个地方都会用得到的代码。

授人以渔,不授人以鱼。
2016-03-30 15:45
快速回复:调试过程监视到全局变量的值是正确的,输出的时候却都是0,麻烦帮忙看 ...
数据加载中...
 
   



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

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