Булева функция для оценки строки - PullRequest
0 голосов
/ 08 октября 2019

Мне нужно построить функцию, которая оценивает строку чисел в C ++. Строка чисел находится в сбалансированной троичной форме , означающей, что числа либо -1,0, либо 1, чтобы быть действительными. Таким образом, цель функции - проверить строку, чтобы убедиться, что она действительна. Например, если пользователь введет «-101-11», логическая функция вернет true. Или, если пользователь введет «-1012», логическая функция вернет false. Эта функция также является закрытой функцией-членом класса. Позвольте мне показать вам, что я до сих пор кодировал (я знаю, что это неправильно, но если бы кто-то мог мне помочь, это было бы здорово!) Это на C ++.

bool BTernary::isTernary(string s)
{
    int i;
    int l = s.length();
    for (i = 0; i < l; i++) {
        if (s.at(i) == '-') {
            continue;
        }
        else if (s.at(i) == '0') {
            continue;
        }
        else if (s.at(i) == '1') {
            break;
        }

        return true;
    }

    return false;
}

Я также попробовал другой подход к проверке строки, он выглядит следующим образом: (Это тестовый файл, над которым я работал некоторое время, и он компилируется без ошибок. Проблемаесли он видит '-' или '1' или '0', он автоматически принимает это за истину, я думаю, вместо оценки всей строки для символов, которые мне нужны для оценки символ за символом?

#include <iostream>
#include <string>

using namespace std;

int main()
{
    int i;
    string s = "0";
    for (i = 0; i < s.length(); i++) {
        if (s.at(i) == '-' || '0' || '1') {
            cout << "True" << endl;
            return True;
        }
        else {
            cout << "false" << endl;
            return false;
        }
    }
}

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Вот более краткая версия предложения Михаила:

bool BTernary::isTernary(const std::string& s)
{
    bool minus = false;

    for (const char c : s)
    {
       switch (c)
       {
         case '-':
            if (minus) return false;
            minus = true;
            break;

         case '0':
            if (minus) return false;
            break;

         case '1':
            if (minus) minus = false;
            break;

         default:
            return false;
    }

    return !minus;
}
0 голосов
/ 08 октября 2019

Алгоритм прост, вы должны проверить, всегда ли за - следует 1 и нет ли других символов, только 0 и 1

bool BTernary::isTernary(string s) {
    int l = s.length();
    bool minus = false;
    for (int i = 0; i < l; i++) {
        if (s[i] == '-') {
            if (minus) {
                return false;
            }
            minus = true;
        } else if (s[i] == '0') {
            if (minus) {
                return false;
            }
        } else if (s[i] == '1') {
            if (minus) {
                minus = false;
            }
        } else {
            return false;
        }
    }
    return !minus;
}
...