- •Программирование
- •На языке высокого уровня
- •Часть 1. Основы языка Си
- •Методические указания
- •К выполнению лабораторных работ
- •Составитель: л.А. Прокушев
- •Подписано к печати Формат 60х84 1/16. Бумага тип. №3
- •Редакционно-издательский отдел
- •190000, Санкт-Петербург, ул. Б. Морская, 67 Общие методические указания
- •Алгоритмизация вычислительных процессов
- •Средства программирования вычислительных процессов Базовые элементы языка Си
- •Данные и их типы
- •Константы
- •Переменные
- •Ввод-вывод данных
- •Форматированный ввод
- •Форматированный вывод
- •Консольный ввод-вывод
- •Функция ввода символа (без отображения)
- •Функция очистки экрана результатов
- •Структура Си-программы
- •Директивы препроцессора
- •Выражения и операции
- •Логические выражения и операции
- •Работа с ветвящимися процессами Операторы
- •Оператор присваивания
- •Условный оператор (if)
- •Операторы передачи управления Пустой оператор
- •Оператор break (прервать) используется для прерывания работы текущего сложного оператора, в теле которого находится оператор break, и передачи управления на следующий по порядку оператор.
- •Оператор выбора (switch)
- •Действие оператора выбора состоит в следующем:
- •Введите 2 числа х, y : 3 8
- •Работа с циклическими вычислительными процессами
- •Циклы с фиксированным числом повторений Оператор цикла с предусловием (while)
- •Прерывание цикла
- •Циклы с неизвестным числом повторений Вычисление рекуррентных последовательностей
- •Оператор цикла с постусловием (do)
- •Вложенные циклы и организация диалога в программе
- •Оператор цикла с параметром (for)
- •Программа:
- •Программа:
- •Программа:
- •Работа с массивами
- •Описание массива
- •Доступ к элементам массива
- •Указатель
- •Занесение данных в массив
- •Многомерные массивы
- •Работа с функциями
- •Определение функции
- •Вызов функции
- •Передача параметров функции
- •Передача данных по значению
- •Передача данных по адресу
- •Пример. Составить функцию обмена значениями между переменными X и y. Верным решением является применение передачи данных по адресу.
- •Прототип (шаблон) функции
- •Блочная структура программы
- •Внешние описания переменных
- •Многомодульные программы Проект программы
- •Внешние ссылки
- •Создание проекта программы
- •Работа с указателями Объявления объектов со сложными описателями
- •Массивы указателей
- •Указатель на указатель
- •Указатель на функцию
- •Использование указателя на функцию как аргумента
- •Массивы указателей на функции
- •Часть 1. Основы языка Си 1
Работа с функциями
Разработка больших программ осуществляется с использованием модульного принципа программирования, суть которого состоит в том, что алгоритм задачи разбивается на ряд подзадач, для решения которых на ЭВМ создаются подпрограммы. Для решения задачи в целом в программе, называемой главной (основной), организуются обращения (вызовы) к подпрограммам. Подпрограммы делятся на стандартные, которые находятся в библиотеке подпрограмм на ЭВМ, и пользовательские, разрабатываемые пользователем.
В языке Си подпрограммы называются функциями. Функция – это логически самостоятельная именованная часть программы, которой могут передаваться параметры и которая может возвращать какие-то результаты. Си-программа состоит из одной или нескольких функций, причем только одна является обязательной и определяется как главная функция с именем main. С этой функции начинается исполнение программы. Последовательность функций может быть произвольной. Функции могут вызывать друг друга (кроме функции main).
Однако для успешной компиляции программы должно соблюдаться правило: вызову функции предшествует либо определение (описание) функции, либо объявление (прототип, шаблон) функции, задающее информацию о заголовке функции. Синтаксис языка Си запрещает внутри определения функции помещать определение другой функции, то есть не может быть вложенных функций.
Определение функции
Определение функции имеет следующую структуру:
тип имя_функции (список параметров) /* заголовок функции */
{ /* тело функции - блок */
описания данных; /* необязательная часть */
операторы; /* обязательная часть */
}
Рассмотрим составляющие заголовка функции.
тип – задает тип возвращаемого функцией значения (по умолчанию принят тип int); если функция не возвращает значения, то используется ключевое слово void (отсутствие типа).
имя_функции (произвольный идентификатор) – это особый тип указателя-константы, называемого указателем на функцию, и его значением является адрес точки входа в функцию. Имени функции может предшествовать символ *. Это значит, что функция возвращает указатель (адрес) на некоторый объект любого типа, в том числе на массив и другую функцию.
список параметров задает последовательность формальных параметров, разделяемых запятыми. Каждый параметр определяется его типом и именем с возможными модификаторами, описывающими указатель – *, массив – [], функцию – (). При отсутствии параметров список может быть пустым, либо содержит ключевое слово void .
В конце заголовка функции разделитель точка с запятой не ставится.
Примеры заголовков функций:
int save (float value ) или save (float value)
void getline (char array[], int size )
float fget () или float fget( void)
char *strcpy( char *tp , char *sp)
Совокупность предложений в фигурных скобках {} называют телом функции. Тело функции образует блок (или составной оператор), определяющий действия функции и её результаты. Блок может содержать описания переменных, используемых в этом блоке, поэтому эти переменные являются локальными, если не объявлено иначе. Операторы тела функции выполняются, пока не встретится оператор return (возврат) или конец функции (последняя закрывающая фигурная скобка – } ), при этом управление возвращается в точку вызова функции.
Функция возвращает значение, если встретится оператор возврата вида
return выражение или return (выражение) ,
при этом значение выражения приводится к типу функции. Если оператор return не содержит выражения или отсутствует, то значение не возвращается, а только передается управление в точку вызова функции с типом void.
Пример. Составить функцию вычисления суммы двух целых чисел.
а) int sum (int a, int b) /* заголовок функции */
{ int m ; /* локальная переменная */
m=a+b; /* получение результата */
return m; /* возврат значения функции */
}
б) Более короткий вариант:
sum (int a, int b)
{ return a+b; }