C ++ Cin не выполняется должным образом

0

У меня возникают проблемы с получением "cin >> calories" для правильной работы. Код автоматически устанавливает калории = в -279846518796, а иногда и другие числа (обычно это большое отрицательное число, как раньше). Таким образом, конечные результаты становятся беспорядочными. Даже если я устанавливаю "калории" как int, я получаю ту же ошибку.

#include <iostream>

int main( ) 
{
int height, weight, age, edible_newfoods;
double bmr, calories;
char gender, activity_level, newfood;

//Take user inputs.
cout << "Please provide your information." << endl;
cout << "male or female (m or f): ";
cin >> gender;
cout << "age in years: ";
cin >> age;
cout << "weight in pounds: ";
cin >> weight;
cout << "height in inches: ";
cin >> height;

//Ask the user how active they are, to get an input between four choices
cout << endl << "How active are you?" << endl; 
cout << "   s - sedentary" << endl;
cout << "   c - casual exerciser--exercise ocasionally" << endl;
cout << "   a - active exerciser--exercise 3-4 days a week" << endl;
cout << "   d - devoted exerciser--exercise everyday" << endl;

//Take users activity level as a char
cout << "Enter the level of association with your activity level: ";
cin >> activity_level;

//Adding more food
cout << endl << "What type of food do you want to eat?" << endl;

cout << "Please use _ between words to create a single word. ";
cin >> newfood;

cout << "How many calories per item? ";
//This is where the cin automatically makes calories a giant negative number.
// causing the final output of results to be a mess.
cin >> calories;

//Calculations - Adjusting BMR to accommodate for activity level
switch (activity_level)
{
    case 's':
    case 'S': activity_level = 0.95; break;
    case 'c':
    case 'C': activity_level = 1.30; break;
    case 'a': 
    case 'A': activity_level = 1.40; break;
    case 'd':
    case 'D': activity_level = 1.50; break;
} 

if (age <= 65 && (gender == 'm' || gender == 'M')) {
    bmr = 1.375 * ((66 + 6.3 * weight) + (12.9 * height) - (6.8 * age));
}
else {
    bmr = 1.375 * ((655 + 4.3 * weight) + (4.7 * height) - (4.7 * age));
}

bmr = bmr * activity_level;

edible_newfoods = bmr / calories;

cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(0);

//output the results to user.
cout << endl << "The BMR for a " << weight << " pound " << gender << " who is " << age << " years    old is " << bmr
<< " calories number of " << newfood << " eaten = " << edible_newfoods;
}

Пожалуйста, будьте добры, я новичок в stackoverflow и кодировании. Любая помощь будет оценена по достоинству. благодаря

  • 0
    Вы никогда не проверяли операции ввода на успех.
  • 0
    Компилировать все предупреждения и отладочную информацию (например, g++ -Wall -g ). Затем используйте отладчик (например, gdb )
Показать ещё 2 комментария
Теги:

2 ответа

1

activity_level имеет тип char, присвоение ему double выглядит неверно:

char gender, activity_level, newfood;
...
activity_level = 0.95;

Хотя он по-прежнему является правильной конструкцией языка, это приводит к усечению плавающей части и присвоению 0 до уровня activity_level. См. Комментарий @KeithThompson.

Кажется, что требуются две разные переменные,

  • один (char), чтобы сохранить вход и использовать его в switch, и
  • другой (double) как фактор для bmr = bmr * activity_level;
  • 1
    Это установит activity_level в '\0' ( double к целочисленному преобразованию усекается). Что касается языка, то это не так, но это определенно не то, что предполагалось.
  • 1
    Я верю, что это то, что я сказал.
0

Проблемы начинаются здесь:

cout << "Enter the level of association with your activity level: ";
cin >> activity_level;

activity_level имеет тип char. Когда вы делаете cin >> char, тогда ведущие пробелы не пропускаются. Таким образом, эта строка поднимает клавишу Enter, которую вы нажали после предыдущего числового ввода. Вы должны были заметить, что программа никогда не ждала, когда вы что-нибудь входите сюда, и сразу же перешла к отображению "Введите уровень связи с уровнем активности".

Следующая проблема заключается в следующем вводе:

cout << "Please use _ between words to create a single word. ";
cin >> newfood;

newfood имеет тип char. Это означает один символ. Он не может содержать никаких слов (кроме "a" или "I").

Чтобы исправить обе эти проблемы, используйте std::string вместо char для всех трех этих символов. Кроме того, вместо использования cin >> newfood который получает только одно слово, getline(cin, newfood); который получает всю строку (и потребляет новую строку). Используйте этот метод для activity_level и gender.

Следующая проблема:

switch (activity_level)
{
    case 's':
    case 'S': activity_level = 0.95;

Вы пытаетесь сохранить 0.95 в char который не будет работать. Используйте здесь новую переменную, например double activity_factor. Убедитесь, что установлено значение по умолчанию, или случай по default. В противном случае вы получите мусор, если человек не введет ожидаемого персонажа.

Наконец, чтобы предотвратить вывод мусора при наличии недопустимого ввода, вы можете добавить следующее до своего окончательного вывода:

if ( !cin )
{
    cerr << "Invalid input entered.\n";
    return 0;
}

или что-то подобное. Тогда, по крайней мере, вы получите что-то разумное. Чтобы дать больше целевых сообщений об ошибках, выполните эту проверку после каждого ввода.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню