2014-01-17 11 views
1

Это вопрос, связанный с C++. Мне нужно сделать программу, которая читает в весе пользователя/высоте. и все это хорошо и денди, но проблема в том, что я застрял.C++ feet/inches

Пользователь должен иметь возможность ввода номера, а затем единицы измерения сразу после. это может быть в футах/дюймах, метрах или см. ive получил все, что сработало, но пользователь должен также иметь возможность написать что-то вроде 5 'и иметь дюймы быть дополнительным. heres проблема im having: У меня есть две переменные im, используемые для ввода пользователем, одна двойная (высота) и одна строка (unitHeight). это прекрасно работает для m и cm, но для ног/дюймов мне нужно добавить еще два, так как пользователю нужно ввести две строки и два числа (я просто сохранил его как парные для простоты) поэтому я использовал оператор if:

if (unitHeight == "'"){ 
    cin >> height2; 
    cin >> unitHeight2; 
} 

Теперь единственная проблема, которая сохраняется, заключается в том, что мне нужно сделать так, чтобы, когда пользователь вводит x '(x - любой номер) , программа не запрашивает никаких дополнительных данных. это может быть очевидно, и мне может просто нужно сделать шаг назад, но я обдумывал это некоторое время, и я лично не могу понять это.

любая помощь приветствуется.

+6

Вы должны получить всю строку и проанализировать ее. С фактической строкой вы можете проверить, являются ли следующие два токена числом и « – chris

+1

Если вы остановитесь после' 5'', как кто-нибудь войдет в «5'2»? –

+0

Я не думаю, что вы можете просто сравнить с блоком «». – BWG

ответ

2

Что делать, зависит немного от того, что другой вход (если таковые имеются) могут прийти после высоты, и как вы хотите обрабатывать ошибки, но, чтобы вы начали:

int height2 = 0; 
if (unitHeight == "'" && cin >> height2) 
{ 
    if (!(cin >> unitHeight2)) 
    { 
     std::cerr << "hey, " << height2 << " what? give me units baby!\n"; 
     exit(EXIT_FAILURE); 
    } 
    // if we get here, then we have height2 and unitHeight2 to work with... 
    ... 

} 
else if (cin.eof()) 
{ 
    // might have hit EOF without inches, that could be legal - depends on your program 
    ... 
} 
else 
{ 
    // saw some non-numeric input when expecting height2 - is that ok? 
    ... 
} 

Поскольку вы в курсе, вы Добавлен комментарий, в котором говорится, что вы специально хотите использовать этот ввод в одной строке, после чего от пользователя можно ожидать нажатия клавиши ввода. Чтобы справиться с этим, объедините вышеуказанный код с помощью std::string line; if (getline(std::cin, line)) { std::istringstream iss(line); >>above code goes here<< } else { ...couldn't read a line of input...}.

Отдельно вы говорите:

пользователь должен иметь возможность вводить номер, а затем единица измерения сразу после. это может быть в футах/дюймах, метрах или см. ive получил все это для работы

... Надеюсь так, но обратите внимание, что это немного сложно при поддержке, например, 5'11 "и 180 см, как cin >> height1 >> unitHeight1, когда unitHeight1 является std::string, будет читать" '11. Если вы сделаете unitHeight1 a char, тогда он будет читать только «c» с «cm», поэтому ни один тип не работает для . обе нотации Вы бы лучше прочитать символ затем использовать его, чтобы решить, стоит ли читать другой ....

+0

wait. Я вроде как C++ nooby. Как сравнивается unitHeight с '' '' ', чтобы работать? Я думал, что' '' 'возвратил указатель на данные для этой строки (из символов). Или я что-то недопонимаю? – BWG

+0

способ, которым я пробирался по всем различным типам единиц, я имею двойную (высоту) и строку (unitHeight), и пользовательские входы говорят 200cm или 1.5m или 5.8feet, все это затем проверяется методом и преобразуется в конечном счете в метры, так как это то, что им работает для дальнейших вычислений. пользователь также может ввести 5'7 ", например , как я это сделал это, я объяснил выше, с помощью if d, если unitHeight is ', то он позволяет использовать еще один двойной и другой ввод строки, состоящий из дюймов и двойных кавычек. Мне просто нужно выяснить, как заставить пользователя НЕ НУЖНО войти в дюймы. –

+0

@BWG: в C++ переменные 'std :: string' могут сравниваться интуитивно (т.е. с' == ','! = ',' <'И т. Д.) Для строковых литералов (т. Е. Текстовых констант типа ASCIIZ с двойными кавычками -of-'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' const char * 'как аргумент правой стороны, но знает, как выполнить операцию' strcmp() '-ish внутри. –

0

Вы можете сделать что-то подобное:

string height; 
cin >> height; 

for(int i = 0; i < height.size(); i++) { 
    if(height[i] == "'"[0]) { 
     cout << "It's ok!" << endl; 
     break; 
    } 
} 
+0

Почему? насколько я могу сказать, это ничего не делает, в котором я нуждаюсь. –

+0

Этот код определит, когда вы будете иметь «». Итак, вы узнаете, что после него у вас будут дюймы (забудьте об этом «break»). –

+0

Спасибо за ввод, но мне не нужен цикл for. Я знаю, что вход будет двойным, строковым, двойным, строковым (они были бы действительно только ints, но я сохранил их как удвоившиеся для последующих вычислений, и я не чувствовал себя как кастинг) проблема I у меня есть то, что пользователь должен иметь возможность делать 5'7 "или просто просто 5 'и нажать enter и не будет запрашиваться значение в дюймах –

0

Читать STDIN одну строку за один раз. Обработайте каждую строку. Если строка содержит второе число (для высоты) и вторую строку (для устройства), то у вас есть спецификация foott + inches. В противном случае у вас есть только один номер и один блок.

const int maxLength = 200; 
while (true) 
{ 
    char line[maxLength+1]; 
    std::cin.getline(line, maxLength); 
    if (!cin.good()) 
    { 
     break; 
    } 

    std::istringstream str(line); 
    double height1; 
    std::string unit1; 
    double height2; 
    std::string unit2; 
    bool secondHeightFound = false; 
    str >> height1 >> unit1 >> height2; 
    if (str.good()) 
    { 
     str >> unit2; 
     secondHeightFound = true; 
    } 
}