Как я должен исправить эту проблему с ошибкой ввода, используя Structs в C ++? - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть это задание на 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.");
 }

1 Ответ

0 голосов
/ 18 сентября 2018

Вы должны прочитать свой ввод до того, как начнете его тестировать. Это

cin >> userInput;
if (nameAsDay(userInput) == 100) 
    die("Input failure.");
else 
    time.day = nameAsDay(userInput);

вместо этого

if (nameAsDay(userInput) == 100) 
    die("Input failure.");
else 
    time.day = nameAsDay(userInput);
cin >> userInput;

Хотя при более внимательном рассмотрении мне интересно, не предназначен ли код для этого

cin >> userInput;
if (nameAsDay(userInput) == 100) 
    die("Input failure.");
else 
    time.day = nameAsDay(userInput);
cin >> userInput;

В любом случае вам нужно прочитать какой-либо ввод перед тем, как позвонить nameAsDay.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...