2939|3

7815

帖子

56

TA的资源

裸片初长成(中级)

楼主
 

俺的C习题(3)——这个恐怕臭鸡蛋真的会多起来了 [复制链接]

这两天因为这样因为那样,结果都没贴程序。
晚上七点多下班回到家,千不该万不该想看新西游记......

恩恩,结果就。。。。。

晚上本想好好想想这几天临时布置下来的程序该怎么整整,估计明天就得交了,有点小压力。
本来还想再停一个晚上,但是实在怕就这么拖着拖着,这事情又黄了,所以好吧,抽出些时间再贴一个吧。

看过这本霍顿的教程都知道,接下来第七章指针我还有三个习题——那三个习题还真是麻烦的紧,我第三次打开第二题的代码,看了看还是觉得要看下去比较费劲——因为我忽然从代码的写法上发现,那个原来不是我当初自己写的,我当时是费了好大劲写了几次,但始终没通过,所以我看到的那个其实是答案。
要说现在来说,写这么一个程序,倒不是太要命的事情,只是估计还不知道要花多少时间——一直以来都没养成良好的编程习惯,就像 绝影 说的那种,拿到题目就开始写代码。
结果那阵子是属于写到后来发现写不下去。
现在是属于写到一半会发觉都很乱,于是就陷入 痛苦修修补补 和 推倒重来,都是悲剧的事情。
好了不说了。

所以我还是选择了稍微简单点的第八章函数的习题。
结果同样发现当初我做的很不认真,嗯,不多说了,看代码里的注释就知道了。

圈哥,这回您老人家有的地方批了,而且都是硬伤,不再是以前那种啦.......
  1. /*Practise 8.1 */
    //定义一个函数,给函数传送任意多个浮点数,计算出这些数的平均值。
    //从键盘输入任意个值,并输出平均值,以说明这个函数的执行过程
    #include<stdio.h>
    #include<ctype.h>

    //这个程序,如果没记错,考的就是 参数个数可变的函数。
    //我总是记不得具体使用了那三个宏,和具体的过程。
    //但我记得的是,当时讨论的只到了类型相同的可变个数的参数,对于不同类型的没有提到。

    double Get_values(void);

    int main(void)
    {
    double sum = 0.0;
    int count = 0;
    char answer = '\r';

    //printf("Beginning...\n");

    //while((answer = getchar()) != 'n')
    while(1)
    {
    /*判断的原来加在这个位置,就会出问题*/
    /*而一旦我把那个判断的if(!count)去掉了又可以?!*/
    if(count != 0)
    printf("Go on?(y or n)\n");
    else
    printf("Beginning...\n");

    scanf(" %c",&answer);
    if(tolower(answer) == 'n')
    break;

    sum += Get_values();
    //count++;
    //这种先++后++,有时候就会导致明明是输入两个,显示
    //却是第三个的尴尬——当时做这题估计是觉得简单,太没用心了。

    printf("\n%.3lf",sum);
    printf("\n%d",count++);
    printf("\n%c",answer);
    //老毛病,多输出了没必要的结果
    //实际跑了一次,还存在不少问题,比如对非法输入缺乏判断机制。



    //这一部分是参考答案临时改的——又是属于没动脑的时候瞎改的情形
    }

    printf("The average of the list of values you input is:\n"
    " %.2lf",sum/(double)(count));

    return 0;
    }

    double Get_values(void)
    {
    double value = 0.0;
    scanf(" %lf",&value);
    return value;
    }

    //这个程序本身没什么麻烦的地方——我原以为我是用可变参数写的。
    //对比了参考答案,原来也还没要求这个。
    //它考的只是把指针作为实参传送
复制代码





下面这个是参考答案。
贴出来对比对比,这样会更显的自己写的那个有多狗屎吧?


  1. /* Exercise 8.1 A function to calculate an average */
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>

    double average(double data[], int count)
    {
    double sum = 0.0;
    for(int i = 0 ; i<count ; sum += data[i++])
    ;
    return sum/count;
    }

    #define CAPACITY_INCREMENT 6 /* Increment in the capacity for data values */

    int main(void)
    {
    double *data = NULL; /* Pointer to array of data values */
    double *newdata = NULL; /* Pointer to new array of data values */
    double *averages = NULL; /* Pointer to array of averages */
    int count = 0; /* Number of data values */
    int capacity = 0; /* Number of data values that can be stored */
    char answer = 'n';

    do
    {
    if(count == capacity)
    {
    capacity += CAPACITY_INCREMENT;
    /* Create new array of pointers */
    newdata = (double*)malloc(capacity*sizeof(double));
    /* Create an array of values of type double for each new day and store the address */
    if(data)
    {
    /* Copy the existing values to the new array */
    for(int i = 0 ; i<count ; i++)
    newdata[i] = data[i];
    free(data); /* Free memory for the old array of pointers */
    }
    data = newdata; /* copy the address of the new array of pointers */
    newdata = NULL; /* Reset the pointer */
    }

    printf("Enter a data value: ");
    scanf(" %lf", data+count++);
    printf("Do you want to enter another (y or n)? ");
    scanf(" %c", &answer);
    } while(tolower(answer) != 'n');

    printf("\nThe average of thew values you entered is %10.2lf\n", average(data, count));
    free(data);
    return 0;
    }

复制代码



此帖出自编程基础论坛

最新回复

既然辛昕点名了,那只好继续拍了先来看这个地方(去掉了原注释)while(1){if(count != 0)printf(\"Go on?(y or n)\n\");elseprintf(\"Beginning...\n\");循环体}在这儿判断 count是否为0,的确是件吃力不计好的事情应该改成printf(\"Beginning...\n\");while(1){循环体printf(\"Go on?(y or n)\n\");}这样既简洁又自然,原来程序,既牺牲了效率,每次循环都要做一次毫无意义,多余的count判零,而且也使得程序显得臃肿,繁琐.  详情 回复 发表于 2012-1-3 16:29
点赞 关注
个人签名

强者为尊,弱者,死无葬身之地

 

回复
举报

7815

帖子

56

TA的资源

裸片初长成(中级)

沙发
 
唔,刚才看时间到了。有一句注释没写上去。
在我自己写的那个,while循环最开始的地方,就是判断哪个地方。

其实那个错误的东西不是别的,是来自于scanf和那个条件判断的写法问题。

scanf的问题,大家都应该知道,它对缓存中的残留字节的处理很不完善。
不过这个问题在这种环境下其实有一个很简单的解决办法:
你残留是吧,不要紧,你总不能残留一个‘n’给我吧?
所以,判断不判不等,就等 等 。

当然了,这个程序改到这里还没改好。
还是乱七八糟的。
贴上来丢人现眼,才有可能等一天我把它改好
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

44

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
既然辛昕点名了,那只好继续拍了

先来看这个地方(去掉了原注释)
while(1)
{

if(count != 0)
printf(\"Go on?(y or n)\n\");
else
printf(\"Beginning...\n\");
循环体
}

在这儿判断 count是否为0,的确是件吃力不计好的事情
应该改成

printf(\"Beginning...\n\");
while(1)
{

循环体
printf(\"Go on?(y or n)\n\");
}

这样既简洁又自然,
原来程序,既牺牲了效率,每次循环都要做一次毫无意义,多余的count判零,
而且也使得程序显得臃肿,繁琐.
此帖出自编程基础论坛
 
个人签名能力越大,责任越大;知道越多,未知更多
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

4
 

回复 板凳 能圈就圈 的帖子

圈哥,我重新把这个程序写了一遍。
 作为今天的内容,我还把参考答案对比,也贴上了。
 敬请关注哈,
嘿嘿。 很不好意思的是,我发现我又忘记了 溢出的情形。

https://bbs.eeworld.com.cn/viewthread.php?tid=314883&page=1&extra=page%3D1#pid1240348
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表