Главная » Просмотр файлов » А. Богатырев - Руководство полного идиота по программированию (на языке Си)

А. Богатырев - Руководство полного идиота по программированию (на языке Си) (1109482), страница 6

Файл №1109482 А. Богатырев - Руководство полного идиота по программированию (на языке Си) (А. Богатырев - Руководство полного идиота по программированию (на языке Си)) 6 страницаА. Богатырев - Руководство полного идиота по программированию (на языке Си) (1109482) страница 62019-04-28СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 6)

Руководство полного идиота<br> по программированию (на языке Си)Чтобы вызывать их с разными аргументами!int res1, res2;...res1 = func(12 * x * x + 177, 865,'x');res2 = func(432 * y + x, 123 * y - 12, 'z');Кстати, вы заметили, что список фактических параметровследует через запятую;и выражений ровно столько, сколько параметров у функции?Функция описывает ПОСЛЕДОВАТЕЬНОСТЬ ДЕЙСТВИЙ,которую можно выполнить много раз,но с разными исходными данными (аргументами).В зависимости от данных она будет выдавать разные результаты,но выполняя одни и те же действия.В том то и состоит ее прелесть:мы не дублируем один кусок программы много раз,а просто "вызываем" его.Функция - абстракция АЛГОРИТМА, то есть последовательности действий.Ее конкретизация - вызов функции с уже определенными параметрами.------------------------------------------------------------------------Оператор return может находиться не только в конце функции,но и в ее середине.Он вызывает немедленное прекращение тела функции и возврат значенияв точку вызова.int f(int x){int y;y = x + 4;if(y > 10) return (x - 1);y *= 2;return (x + y);}РЕКУРСИВНЫЕ ФУНКЦИИ.

СТЕКРекурсивной называется функция, вызывающая сама себя.int factorial(int arg){if(arg == 1)return 1;elsereturn arg * factorial(arg - 1);}/* a *//* b */Эта функция при вызове factorial(n) вычислит произведениеn * (n-1) * ... * 3 * 2 * 1называемое "факториал числа n".В данной функции переменная arg будет отведена (а после и уничтожена) МНОГО РАЗ.Так что переменная factorial::arg должна получить еще и НОМЕР вызова функции:file:///Volumes/WININSTALL/assets/materials_informatiks.html38/6803.06.2015Андрей Богатырев.

Руководство полного идиота<br> по программированию (на языке Си)factorial::arg[уровень_вызова]И на каждом новом уровне новая переменная скрывает все предыдущие.Так для factorial(4) будет+----------------------------------------+|| factorial::arg[ 0_ой_раз ] есть 4||| factorial::arg[ 1_ый_раз ] есть 3||| factorial::arg[ 2_ой_раз ] есть 2||| factorial::arg[ 3_ий_раз ] есть 1|V --------++--------Затем пойдут возвраты из функций:+----------------------------------------+A| /* b */ return 4 * 6 = 24||| /* b */ return 3 * 2 = 6||| /* b */ return 2 * 1 = 2||| /* a */ return 1;|| --------++--------Такая конструкция называется СТЕК (stack).--------++-----------||+---------------+пустой стекПоложим в стек значение a|--------+|+-----------|V|+---------------+|a| <--- вершина стека+---------------+Положим в стек значение b--------++-----------||+---------------+|b| <--- вершина стека+---------------+|a|+---------------+Положим в стек значение c--------++-----------||+---------------+|c| <--- вершина стека+---------------+|b|+---------------+|a|+---------------+Аналогично, значения "снимаются со стека" в обратном порядке: c, b, a.В каждый момент времени у стека доступно для чтения (копирования) иливыбрасывания только данное, находящееся на ВЕРШИНЕ стека.file:///Volumes/WININSTALL/assets/materials_informatiks.html39/6803.06.2015Андрей Богатырев.

Руководство полного идиота<br> по программированию (на языке Си)Так и в нашей рекурсивной функции переменная factorial::argведет себя именно как стек (этот ящик-стек имеет имя arg) она имеет ОДНО имя, но разные значения в разных случаях.Переменные, которые АВТОМАТИЧЕСКИ ведут себя как стек,встречаются только в (рекурсивных) функциях.Стек - это часто встречающаяся в программировании конструкция.Если подобное поведение нужно программисту, он должен промоделироватьстек при помощи массива:int stack[10];int in_stack = 0;/* сколько элементов в стеке *//* Занесение значения в стек */void push(int x){stack[in_stack] = x;in_stack++;}/* Снять значение со стека */int pop(){if(in_stack == 0){printf("Стек пуст, ошибка.\n");return (-1);}in_stack--;return stack[in_stack];}Обратите в нимание, что нет нужды СТИРАТЬ (например обнулять)значения элементов массива, выкинутых с вершины стека.Они просто больше не используются, либо затираются новым значением припомещении на стек нового значения.void main(){push(1);push(2);push(3);while(in_stack > 0){printf("top=%d\n", pop());}}СТЕК И ФУНКЦИИБудем рассматривать каждый ВЫЗОВ функции как помещение в специальный стекбольшого "блока информации", включающего в частностиАРГУМЕНТЫ И ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ вызываемой функции.Оператор return из вызванной функции выталкивает со стека ВЕСЬ такой блок.В качестве примера рассмотрим такую программу:int x = 7;int v = 333;/* глобальная *//* глобальная */int factorial(int n){int w; /* лишняя переменная, только для демонстрационных целей */file:///Volumes/WININSTALL/assets/materials_informatiks.html40/6803.06.2015Андрей Богатырев.

Руководство полного идиота<br> по программированию (на языке Си)w = n;if(n == 1)else}void func(){int x;return 1;return n * factorial(n-1);/* #a *//* #b *//* func::x */x = 777;/* #c */printf("Вызвана функция func()\n");}void main(){int y = 12;int z;/* main::y */z = factorial(3);printf("z=%d\n", z);/* A *//* B */func();/* C */}------------------------------------------------------------------------Выполнение программы начнется с вызова функции main().В точке /* A */|Vв з г л я д|V--------++-------|=======================||z = мусор||y = 12|+------+---------+|main()||x = 7 | v = 333 |+-----------------------+-----------+------+---------+----СТЕК ВЫЗОВОВ ФУНКЦИЙГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕВ каждый данный момент видимы переменные, которые находятсяa) на вершине (и только) стека вызовов функций.b) и незаслоненные ими глобальные переменные.В данном случае мы смотрим "сверху" и видим:main::z, main::y, ::x, ::v------------------------------------------------------------------------В точке /* B */ мы вызываем factorial(3).--------++-------|=======================||w = мусор||n=3||factorial(3)||=======================||+-|---> текущий оператор z = factorial(3);|z = мусор||y = 12|+------+---------+|main()||x = 7 | v = 333 |+-----------------------+-----------+------+---------+----СТЕК ВЫЗОВОВ ФУНКЦИЙГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕПри новом взгляде видимы:factorial(3)::w, factorial(3)::n, ::x, ::vСтали невидимы:file:///Volumes/WININSTALL/assets/materials_informatiks.html41/6803.06.2015Андрей Богатырев.

Руководство полного идиота<br> по программированию (на языке Си)main::z, main::yСтрока "текущий оператор ..." указывает место, с которого надо возобновитьвыполнение функции, когда мы вернемся в нее.------------------------------------------------------------------------Когда выполнение программы в функции factorial(3) дойдет до точки/* #b */ будет выполняться return 3 * factorial(2).В итоге будет вызвана функция factorial(2).--------++-------|=======================||w = мусор||n=2||factorial(2)||=======================||+-|---> текущий оператор return 3 * factorial(2);|w=3||n=3||factorial(3)||=======================||+-|---> текущий оператор z = factorial(3);|z = мусор||y = 12|+------+---------+|main()||x = 7 | v = 333 |+-----------------------+-----------+------+---------+----СТЕК ВЫЗОВОВ ФУНКЦИЙГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ------------------------------------------------------------------------Когда выполнение программы в функции factorial(2) дойдет до точки/* #b */ будет выполняться return 2 * factorial(1).В итоге будет вызвана функция factorial(1).--------++-------|=======================||w = мусор||n=1||factorial(1)||=======================||+-|---> текущий оператор return 2 * factorial(1);|w=2||n=2||factorial(2)||=======================||+-|---> текущий оператор return 3 * factorial(2);|w=3||n=3||factorial(3)||=======================||+-|---> текущий оператор z = factorial(3);|z = мусор||y = 12|+------+---------+|main()||x = 7 | v = 333 |+-----------------------+-----------+------+---------+----СТЕК ВЫЗОВОВ ФУНКЦИЙГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ------------------------------------------------------------------------Затем в factorial(1) выполнение программы дойдет до точки /* #a */и будет производиться return 1.При return вычеркивается ОДИН блок информации со стека вызовов функций,и возобновляется выполнение "текущего оператора" в функции,ставшей НОВОЙ вершиной стека вызовов.Заметьте, что в данной ситуации вызванные функции factorial(m) еще не завершились.file:///Volumes/WININSTALL/assets/materials_informatiks.html42/6803.06.2015Андрей Богатырев.

Руководство полного идиота<br> по программированию (на языке Си)В них еще ЕСТЬ что сделать: вычислить выражение в return,и собственно выполнить сам return. Вычисления будут продолжены.--------++-------|=======================||+-|---> текущий оператор return 1;|w=1||n=1||factorial(1)||=======================||+-|---> текущий оператор return 2 * factorial(1);|w=2||n=2||factorial(2)||=======================||+-|---> текущий оператор return 3 * factorial(2);|w=3||n=3||factorial(3)||=======================||+-|---> текущий оператор z = factorial(3);|z = мусор||y = 12|+------+---------+|main()||x = 7 | v = 333 |+-----------------------+-----------+------+---------+----СТЕК ВЫЗОВОВ ФУНКЦИЙГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ------------------------------------------------------------------------Начинается выталкивание функций со стека и выполнение операторов return;--------++-------|=======================||+-|---> текущий оператор return 2 * 1;|w=2||n=2||factorial(2)||=======================||+-|---> текущий оператор return 3 * factorial(2);|w=3||n=3||factorial(3)||=======================||+-|---> текущий оператор z = factorial(3);|z = мусор||y = 12|+------+---------+|main()||x = 7 | v = 333 |+-----------------------+-----------+------+---------+----СТЕК ВЫЗОВОВ ФУНКЦИЙГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ--------++-------|=======================||+-|---> текущий оператор return 3 * 2;|w=3||n=3||factorial(3)||=======================||+-|---> текущий оператор z = factorial(3);|z = мусор||y = 12|+------+---------+|main()||x = 7 | v = 333 |+-----------------------+-----------+------+---------+----СТЕК ВЫЗОВОВ ФУНКЦИЙГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕfile:///Volumes/WININSTALL/assets/materials_informatiks.html43/6803.06.2015Андрей Богатырев.

Характеристики

Тип файла
PDF-файл
Размер
733,58 Kb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6447
Авторов
на СтудИзбе
306
Средний доход
с одного платного файла
Обучение Подробнее