Основи програмування на С ++ для початківців

Задача: перевірка скобового вираження

Є текстовий рядок, яка містить довільне Дужковий вираз (дужки (), [], или {}). Необхідно створити функцію check(), яка буде перевіряти це Дужковий вираз на правильність:

перевірка(“і(x)”) -> true
перевірка(“[(]”) -> false
перевірка(“[{}]”) -> true
перевірка(“)(“) -> false
перевірка(“”) -> true
перевірка(“b([{}-()]{a})”) -> true

З рішенням потрібно повозитися. Але коли воно знайдеться – буде коротким і компактним (10 – 15 строк). Варіантів рішень може бути багато.

13 думки про "Задача: перевірка скобового вираження


  1. string str("{}{}{}");
    int bct1, bct2, bct3;
    bool is_correct(true);
    for (auto c : str) {
    do {
    if (c == "(") { ++bct1; break; }
    if (c == ")") { --bct1; break; }
    if (c == "{") { ++bct2; break; }
    if (c == "}") { --bct2; break; }
    if (c == "[") { ++bct3; break; }
    if (c == "]") { --bct3; break; }
    } while (false);
    if (bct1 < 0 || bct2 < 0 || bct3 < 0) {
    is_correct = false;
    break;
    }
    }
    cout << (is_correct == false || bct1 || bct2 || bct3 ? "false" : "true");

    Типу того (код не перевіряв, можуть бути помилки). BLE будь- різно прикрашати і робити гнучкіше, но суть та же, що і в разі одного виду дужок – блок-схема алгоритму є тут: http://pro-prof.com/archives/578

  2. > код не перевіряв
    А даремно ;-) …

    1. замість цього, якщо (з == “(“) має if (з == «(«)
    ну і у всіх подібних гілках…
    (і то якщо тільки це компілювати з опціями стандарту C ++ 11)

    2. але і це не буде працювати без:

    int bct1 = 0, bct2 = 0, bct3 = 0;

    принаймні, доти, поки це (bct1, bct2, bct3) – локальні змінні.

    3. і, нарешті, це ніколи не буде працювати просто алгоритмічно, бо ось таке Дужковий вираз теж буде абсолютно коректним:

    string str( "( 1 [ 2 { 3 ) 4 ] }");

    1. >> бо ось таке Дужковий вираз теж буде абсолютно коректним: ( 1 [ 2 { 3 ) 4 ] }

      Я не вважаю такий вислів коректним. В умовах задачі написано “перевіряти на правильність”. “правильність” ви ніяк не формалізували, наведені в завданні приклади не містять начебто жодної групи дужок, всередині якої порушується баланс інших дужок. Ну і взагалі, не зрозуміло що саме задається (може здаватися) різними видами дужок.

      З лапками і инициализацией змінних я накосячілі, да. Ще конструкцію do while(false) я тут даремно застосував, профіту з неї в цьому випадку не буде.

      Приведи своє рішення зі стеками, цікаво подивитися (я по твоєму опису профіту з них не бачу).

      1. > Я не вважаю такий вислів коректним.
        Ось і я не вважаю.
        А код показаний – вважає. ;-)

      2. > Приведи своє рішення зі стеками, цікаво подивитися
        А воно з 1-го для лежить під спойлером “Рішення”.
        І навіть не одне рішення…

      3. > Ну і взагалі, не зрозуміло що саме задається (може здаватися) різними видами дужок.

        Що таке правильне Дужковий вираз (і для різних видів дужок теж) діти вчать у 4-му класі початкової школи.

  3. Взагалі то, це в закамуфльованій формі завдання обчислення вкладених дужкових виразів (як, например, в LISP lambda-виразів … або в калькуляторі), але спеціально в дуже упрщённой формулюванні. У загальному вигляді задача таких обчислень вирішується рекурсивно: при відкритті чергового скобового вираження – заштовхуємо параметри в стек і викликаємо нижній рівень рекурсії, а при завершенні обробки скобового рівня – повернення з рекурсивного виклику і виштовхування переметров і стека назад.
    Але в такому формулюванні завдання обчислення на рівні рекурсії вироджене (нічого не робити), тому рекурсія відпала, а стек залишився.

  4. Я хочу розробити програму комп'ютерна діагностики аудіо відео радіо апаратури опис програми там є віконце де можна писати пишемо того що будемо перевіряти і програма знає всі параметри радіо деталь в савляем щупи в Вуков карту і перевіряємо радіо деталі якщо горить зеленим кольором то радіо деталь робоча якщо горить жовтим то радіо деталь підлозі робоча тобто промені поміняти якщо горить червоним то радіо деталь не рабочая.Нужна помочт раработки?

    1. 1. це буде дуже непроста за кодом і розміром програма
      2. просто зі входу звукової карти (мікрофонний?) так перевірити не вийде – це вхід АЦП, на нього можна подавати напруга, але без внешнего джерела напруги підключати туди “радіодеталей” безглуздо…
      3. навіть вирішивши питання з джерелом напруги, так перевіряти параметри ви зможете далеко не всіх найпростіших радіодеталей: діода, деяких резисторів … транзистор ви вже не перевірите, не кажучи вже про більш складних пристроях.
      4. така програма (навіть якби ви її попри всі обмеження можливостей зробили) будет залежною від операційної системи: працює під Windows не буде працювати під Linux, якщо ви зробите під Linux – вона не буде працювати під FreeBSD, зробите під FreeBSD – не працюватиме під Solaris і т.д.

      У мережі є досить багато програм комп'ютерних осцилографів, підключаються до входу аудіокарти. Багато з них – з відкритим кодом. Візьміть код таких програм і дивіться як вони працюють з аудиовходом.


  5. #include "stdafx.h"
    #include
    #include
    #include

    using namespace std;

    bool check(char*, int = 0, int = 0);

    int main()
    {
    cout<<boolalpha<<setw(17)<<"y(x) "<<check("y(x)",4)<<endl
    <<setw(17)<<"[(] "<<check("[(]",3)<<endl
    <<setw(17)<<"[{}] "<<check("[{}]",4)<<endl
    <<setw(17)<<")( "<<check(")(",2)<<endl
    <<setw(17)<<""<<check("")<<endl
    <<setw(17) << "b([{}-()]{a}) " << check("b([{}-()]{a})", 13) << endl
    <<setw(17)<<"(1[2{3)4]} "<<check("(1[2{3)4]}",10)<<endl;

    _getch();
    return 0;
    }

    bool check(char* str, int finish, int start)
    {
    char chArray[] = "({[)}]";
    bool result = true;
    int mult = 0;

    for (int i = start; i<finish; i++)
    for (int q = 0; q<3; q++)
    if (str[i] == chArray[q]){
    result = false;
    for (int f = i + 1; f < finish; f++)
    if (str[f] == chArray[q + 3]){
    if (mult == 0){
    result = check(str,f,(i+1));
    if (!result)
    return false;
    break;}
    mult--;}
    else if (str[f] == chArray[q])
    mult++;}
    return result;
    }

  6. Я програміст С ++ і можливо код буде громіздкий, але як вийшло.


    #include "stdafx.h"
    #include
    #include

    using namespace std;

    //check(“y(x)”) -> true
    //check(“[(]”) -> false
    //check(“[{}]”) -> true
    //check(“)(“) -> false
    //check(“”) -> true
    //check(“b([{}-()]{ a })”) -> true

    bool findclose(const string &data, char find = '\0', int ind = 0)
    {
    bool res = false;

    if (find == '\0') return false;

    for (int i = ind; i < data.length(); i++)
    {
    if (data[i] == find)
    return true;
    else
    {
    switch (data[i])
    {
    case '{':
    res = findclose(data, '}', i + 1);
    if (res == false) return false;
    break;
    case '(':
    res = findclose(data, ')', i + 1);
    if (res == false) return false;
    break;
    case '[':
    res = findclose(data, ']', i + 1);
    if (res == false) return false;
    break;
    default:
    break;
    }
    }
    }
    return res;
    }

    int main()
    {
    setlocale(LC_ALL, "Rus");

    string data;
    char repeat = 'N';
    do
    {
    cout << "==============================================" << endl;
    cout << "Введите строку проверки скобочного выражения: " <> data;

    bool res = false;

    for (int i = 0; i < data.length(); i++)
    {
    if (data[i] == '{' || data[i] == '(' || data[i] == '[')
    {
    switch (data[i])
    {
    case '{':
    res = findclose(data, '}', i + 1);
    break;
    case '(':
    res = findclose(data, ')', i + 1);
    break;
    case '[':
    res = findclose(data, ']', i + 1);
    break;
    default:
    break;
    }
    break;
    }
    }

    if (res) cout << "OK" << endl;
    else cout << "ERROR" << endl;

    cout << "Повторить проверку? (Y-да, N-нет): " <> repeat;

    } while (repeat == 'Y' || repeat == 'y');

    system("pause");
    return 0;
    }

  7. Вітаю. Допоможіть, будь ласка. Розпишіть як працює кожен рядок в рішенні (перший варіант).

  8. Уповноважений c #:

    за допомогою System;

    простір імен Домашнє завдання5
    {
    клас Програма
    {
    статична перевірка буля(рядок тексту)
    {
    int count = 0;
    char[] пам'ять = новий символ[100];
    для кожного (Елемент символу в тексті)
    {
    switch (елемент)
    {
    справа{«: пам'ять[++count] = елемент; break;
    справа(«: пам'ять[++count] = елемент; break;
    справа[«: пам'ять[++count] = елемент; break;
    справа}': if (пам'ять[count] == ‘{«) { count–; } else { повернення помилковим; }; break;
    справа)': if (пам'ять[count] == ‘(«) { count–; } else { повернення помилковим; }; break;
    справа]': if (пам'ять[count] == ‘[«) { count–; } else { повернення помилковим; }; break;
    }
    }
    кількість повернень == 0 ? true : false;
    }
    статична порожнеча Головна(string[] аргументи)
    {
    Console.WriteLine(перевірка(Console.ReadLine()));
    Console.ReadKey(true);
    }
    }
    }

залишити коментар

Ваша електронна адреса не буде опублікований. Обов'язкові поля позначені * *