コンソールからdoubleデータを読み込むフォールトトレランス処理(実行可能コードを完全に添付)
以下は私が自分で書いたコンソールから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となる.
完全なコードの説明
1.このプログラムはc++コンソールプログラムで、全部で3つのファイルがある:RectangleCodeTest.cpp, My_head_rectangle.cpp, My_head_rectangle.h.
2.コンソールから矩形の長さと幅を受け取り、矩形の面積と周長の計算と出力を完了する.
3.私はファイルとソースファイルを下に貼って、私の考えを分かち合います.
4.皆さん、手加減しないでください.私のプログラムの中でどれらがもっと改善できるか、どれらの不適切なところがあるかを見てください.ありがとうございます. f
テストの完全なコードは以下の通りです.
RectangleCodeTest.cppファイル
コードの考え方:
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;
}
さん、もっとアドバイスしてください.ありがとうございます.