Главная » Просмотр файлов » Лекция 9. Функции, структуры, перечисления

Лекция 9. Функции, структуры, перечисления (1107984)

Файл №1107984 Лекция 9. Функции, структуры, перечисления (Электронные лекции)Лекция 9. Функции, структуры, перечисления (1107984)2019-04-24СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла

Лекции по курсу “Алгоритмы и алгоритмические языки”, 1 курс, 1 поток, 2010/2011 уч.год.Лекция 9.9.1. Функции9.1.1. Объявление функции. Синтаксис:тип_возвр_значения имя_функции(тип параметр, тип параметр, …, типпараметр);Примеры:int atoi(char s[]);double atof(char s[]);void QuickSort(char *items, int count);Функция atoi преобразует строку десятичных цифр s в целое число, функцияatof преобразует строку десятичных цифр s в число двойной точности, функцияQuickSort выполняет сортировку массива items.Тип возвращаемого значения void означает, что функция не возвращает значения.9.1.2. Определение функции.

Синтаксис:объявление_функции {тело_функции}Пример:/* вставление объявлений функций библиотеки ctype */#include <ctype.h>int atoi(char s[]) {int i, n, sign;/* пропуск пробельных символов */for(i = 0; isspace(s[i]); i++);/* определение знака числа по первому знаку */sign = (s[i] == '-') ? -1: 1;/* пропуск остальных знаков, если их несколько */if(s[i] == '+' || s[i] == '-') i++;/* вычисление значения числа *//* цикл должен начаться с текущего значения i *//* n = 0 "побочный эффект", позволяющий *//* сэкономить одну строку в программе */for(n = 0; isdigit(s[i]); i++)n = 10 * (s[i] - '0');return sign * n;}Стандартная библиотека ctype содержит такие функции, как isspace() ,isdigit() и др.Областью действия функции является весь программный файл, в котором онаобъявлена, начиная со строки, содержащей ее объявление.

При этом определениефункции должно присутствовать только в одном из программных файлов, вкоторых она объявлена, либо в одной из библиотек.9.1.3. Вызов функции. Если функция f() возвращает значение типа тип, то вызов этойфункции может иметь вид: v = f(), где v – переменная типа тип. Вызов функцииможет также входить в состав выражения типа тип.Если функция f(параметр) не возвращает значений, вызов этой функции имеетвид: f(аргумент);(с) Кафедра системного программирования ф-та ВМК МГУ, 20101Лекции по курсу “Алгоритмы и алгоритмические языки”, 1 курс, 1 поток, 2010/2011 уч.год.Если в программном файле вызывается какая-либо функция, она обязательнодолжна быть объявлена в этом программном файле до ее вызова (отсутствиеобъявления функции или объявление функции после ее вызова фиксируетсякомпилятором как ошибка).Директива препроцессора #include <имя_библиотеки.h> вставляет впрограмму (перед ее компиляцией) объявления всех функций соответствующейбиблиотеки (в частности, стандартной библиотеки), обеспечивая программевозможность вызова функций соответствующей библиотеки.

Например, #include<string.h> вставляет объявления всех функций стандартной библиотекиstring.При вызове функции ей передаются ее аргументы. В языке Си все аргументыпередаются по значению (т.е. передаются только значения аргументов, и этизначения копируются в память функции). Если аргументом является указатель, егозначением является адрес объекта вызывающей функции, что обеспечиваетвызываемой функции доступ к соответствующему объекту. Массив всегдапередается с помощью указателя на его первый элемент (напомним, что указателемна первый элемент массива является, в частности, имя массива без индексов).9.1.4. Пример.

Функция void swap(int x, int y), меняющая местами значенияпеременных x и y.Неправильный вариант:Правильный вариант:void swap(int x, int y) {void swap(int *px, int *py) {int tmp;int tmp;tmp = x;tmp = *px;x = y;*px = *py;y = tmp;*py = tmp;}}Неправильный вариант не учитывает того обстоятельства, что все аргументыфункции передаются только по значению: операция x = y; не имеет смысла(ошибочна), так как значение x (целое число) не может быть левой частьюприсваивания.Используя аргументы-указатели, функция может обращаться к объектамвызвавшей ее функции.9.1.5. Возврат из функции.

Возврат из функции в точку вызвавшей ее функции,следующей за точкой вызова функции (это может быть следующий членвыражения, если вызов функции входит в состав выражения, либо следующийоператор, если вызов функции не входит в состав выражения), осуществляетсялибо при выполнении оператора return, либо после выполнения последнегооператора функции, если она не содержит оператора return. Например, возвратиз функции, печатающей строку s в обратном порядке.#include <string.h>#include <stdio.h>void str_reverse(char *s) {register int i;for(i = strlen(s) – 1; i >= 0; i--) putchar(s[i]);}(с) Кафедра системного программирования ф-та ВМК МГУ, 20102Лекции по курсу “Алгоритмы и алгоритмические языки”, 1 курс, 1 поток, 2010/2011 уч.год.выполняется сразу после окончания выполнения оператора цикла for.Если у функции несколько операторов return, возврат осуществляется по тому изних, который будет выполнен первым.9.1.6.

Результат выполнения функции. Все функции, кроме тех, которые относятся ктипу void, возвращают значение. Это значение определяется выражением воператоре return. Согласно стандарту C99, в функции, тип которой отличен отvoid, каждый оператор return обязательно должен содержать возвращаемоезначение1. Однако, если возврат из функции, тип которой отличен от void,выполняется не по оператору return, а после выполнения последнего оператораэтой функции, то возвращается произвольное значение. Рекомендуется избегатьтаких случаев.Помимо вычисления возвращаемого значения функция может изменять значенияпеременных вызывающей программы, осуществляя доступ к ним с помощьюуказателей, переданных ей в качестве аргументов, а также изменять значенияглобальных переменных программы.

Результаты вызова функции, не связанныенепосредственно с вычислением возвращаемых значений, составляют побочныйэффект функции.В Си-программе можно использовать функции трех видов:(1) Функции, которые выполняют операции над своими аргументами сединственной целью – вычислить возвращаемое значение.(2) Функции, которые обрабатывают данные и возвращают значение, котороепоказывает, успешно ли была выполнена эта обработка. Основная работа такойфункции заключается в ее побочном эффекте.(3) Функции, не возвращающие значений.

Все такие функции имеют тип void.Примерами функций первого вида могут служить библиотечные функцииsqrt(x) или exp(x).В качестве примера функции третьего вида рассмотрим функцию перемножениядвух прямоугольных матриц.void matr_prod(double *a, int m, int s, double *b, ints,int n, double *c, int m, int n) {int i, j, k;for(i = 0; i < m; i++)for(j = 0; j < n; j++) {c[i, j] = 0;for(k = 0; k < s; k++)c[i][j] += a[i][k]*b[k][j];}}Значения, возвращаемые функциями первого и второго вида, не обязательнодолжны быть использованы в программе (т.е.

их можно вообще не использовать).1В стандарте C89 в функциях типа, отличного от void, разрешаются операторы return без возвращаемого значения.В этих случаях вызывающей программе возвращается произвольное значение соответствующего типа.(с) Кафедра системного программирования ф-та ВМК МГУ, 20103Лекции по курсу “Алгоритмы и алгоритмические языки”, 1 курс, 1 поток, 2010/2011 уч.год.Пример:#include <stdio.h>int mult(int a, int b);int main() {int x, y, z;x = 10; y = 20;z = mult(x, y);printf("%d", mult(x, y));mult(x, y);return 0;}int mult(int a, int b) {return a * b;}Определение функции mult следует после определения.

Но так как функция multвызывается в функции main, до определения функции main функция multдолжна быть объявлена до определения функции main (либо ее определениедолжно быть до определения функции main).Несмотря на то, в 6-ой строке функции main вызывается функция mult , а еезначение никакой переменной не присваивается, никаких неприятностей привыполнении функции main не возникает. Рассматриваемый вызов функции multявляется примером «мертвого кода», т.е. вычислений, результаты которых впрограмме не используются. Большая часть мертвого кода (но не весь мертвыйкод) исключается при компиляции программы.Возвращаемым значением может быть указатель. Требуется, чтобы в объявлениитакой функции тип возвращаемого указателя был объявлен точно: например,нельзя объявлять возвращаемый тип как int *, если функция возвращаетуказатель типа char *.

Пример функции, возвращающей указатель (поискпервого вхождения символа c в строку s):char *match(char, char *s) {while(c != *s && *s) s++;return (s);}9.1.7. Рекурсия. В языке Си функция может быть рекурсивной, т.е. вызывать саму себя.Простым примером рекурсивной функции является функция, вычисляющая числоФибоначчи по его номеру:int Fibrec(int n) {if(n == 1 || n == 2) return 1;else return ((Fibrec(n – 2) + Fibrec(n – 1));}Когда функция вызывает сама себя, в памяти в стеке размещается новый наборлокальных переменных и параметров, а код функции выполняется над этиминовыми переменными и параметрами с самого своего начала. При этом новаякопия кода функции не создается, новыми являются только значения, над(с) Кафедра системного программирования ф-та ВМК МГУ, 20104Лекции по курсу “Алгоритмы и алгоритмические языки”, 1 курс, 1 поток, 2010/2011 уч.год.которыми выполняется функция.

При каждом возвращении из рекурсивноговызова старые локальные переменные и параметры извлекаются из стека ивозобновляется работа функции с того места, которое идет сразу за рекурсивнымвызовом.Хотя может показаться, что рекурсивная функция более эффективна, на самом делетакое случается очень редко. Размер кода функции сокращается не очень сильно,эффективность работы с памятью возрастает также незначительно, затодобавляются накладные расходы на организацию рекурсивных вызовов. Крометого, при большом количестве рекурсивных вызовов возникает переполнениестека.Все это нетрудно заметить, сравнивая работу рекурсивной функции Fibrec и еене рекурсивного варианта Fib, который приводится ниже:int Fbn(int n) {if ((n == 1) || (n == 2))return 1;else {g = h = 1;for(k = 2; k < n; k++) {Fb = g + h;h = g;g = Fb;}return Fb;}}9.1.8.

Ключевое слово inline. В стандарт C99 добавлено ключевое слово, котороеприменяется к функциям и определяет так называемую подставляемую функцию.Смысл подставляемой функции (и ключевого слова inline) станет ясен изследующего примера. Рассмотрим Си-программу#include <stdio.h>inline int max(int a, int b) {return a > b ? a : b;}int main() {int x = 5, y = 17;printf("Наибольшим из чисел %d и %d является %d\n",x, y, max(x, y));return 0;}При типичной реализации inline приведенная программа эквивалентнаследующей:#include <stdio.h>inline int max(int a, int b) {return a > b ? a : b;}(с) Кафедра системного программирования ф-та ВМК МГУ, 20105Лекции по курсу “Алгоритмы и алгоритмические языки”, 1 курс, 1 поток, 2010/2011 уч.год.int main() {int x = 5, y = 17;printf("Наибольшим из чисел %d и %d является %d\n",x, y, (x > y ? x : y));return 0;}Подставляемые функции помогают создавать более эффективный код(подробности – в следующем семестре).9.2.

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

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

Тип файла PDF

PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.

Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.

Список файлов лекций

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