Как проверить правильно ли введен рост в футах и дюймах?

423
12 июня 2017, 22:29

Программа запрашивает рост в футах и дюймах. Нужно преобразовать рост в футах и дюймах в рост в дюймах (1 фут = 12 дюймов).

Ввод роста должен производиться в формате (футы.дюймы). Максимальный размер дробной части не может превышать 11. Например, значение 5.12 не может быть принято, потому что в одном футе двенадцать дюймов, т.е. 5.12 футов == 6 футов. Я начал решать задачу, но столкнулся с проблемой: если принятое значение поместить в переменную типа float, то это значение нужно проверить на правильность прежде чем продолжить вычисления. Я использовал для этого функцию modff(), которая помещает целую и дробную части числа в две разные переменные. Как можно проверить дробную часть на правильность, если, например, 5.1 и 5.10 воспринимаются как одно число, но если речь идет о футах и дюймах, то это два разных числа. Ниже я привожу код, который написал. Помогите, пожалуйста, продолжить его или предложите другое решение.

//calculate BMI
#include <iostream>
#include <math.h>
int main()
{
    using namespace std;
    const double Inches_per_foot = 12;
    float height;
    cout << "Enter your height in foots and inches: _____\b\b\b\b\b";
    cin >> height;
    float foots ;
    float inches = modff(height, &foots);
    cout << foots << " - The integer part of number" << inches << " - The 
float part of number " << endl;
    if ( inches >= 0.12 )
    {
        cout << "Error: Inches value must be less than 12" << endl;
    }
    else if (  )
    {
    }
    else
    {
    cout << " foots = " << foots << ", inches = " << inches << endl;
    }
    return 0;
}
Answer 1
#include <iostream>
#include <math.h>
#include <string>
int main()
{
using namespace std;
string input{};
int foots{};
int inches{};
cout << "Enter your height in foots and inches: _____\b\b\b\b\b";
while (true)
{
    cin >> input;
    float foots;
    //float inches = modff(height, &foots);
    int pos = input.find_first_of('.');
    if (pos > 0)
    {
        string sfoots = input.substr(0, pos);
        string sinches = input.substr(pos + 1);
        foots = atoi(sfoots.c_str());
        inches = atoi(sinches.c_str());
    }
    else
    {
        if (input.size() > 0)
        {
            foots = atoi(input.c_str());
        }
    }
        if (inches > 11)
        {
            cout << "Wrong inches. Retype height in foots and inches" << endl;
            cout << "Enter your height in foots and inches: _____\b\b\b\b\b";
        }
        else
        {
            cout << foots << " - The integer part of number   " << inches << " - The float part of number " << endl;
            cout << "The size in inches:" << foots * 12 + inches<<endl;
            break;
        }
}
system("pause");
}
Answer 2

Если вы видите число с точкой, то это не значит, что тип — float. Вы имеете дело с двумя целыми значениями (футы и дюймы), и хранить их надо как два целых значения.

К слову, запись футов и дюймов через точку — неверная. Если вы встретите надпись "5.12 футов", то это означает "5 футов и 12∕100 фута", а вовсе не "5 футов и 12 дюймов". "5 футов и 12 дюймов" традиционно записываются как "5´12˝" с вариациями символов и пробелов.

READ ALSO
Существуют ли правила подключения include-файлов в С++? [требует правки]

Существуют ли правила подключения include-файлов в С++? [требует правки]

Написал проект, в котором используется много файлов, в каждом по несколько классов и они ссылаются друг на другаИ вот в какой-то момент возникла...

250
Does not name a type

Does not name a type

Есть вот такой код(работаю в Code Blocks):

348
FLEX, BISON и Visual Studio [требует правки]

FLEX, BISON и Visual Studio [требует правки]

Хотел бы поинтересоваться, есть ли книги по FLEX и BISON в среде VS? Желательно подробные

262
Наследование C++

Наследование C++

Например, подкласс наследует поля и методы надкласса, а другой класс, наследует поля и методы предыдущего подкласса(который наследует надкласс),...

255