Почему различается output? Была написана программа, но её надо переписать под функции [дубликат]

111
09 июля 2021, 08:10
На этот вопрос уже даны ответы здесь:
Параметр функции в c++ (2 ответа)
Закрыт 1 год назад.

//Пример работающей программы
    #include <iostream>
    #include <string>
    using namespace std;
    int main()
    {
        bool flag = true;
        bool jk = false;
        char str;
        string str_output;
        while ((str = cin.get()) != '\n')
        {
            str_output += str;
        if (str == ',')
        {
            str_output.clear();
            jk = true;
        }
        if (str == '.' || str == '?' || str == '!')
        {
            if (!jk)
            {
                cout << str_output << endl;
            }
            flag = false;
        }
        if (!flag)
        {
            str_output.clear();
            flag = true;
            jk = false;
        }
        }
    }
``
//Программа переписанная под функции
    #include <iostream>
    #include <string>
    using namespace std;
    void logic_function(bool flag,string str_output,bool jk)
    {
        if (!flag)
        {
            str_output.clear();
            flag = true;
            jk = false;
        }
    }
    void logic(char str,bool jk,string str_output,bool flag)
    {
        if (str == '.' || str == '?' || str == '!')
        {
            if (!jk)
            {
                cout << str_output;
            }
            flag = false;
        }
    }
    void clear_str(string str_output,char str,bool jk)
    {
        if (str == ',')
        {
            str_output.clear();
            jk = true;
        }
    }
    int main()
    {
        bool flag = true;
        bool jk = false;
        char str;
        string str_output;
        while ((str = cin.get()) != '\n')
        {
            str_output += str;
            clear_str(str_output, str, jk);
            logic(str, jk, str_output, flag);
            logic_function(flag, str_output, jk);
        }
    }
Answer 1

Когда Вы передаёте в функцию переменную как аргумент, копируется только значение переменной. Все изменения этого значения внутри функции будут локальными и никак не отразятся на основной переменной. Т.е. создали Вы переменную flag внутри функции main и передали её в какую-нибудь функцию. Эта функция изменила значение flag. Но после возврата в main значение flag будет прежним. Функция изменила только локальную копию значения, а, завершая работу, уничтожила эту копию, никуда не передав. Решить эту проблему можно либо используя глобальные переменные (но это делать не рекомендуется в целях улучшения качества кода + Вам по заданию нельзя их использовать), либо возвращая значения из функций. Последнее можно делать с помощью return (не забудьте указать для функций тип возвращаемого значения), либо с помощью параметров-указателей. Но судя по уровню урока, за указатели Вам браться ещё рановато.

READ ALSO
Подправить код. Представление числа в памяти компьютера

Подправить код. Представление числа в памяти компьютера

Задача: На языке C/C++ написать программу, которая запрашивает целое число (положительное, отрицательное или ноль), разрядность типа данных...

103
Устранение Memory Leak

Устранение Memory Leak

Я начинающий програмист, использующий С++(с надеждой в дальнейшем попасть в GameDev)Так вот, для собеседования была написана игра и хотелось устранить...

96
Как открыть скачанный .ехе файл?

Как открыть скачанный .ехе файл?

Используя библиотеки QNetworkReply и QNetworkAccessManager я скачалexe файл, но не понимаю как его открыть

111