大一狗放假在家自學點算法,編程渣,自己練習一下
————————————————————————————————————————(我是劃分線)
題目:只使用處理I/O的PrintDigit函數,編寫一個過程以輸出任意實數(可以為負)
分析:書中已經給出了一個範例來打印正整數,那麼打印實數的關鍵在於將小數部分和整數部分區分開來,也就是分別用intPart和floatPart分別表示整數部分和小數部分轉換成的正整數,然後分別將intPart和floatPart用書中已經給出的PrintOut函數打印即可。一開始寫程序的時候我沒有考慮到計算機存儲double的方式,如2.16會被保存為2.15999999999999等,所以原來試圖通過先乘10再對10取餘來確定小數位數,後來發現做不到。。。。在網上看了人家發的代碼,發現大多是直接將小數位數當作參數傳給函數,好吧。。。。問題簡化很多。。。。所以後來也直接將小數位數當參數傳給了函數~~不過還要注意一下,比如上面提到的例子:2.16存储为2.15999999999,顯然,傳給函數的小數位數應該是2,而當我們將小數部分0.1599999999*10*10後,得到的是15.9999999999,對其取整是15。。。而正確的應該是16,所以應在對15.9999999取整後加1才是正確的結果。不過我有一個疑問,计算机存储double类型的时候像3.20呢?是存储为3.19999999还是3.2000000000?有點問題啊。。。求解答~
#include <cstdio>
#include <cmath>
void PrintDigit(int n);
void PrintOut(int n);
void PrintReal(double n,int dig);
int main()
{
double readin;
int dig;
printf("请输入一个实数以及它的小数位数:\n");
scanf("%lf", &readin);
scanf("%d",&dig);
if(readin<0)
{
readin=-readin; //若数字为负数,则将其变为正数
printf("-"); //并打印一个负号
}
PrintReal(readin, dig);
return 0;
}
void PrintDigit(int n) //只能输出单个数字的函数
{
printf("%d",n);
}
void PrintOut(int n) //只能输出整数的函数
{
if (n>=10)
PrintOut(n/10);
PrintDigit(n-(n/10)*10);
}
void PrintReal(double n,int dig) //能输出实数的函数
{
int intPart,floatPart; //将输入数字转换成整数部分和小数部分
double fp;
intPart=(int)n; //将数字取整即为原数字整数部分
PrintOut(intPart); //先输出整数部分
if ( (n-intPart)>0 ) //若存在小数部分
{
printf("."); //输出小数点
fp=n-intPart; //截取小数部分
}
floatPart=1+fp*pow(10.0, dig); //将小数部分转为整数后的值赋值给floatPart
PrintOut(floatPart); //打印转变为整数后的小数部分
}
在這個程序中,我將負數的轉換放在了main函數裡,可能不是很好,不過。。。懶得改了。。。