編制乙個從鍵盤讀入實數的函式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 型...