3677|2

7815

帖子

56

TA的资源

裸片初长成(中级)

楼主
 

俺的C习题(8)——这个习题写的真够狗血的 [复制链接]

不知不觉,这个系列已经写到第八篇了。
不过我当初写的那些习题也差不多完了。

今天想着给这个事琢磨着考虑个边界,于是,忙活了几个小时。
并把结果写在这个博客里。
https://home.eeworld.com.cn/my/space.php?uid=115166&do=blog&id=65957

基本上,已经看到结束的边界了,这种感觉真好。

今天接下去的时间,我要把9.4弄好,摆上来。
这个程序写的真是够狗血的,是目前整理看到的最狗血的一个。

先贴我原来的版本,可以用,但是,那个子函数写的异常复杂,怎么着都该细分。

  1. /*practise 9.4*/
    #include<stdio.h>
    #include<stdlib.h>
    #include<stdarg.h>
    #include<string.h>

    char *to_string(int count,double first,...);

    void main()
    {
    printf("You value list is:\n");
    printf("%s\n",to_string(7,1.45,4.58,6.5,12.45,3.67,12.67,4.02,0) );
    }

    char *to_string(int count,double first,...)
    {
    va_list pvar;
    va_start(pvar,first);

    int value = 0;
    int index = 0;
    int j = 0;
    unsigned int length = 0;
    static int num = 0;

    char *presult = NULL;
    presult = (char *)malloc(200 * sizeof(char));

    char **plist = NULL;
    plist = (char **)malloc(count * sizeof(char *) );

    /*Specific for the first double*/
    *(plist + index) = (char *)malloc(9 * sizeof(char));
    value = int(100 * first);
    do
    {

    if(j == 2)
    *(*(plist + index) + j++) = '.';
    else
    {
    *(*(plist + index) + j++) ='0'+ (value % 10);
    value = value / 10;
    }
    }while(value != 0);
    *(*(plist + index) + j) = '\0';
    j = 0;

    do
    {
    *(plist + ++index) = (char *)malloc(9 * sizeof(char));
    if( (value = int(100 * va_arg(pvar,double)) ) != 0)
    {
    do
    {
    if(j == 2)
    *(*(plist + index) + j++) = '.';
    else
    {
    *(*(plist + index) + j++) ='0'+ (value % 10);
    value = value / 10;
    }
    }while(value != 0);
    *(*(plist + index) + j) = '\0';
    }
    j = 0;

    }while(index != (count - 1) );

    for(int i = 0;i < (count - 1);i++)
    {
    for(j = strlen(*(plist + i)) - 1;j >= 0;j--)/*事情的真相是,我把判断条件记反了,是条件为真,继续*/
    *(presult + num++) = *(*(plist + i) + j);
    if(i < count - 2)
    *(presult + num++) = ',';/*小问题,最后多了一个逗号*/
    }
    *(presult + num) = '\0';

    va_end(pvar);
    return presult;
    }
复制代码

此帖出自编程基础论坛

最新回复

辛苦辛昕啦  详情 回复 发表于 2012-1-20 10:25
点赞 关注
个人签名

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

 

回复
举报

2万

帖子

71

TA的资源

管理员

沙发
 
辛苦辛昕啦
此帖出自编程基础论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

板凳
 

这是俺重新写的一个答案。

圈哥,俺静静等着你

  1. /*practise 9.4*/
    /*
    一个函数的原型是:
    char *to_string(int count,double first,...);
    这个函数返回一个字符串,这个字符串含有第二及其后参数的字符串表示,每个参数都有两位小数,参数间用逗号隔开。
    第一个参数是从第二个参数算起的参数个数。编写一个main()函数,演示这个函数的运作。
    */

    /*
    这个函数被我写的异常复杂,而且也没有分成子函数逐个完成。
    比如说,itoa的转换;
    */

    #include<stdio.h>
    #include<stdlib.h>
    #include<stdarg.h>
    #include<string.h>

    #define SINGLE_LENGTH 10

    char *to_string(int count,double first,...);
    /*两位小数点浮点数转换成字符串子函数*/
    void transfer_Double(double value,char *pbuffer);

    int main(void)
    {
    char i ;

    printf("You value list is:\n");
    printf("%s\n",to_string(7,7.02,4.5999,1.436,12.43,3.67,12.67,4.020,0) );

    return 0;
    }

    char *to_string(int count,double first,...)
    {
    int j = 0;
    int i;
    char pSingle[SINGLE_LENGTH];
    char *pReturn = NULL;

    va_list pvar;
    va_start(pvar,first);

    pReturn = (char *)calloc(100,sizeof(char));

    /*把所有浮点数转换成字符串*/
    for(i = 0;i < count;i++)
    {
    if(i == 0)
    transfer_Double(first,pSingle);
    else
    transfer_Double(va_arg(pvar,double),pSingle);

    strcat(pReturn,pSingle); //逐一连接起来

    if(i != count - 1) //非最后一个,加一个逗号
    pReturn[strlen(pReturn)] = ',';
    }
    pReturn[strlen(pReturn)] = '\0'; //加一个结束符

    return pReturn;
    }

    void transfer_Double(double value,char *pbuffer)
    {
    char i,j;
    int I_value;
    char Swap[SINGLE_LENGTH];

    for(i = 0;i < SINGLE_LENGTH;i++)
    Swap[i] = 0;

    I_value = (int)(100 * value + 0.00001); //小数点后两位,所以乘以100 ,加0.5弥补截断????
    /*于是乎,这一句,就成了整个程序最难得地方,究竟该如何弥补截断?*/
    i = 0;
    do
    {
    if(i == 2)
    Swap[i++] = '.';
    else
    {
    Swap[i++] = I_value % 10 + '0';
    I_value /= 10;
    }
    }while(I_value);

    Swap[i] = 0;

    /*逆转顺序*/
    for(j = 0;j < i;j++)
    pbuffer[j] = Swap[strlen(Swap) - 1 - j];

    pbuffer[j] = 0;

    }
复制代码

此帖出自编程基础论坛
 
个人签名

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

 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表