- •Предисловие
- •Знакомство с языком C
- •Структура программы
- •Пример простой программы
- •Более сложный пример
- •Контрольные вопросы
- •Основные понятия, объявление переменных, типы данных
- •Объявление переменных
- •Примеры описаний переменных:
- •Основные типы данных
- •Производные типы.
- •Контрольные вопросы
- •Ввод/вывод с помощью функций printf() и scanf().
- •Модификаторы спецификаций преобразования используемые в функции printf()
- •Применение функции scanf()
- •Контрольные вопросы
- •Операции
- •Простейшие арифметические операции
- •Операция присваивания
- •Использование в выражениях операндов разных типов
- •Операции преобразования типов
- •Дополнительные арифметические операции
- •Дополнительные операции присваивания
- •Операции отношения
- •Логические операции
- •Приоритеты операций
- •Таблица 3. Таблица приоритетов рассмотренных выше операций
- •Контрольные вопросы
- •Операторы
- •Оператор-выражение
- •Ветвление
- •Условный оператор
- •Оператор switch
- •Оператор break
- •Циклы
- •Цикл while
- •Цикл do…while
- •Цикл for
- •Другие операторы
- •Оператор continue
- •Оператор goto
- •Оператор вызова функции
- •Контрольные вопросы
- •Обработка числовых последовательностей
- •Последовательная обработка
- •Обработка числовых последовательностей
- •Примеры
- •Контрольные вопросы
- •Последовательная обработка символьных данных
- •Символьные данные
- •Последовательная обработка символов
- •Функции getchar( ) и putchar( )
- •Контрольные вопросы
- •Обработка массивов
- •Массивы
- •Объявление массива
- •Использование и обработка массивов
- •Примеры
- •Контрольные вопросы
- •Указатели и динамические массивы
- •Указатели
- •Динамическое выделение памяти
- •Статические и динамические массивы
- •Контрольные вопросы
- •Подпрограммы
- •Описание подпрограмм
- •Параметры подпрограмм
- •Область действия переменных
- •Примеры
- •Контрольные вопросы
- •Рекурсивные функции
- •Понятие рекурсивной функции
- •Контрольные вопросы
- •Символьные строки и функции обработки строк
- •Посимвольная обработка строк
- •Пример программы
- •Контрольные вопросы
- •Структуры
- •Тип данных структура
- •Контрольные вопросы
- •Работа с файлами
- •Примеры
- •Контрольные вопросы
- •Массивы и функции как параметры
- •Указатели на функции
- •Массивы и указатели
- •Указатели и двумерные массивы
- •Пример
- •Технологии программирования
- •Структурное программирование
- •Модульное программирование
- •Объектно-ориентированное программирование
- •Компонентное программирование
- •Структурная декомпозиция задачи и разработка алгоритмов и программ методами сверху вниз и снизу вверх
- •Контрольные вопросы
- •Модульное программирование
- •Работа с графикой на языке C и модуль graphics.h
- •Типы видео мониторов и их режимы
- •Инициализация графики
- •Система координат
- •Основные графические функции
- •Функции рисования
- •Функции изменения параметров рисования
- •Шаблоны линий
- •Шаблоны закраски
- •Задание на расчетно-графическую работу
- •Порядок выполнения работы
- •Задание
- •Задание для вариантов 1-11
- •Задание для вариантов 12-20
- •Задание для вариантов 21-40
- •Пример исходных данных для вариантов 12-16
- •Задание для вариантов 41-60
- •Варианты индивидуальных заданий
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •Вариант 6
- •Вариант 7
- •Вариант 8
- •Вариант 9
- •Вариант 10
- •Вариант 11
- •Вариант 12
- •Вариант 13
- •Вариант 14
- •Вариант 15
- •Вариант 16
- •Вариант 17
- •Вариант 18
- •Вариант 19
- •Вариант 20
- •Вариант 21
- •Вариант 22
- •Вариант 23
- •Вариант 24
- •Вариант 25
- •Вариант 26
- •Вариант 27
- •Вариант 28
- •Вариант 29
- •Вариант 30
- •Вариант 31
- •Вариант 32
- •Вариант33
- •Вариант 34
- •Вариант 35
- •Вариант 36
- •Вариант 37
- •Вариант 38
- •Вариант 39
- •Вариант 40
- •Вариант 41
- •Вариант 42
- •Вариант 43
- •Вариант 44
- •Вариант 45
- •Вариант 46
- •Вариант 47
- •Вариант 48
- •Вариант 49
- •Вариант 50
- •Вариант 51
- •Вариант 52
- •Вариант 53
- •Вариант 54
- •Вариант 55
- •Вариант 56
- •Вариант 57
- •Вариант 58
- •Вариант 59
- •Вариант 60
- •Задания на курсовую работу
- •Требования к курсовой работе
- •Этапы разработки программ
- •Содержание отчета по курсовой работе
- •Задания к курсовой работе
- •Литература
- •Функции консольного ввода/вывода
- •Функции обработки строк
- •Функции преобразования данных
Подпрограммы
Описание подпрограмм
Подпрограмма - это программа, которая выполняется в составе одной или нескольких программ. В сложных программах в виде подпрограммы чаще всего определяют функционально самостоятельный фрагмент алгоритма, который возможно используется неоднократно.
Для подпрограмм используются обозначения, аналогичные функциям в математике.
Перед использованием функции необходимо дать ее определение,
например: P(x) = x * (x + 1)
После этого ее можно использовать, например, получить значение функции P(x) при x=10: P(10) = 10 *( 10 + 1) = 110
Вызов подпрограммы (команда «выполнить подпрограмму») записывается аналогично использованию математической функции:
f(a1, a2, ... , an)
где f - имя подпрограммы (аналогично имени функции P), a1, a2, ... , an -
аргументы вызова (фактические параметры), конкретные величины,
подставляемые вместо формальных параметров при выполнении подпрограммы (как аргумент 10 при вычислении значения функции P).
Формальный параметр – это входная или выходная переменная подпрограммы, указанная в заголовке ее определения (как x в левой части определения функции P(x)).
При изменении имени формального параметра смысл подпрограммы не изменяется (как если бы в определении функции F(x) заменить x, например,
на y).
Подпрограммы могут быть двух типов:
•функция – подпрограмма, обладающая значением;
•процедура – подпрограмма, не обладающая значением.
Вязыке С все подпрограммы называют функциями и различают:
85
•функции, обладающие значением;
•функции, не обладающие значением.
Алгоритм подпрограммы записывается в форме определения функции. Программа на языке С состоит из определений функций, одна из которых должна иметь имя main (главная). С нее начинается выполнение программы.
Определение функции имеет вид:
<Заголовок_ функции> |
// тело |
|
{ |
<Объявление переменных функции> |
|
} |
<Операторы функции> |
// функции |
|
|
Заголовок функции имеет вид:
<тип значения> <имя функции> ([<тип> <имя>[,<тип> <имя>] …])
Если функция не обладает значением, в качестве типа значения пишется ключевое слово void. Тип значения функции разрешается не указывать. В этом случае (по умолчанию) подразумевается тип int.
Взаголовке функции в скобках заданы типы и имена формальных параметров, разделенных запятыми. При отсутствии параметров скобки могут быть пустые или в скобках указывается слово void.
Втеле функции определяются действия, которые будут выполнены после ее вызова. Тело функции начинается с объявления всех использованных в ней локальных переменных. Локальные переменные могут использоваться только в той функции, где объявлены. Формальные параметры локальны для функции. Далее следуют операторы, реализующие функцию.
Выполнение подпрограммы завершается при выполнении оператора возврата или достижении конца тела функции.
Оператор возврата имеет вид:
return [<выражение>];
В теле функции, обладающей значением, обязательно должен быть оператор возврата, где тип вычисленного выражения должен соответствовать типу значения функции. Значение выражения становится значением функции: оно передается в вызывающую программу и подставляется вместо вызова функции. Оператор возврата вида return; (без выражения)
86
осуществляет возврат в вызывающую программу в точку, следующую за вызовом подпрограммы. Если функция не возвращает значение, оператор возврата может отсутствовать.
Подпрограмма выполняется после ее вызова. Программа, в составе которой выполняется подпрограмма, по отношению к подпрограмме называется главной, основной или вызывающей программой. В то же время,
она сама может быть подпрограммой (подчиненной программой) по отношению к вызывающей ее программе.
Вызов подпрограммы, т.е. команда для выполнения подпрограммы имеет вид:
<имя функции> ([<имя> [,<имя>] …])
При вызове подпрограммы (в скобках) определяются имена фактических параметров (аргументы вызова). Фактические параметры подставляются вместо формальных параметров при выполнении подпрограммы.
Вызов функции, не обладающей значением, обозначает действие и
может записываться только как самостоятельный оператор.
Вызов функции, обладающей значением, называется указателем и обозначает значение, может входить в состав выражения как операнд.
Значение функции используется при вычислении значения выражения. Например, вызов функции может быть в правой части оператора присваивания.
Вызов функции, обладающей значением (возвращающей значение), в
операторе присваивания:
<имя переменной> = <имя функции> ([<имя> [, <имя>] …]);
Например, в языке С операция извлечения квадратного корня из величины x реализуется вызовом стандартной функции sqrt (x). Можно записать выражение, содержащее вызовы функций sqrt с разными аргументами, называемыми фактическими параметрами функции:
z= (sqrt (x) + sqrt (y*2)) / 2;
Примеры заголовков функций, не обладающих значением:
87
void p_f (float x, float *z) - процедура p_f от входного вещественного параметра x и выходного вещественного параметра z;
void p_fakt (int k, int *f) - процедура p_fakt с входным целочисленным параметром k и выходным целочисленным параметром f.
Примеры вызова функций p_f и p_fakt:
float a = 15.2, b; int p;
p_f (a, &b); p_fakt (4, &p);
Примеры заголовков функций, обладающих значением:
float f (float x) - вещественная функция f от вещественного параметра x; int fakt (int k) - целочисленная функция fakt с входным целочисленным
параметром k.
Примеры вызова функций f и fakt:
float a, |
b; |
||
int |
n=4, |
p; |
|
a = |
15.2; |
*f(20.5); |
|
b |
= |
f (a) |
|
p |
= |
fakt |
(n) + fakt(5); |
Пример описания функции:
/* функция определения наибольшего из двух чисел */ float max ( float x, float y )
{ if (x>y) return x; else return y;
}
Пример вызова функции:
f = max(a,b) - max(a+b,c);
содержит два вызова приведенной выше функции max. При первом обращении функции max передаются значения переменных a и b, она возвращает наибольшее из этих чисел, которое подставляется вместо указателя функции max(a,b). При втором вызове функции max формальным параметрам x и y присваиваются соответственно значения фактических параметров a+b и c. Оператор return возвращает наибольшее из этих значений в точку вызова функции.
Если определение функции в программе расположено позже вызова, то до вызова, в начале программы, необходимо поместить объявление функции
88