從鍵盤讀入實數

2021-07-02 15:46:51 字數 2145 閱讀 3834

編制乙個從鍵盤讀入實數的函式readreal(double *rp)。函式將讀入的實數字元列換成實數後,利用指標引數rp,將實數存於指標所指向的變數*rp

解析:

函式在返回之前,將最後讀入的結束實數字元列的字元返還給系統,以便隨後讀字元時能再次讀入該字元。函式若能正常讀入實數,函式返回整數1,如果函式在讀入過程中,未遇到數字符之前,遇到不能構成數字的情況,函式返回-1,表示為讀到實數。

在輸入實數時,在實數之前可以有乙個數不定的空白類字元,組成實數的字元列有數的符號字元,實數的整數部分,小數點和實數的小數部分,其中,某些部分可以預設。設實數字元列有以下幾種可能形式:

數符 整數部分

數符 整數部分

數符 整數部分.小數部分

數符 .小數部分

其中數符或為空,或為』+』,或為』-『,分別代表不帶符號,帶正號,帶負號。整數部分和小數部分至少要有乙個數字符組成。

上述實數形式說明,在實數轉換過程中,同一字元在不同情況下會有不同的意義。為標記當前實數轉換的不同情況,程式引入狀態變數,有狀態變數的不同值代表當前實數轉換過程中的不同情況。

共有以下多種不同的情況:正準備開始轉換,轉換了數的符號字元,正在轉換實數的整數部分,正在轉換實數的小數部分,發現輸入錯誤,轉換正常結束。設狀態變數為0表示正準備開始轉換,還未遇到任何與實數有關的字元;1表示已經遇到數的符號字元;2表示正在轉換實數的整數部分,3表示在未遇到數字字元之前先遇到小數點;4表示在轉換整數部分之後遇到小數點;5表示轉換發現錯誤,6表示轉換正常結束。

讀函式另外有兩張表,一張是轉換函式表,一張是狀態表。函式反覆讀入字元,將字元分類,根據當前狀態和當前字元類呼叫對應轉換函式。

下面是程式的實現部分:

#include #define err 5

#define ok 6

int status;

double result,sig,scale;

/* * 處理數的符號函式

*/int sign(int c)

/** *@brief integer 轉換整數部分

*@param c 要被轉換的整數字

*@return 返回成功與否

*/int integer(int c)

/** *@brief decimal 轉換小數部分

*@param c 要被轉換的小數字

*@return 返回成功與否

*/int decimal(int c)

/* 狀態表 */

/* * 0 - 正準備開始轉換,還未遇到任何與實數有關的字元

* 1 - 已遇數的符號字元

* 2 - 正在轉換實數的整數部分

* 3 - 在未遇數字字元之前先遇到小數點

* 4 - 在轉換整數部分之後先遇到小數點

* 5 - 表示轉換發現錯誤

* 6 - 轉換正常結束

*/int statbl[4]=,,,

,};/* 轉換函式表 */

int (*funtbl[4])() = ,,,

,};/**

*@brief readreal 用於對輸入的字串轉換成浮點數

*@param dp 轉換後的浮點數

*@return 返回是否轉換成功

*/int readreal(double *dp)

status = statbl[status][ckind]; /* 設定新的狀態 */

if(status == err || status == ok) break; /*結束,出錯或成功 */

c=getchar();

}ungetc(c,stdin); /* 歸還數的結束符*/

if(status == ok)

return -1;

}int main()

下面是我的程式的執行結果:

這個程式剛開始的時候,我的思路是,從第1個元素開始遍歷,遍歷過程中,在遇到」.」之前,類似於上面integer()函式的實現方式,當遇到點之後,就類似於上面decimal()函式的實現方式,但是看了作者的原始碼之後,發現需要學習乙個做著的思路,思路敏捷,**整潔,需要好好學習。

從鍵盤讀入實數

編制乙個從鍵盤讀入實數的函式readreal double rp 函式將讀入的實數字元列換成實數後,利用指標引數rp,將實數存於指標所指向的變數 rp。解析 函式在返回之前,將最後讀入的結束實數字元列的字元返還給系統,以便隨後讀字元時能再次讀入該字元。函式若能正常讀入實數,函式返回整數1,如果函式在...

c 鍵盤讀入問題

做演算法題時經常遇到,c 鍵盤讀入問題,總結如下。1 輸入二維陣列 int tmain int argc,tchar ar arr.push back a a.clear return 0 輸入是陣列,輸入換行符時,該行結束 vectorvec int i char c while c cin.ge...

易錯點 c 從鍵盤讀入double型別資料

一直在用c 使用cin讀入double型別,今天寫了點c,突然發現從鍵盤讀入double型別出錯了。如下 double a scanf f a printf f n a 輸入的小數部分是亂碼。查了一下資料,原來是我把格式化輸入搞錯了。printf 使用 f 可以輸出 double 和 float 型...