C ++ программа, если операторы в функции не выполняются. Кажется логически ошибочным - PullRequest
0 голосов
/ 27 апреля 2018

Я делаю программу на C ++, которая берет введенное пользователем время в стандартном времени США и преобразует его в военное время. Тело основного кода выполняется нормально, но проблема возникает в теле моей функции, начиная с операторов if. Мне интересно, почему это происходит; Я довольно новый с C ++. Вот мой код, если у вас есть вопросы, не стесняйтесь спрашивать или вам нужно объяснение того, что программа должна делать.

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

void militaryConversion(string am_pmPart_st, string firstPartofTime, string secondPartofTime){
    // Converts they obtained strings, but first we must concatenate the two parts into one string
    string concatenatedTime;
    int militaryTime;
    cout << "test1" << endl;

    concatenatedTime = firstPartofTime + secondPartofTime;
    if(firstPartofTime == "12")
        {
        cout << "Corresponding military time is: " << concatenatedTime << " hours" << endl;
        }

    else if(am_pmPart_st == " am")
        {
            if (concatenatedTime.length() < 4){
                cout << "Corresponding military time is: " << concatenatedTime << " hours"<< endl;
            }
        }
    else if(am_pmPart_st == " pm")
    {
        int castedTime;
        castedTime = stoi(concatenatedTime); //This is where we convert the string to int because its the only place it matters
        militaryTime = castedTime + 1200;
        cout << "Corresponding military time is: " << militaryTime << " hours" << endl;
    }

}

int main()
{
    char DELEMETER = ':';
    char DELEMETER_sp = ' ';
    string time, firstPartofTime, secondPartofTime, am_pmPart_st, loweredAM_PM;

    cout << "Enter the time in the format of: HH:MM AM/PM ";
    getline(cin, time);
    firstPartofTime = time.substr(0, time.find(DELEMETER));
    cout << "The first digits of time " << firstPartofTime << endl;
    secondPartofTime = time.substr(time.find(DELEMETER) + 1, time.find(DELEMETER_sp)-1);
    cout << "The second set of digits " << secondPartofTime << endl;
    am_pmPart_st = time.substr(time.find(DELEMETER_sp), time.size());
    cout << "The am/pm part is:" << am_pmPart_st << endl;

    for(int i=0; am_pmPart_st[i]; i++) am_pmPart_st[i] = tolower(am_pmPart_st[i]); //Converts am/pm to lowercase
    cout << am_pmPart_st << endl;

    militaryConversion(am_pmPart_st, firstPartofTime, secondPartofTime);
}

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

substr принимает два параметра. Первая - это начальная позиция, а вторая - длина . Когда вы вызываете secondPartofTime = time.substr(time.find(DELEMETER) + 1, time.find(DELEMETER_sp)-1);, вы по ошибке передаете второй параметр как конечная позиция , а не длина.

Вместо этого вы можете сделать:

int startPos = time.find(DELEMETER) + 1;
int endPos = time.find(DELEMETER_sp) - 1;
secondPartofTime = time.substr(startPos, endPos - startPos + 1);

В идеале вы должны проверить возвращаемые значения find и обработать случай, когда возвращается npos, чтобы не вылетать при неправильном вводе пользователем.

0 голосов
/ 27 апреля 2018
  1. Ввод, который не соответствует форме ЧЧ: ММ AM / PM, создает проблему. (Ровно 5 символов для ЧЧ: ММ (включая двоеточие))

  2. У вас есть дерево решений на основе if-else, где одно if не сопровождается else. Отсутствие else является причиной того, что ваша программа не дает никакого вывода

  3. string.substr() имеет некоторые проблемы, описанные MFisherKDX

0 голосов
/ 27 апреля 2018

Во-первых, ваш вопрос неопределенный, потому что он говорит о том, что происходит, чего не должно происходить. Тем не менее, я думаю, что я могу видеть, что происходит. Когда вы проверяете часовую часть времени в первом условии, вы сначала проверяете «12». Тем не менее, вы никогда не корректируете значения am или pm в течение этих 12. Я рекомендую проверять 12 в am (12:00 == 0000 часов) и pm (12 pm == 1200 часов). В настоящее время вам нужно проверить на 12 и вычесть 1200 из времени, в pm вам нужно будет проверить на 12 и не прибавлять 1200 ко времени.

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