结合之前几个版本的计算器,现在我将计算器进行了又一次升级,当数字输入的为其它字符的时候我们会要求重新输入,具体代码如下:
#include <iostream>
#include <limits> // 包含用于处理输入流的 std::numeric_limits
#include <cstdlib> // 包含用于清屏的 std::system
#include <cmath> // 包含用于平方根的 std::sqrt
using namespace std;
// 函数声明
void sssm();
void show_results();
// 全局变量
float result_arr[2] = { 0 }; // 存放两次结果的数组
int arr_index = 0; // 当前存放结果的数组索引
int main() {
float num1 = 0, num2 = 0, final;
char fh = 0;
char select = 0;
cout << "欢迎使用简易计算器" << endl;
cout << "-----------------" << endl;
cout << "| 1、进入 |" << endl;
cout << "-----------------" << endl;
cout << "| 2、说明 |" << endl;
cout << "-----------------" << endl;
cin >> select;
if (select == '1') {
system("cls");
cout << "请输入" << endl;
sssm();
goto Z;
}
else
sssm();
Z:cin >> num1;
while (true) {
if (cin.fail()) {
cin.clear(); // 清除错误标志
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略输入缓冲区中的内容
cout << "输入无效,请重新输入一个数字:" << endl;
cin >> num1;
}
else {
break;
}
}
cin >> fh;
int a = 0;
double result;
int final2;
while (fh != 'n')
{
switch (fh)
{
case'+':cin >> num2;
while (true) {
if (cin.fail()) {
cin.clear(); // 清除错误标志
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略输入缓冲区中的内容
cout << "输入无效,请重新输入一个数字:" << endl;
cin >> num2;
}
else {
break;
}
}final = num1 + num2;
break;
case'-':cin >> num2;
while (true) {
if (cin.fail()) {
cin.clear(); // 清除错误标志
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略输入缓冲区中的内容
cout << "输入无效,请重新输入一个数字:" << endl;
cin >> num2;
}
else {
break;
}
}final = num1 - num2; break;
case'*':cin >> num2;
while (true) {
if (cin.fail()) {
cin.clear(); // 清除错误标志
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略输入缓冲区中的内容
cout << "输入无效,请重新输入一个数字:" << endl;
cin >> num2;
}
else {
break;
}
}
final = num1 * num2;
break;
case'/':cin >> num2;
while (true) {
if (cin.fail()) {
cin.clear(); // 清除错误标志
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略输入缓冲区中的内容
cout << "输入无效,请重新输入一个数字:" << endl;
cin >> num2;
}
else {
break;
}
}
final = num1 / num2;
a = num1 - (num2 * static_cast<int>(num1 / num2));
break;
case'^':final = num1 * num1; break;
case'~':cin >> num2;
while (true) {
if (cin.fail()) {
cin.clear(); // 清除错误标志
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略输入缓冲区中的内容
cout << "输入无效,请重新输入一个数字:" << endl;
cin >> num2;
}
else {
break;
}
}
final = num1;
for (int i = num2; i > 1; i--)
{
final = num1 * final;
}
break;
case'c': show_results(); cout << "请输入是否要调用上一次结果(y/n):" << endl; cin >> select; if (select == 'y')final = result_arr[1]; break; // 查看之前的结果
case'h':if (num1 < 0)cout << "负数没有平方根!" << endl; else final = sqrt(num1); break;
case'z':final2 = final; final = final2; break;
default:cout << "请重新输入" << endl; fh = 0; break;
}
system("cls");
if (a != 0)
{
int final1 = final;
printf("--------------------\n");
printf("结果是%d····%d\n", final1, a);
printf("--------------------\n");
sssm();
final = final1;
a = 0;
result_arr[arr_index % 2] = final; // 存放结果到数组中
arr_index++;
}
else
{
printf("---------------------\n");
printf("结果是%.2f\n", final);
printf("---------------------\n");
sssm();
result_arr[arr_index % 2] = final; // 存放结果到数组中
arr_index++;
}
a: cin >> fh;
if (fh == 'q')
{
printf("已清空\n");
goto Z;
}
else
{
num1 = final;
continue;
}
}
return 0;
}
void sssm() {
cout << "-----------------------------------" << endl;
cout << "| 1、+加法 | 2、-减法 |" << endl;
cout << "-----------------------------------" << endl;
cout << "| 3、*乘法 | 4、/除法 |" << endl;
cout << "-----------------------------------" << endl;
cout << "| 5、^平方 | 6、h开方 |" << endl;
cout << "-----------------------------------" << endl;
cout << "| 7、c是查看上一次结果 |" << endl;
cout << "-----------------------------------" << endl;
cout << "| 8、z是去掉小数点后面的数字 |" << endl;
cout << "-----------------------------------" << endl;
}
void show_results() {
cout << "上一次计算结果是: " << result_arr[1] << endl;
system("pause");
}