Лекция 2. Функции и многофайловые программы в Си 2.1. Общие сведения о подпрограммах и функциях Функции являются частным случаем подпрограмм. Подпрограмма — автономно оформленный алгоритм, который может быть использован другим алгоритмом. Подпрограммы (или аналогичные им конструкции) имеются во всех алгоритмических языках.
Их использование позволяет избежать повторного программирования одинаковых (с точностью до обозначений и констант) частей алгоритма, увеличивает наглядность программ (за счет укрупнения операторов), упрощает разделение труда между несколькими программистами, делает возможным создание библиотек типовых алгоритмов, упрощает отладку программ. Использование подпрограмм естественно при разработке алгоритмов методом нисходящего проектирования: задача порождает подзадачи, которые удобно оформить как подпрограммы.
Главным вопросом, который следует решить при проектировании подпрограмм, является вопрос о способе передачи данных между подпрограммой и программой. В любом алгоритмическом языке существует два основных способа передачи данных: через список параметров подпрограммы и через глобальные переменные (общие области, внешние имена).
Программирование на Си — Урок 6 — процедуры, функции, параметры и разгадка тайны int main
Первый способ дает возможность подстановки, т. е. передачи в подпрограмму при каждом обращении к ней нового параметра. В список параметров подпрограммы включаются переменные, значения которых должны быть переданы из программы в подпрограмму и из подпрограммы в программу (т.е. «исходные» и «выходные» 1 переменные для подпрограммы).
Во всех алгоритмических языках при использовании подпрограмм выделяются два момента: описание подпрограмм и обращение к ним (вызов). Под описанием подпрограммы понимается оформление ее алгоритма особым образом, так чтобы любая программа (или подпрограмма) могла его активизировать и выполнить над своими данныКавычки присутствуют потому, что в вводу и выводу эти термины здесь отношения не имеют 1 ми.
Под обращением к подпрограмме понимается активизация подпрограммы; программа передает управление подпрограмме и пересылает ей данные, подпрограмма выполняет свой алгоритм и возвращает управление программе. При описании подпрограммы в списке параметров записываются формальные параметры, которые используются только в подпрограмме и при обращении к ней заменяются на фактические параметры, т. е. на соответствующие данные программы 2. Фактические параметры должны соответствовать формальным по количеству, порядку перечисления и типу.
Существует два способа замены формальных параметров на фактические:»по ссылке» (call-by-reference) и «по значению» (call-byvalue). Передача параметра «по ссылке» означает передачу в подпрограмму адреса фактического параметра. При этом любое изменение формального параметра внутри подпрограммы есть изменение соответствующего фактического параметра.
Поэтому константы и выражения нельзя передавать «по ссылке» — они могут измениться. Передача параметров «по значению» означает пересылку значения фактического параметра в ячейку, соответствующую формальному параметру, при обращении к подпрограмме. Это обеспечивает сохранность величины фактического параметра.
Язык Си для начинающих / #6 — Функции в Си
Изменение формального параметра внутри подпрограммы никак не отражается на фактическом. «По значению» нельзя передавать переменные-результаты подпрограммы; их следует передавать «по ссылке». Если фактическое значение может быть константой или выражением, то следует использовать замену «по значению».
Заметим, что при передаче «по ссылке», как правило, экономится память, так как формальные параметры не копируют фактические; поэтому массивы обычно передаются «по ссылке». При передаче «по значению» обычно экономится время работы подпрограммы (за счет отсутствия переадресации при обращении к формальным параметрам). Здесь имеется некоторая аналогия с формулой.
Вместо обозначений, участвующих в формуле можно подставить другие обозначения, числа или выражения. 2 2 В большинстве алгоритмических языков имеется два вида подпрограмм: подпрограммы общего назначения (они часто называются процедурами) и функции.
Функции следует использовать, если подпрограмма имеет одно выходное значение; классическими примерами функций во всех алгоритмических языках являются стандартные математические функции: синус, косинус, абсолютная величина и т. д. Имя функции является не только именем ее алгоритма, но и именем результата; это имя можно использовать в выражениях (как sin, cos, abs, и т. д.) Говорят, что функция через свое имя возвращает единственный (или основной) результат. Си, пожалуй, является исторически первым языком программирования, где отсутствуют подпрограммы общего назначения (есть только функции).
Конечно, существуют специальные приемы, которые позволяют на базе функции Си получить конструкцию, аналогичную процедуре. 2.2. Функции СИ Как всегда при изучении подпрограмм, рассмотрим два вопроса: описание функций Си и обращение к ним. 2.2.1.
Описание функции Общий вид описания функций: Тип Имя_Функции(Список_Формальных_Параметров) < Описания данных Операторы return(выражение, возвращаемое функцией) >Конструкция Тип Имя_Функции(Список_Формальных_Параметров) называется заголовком, остальная часть — блоком функции. Для того, чтобы запрограммировать вызов функции, достаточно знать заголовок.
В заголовке тип — тип возвращаемого значения; если он отсутствует, то по умолчанию принимается int. В операторе return указывается выражение, значение которого присваивается имени функции; этот основной или единственный результат функции.
В качестве типа 3 может использоваться слово void3; в этом случае значение через имя функции не возвращается, т. е. имеем аналог подпрограммы общего назначения; тогда, естественно, return не нужен. Имя_Функции имеет два смысла: 1) имя алгоритма; более строго, имя функции — это особый указатель (указатель на функцию), его значение — адрес точки входа в функцию; 2) возвращаемое значение (имя функции можно использовать в выражениях).
Заметим, что использование имени функции внутри ее блока рассматривается как обращение функции к ней самой (рекурсивное обращение). После имени функции обязательно должны идти скобки со списком параметров (если этот список не пустой). Использовать имя функции в выражениях как имя простой переменной нельзя.
Если это необходимо по смыслу задачи, например, для накапливания результата, то следует завести промежуточную переменную и использовать ее вместо имени функции, а затем ее значение присвоить имени функции с помощью оператора return (см. пример 2 п.2.2.4). Если имя функции main, то это главная функция, она первой получает управление после запуска программы; main обязательно присутствует в программе, и только один раз.
В настоящем пособии рассматриваем main без параметров, хотя Си позволяет разрабатывать программы с параметрами. Список формальных параметров.имеет вид: тип1 параметр1, тип2 параметр2. типN параметрN В список формальных параметров во всех алгоритмических языках включаются переменные, которые передаются из главной (или другой вызывающей) функции в вызываемую функцию и из вызываемой функции в вызывающую.
Иначе говоря, формальные параметры — это “вход” и “выход” функции. У формальных параметров-массивов при описании можно не указывать число значений первого индекса. Void (англ.) -пустой, свободный, незанятый; в Си это ключевое слово используется в двух значениях: либо отсутствующее значение, либо любой тип.
3 4 Если список формальных параметров отсутствует или вместо него стоит слово void, то нет передачи значений в функцию. Замена формальных параметров на фактические в Си происходит только “по значению”, поэтому у переменных-результатов функции в список формальных параметров следует включать адрес (вспомните функцию scanf –п. 1.3.3).
Имя массива является адресом начала массива, поэтому массивы в Си передаются только «по ссылке», передачу массивов “по значению” осуществить невозможно. 2.2.2.
Обращение к функции Существует два способа обращения к функции: 1) как к процедуре общего назначения, т. е. можно для вызова функции использовать оператор Имя_Функции(Список_Фактических_Параметров) 2) как к функции, т. е. можно указатель функции Имя_Функции(Список_Фактических_Параметров) — использовать в выражениях. Для функции типа void допустим только первый способ.
Заметим еще раз, что фактические параметры должны соответствовать формальным по количеству, порядку перечисления и типу. 2.2.3. Место описания функции в программе Функция не может быть описана внутри другой функции. Функция (как всё в программе) должна быть описана до использования; если это не так, то до использования необходимо поместить прототип (шаблон) функции.
Самый простой и лучший вариант шаблона: заголовок функции, в котором могут отсутствовать имена формальных параметров (но присутствуют их типы). Формальное отличие шаблона от заголовка функции состоит в присутствии точки с запятой после скобки, закрывающей список формальных параметров.
Наличие шаблона позволяет компилятору контролировать соответствие типа возвращаемого функцией значения и соответствие количества и типов формальных и фактических параметров. 5 Общеупотребительная практика состоит в соблюдении следующих правил: 1) надо ставить шаблоны в начало программного файла; 2) удобно записывать часто употребляемые шаблоны в заголовочный файл, подключаемый к программе директивой include препроцессора (см. п. 2.3.3).
Обратите внимание, что в всех рассмотренных примерах Си-программ с помощью директивы include подключались именно файлы, содержащие шаблоны библиотечных функций, т. е. заголовочные файлы. 2.2.4. Примеры программ, использующих функции Пример 1. Даны две матрицы: а из 3-х строк и 5 столбцов (в дальнейшем будем условно записывать а[3*5]) и b[7*3].
Вычислить минимальные значения для каждой строки каждой из этих матриц. Естественно, вычисление минимальных значений строк произвольной матрицы следует оформить как функцию (назовем ее minmatr), а затем применить ее два раза к конкретным (фактическим) матрицам а и b. Алгоритм ввода одинаков для матриц а и b, поэтому ввод также оформим как функцию (назовем ее matrin).
Аналогично вывод массива результатов будет процедура masout. Поясним, как составляются заголовки на примере функции minmatr. Функция имеет столько результатов, сколько строк у матрицы, все они равноправны, поэтому нет причины передавать один из них через имя функции, и, следовательно, тип функции — void.
В список формальных параметров передаются «входные» данные для функции: матрица а и ее размеры (n — число строк, m — число столбцов), и «выходные» данные: min — массив минимальных значений строк. Заметим, что обозначения, принятые в одной функции (a, n,m,min) никоим образом не связаны с обозначениями в других функциях (в том числе main), т. е. программирование функций выполняется автономно друг от друга.
Переменная min — результат работы функции, поэтому в список формальных параметров должен быть включен ее адрес. Так как min является массивом, то это требование удовлетворяется автоматически, без применения специальных операций.
6 Типы фактических и формальных параметров должны совпадать, поэтому размеры формальных массивов должны подходить и для матрицы а, и для матрицы b. Чтобы удовлетворить этому требованию, используем максимальный второй размер (число столбцов), подходящий и для а, и для b, т. е. память под массивы отводится с избытком. Первый размер — число строк — в списке формальных параметров можно не указывать.
Получаем заголовок: void minmatr(float a[ ][5],int n,int m,float min[ ]). Дальнейшие комментарии приведены в тексте программы. Блоксхема функции minmatr приведена на рис. 10.
Программа: #include #include void masout(float a[ ],int n,char c);/* если стоит «;», то это шаблон*/ /*первый размер у массивов-формальных параметров можно*/ /* не указывать, второй задан по максимуму*/ void matrin(float [ ][5],int n,int m,char с);/* c -имя матрицы*/ /* используется при выводе пояснительных фраз и приглашений*/ void minmatr(float [ ][5],int n,int m,float min[ ]); /* n и m во всех функциях передаются по значению, т. к. их*/ /*фактические значения — константы*/ void main() void minmatr(float a[][5],int n,int m,float min[]) float min(float a[], int n) a=. ; b=. ; extern int c; > f4() float f1() < a=. > f5() float b; . Глобальная переменная а может использоваться во всех функциях файла 1, т. к. она описана в самом начале файла 1; она также доступна всем функциям файла 2, потому что объявление extern float a стоит в начале файла 2. Глобальная переменная i файла 1 недоступна ни одной функции этого файла, так как каждая функция имеет локальную переменную i. Описание int i приводит к выделению ячейки памяти под переменную i каждый раз при входе в блок <. >,где стоит это описание; при выходе из блока эта ячейка освобождается. Локальные i доступны только в блоке своей функции, а глобальная i — во всем файле 1, за исключением этих функций.
Глобальная переменная b файла 1 может использоваться в функции f2, т. к. объявлена до описания f2. В функциях, описанных выше объявления b, эта переменная недоступна. Объявление extern float b в блоке функции main, позволяет этой функции использовать b; тем не менее, для f1 переменная b остается недоступной.
16 В файле 2 вместо двух объявлений int c и extern int c можно было бы оставить только int c, поместив его на место extern int c. Рекомендации. 1. По возможности описания глобальных переменных, в том числе и extern, следует ставить в начало файла. 2. Не стоит делать глобальными промежуточные переменные (например, i в программе, приведенной ниже), потому что: 1) это делает подпрограмму менее универсальной, так как приводит к появлению непонятного пользователю «стыка» — промежуточной глобальной переменной; 2) приводит к неэкономному расходованию памяти, так как глобальные переменные занимают память в течение всего времени работы программы. Однако допустимо использование глобальных переменных для передачи данных между подпрограммами (если не требуется подстановка параметров). Так, если бы в примере 1 п.2.2.4 требовалось обработать одну матрицу, то можно было бы использовать функции без параметров: #include #include void masout(); void matrin(); void minmatr(); float a[3][5],min[3]; void main() void minmatr ()
В закладки
Разместил пособие
lida.denisova.87
Эксперт по предмету «Программирование»
Поделись лекцией и получи скидку 30% на платформе Автор24
Заполни поля и прикрепи лекцию. Мы вышлем промокод со скидкой тебе на почту
Твоя лекция отправлена! Жди скидку на почте. Есть еще материалы? Загрузи прямо сейчас
Загрузить еще лекции
Поделись лекцией и получи промокод на скидку 30% на платформе Автор24
Заполни поля и прикрепи лекцию. Мы вышлем промокод со скидкой тебе на почту
Твоя лекция отправлена! Жди скидку на почте. Есть еще материалы? Загрузи прямо сейчас
Источник: spravochnick.ru
[Язык C] Введение в язык Си (глава 2)
Вторая глава в книжке Стивена Прата “C Primer Plus”. Тут уже появляются первые практические задания; хоть и крайне простые, на запоминание базового синтаксиса; поэтому отдельно их результат вывода приводить не буду. Перед заданиями небольшая памятка:
5 типов операторов в языке C
- Оператор объявления
- Оператор присваивания
- Функция
- Управляющий оператор
- Пустой оператор
Упражнения по программированию
1) Напишите программу, которая использует первый вызов функции printf () для вывода своего имени и фамилии в одной строке, второй вызов printf (), чтобы вывести имя и фамилию в двух строках, и еще два вызова printf () для вывода имени и фамилии в одной строке. Выходные данные должны иметь следующий вид (но с указанием ваших персональных данных):
Иван Иванов ← Первый оператор вывода
Иван ← Второй оператор вывода
Иванов ← По-прежнему второй оператор вывода
Иван Иванов ← Третий и четвертый операторы вывода
#include
int main (void)
<
printf(«Ivan Ivanovn»);
printf(«IvannIvanovn»);
printf(«Ivan «);
printf(«Ivanov»);
getchar();
return 0;
>
2. Напишите программу, выводящую ваше имя и адрес.
#include
int main (void)
<
printf(«My name is Ivan Ivanovn»);
printf(«My address is Moscow»);
getchar();
return 0;
>
3. Напишите программу, которая преобразует ваш возраст в полных годах в количество дней и отображает на экране оба значения. Не обращайте внимания на високосные годы.
#include
int main (void)
<
int years, days;
years = 34;
days = years * 365;
printf(«I live already %d years which is %d days», years, days);
getchar();
return 0;
>
4. Напишите программу, которая производит следующий вывод:
Он веселый молодец!
Он веселый молодец!
Он веселый молодец!
Никто не может это отрицать!
Вдобавок к функции main () в программе должны использоваться две определенные пользователем функции: jolly (), которая выводит сообщение “Он веселый молодец!» один раз, и deny (), выводящая сообщение в последней строке.
#include
void jolly();
void deny();
int main (void)
<
jolly();
jolly();
jolly();
deny();
getchar();
return 0;
>
void jolly()
<
printf(«He is funny good lad!n»);
>
void deny()
<
printf(«No one can’t deny it!n»);
>
5. Напишите программу, которая производит следующий вывод:
Бразилия, Россия, Индия, Китай
Индия, Китай,
Бразилия, Россия
Вдобавок к функции main () в программе должны использоваться две определенные пользователем функции: br (), выводящую строку “Бразилия, Россия” один раз, и ic (), которая один раз выводит строку “Индия, Китай». Функция main () должна позаботиться о любых дополнительных задачах вывода.
6. Напишите программу, которая создает целочисленную переменную по имени toes (англ. — пальцы ног). Программа должна присвоить переменной toes значение 10. Наряду с этим, программа должна вычислить удвоенное значение toes и квадрат toes. Программа должна вывести все три значения, снабдив их соответствующими пояснениями.
#include
int main(void)
<
int toes = 10;
int toes_2x;
int toes_sqrt;
toes_2x = 2 * toes;
toes_sqrt = toes * toes;
printf(«Human got %d toesn», toes);
printf(«Two humans got %d toesn», toes_2x);
printf(«Ten humans got %d toes», toes_sqrt);
getchar();
return 0;
>
7. Многие исследования показывают, что улыбка способствует успеху. Напишите
программу, которая производит следующий вывод:
Улыбайся!Улыбайся!Улыбайся!
Улыбайся!Улыбайся!
Улыбайся!
В программе должна быть определена функция, которая отображает строку
“Улыбайся!» один раз. Эта функция должна вызываться столько раз, сколько необходимо
#include
void smile();
int main(void)
<
smile(); smile(); smile();
printf(«n»);
smile(); smile();
printf(«n»);
smile();
printf(«n»);
getchar();
return 0;
>
void smile()
<
printf(«Smile!»);
>
8. В языке С одна функция может вызывать другую. Напишите программу, которая вызывает функцию по имени one_three ( ) . Эта функция должна вывести слово “один» в одной строке, вызвать функцию two (), а затем вывести слово “три» тоже в одной строке. Функция two () должна отобразить слово “два» в одной строке. Функция main () должна вывести слово “начинаем:» перед вызовом функции one_three () и слово “порядок!» после ее вызова. Таким образом, выходные данные должны иметь следующий вид:
начинаем:
#include
void one_three();
void two();
int main()
<
printf(«start:n»);
one_three();
printf(«good!n»);
getchar();
return 0;
>
void one_three()
<
printf(«onen»);
two();
printf(«threen»);
>
void two()
<
printf(«twon»);
>
Буду рад вашим комментариям!
Источник: skobki.com
курсовая Использование функций языка Си. Использование функций языка Си
Единственный в мире Музей Смайликов
Самая яркая достопримечательность Крыма
Скачать 24.95 Kb.
Федеральное агентство связи
Сибирский государственный университет телекоммуникаций и информатики
Курсовая работа по информатике на тему
«Использование функций языка Си»
Выполнил студент группы
- Введение
- Описание и определения
Сигнатура функции определяет правила использования функции. Обычно сигнатура представляет собой описание функции, включающее имя функции, перечень формальных параметров с их типами и тип возвращаемого значения.
Семантика функции определяет способ реализации функции. Обычно представляет собой тело функции.
Определение функции
- тип возвращаемого значения;
- имя функции;
- информация о формальных аргументах;
- тело функции.
Системные функции хранятся в стандартных библиотеках, и пользователю не нужно вдаваться в подробности их реализации. Достаточно знать лишь их сигнатуру. Примером системных функций, используемых ранее, являются функции printf() и scanf().
Собственные функции — это функции, написанные пользователем для решения конкретной подзадачи.
Разбиение программ на функции дает следующие преимущества:
Функцию можно вызвать из различных мест программы, что позволяет избежать повторения программного кода.
Одну и ту же функцию можно использовать в разных программах.
Функции повышают уровень модульности программы и облегчают ее проектирование.
Использование функций облегчает чтение и понимание программы и ускоряет поиск и исправление ошибок.
С точки зрения вызывающей программы функцию можно представить как некий «черный ящик», у которого есть несколько входов и один выход. С точки зрения вызывающей программы неважно, каким образом производится обработка информации внутри функции. Для корректного использования функции достаточно знать лишь ее сигнатуру.
Фактический аргумент — это величина, которая присваивается формальному аргументу при вызове функции. Таким образом, формальный аргумент — это переменная в вызываемой функции, а фактический аргумент — это конкретное значение, присвоенное этой переменной вызывающей функцией. Фактический аргумент может быть константой, переменной или выражением.
Если фактический аргумент представлен в виде выражения, то его значение сначала вычисляется, а затем передается в вызываемую функцию. Если в функцию требуется передать несколько значений, то они записываются через запятую. При этом формальные параметры заменяются значениями фактических параметров в порядке их следования в сигнатуре функции.
Возврат в вызывающую функцию
По окончании выполнения вызываемой функции осуществляется возврат значения в точку ее вызова. Это значение присваивается переменной, тип которой должен соответствовать типу возвращаемого значения функции. Функция может передать в вызывающую программу только одно значение. Для передачи возвращаемого значения в вызывающую функцию используется оператор return в одной из форм:
Действие оператора следующее: значение выражения, заключенного в скобки, вычисляется и передается в вызывающую функцию. Возвращаемое значение может использоваться в вызывающей программе как часть некоторого выражения.
Оператор return также завершает выполнение функции и передает управление следующему оператору в вызывающей функции. Оператор return не обязательно должен находиться в конце тела функции.
Функции могут и не возвращать значения, а просто выполнять некоторые вычисления. В этом случае указывается пустой тип возвращаемого значения void, а оператор return может либо отсутствовать, либо не возвращать никакого значения:
В языке Си нельзя определять одну функцию внутри другой.
- тип возвращаемого значения;
- имя функции;
- типы формальных аргументов в порядке их следования.
- Выполнение лабораторной работы
#include //terminal for Windows
float cap(float a, float b, float x)
Источник: topuch.com