我是编程的初学者,我正在尝试制作一个程序来计算你一生中接触过多少辐射。出于某种原因,我的xray函数中的'cin'不接受用户输入,只是以代码0退出。
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <stdlib.h>
#include <string>
#include <sstream>
using namespace std;
bool nearpowerplant;
int XRay; // the amount of times you got an x-ray
double tRads = 0; // your total dose of radiation in your lifetime, measured in mSv (millisievert)
int age;
//the sleep function
void sleep() {
Sleep(1000); // 1000 miliseconds = 1 second
}
/*
>system("CLS")< for clear the console
*/
//introduction and pretty much the menu
void intro() {
cout << "Welcome to the Radiation Level Calculator" << endl;
sleep();
cout << "Conceptualized and created by Anatoly Zavyalov" << endl;
sleep();
cout << "Press the ENTER key to begin." << endl;
cin.get();
}
//introduction to general questions
void genintro() {
// intro to the medical
system("CLS");
sleep();
cout << "Let's begin with general questions." << endl;
sleep();
cout << "Press the ENTER key to continue." << endl;
cin.get();
}
//medical questions
void Age() {
//age
system("CLS");
cout << "How old are you?\n" << endl;
sleep();
cin >> age;
if (age <= 0) {
cout << "Your age can't be less or equal to 0." << endl;
Age();
}
else {
tRads += (age * 2);
sleep();
cout << tRads << endl;
}
}
//live close to powerplant?
void powerplant() {
system("CLS");
cout << "Do you live within 75 kilometers of a nuclear powerplant?" << endl;
sleep();
cout << "If yes, type YES. If no, type NO." << endl;
cin >> nearpowerplant;
if (nearpowerplant = "YES") {
tRads += (age * 0.01);
}
else {}
sleep();
cout << tRads << endl;
}
void xray() {
system("CLS");
cout << "How many times have you had an x-ray?\n" << endl;
sleep();
cin >> XRay;
if (XRay < 0) {
cout << "You can't have an x-ray a negative amount of times." << endl;
}
else {
tRads += (XRay * 3.1);
}
sleep();
cout << tRads << endl;
}
//main function, put all of the loops into here
int main() {
intro(); // the introduction
genintro(); // medical intro
Age(); // asks for age
powerplant(); // asks if lives close to powerplant
xray(); // asks for x-ray
return 0;
}
编辑:我编辑了帖子以包含整个代码。顺便说一下,我正在使用2017年的Visual Studio社区。 p>
答案 0 :(得分:0)
bool nearpowerplant;
nearpowerplant
是一个布尔。这是真是假。这就对了。值得注意的是,没有理由将此变量全局访问并为整个程序运行消耗存储空间。它在程序中使用了两次,两次都在同一个函数中。它应该是由使用它的函数确定的自动变量。
cout << "If yes, type YES. If no, type NO." << endl;
cin >> nearpowerplant;
将“YES”或“NO”读入bool
类型的变量失败。 cin
无法将字符串输入转换为布尔值,cin
将停止接受输入,直到错误被清除。删除导致cin
失败或猜测什么的垃圾输入也是个好主意? cin
只会再次失败。有关如何处理此问题的数百个问题,因此我只想在此处删除关键字:clear
和ignore
。
Takeaways:确保数据条目与输入的数据类型相匹配,并在每次读取后测试流以确保读取成功。
例如:
if (cin >> nearpowerplant)
{
// do stuff
}
else
{
// clean up
}
这解决了OP的可见错误,但由于它与它们可能发现的下一个错误密切相关,我们也可以覆盖它。
if (nearpowerplant = "YES") {
tRads += (age * 0.01);
}
else {}
if (nearpowerplant = "YES") {
使用=
(赋值),它应该使用==
(比较)。 C ++在这里是不可原谅的,因为这将编译。它真正做的是获取字符串文字的地址“YES”,测试它不是null,并将nearpowerplant
设置为结果。由于字符串文字的地址永远不会为NULL,因此结果始终为true,当if测试结果时,if
将始终输入。
所以我们需要的更像是
cout << "If yes, type YES. If no, type NO." << endl;
string temp;
cin >> temp;
if (temp == "YES") {
tRads += (age * 0.01);
}
else {}
注意如果用户输入“是”,“是”,“是”或除了“是”以外的任何内容,则会跳过此步骤。您如何处理此问题取决于您,但std::tolower
和std::transform
可能会有所帮助。
答案 1 :(得分:-1)
我认为sleep()有未定义的行为,你应该在没有测试的情况下,os处理用户输入而你不必关心用户输入。endl
刷新cout,所以文本是直接显示。
编辑:
也许系统(“CLS”)或睡眠会产生无声错误。