На данный момент - последняя статья о программе "Калькулятор" на С++. Потому что задание выполнено и перевыполнено, проект реализован даже в трёх вариантах!
С вами опять начинающая программистка Алёна со своими уникальными дневниковыми записями.
Сначала напомню, на чем остановилась в прошлый раз - вот на этом:
Этот код работает и делает всё, что положено, все четыре арифметических действия. А задача стоит следующая - переписать код с применением функций, чтобы сократить количество повторяющихся элементов. В такой простой программе, как "Калькулятор", это несущественно, однако к правильному программированию нужно привыкать с самого начала - то есть код должен быть максимально простым, понятным и коротким. И желательно структурированным так, чтобы можно было изменять отдельные блоки, не затрагивая остальных. Для этого и нужны функции.
В данной статье кратко рассказано о функциях С++ на конкретных примерах. Приводятся три листинга программы "Калькулятор" (разные варианты). И видеоролик, демонстрирующий работу этих трёх вариантов кода.
Предварительно я опубликовала два поста - один о переменных, второй - о функциях. Сейчас же о функциях поговорим более подробно.
Применение функций делится на три этапа - объявление (описание), определение (что функция должна делать) и вызов (собственно, само использование). Сама функция состоит из следующих частей:
- Тип возвращаемого значения. Если в результате работы функции вычисляется какое-либо значение - указывается тип этого значения (int, float, double). Если функция ничего не вычисляет, указывается тип void - пустое множество.
- Имя функции. Задается пользователем, подчиняется общим правилам задания имён в С++. Как и имена переменных.
- Список параметров. Вводится сразу после имени функции в круглых скобках, параметры отделяются друг от друга запятыми, для каждого параметра указывается тип (обязательно) и имя (необязательно).
- Тело функции. Заключается в фигурные скобки, состоит из выражений (операторов) которые должна выполнять функция. Заканчивается словом return значение, если функция возвращает это значение в программу. В функции void слово return не используется.
Пример - функция void print_menu() в галерее "Первый вариант кода". Хотя эта функция присутствует и в других вариантах - меню-то печатать везде нужно.
В строке 6 функция объявляется. Параметров у неё нет, поэтому и в круглых скобках ничего не пишу. Определение функции проводится в строках 52-57. И в строке 19, а также в строке 25 функция вызывается, чтобы выполнить свою работу - вывести на экран меню программы.
Хочу сразу обратить внимание на строку 24, выражение system("cls");. Это выражение очищает консольное окно, стирая из него всё - поэтому и приходится в следующей строке вызывать функцию печати меню. Если же не очищать консольное окно - в нём будут отображаться результаты предыдущих вычислений, а это, мягко говоря, раздражает. Пример программы без очистки консольного окна приводится в этой статье, в прикреплённом к ней видеоролике.
В строках 7,8,9,10 объявляются функции непосредственно вычислений, на каждое действие - своя функция. Их определение - в строках с 59 по 100. Строго говоря, в каждую функцию просто перенесён код, который раньше был в соответствующих местах оператора switch, а теперь из оператора switch просто вызываются соответствующие функции. Код стал немного более структурирован, количество строк в главной функции main() уменьшилось, зато сама программа "увеличилась" в размерах. Поэтому этот вариант меня не совсем устраивает.
Во втором варианте кода для всех вычислений я использую одну функцию calculation (галерея "Второй вариант кода").
Этот код опять-таки практически полностью повторяет код, описанный в предыдущей статье, только тело оператора switch вынесено в отдельную функцию, и вместо switch используется if - но можно использовать и switch. Единственное достоинство этого варианта - функцию calculation можно преобразовать в заголовочный файл, и включать его в программу при помощи директивы include, как файл iostream. Вот тогда да, в программе будут отсутствовать строки с 58 по 104 и листинг значительно сократится. Но поскольку эту тему я ещё не проходила, а так, заглянула вперёд - то и останавливаться на этом варианте не буду, просто показываю, что он есть.
Ну и третий вариант, самый удобоваримый на данный момент. И на нём наконец можно объяснить, как в функцию передаются аргументы.
Здесь функция input_dat используется только для ввода данных, поэтому и возвращает в программу значение типа double (десятичную дробь). Вычисления и вывод результата проводятся в одном выражении (строки 30, 36, 42, 48). У функции input_dat два параметра - строка и переменная типа double. В качестве параметра x double в функцию передается переменная x - не следует путать её с параметром. В данном случае переменная х является аргументом функции, а её значение задаётся пользователем, с клавиатуры. А вот параметр string str принимает разные значения - "Первое слагаемое " в строке 28, "Второе слагаемое " в строке 29 и так далее (все строки программы, где вызывается функция input_dat).
В конкретном примере (строка 28) "Первое слагаемое " является аргументом функции input_dat. Иначе говоря, параметр формален и конкретного значения не имеет. А аргумент - имеет.
Порядок работы программы при вызове функции:
- Строка 28 - переменная str принимает значение "Первое слагаемое ";
- Строка 71 - значение переменной str передаётся объекту cout и выводится на экран;
- Строка 72 - аргументу х присваивается значение, введённое с клавиатуры при помощи объекта cin;
- Строка 73 - Оператор return возвращает в программу значение аргумента х;
- Строка 28 - переменной х присваивается значение аргумента х функции input_dat.
Следует помнить, что выражения в С++ выполняются с конца. Если в математике пример 2+2=4 выполняется так же, как и пишется, то уравнение х=2+2 представляет из себя "перевёрнутую" запись, и чтобы найти чему равен х мы к последней двойке при помощи оператора сложения "+" добавляем ещё одну, а потом оператором присваивания "=" передаём полученное значение переменной х. И при вызове функции сначала присваиваются значения её аргументам, затем выполняется тело функции, и только потом - оператор присваивания "=". И не надо путать переменную х в программе с аргументом х функции input_dat - это РАЗНЫЕ переменные, хоть и носят одно имя. Для наглядности - в строке 29 значение аргумента х будет присвоено переменной у.
Посмотреть, как всё работает, можно здесь:
Подвожу итоги
Может показаться, что цель не совсем достигнута - в программе из предыдущей статьи 69 строк кода, а в последнем варианте - 74. Но не следует забывать о дополнительном выражении system ("cls");, а также о комментариях. И самое главное - в процессе написания этой программы я научилась работать с функциями, а ведь это и было основной целью. Но, наверное, придётся ненадолго прерваться (хоть я ещё и не рассказала о такой интересной штуке как рекурсия), вернуться к Visual Basic и показать, какие замечательные вещи я научилась делать при его помощи. Так что - до новых встреч на страницах моего дневника!
А что касается С++:
The memory of the object "Alyona's brain" is overflowing...
System reboot.