从控制台读入double数据的容错处理(附完整可运行代码)

原创 2012年03月29日 11:20:14

以下是我自己写的从控制台读入double数据的容错处理的代码(可运行的完整代码在后面, 请大家 多多指点!!)

代码思想:

1 用栈 保存 控制台中的各个符合条件字符(位权大的先入栈, 例如:2.3, '2'先入栈, 接着是'.', 最后是'3')。

2.记录 小数点 的位置。

3. 每个数字位符依次出栈, 将各个字符转换成整数数字, 然后进行权位转换(例如:2.3: 第一个出栈的是'3', 操作是 3*pow(10, -1)即0.3, 第二个出栈的是'.'不做处理,最后一个出栈的是'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()) != '\n')
	{
		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++ 控制台程序, 共有 三个文件: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()) != '\n')
	{
		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;
}


以上 ~~~

请 大家 多给我点 建议, 谢谢!!

QT总结第1篇:创建一个QT工程

本人是做C的,之前主要从事SIP协议的开发工作。最近换了份新工作,却要求我用C++和QT做2个界面,模仿两个CAN设备,期限7天,这对从来没有接触过C++和QT的我来说,是一个不小的挑战。不过还好,总...

linux下创建,使用动态库

1. 现在要生成libmydll.so的库文件,头文件如下 #ifndef  _MYDLL_H #define  _MYDLL_H #include "stdio.h" #ifdef WIN32   ...

VB的容错处理(完整)

本文包括以下几节内容: 使用On Error语句 如何离开错误处理程序 定义错误常数 将错误处理程序单独存放 理解错误处理的范围 不要嵌套使用错误处理程序 使用On Error语句   Visual ...

项目1-3 定义一个定义完整的类。这样的类在(2)的基础上,扩展+、-、*、/运算符的功能,使之能与double型数据进行运算。设Complex c; d

问题及代码: /* *Copyright (c) 2016,烟台大学计算机学院 *All rights reserved. *文件名称:main.cpp *作 者:李磊涛 *完成时间:2016...

项目1-3 定义一个定义完整的类。这样的类在(2)的基础上,扩展+、-、*、/运算符的功能,使之能与double型数据进行运算。设Complex c; d

/* *Copyright (c) 2016,烟台大学计算机学院 *All rights reserved. *文件名称:main.cpp *作    者:李磊涛 *完成时间:2016年5月...

Android对异常容错处理的代码例子

  • 2016年08月29日 21:39
  • 1.99MB
  • 下载

【Android】使用AIDL传递用户自定义类型数据--附完整示例代码

AIDL对Java类型的支持 AIDL支持Java原始数据类型 AIDL支持String和CharSequence AIDL支持传递其他AIDL接口,但你引用的每个AIDL接口都需要...

微信小程序服务器请求和上传数据,上传图片并展示,提交表单完整实例代码附效果图

经测试都是可用的. console.log(JSON.stringify(res.data)) 效果是对象转换字符串打印输出。如果有什么疑问欢迎加入微信小程序开发交流群(173683895)进行提问....

数据结构之静态链表的游标表示及其实现(附完整代码)

了解过计算机高级编程语言大家族的我们都知道,并非所有的编程语言都支持指针这种数据类型。诸如BASIC、FORTRAN等许多语言都不支持指针。如果程序中需要利用链表但是又不能使用指针,那么就只能采用类似...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从控制台读入double数据的容错处理(附完整可运行代码)
举报原因:
原因补充:

(最多只允许输入30个字)