C++如何检查双精度数是否输入为字母
C++如何检查双精度数是否输入为字母
这是一个程序,用户输入5个分数,程序计算平均分和等级。
然而,当用户输入字母而不是数字时,它应该显示一个错误。我应该怎么做?
#includeusing namespace std; int main() { double dblMarkOne; double dblMarkTwo; double dblMarkThree; double dblMarkFour; double dblMarkFive; double dblAverage; string strGrade; cout << "请输入第一个分数:"; cin >> dblMarkOne; while (dblMarkOne < 0 || dblMarkOne > 100) { cout << "请输入1到100之间的有效考试分数。"; cout << "请输入第一个分数:"; cin >> dblMarkOne; } }
这个问题的出现原因是,程序在读取用户输入的字符数组后,判断是否为double类型时,只考虑了数字和小数点的情况,而没有考虑到输入中可能存在多个小数点的情况。
为了解决这个问题,我们可以对输入进行进一步的判断,如果输入中包含多个小数点,则判断为非double类型。具体的解决方法如下:
1. 在isDouble函数中,添加一个计数器count,用来记录小数点的个数。
2. 在while循环中,遍历字符数组a的每一个字符,如果当前字符不是数字和小数点之一,则返回false。
3. 如果当前字符是小数点,则将计数器count加1。
4. 在while循环结束后,判断计数器count的值,如果大于1,则表示输入中包含多个小数点,返回false;否则返回true。
下面是修改后的代码:
#include <iostream> #include <stdlib.h> /* atoi */ using namespace std; bool isDouble(char a[]); int main() { double dblMarkOne; char a[10]; cout<<"Enter your first mark: "; cin >> a; /* read it as a char array */ if(isDouble(a)){ dblMarkOne = atof(a); cout << dblMarkOne; } else { cout << "not a double"; } } bool isDouble(char a[]) { int i = 0; int count = 0; while(a[i] != 0) { if(!(isdigit(a[i]) || a[i] == '.')) { return false; } if(a[i] == '.') { count++; } i++; } if(count > 1) { return false; } return true; }
这样,当输入为1.1.1
时,程序会判断为非double类型。
问题的原因是用户可能会输入一个字母而不是一个双精度数值。这段代码使用了一个do-while循环来要求用户输入一个有效的测试分数。如果用户输入的不是一个双精度数值,cin操作符将返回false,循环将继续执行直到用户输入一个有效的双精度数值。
解决方法是在循环条件中使用逻辑非运算符来检查cin操作符的返回值。如果返回值不是双精度数值,循环将继续执行。这样可以确保只有当用户输入一个有效的双精度数值时,循环才会结束。
下面是修改后的代码:
do { cout << "请输入一个有效的测试分数(1-100):"; cout << "请输入第一个分数:"; } while (! (cin >> dblMarkOne) );
这样修改后的代码可以确保用户输入的是一个双精度数值而不是一个字母。如果用户输入一个字母,循环会继续执行直到用户输入一个有效的双精度数值。这样可以避免程序崩溃或产生错误的结果。