У меня есть это задание на Structs для моего класса по информатике.Проблема в том, что на функции
void input (Time & time);
Когда я пытаюсь вызвать функцию, выводится ошибка
FATAL ERROR: Input failure
.Вот что должна делать функция:
void input (Time & time);Работа input заключается в том, чтобы ввести время, которое выглядит как среда в 19:05, и соответственно установить arg времени (в данном случае, {3, true, 7, 5}).Если ввод не пройден или недействителен, пожаловаться и умереть.(Ваша функция ok может выполнить некоторые, но не все из этой проверки.) Вы (попытаетесь) ввести 5 вещей: день, час, двоеточие, минута, ампер.Если какой-либо ввод оставляет cin в состоянии ошибки, жаловаться и умереть.Если день точно не совпадает с одним из дней в вашем глобальном массиве имен дней, жалуйтесь и умрите.(Давайте сделаем жизнь немного проще для нас и немного сложнее для пользователя, сказав, что название дня должно иметь именно тот случай, который мы ожидаем: первая буква верхнего регистра, остальные буквы строчные. Таким образом, нам не нужноне обращайте внимания на конвертацию дела.) Если время не в допустимых пределах, пожаловайтесь и умрите.Если символ, который мы вводим после часа, не является двоеточием, жаловаться и умирать.Если минута не находится в пределах допустимого, жаловаться и умереть.Если обозначение AM / PM не совсем совпадает с «AM» или «PM» (с учетом регистра), пожалуйтесь и умрите.Если мы выживем, наша задача - установить время.Например, в среду, 19:05, жалуется и умирает (плохое имя дня (ошибка в случае)). Например, среда x: 00 вечера жалуется и умирает (плохой час). Например, среда 0:00 жалуется и умирает (плохой час)Например, среда 7: 5 вечера жалуется и умирает (плохое двоеточие) Например, среда 7 вечера жалуется и умирает (плохое двоеточие) Например, среда 7: x PM жалуется и умирает (плохая минута) Например, среда 7:60Премьер-министр жалуется и умирает (плохая минута) Например, среда 7:05 вечера жалуется и умирает (плохой AMPM (ошибка случая)) Вам не нужно генерировать отчетливое сообщение об ошибке для всех этих возможностей, вы можете просто сказать что-то вроде фатальной ошибки: фиктивный ввод времени, если есть какие-либо проблемы со входом.
Если кто-нибудь может сказать мне, что я делаю неправильно, я был бы очень признателен.Я удалил все части, которые не имеют отношения к проблеме.
#include<iostream>
#include<string>
#include<sstream>
#include<cctype>
using namespace std;
//Structs
struct Address {
unsigned number;
string street;
string suffix;
string city;
string state;
unsigned zip;
};
struct Time {
unsigned day;
bool pm;
unsigned hour;
unsigned minute;
};
//Prototypes
void show(const Address & address);
void show(const Address address[], unsigned elements, unsigned desiredZip);
void show(const Address address[], unsigned addressElements, const unsigned desiredZip[], unsigned desiredZipElements);
void show(const Time & time);
bool ok(const Time & time);
int compare(const Time & time0, const Time & time1);
bool die(const string & msg);
int nameAsDay(const string &day); //My own function
void input(Time & time);
const string days[7] = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };
int main() {
Address addList[7] = { a1, a2, a3, a4, a5, a6, a7 };
unsigned zipList[2] = { 91324, 91325 };
Time t1 = { 0, false, 12, 1 };
Time t2 = { 0, 0, 12, 0 };
Time t3 = { 4, true, 5, 30 };
Time t4 = { 1, false, 11, 60 };
Time t5 = { 7, 1, 9, 1 };
Time t6 = { 0, 0, 12, 0 };
Time t7;
show(a1);
show(addList, 7, 91329);
show(addList, 7, zipList, 2);
show(t2);
cout << ok(t2) << endl;
cout << compare(t1, t2) << endl;
input(t3);
show(t3);
system("pause");
return 0;
}
//Displays time and day
void show(const Time & time) {
cout << days[time.day] << " " << time.hour << ":";
if (time.minute == 0)
cout << "00";
else if (time.minute < 10)
cout << "0" << time.minute;
else
cout << time.minute;
if (time.pm == 0)
cout << " AM" << endl;
else
cout << " PM" << endl;
}
//Determines if the data for struct Time is valid
bool ok(const Time & time) {
if ((time.day < 0) || (time.day > 6))
return false;
if ((time.hour < 1) || (time.hour > 12))
return false;
if ((time.minute < 0) || (time.minute > 59))
return false;
return true;
}
//Compares two times to see which comes first
int compare(const Time & time0, const Time & time1) {
//Check that time is correctly entered
if ((!ok(time0)) || (!ok(time1)))
die("Unable to interpret input");
if (time0.day < time1.day)
return -1;
else if ((time1.day == time0.day) && (time1.pm == true) && (time0.pm == false))
return -1;
else if ((time1.day == time0.day) && (time1.pm == time0.pm) && (time0.hour < time1.hour))
return -1;
else if ((time1.day == time0.day) && (time1.pm == time0.pm) && (time1.hour == time0.hour) && (time0.minute < time1.minute))
return -1;
else if ((time1.day == time0.day) && (time1.pm == time0.pm) && (time1.hour == time0.hour) && (time1.minute == time0.minute))
return 0;
else
return 1;
}
//Die function, exits program
bool die(const string & msg) {
cout << endl << "FATAL ERROR: " << msg << endl;
return -1;
}
string convertDayToString(const Time &time) {
const string day[7] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
return days[time.day];
}
//My own function - changes day to an element #
int nameAsDay(const string &day) {
if (day == "Sunday")
return 0;
else if (day == "Monday")
return 1;
else if (day == "Tuesday")
return 2;
else if (day == "Wednesday")
return 3;
else if (day == "Thursday")
return 4;
else if (day == "Friday")
return 5;
else if (day == "Saturday")
return 6;
else
return 100; //Input failure
}
//Set the time argument and discern errors
void input(Time & time) {
string userInput;
unsigned found, hour, minute;
if (nameAsDay(userInput) == 100)
die("Input failure.");
else
time.day = nameAsDay(userInput);
cin >> userInput;
found = userInput.find(":");
if (found == 2) {
if (isdigit(userInput[0]) && isdigit(userInput[1])) {
stringstream(userInput.substr(0, 2)) >> hour;
if ((hour > 0) && (hour < 13))
time.hour = hour;
else
die("Hour out of range.");
}
else
die("Invalid hour input.");
if (isdigit(userInput[3]) && isdigit(userInput[4])) {
stringstream(userInput.substr(3, 1)) >> minute;
if ((minute >= 0) && (minute <= 59))
time.minute = minute;
else
die("Minute out of range.");
}
else
die("Invalid minute input.");
}
else
die("Invalid time input.");
cin >> userInput;
if (userInput == "AM")
time.pm = false;
else if (userInput == "PM")
time.pm = true;
else
die("Invalid AM/PM input.");
}