鱼C论坛

 找回密码
 立即注册
查看: 2350|回复: 4

[已解决]求解释《数据结构与算法——C语言描述》习题1.3

[复制链接]
发表于 2020-3-11 20:28:24 | 显示全部楼层 |阅读模式
5鱼币
//习题1.3                只使用处理I/O的PrintDigit函数,编写一个过程以输出任意实数
#include <stdio.h>

#define PrintDigit( Ch )      ( putchar( ( Ch ) + '0' ) )


void PrintInt(unsigned int N)  /* Print nonnegative N */
{
        if (N >= 10)
                PrintInt(N / 10);
        PrintDigit(N % 10);
}

void PrintOut(double N,int accuracy)
{
        if (N < 0){
                putchar('-');
                N = -N;
        }
        int n = (int)N;
        PrintInt(n);
        double decimal = N - n;
        if (decimal > 0){
                putchar('.');
                double add = 0.5;
                for (int i = 0; i < accuracy; i++) {
                        add /= 10;
                }
                N += add;
                for (int i = 0; i < accuracy; i++){
                        decimal *= 10;                       
                }
                PrintInt(decimal);
        }
}
int main()
{
        PrintOut(1208.123456,3);
        putchar('\n');
        return 0;
}


我想知道这个函数的实现原理,求大佬解答。
最佳答案
2020-3-11 20:28:25
本帖最后由 墨羽岚 于 2020-3-11 22:04 编辑

程序有一点小错误啊,倒数12行重复定义了i,把int去掉吧。



调用库函数<include.h>

定义函数PrintDigit(Ch)为(putchar(Ch)+'0')    (以数字形式输出Ch)

定义PrintInt函数(运算对象为无符号整型数N)/*用以输出非负数N*/
{
        当N>=10时
                再次对N/10(N去掉个位数后的数)进行PrintInt函数操作;
        对N%10(N的个位数)使用PrintDigit函数;
}
定义PrintOut函数(运算对象为双精度型数N,整型数accuracy(即精确度))
{
        当N<0时
                {
                        输出负号;
                        将N的相反数重新赋值给N;
                }
        定义一个整型数n,并将对N进行int操作(向下取整)后的值赋初值给n;
        对n使用PrintInt函数;
        定义一个双精度型数demical(小数),并将N-n的值赋初值给demical;
        若demical>0
        {
                输出小数点符号;
                定义双精度型数add且初值为0.5;
                定义整型数i,且赋初值0给i,当i<accuracy时,进行以下循环体并在每次循环后自动加1
                {
                        将add除以10后的值重新赋值给add;
                }
                赋初值0给i,当i<accuracy时,进行以下循环体并在每次循环后自动加1(因为上一段已经定义了i,此处不要再定义)
                {
                        将demical乘10后的值重新赋值给demical;
                }
        对demacal使用PrintInt函数;                     //这一小段是在进行四舍五入//
        }
}
定义整形main函数
{
        对1208.123456和3使用PrintOut函数;
        输出回车;
        结束;
       
}

最佳答案

查看完整内容

程序有一点小错误啊,倒数12行重复定义了i,把int去掉吧。 调用库函数 定义函数PrintDigit(Ch)为(putchar(Ch)+'0') (以数字形式输出Ch) 定义PrintInt函数(运算对象为无符号整型数N)/*用以输出非负数N*/ { 当N>=10时 再次对N/10(N去掉个位数后的数)进行PrintInt函数操作; 对N%10(N的个位数)使用PrintDigit函数; } 定义PrintOut函数(运算对象为双精度型数N,整型数accuracy(即精确度)) { ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-11 20:28:25 | 显示全部楼层    本楼为最佳答案   
本帖最后由 墨羽岚 于 2020-3-11 22:04 编辑

程序有一点小错误啊,倒数12行重复定义了i,把int去掉吧。



调用库函数<include.h>

定义函数PrintDigit(Ch)为(putchar(Ch)+'0')    (以数字形式输出Ch)

定义PrintInt函数(运算对象为无符号整型数N)/*用以输出非负数N*/
{
        当N>=10时
                再次对N/10(N去掉个位数后的数)进行PrintInt函数操作;
        对N%10(N的个位数)使用PrintDigit函数;
}
定义PrintOut函数(运算对象为双精度型数N,整型数accuracy(即精确度))
{
        当N<0时
                {
                        输出负号;
                        将N的相反数重新赋值给N;
                }
        定义一个整型数n,并将对N进行int操作(向下取整)后的值赋初值给n;
        对n使用PrintInt函数;
        定义一个双精度型数demical(小数),并将N-n的值赋初值给demical;
        若demical>0
        {
                输出小数点符号;
                定义双精度型数add且初值为0.5;
                定义整型数i,且赋初值0给i,当i<accuracy时,进行以下循环体并在每次循环后自动加1
                {
                        将add除以10后的值重新赋值给add;
                }
                赋初值0给i,当i<accuracy时,进行以下循环体并在每次循环后自动加1(因为上一段已经定义了i,此处不要再定义)
                {
                        将demical乘10后的值重新赋值给demical;
                }
        对demacal使用PrintInt函数;                     //这一小段是在进行四舍五入//
        }
}
定义整形main函数
{
        对1208.123456和3使用PrintOut函数;
        输出回车;
        结束;
       
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-12 10:48:33 | 显示全部楼层
墨羽岚 发表于 2020-3-11 20:28
程序有一点小错误啊,倒数12行重复定义了i,把int去掉吧。

为什么给add赋初值为5?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-12 11:18:59 | 显示全部楼层
星云鱼梦 发表于 2020-3-12 10:48
为什么给add赋初值为5?

add初值0.5是为了小数点后四舍五入呀,按照accuracy的值来判断在哪一位进行四舍五入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-12 11:38:50 | 显示全部楼层
墨羽岚 发表于 2020-3-12 11:18
add初值0.5是为了小数点后四舍五入呀,按照accuracy的值来判断在哪一位进行四舍五入

谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 18:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表