日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

近似与精确——《狂人C》习题解答15(第三章习题5)

發布時間:2024/6/5 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 近似与精确——《狂人C》习题解答15(第三章习题5) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目:從前有一個農夫,死后留下15頭牛,他在遺書中寫到:"妻子:分給全部牛的半數再加半頭;長子:分給剩下的牛的半數再加半頭;次子:分給剩下的牛的半數再加半頭;長女:分給最后剩下的。"編程求長女得到了幾頭牛。

??? 這是一個簡單的小學算術問題:
??? 15頭牛的一半是7又1/2 ,再加半頭得8,這是妻子所得。剩下7頭
??? 7頭牛的一半是3又1/2 ,再加半頭得4,這是長子所得。剩下3頭
??? 3頭牛的一半是1又1/2 ,再加半頭得2,這是次子所得。剩下1頭
??? 因而長女所得為1頭。

??? 但是如果寫出如下的代碼,則最多只能得60分。

#include <stdio.h> #include <stdlib.h>#define ZONGSHU 15. //總數:留下15頭牛 #define FENPEI_BL .5 //分配比例: 半數 #define EWAI_TJ .5 //額外添加:半頭 int main( void ) {double qizi , zhangzi , cizi , zhangnv ; //妻子、長子、次子、長女所得 double shengyu = ZONGSHU ; //剩余的數量 qizi = shengyu * FENPEI_BL + EWAI_TJ ; //妻子所得shengyu -= qizi ; //剩余的數量zhangzi = shengyu * FENPEI_BL + EWAI_TJ ; //長子所得shengyu -= zhangzi ; //剩余的數量cizi = shengyu * FENPEI_BL + EWAI_TJ ; //次子所得shengyu -= cizi ; //剩余的數量zhangnv = shengyu ; //長女:分給最后剩下的printf("長女得到了%f頭牛\n" , zhangnv ) ;system("PAUSE"); return 0;}

輸出:長女得到了1.000000頭牛

??? 因為,第一,這個結果僅僅表示長女得到的牛數約等于1頭;第二,代碼并沒有真正實現前面的算術運算過程。譬如
??? qizi =? shengyu * FENPEI_BL +? EWAI_TJ ;
??? 所表示的含義僅僅是一些近似的值的一個近似運算,而非前面算術運算過程中的精確運算。因為就其本質和普遍情形來講,實浮點類型的數據只是對實數的一個近似表示,這注定實浮點類型的運算也只是一種近似運算。只不過在本題目中,近似的精度很高,計算結果恰好和精確的結果一致而已。如果把程序視為對筆算過程的精確模擬的話,顯然前面一段代碼并不符合要求。
??? 在計算機中,只有整數類型是對整數集合子集的近似表示。所以如果希望準確地模擬筆算過程就只能用整數類型。然而筆算過程涉及到了分數。在數學中,分數也是一種精確表示,然而在C語言中卻并沒有與之對應的“分數類型”。
??? 沒有相應的數據類型怎么辦?答案很簡單:沒有這種類型就創造這種數據類型。為創造性提供了廣闊的發揮空間是C語言的特點和魅力,也恰恰是編程的樂趣之一。
??? 由于分數是由分子、分母兩個部分組成,而分子、分母都是整數,因而可以用兩個整數類型的數據來表示分數。對于這樣的數據,C語言并沒有提供直接的運算,這種“分數”的運算需要自己用C語言所提供的運算模擬。
??? 例如,若計算a/b+c/d,則無法通過一次“+”運算完成,只能分兩次計算出和的分子“b*c+d*c”及和的分母“a*c”。
??? 按照這種辦法得到的代碼是

#include <stdio.h> #include <stdlib.h>#define ZONGSHU_FZ 15 //總數的分子 #define ZONGSHU_FM 1 //總數的分母 #define FENPEI_BL_FZ 1 //分配比例的分子 #define FENPEI_BL_FM 2 //分配比例的分母 #define EWAI_TJ_FZ 1 //額外添加的分子 #define EWAI_TJ_FM 2 //額外添加的分母 int main( void ) {int qizi_fm , qizi_fz , //妻子所得的分母和分子 zhangzi_fm , zhangzi_fz , //長子所得的分母和分子cizi_fm , cizi_fz , //次子所得的分母和分子 zhangnv_fm , zhangnv_fz ; //長女所得的分母和分子 int shengyu_fm = ZONGSHU_FM , //剩余的數量的分母shengyu_fz = ZONGSHU_FZ ; //剩余的數量的分子 qizi_fz = shengyu_fz * EWAI_TJ_FM //妻子所得+ shengyu_fm * FENPEI_BL_FM * FENPEI_BL_FZ; qizi_fm = shengyu_fm * FENPEI_BL_FM * EWAI_TJ_FM ; shengyu_fz = shengyu_fz * qizi_fm - qizi_fz * shengyu_fm ; //剩余的數量shengyu_fm *= qizi_fm ; zhangzi_fz = shengyu_fz * EWAI_TJ_FM //長子所得+ shengyu_fm * FENPEI_BL_FM * FENPEI_BL_FZ; zhangzi_fm = shengyu_fm * FENPEI_BL_FM * EWAI_TJ_FM ; shengyu_fz = shengyu_fz * zhangzi_fm - zhangzi_fz * shengyu_fm ; //剩余的數量shengyu_fm *= zhangzi_fm ; cizi_fz = shengyu_fz * EWAI_TJ_FM //次子所得+ shengyu_fm * FENPEI_BL_FM * FENPEI_BL_FZ; cizi_fm = shengyu_fm * FENPEI_BL_FM * EWAI_TJ_FM ; shengyu_fz = shengyu_fz * cizi_fm - cizi_fz * shengyu_fm ; //剩余的數量shengyu_fm *= cizi_fm ; zhangnv_fz = shengyu_fz ; //長女所得zhangnv_fm = shengyu_fm ;printf("長女得到了%d又%d/%d頭牛\n" , shengyu_fz/shengyu_fm , shengyu_fz % shengyu_fm , shengyu_fm ) ;system("PAUSE"); return 0;}

輸出:長女得到了1又0/16384頭牛

??? 這是一個精確的結果。
??? 【注:學習了控制語句和函數理論之后,后一個代碼可以進一步改進。】

?

轉載于:https://www.cnblogs.com/KBTiller/archive/2011/09/24/2189685.html

總結

以上是生活随笔為你收集整理的近似与精确——《狂人C》习题解答15(第三章习题5)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。