コンソールからdoubleデータを読み込むフォールトトレランス処理(実行可能コードを完全に添付)

11313 ワード

以下は私が自分で書いたコンソールからdoubleデータを読み込むフォールトトレランス処理のコードです(実行可能な完全なコードは後ろにありますので、よろしくお願いします!)
コードの考え方:
1コンソール内の各適合条件文字(ビット権の大きい先入スタック、例えば2.3,'2'先入スタック、次いで'.',最後に'3')をスタックで保存します.
2.小数点の位置を記録します.
3.各数字のビット記号は順次スタックを出て、各文字を整数の数字に変換して、それから権位変換を行います(例えば:2.3:第1のスタックは'3'で、操作は3*pow(10、-1)つまり0.3で、第2のスタックは'.'です.処理を行わず、最後のスタックは'2'であり、2*pow(10,1)すなわち2であり、得られた2に0.3を加えて2.3となる.
//         double               
double InputDoubleVariableFromConsole()
{
	stack<char> sLength;
	int iFlag = 0; //         ; 1       , 0       
	int iDotPosition = 0; //        
	int iCount = 0; //                  
	char cTempChar;	//                  
	while ((cTempChar = cin.get()) != '
') { if ((cTempChar >= '0' && cTempChar <= '9') || cTempChar == '.') { iCount++; if (cTempChar == '.') { if ( 0 == iFlag) // { iDotPosition = iCount; // iFlag = 1; } else// { cout << "Input the length wrong, input again!" << endl; // cin.sync(); cin.clear(); ClearStack(sLength); // // 0 iFlag = 0; // iCount = 0; // 0 continue; } } sLength.push(cTempChar); // } else { cout << "Input the length wrong, input again!" << endl; // cin.sync(); cin.clear(); ClearStack(sLength); // // 0 iFlag = 0; // iCount = 0; // 0 continue; } } /*****************(2012 3 31 10:10:34 )********************/ // , if ( 0 == iFlag) // { iDotPosition = sLength.size() + 1; // sLength.push('.'); // iFlag = 1; } /*****************(2012 3 31 10:10:34 )********************/ double iTempLength = 0; // double while (!sLength.empty()) { int iLong = sLength.size(); // if (iLong > iDotPosition) // 。 { iTempLength += (sLength.top() - 48) * pow(10.0, iDotPosition - iLong); } else if (iLong < iDotPosition) // 。 { // 0 , 1 iTempLength += (sLength.top() - 48) * pow(10.0, iDotPosition - iLong - 1); } else {} sLength.pop(); // } return iTempLength; }

 
完全なコードの説明
1.このプログラムはc++コンソールプログラムで、全部で3つのファイルがある:RectangleCodeTest.cpp, My_head_rectangle.cpp, My_head_rectangle.h.
2.コンソールから矩形の長さと幅を受け取り、矩形の面積と周長の計算と出力を完了する.
3.私はファイルとソースファイルを下に貼って、私の考えを分かち合います.
4.皆さん、手加減しないでください.私のプログラムの中でどれらがもっと改善できるか、どれらの不適切なところがあるかを見てください.ありがとうございます.  f
テストの完全なコードは以下の通りです.
RectangleCodeTest.cppファイル
/* Created: 2012 3 29 11:13:24
 *
 * FileName: RectangleCodeText.cpp
 *
 * Author: Renzhibo
 *
 * Subject:        ,                 。
 *
 * Summary: 1.              
 */

#include <iostream>
#include <cmath>
#include <stack>

using std::cin;
using std::cout;
using std::endl;
using std::stack;

#include "My_head_rectangle.h"    

void ClearStack(stack<char>& s);
double InputDoubleVariableFromConsole();

int main()
{
	double length = 0, width = 0;
	My_rectangle myrectangle(length, width);
	//            
	cout << "Please input the length:" << endl;
	myrectangle.Set_Length(InputDoubleVariableFromConsole());
    cout << "Please input the width:" << endl;
	myrectangle.Set_Width(InputDoubleVariableFromConsole());

	myrectangle.Get_my_rectangle_area();  //          
	myrectangle.Show_my_rectangle_area(); //         
	myrectangle.Get_my_rectangle_circumference();  //           
	myrectangle.Show_my_rectangle_circumference(); //          
	myrectangle.Show_my_rectangle_property(); //             

	cin.get();
	return 0;
}

//         double               
double InputDoubleVariableFromConsole()
{
	stack<char> sLength;
	int iFlag = 0; //         ; 1       , 0       
	int iDotPosition = 0; //        
	int iCount = 0; //                  
	char cTempChar;	//                  
	while ((cTempChar = cin.get()) != '
') { if ((cTempChar >= '0' && cTempChar <= '9') || cTempChar == '.') { iCount++; if (cTempChar == '.') { if ( 0 == iFlag) // { iDotPosition = iCount; // iFlag = 1; } else// { cout << "Input the length wrong, input again!" << endl; // cin.sync(); cin.clear(); ClearStack(sLength); // // 0 iFlag = 0; // iCount = 0; // 0 continue; } } sLength.push(cTempChar); // } else { cout << "Input the length wrong, input again!" << endl; // cin.sync(); cin.clear(); ClearStack(sLength); // // 0 iFlag = 0; // iCount = 0; // 0 continue; } } double iTempLength = 0; // double
	/*****************(2012 3 31 10:10:34   ,              )********************/
	//          ,                     
	if ( 0 == iFlag) //           
	{  
		iDotPosition = sLength.size() + 1; //              
		sLength.push('.'); //           
		iFlag = 1;   
	}  
	/*****************(2012 3 31 10:10:34   )********************/
	while (!sLength.empty())
	{
		int iLong = sLength.size(); //      
		if (iLong > iDotPosition)  //        。            
		{
			iTempLength += (sLength.top() - 48) * pow(10, iDotPosition - iLong);
		}
		else if (iLong < iDotPosition) //        。            
		{
			//         0   ,     1
			iTempLength += (sLength.top() - 48) * pow(10, iDotPosition - iLong - 1);
		}
		else
		{}

		sLength.pop(); //   
	}

	return iTempLength;
}

void ClearStack(stack<char>& s)
{
	while(s.empty()==false)
		s.pop();

	return;
}
 
My_head_rectangle.hファイル
/* Created: 2012 3 29 11:13:46
*
* FileName: My_head_rectangle.h 
*
* Author: Renzhibo
*
* Subject: 
*
* Summary:  1.                         ,      
*/

#ifndef __MY_HEAD_RECTANGLE_H
#define __MY_HEAD_RECTANGLE_H

class My_rectangle
{
private:
	double my_rectangle_length;
	double my_rectangle_width;
	double my_rectangle_area;
	double my_rectangle_circumference;
public:
	//construct
	My_rectangle(double dLength, double dWidth, double dArea = 0, double dCircumference = 0) 
		: my_rectangle_length(dLength), 
		my_rectangle_width(dWidth), 
		my_rectangle_area(dArea),
		my_rectangle_circumference(dCircumference){}
	// method
	void Set_Length(double dLength);
	void Set_Width(double dWidth);
	void Get_my_rectangle_area();
	void Get_my_rectangle_circumference();
	void Show_my_rectangle_area();
	void Show_my_rectangle_circumference();
	void Show_my_rectangle_property();
	//destruct
	~My_rectangle(){}
};

#endif
 
My_rectangle_head.cppファイル
/* Created: 2012 3 29 11:13:53
*
* FileName: My_head_rectangle.cpp 
*
* Author: Renzhibo
*
* Subject: 
*
* Summary:  
*/

#include <iostream>
using std::endl;
using std::cout;
#include "My_head_rectangle.h"

/*****************************************************
*
* My_Rectangle               
*
*****************************************************/
void My_rectangle::Set_Length(double dLength)
{
	this->my_rectangle_length = dLength;
	
	return;
}

/*****************************************************
*
* My_Rectangle               
*
*****************************************************/
void My_rectangle::Set_Width(double dWidth)
{
	this->my_rectangle_width = dWidth;
	
	return;
}

/*****************************************************
*
* My_Rectangle               
*
*****************************************************/
void My_rectangle::Get_my_rectangle_area()
{
	my_rectangle_area = my_rectangle_length * my_rectangle_width;
	
	return;
}

/*****************************************************
*
* My_Rectangle                   
*
*****************************************************/
void My_rectangle::Show_my_rectangle_area()
{
	cout << "The Rectangle's area is:" << my_rectangle_area << endl;
	
	return;
}

/*****************************************************
*
* My_Rectangle               
*
*****************************************************/
void My_rectangle::Get_my_rectangle_circumference()
{
	my_rectangle_circumference = 2 * (my_rectangle_length + my_rectangle_width);
	
	return;
}

/*****************************************************
*
* My_Rectangle                   
*
*****************************************************/
void My_rectangle::Show_my_rectangle_circumference()
{
	cout << "The Rectangle's circumference is:" << my_rectangle_circumference << endl;
	
	return;
}

/*****************************************************
*
* My_Rectangle                    
*
*****************************************************/
void My_rectangle::Show_my_rectangle_property()
{
	cout << "The Rectangle' length is:" << my_rectangle_length << "\t"
		<< ",width is:" << my_rectangle_width << endl;
	
	return;
}


さん、もっとアドバイスしてください.ありがとうございます.