星云鱼梦 发表于 2020-3-11 20:28:24

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

//习题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函数;
        输出回车;
        结束;
       
}

星云鱼梦 发表于 2020-3-12 10:48:33

墨羽岚 发表于 2020-3-11 20:28
程序有一点小错误啊,倒数12行重复定义了i,把int去掉吧。




为什么给add赋初值为5?

墨羽岚 发表于 2020-3-12 11:18:59

星云鱼梦 发表于 2020-3-12 10:48
为什么给add赋初值为5?

add初值0.5是为了小数点后四舍五入呀,按照accuracy的值来判断在哪一位进行四舍五入

星云鱼梦 发表于 2020-3-12 11:38:50

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

谢谢大佬
页: [1]
查看完整版本: 求解释《数据结构与算法——C语言描述》习题1.3