- •Программирование
- •На языке высокого уровня
- •Часть 1. Основы языка Си
- •Методические указания
- •К выполнению лабораторных работ
- •Составитель: л.А. Прокушев
- •Подписано к печати Формат 60х84 1/16. Бумага тип. №3
- •Редакционно-издательский отдел
- •190000, Санкт-Петербург, ул. Б. Морская, 67 Общие методические указания
- •Алгоритмизация вычислительных процессов
- •Средства программирования вычислительных процессов Базовые элементы языка Си
- •Данные и их типы
- •Константы
- •Переменные
- •Ввод-вывод данных
- •Форматированный ввод
- •Форматированный вывод
- •Консольный ввод-вывод
- •Функция ввода символа (без отображения)
- •Функция очистки экрана результатов
- •Структура Си-программы
- •Директивы препроцессора
- •Выражения и операции
- •Логические выражения и операции
- •Работа с ветвящимися процессами Операторы
- •Оператор присваивания
- •Условный оператор (if)
- •Операторы передачи управления Пустой оператор
- •Оператор break (прервать) используется для прерывания работы текущего сложного оператора, в теле которого находится оператор break, и передачи управления на следующий по порядку оператор.
- •Оператор выбора (switch)
- •Действие оператора выбора состоит в следующем:
- •Введите 2 числа х, y : 3 8
- •Работа с циклическими вычислительными процессами
- •Циклы с фиксированным числом повторений Оператор цикла с предусловием (while)
- •Прерывание цикла
- •Циклы с неизвестным числом повторений Вычисление рекуррентных последовательностей
- •Оператор цикла с постусловием (do)
- •Вложенные циклы и организация диалога в программе
- •Оператор цикла с параметром (for)
- •Программа:
- •Программа:
- •Программа:
- •Работа с массивами
- •Описание массива
- •Доступ к элементам массива
- •Указатель
- •Занесение данных в массив
- •Многомерные массивы
- •Работа с функциями
- •Определение функции
- •Вызов функции
- •Передача параметров функции
- •Передача данных по значению
- •Передача данных по адресу
- •Пример. Составить функцию обмена значениями между переменными X и y. Верным решением является применение передачи данных по адресу.
- •Прототип (шаблон) функции
- •Блочная структура программы
- •Внешние описания переменных
- •Многомодульные программы Проект программы
- •Внешние ссылки
- •Создание проекта программы
- •Работа с указателями Объявления объектов со сложными описателями
- •Массивы указателей
- •Указатель на указатель
- •Указатель на функцию
- •Использование указателя на функцию как аргумента
- •Массивы указателей на функции
- •Часть 1. Основы языка Си 1
Вызов функции
Обращение к функции имеет вид
имя_функции (список аргументов), где
список аргументов – последовательность выражений, разделенных запятыми, представляющих фактические параметры, которые должны соответствовать списку формальных параметров в количестве, порядке следования и типах параметров. При передаче параметров в функцию может выполняться дополнительное преобразование типов фактических параметров к типу формальных.
Возможны два способа вызова функции:
Вызов функции – операнд.
В этом случае значение, возвращаемое функцией, используется в выражении, где функция участвует как операнд; например:
int fun1(int k) /* заголовок функции */
m = fun1(n) * p; /* вызов функции-операнда */
Вызов функции – оператор.
Если вместо типа функции стоит слово void или возвращаемое значение функции игнорируется, а используются только фактические параметры, то вызов функции задается как отдельный оператор, например:
void fun2 (int mas[]) /* заголовок функции */
fun2 (ar[10]); /* вызов функции-оператора */
Передача параметров функции
При обработке вызова функции возможны два способа передачи данных в функцию и из функции: по значению и по адресу.
Передача данных по значению
Обрабатывая вызов функции, компилятор осуществляет запись копий значений фактических параметров (выражений, переменных или констант) в стек (временную память). Формальные параметры при выполнении тела функции работают с копиями аргументов. Таким образом, формальные и фактические параметры изолируются друг от друга, поэтому в теле функции нельзя изменить значение фактического параметра.
Пример. Составить функцию Sum, которая увеличивает свои параметры на 1 и возвращает их сумму, и использовать ее в главной функции.
Программа:
int Sum (int a, int b) /* описание функции Sum */
{ a++; b++; return (a+b); }
void main ( ) /* главная функция */
{ int m, k=5, l=4; /* фактические параметры */
m = Sum(k, l); /* передача аргументов по значению */
printf (“m=%d k=%d l=%d “, m, k, l ”);
}
Результат программы: m=11 k=5 l=4,
то есть фактические параметры (k, l) остались без изменения после вызова функции.
Такой способ используется, если необходимо сохранить значения фактических параметров после работы вызываемой функции.
Передача данных по адресу
В этом случае в качестве аргументов при вызове функции передаются не копии переменных, а копии адресов переменных. Формальный и фактический параметр, используя один и тот же адрес (указатель), получают доступ к общему участку памяти (переменной). После применения операции разадресации (* – обращения по адресу) в функции можно изменить значение фактического параметра и использовать его как один из результатов функции.
Пример. Составить функцию Sum, которая использует в качестве параметров указатели и решает задачу, аналогичную предыдущему примеру.
Программа.
int Sum (int *a , int *b) /* функция Sum с указателями */
{(*a)++; (*b)++; return (*a + *b); }
void main () /* главная функция */ { int m, k=5, l=4; /* фактические параметры */
m = Sum (&k, &l); /* передача адресов аргументов */
printf(“m=%d k=%d l=%d”, m, k, l);
}
Результат программы: m=11 k=6 l=5 ,
то есть фактические параметры (k, l) изменили свои значения после вызова функции.