2014-02-19 3 views
0

То, что я до сих пор:Как я могу считывать входные данные и форматировать вывод?

cout << "Please enter your destination travel start time (HH:MM): " << endl; 
cin >>dest_startHOUR>>dest_startMIN; 

cout << "Please enter your destination travel end time (HH:MM): " << endl; 
cin >>dest_endHOUR>>dest_endMIN; 

cout << "Please enter your home travel start time (HH:MM): " << endl; 
cin >>home_startHOUR>>home_startMIN; 

cout << "Please enter your home travel end time (HH:MM): " << endl << endl; 
cin >>home_endHOUR>>home_endMIN; 
cout << "Departed from " << home_city << " at " << dest_startHOUR << ":" << dest_startMIN << "." << endl; 
cout << "Traveled " << dest_miles << " miles to " << dest_city << ", arrived at " <<  dest_endHOUR << ":" << dest_endMIN << ". " << "Travel time, " << dest_endHOUR - home_startHOUR << "." << (dest_endMIN - home_startMIN)/60 << " hours."<< endl << endl; 

И это дает мне следующий вывод:

Please enter your destination travel start time (HH:MM): 
04:30 
Please enter your destination travel end time (HH:MM): 
Please enter your home travel start time (HH:MM): 
Please enter your home travel end time (HH:MM): 
Departed from CityA at 4:0. 
Traveled 200 miles to CityB, arrived at 0:0. Travel time, 0.0 hours. 

Но мне нужен выход выглядеть следующим образом:

Please enter your destination travel start time (HH:MM): 05:30 
Please enter your destination travel end time (HH:MM): 07:45 
Please enter your home travel start time (HH:MM): 06:15 
Please enter your home travel end time (HH:MM): 08:30 

Departed from CityA at 05:30. 
Traveled 100 miles to CityB, arrived at 
07:45. Travel time, 2.25 hours. 

ответ

2

Так как вы хотите пользовательский ввод в той же строке, что и связанное с ней приглашение, избавится от endl по запросам. Вы также должны игнорировать разрывы строк, введенные пользователем, а также учитывать символы :.

Попробуйте вместо этого:

#include <iostream> 
#include <string> 
#include <iomanip> 
#include <string> 

using namespace std; 

... 

int dest_startHOUR, dest_startMIN; 
int dest_endHOUR, dest_endMIN; 
int home_startHOUR, home_startMIN; 
int home_endHOUR, home_endMIN; 
int dest_miles; 
string home_city, dest_city; 
char c; 

... 

cout << "Please enter your destination travel start time (HH:MM): "; 
cin >> dest_startHOUR >> c >> dest_startMIN; 
cin.clear(); 
cin.ignore(numeric_limits<streamsize>::max(), '\n'); 

cout << "Please enter your destination travel end time (HH:MM): "; 
cin >> dest_endHOUR >> c >> dest_endMIN; 
cin.clear(); 
cin.ignore(numeric_limits<streamsize>::max(), '\n'); 

cout << "Please enter your home travel start time (HH:MM): "; 
cin >> home_startHOUR >> c >> home_startMIN; 
cin.clear(); 
cin.ignore(numeric_limits<streamsize>::max(), '\n'); 

cout << "Please enter your home travel end time (HH:MM): "; 
cin >> home_endHOUR >> c >> home_endMIN; 
cin.clear(); 
cin.ignore(numeric_limits<streamsize>::max(), '\n'); 

cout << endl; 
cout << "Departed from " << home_city << " at " << setw(2) << setfill('0') << dest_startHOUR << ":" << dest_startMIN << "." << endl; 
cout << "Traveled " << dest_miles << " miles to " << dest_city << ", arrived at " << setw(2) << setfill('0') << dest_endHOUR << ":" << dest_endMIN << ". " << endl; 
cout << "Travel time, " << dest_endHOUR - home_startHOUR << "." << (dest_endMIN - home_startMIN)/60 << " hours." << endl; 
cout << endl; 
+0

Не могли бы вы объяснить причину «cin.clear () "каждый раз после cin >>? Благодарю. –

+0

@PengZhang: прочитайте это: http://stackoverflow.com/questions/5131647/why-would-we-call-cin-clear-and-cin-ignore-after-reading-input –

+0

Итак, это просто безопасно ? учитывая, что этот фрагмент кода сильно взаимодействует с пользовательским вводом. –

1

Вы получите неправильные результаты по этим причинам:

  • Вы положили Endl после каждого оперативного сообщения, которое делает курсор переходит на следующую строку, прежде чем попасть ответ от пользователя.
  • Когда cin >> dest_startHOUR >> dest_startMIN; , ваша программа ожидает от пользователя двух целых переменных (т. е. часов и минут). Однако после ввода пользователем двоеточия: программа считает это значением минут. Таким образом, выполнение вашей программы предшествует и дает неверные результаты.
  • Вы должны иметь (dest_endHOUR - dest_startHOUR), чтобы вычислить время отправления до места назначения, а не (dest_endHOUR - home_startHOUR).
  • Чтобы получить часть часа для времени отправления до места назначения, вы должны изменить свое выражение на ((dest_endMIN - dest_startMIN)/60.0 * 100). Вам нужно поставить 0,0 после 60, чтобы избежать целочисленного деления, и вам нужно умножить результат на 100, чтобы преобразовать его в долю часа. Однако имеет смысл распечатать время в формате HH: MM.
  • Ваша программа работает правильно, если вы считаете, что формат 24 часа и поездка начинается утром и заканчивается вечером в тот же день. В противном случае вам необходимо улучшить свой код, чтобы рассмотреть эту проблему.

Беллоу пересмотренная версия вашей программы:

#include <iostream> 
#include <string> 
using namespace std; 

int main() 
{ 
    int dest_startHOUR, dest_startMIN; 
    int dest_endHOUR, dest_endMIN; 
    int home_startHOUR, home_startMIN; 
    int home_endHOUR, home_endMIN; 
    int dest_miles = 200; 
    string home_city = "CityA", dest_city = "CityB"; 
    char ch; 

    cout << "Please enter your destination travel start time (HH:MM): "; 
    cin >> dest_startHOUR >> ch >> dest_startMIN; 

    cout << "Please enter your destination travel end time (HH:MM): "; 
    cin >> dest_endHOUR >> ch >> dest_endMIN; 

    cout << "Please enter your home travel start time (HH:MM): "; 
    cin >> home_startHOUR >> ch >> home_startMIN; 

    cout << "Please enter your home travel end time (HH:MM): "; 
    cin >> home_endHOUR >> ch >> home_endMIN; 

    cout << "Departed from " << home_city << " at " << dest_startHOUR << ":" << dest_startMIN << "." << endl; 
    cout << "Traveled " << dest_miles << " miles to " << dest_city 
     << ", arrived at " << dest_endHOUR << ":" << dest_endMIN << ". " 
     << "Travel time, " << dest_endHOUR - dest_startHOUR << "." << (dest_endMIN - dest_startMIN)/60.0 * 100 
     << " hours." << endl << endl; 

    return 0; 
} 

Здесь вы найдете работающий образец для пересмотренной программы:

Please enter your destination travel start time (HH:MM): 05:30 
Please enter your destination travel end time (HH:MM): 07:45 
Please enter your home travel start time (HH:MM): 06:15 
Please enter your home travel end time (HH:MM): 08:30 
Departed from CityA at 5:30. 
Traveled 200 miles to CityB, arrived at 7:45. Travel time, 2.25 hours. 
Смежные вопросы