- •Основы алгоритмизации и программирования, язык Си
- •Введение
- •Блок-схема алгоритма Общие требования к блок-схеме алгоритма
- •Линейные и разветвляющиеся процессы
- •Циклические процессы
- •Итерационные процессы
- •Комментарии
- •Типы данных
- •Данные целого типа
- •Данные вещественного типа
- •Модификатор const
- •Переменные перечисляемого типа
- •Константы
- •Описание переменных
- •Локальные переменные
- •Операции и выражения
- •Операция присваивания
- •Арифметические операции
- •Операции поразрядной арифметики
- •Логические операции
- •Операции отношения
- •Инкрементные и декрементные операции
- •Операция sizeof
- •Порядок выполнения операций
- •Приоритет операций
- •Преобразование типов
- •Операция приведения
- •Операция запятая
- •Ввод и вывод информации
- •Директивы препроцессора Директива #include
- •Директива #define
- •Понятие пустого и составного операторов
- •Условные операторы
- •Операторы организации цикла
- •Оператор цикла for
- •Оператор цикла while
- •Оператор цикла do … while
- •Вложенные циклы
- •Операторы перехода (break, continue, return, goto)
- •Примеры программ
- •Массивы Одномерные массивы
- •Примеры программ
- •Многомерные массивы (матрицы)
- •Примеры программ
- •Указатели Понятие указателя
- •Описание указателей
- •Операции с указателями
- •Связь между указателями и массивами
- •Массивы указателей
- •Многоуровневые указатели
- •Примеры программ
- •Символьные строки
- •Ввод/вывод строк.
- •Функции работы со строками.
- •Примеры программ
- •Функции
- •Прототип функции.
- •Определение функции.
- •Параметры функции
- •Параметры по умолчанию
- •Передача массива в функцию
- •Inline функции
- •Класс памяти
- •Автоматические переменные
- •Статические переменные
- •Регистровые переменные
- •Блочная структура
- •Примеры программ
- •Указатели на функции
- •Примеры программ
- •Рекурсия
- •Примеры программ
- •Аргументы в командной строке
- •Функции с переменным числом параметров
- •Примеры программ
- •Сортировка
- •Пузырьковая сортировка.
- •Шейкер сортировка
- •Сортировка вставкой
- •Сортировка выбором
- •Метод Шелла
- •Метод Хора
- •Структуры
- •Доступ к элементам структуры
- •Инициализация структур
- •Указатели на структуры.
- •Структуры и функции
- •Примеры программ
- •Поля бит
- •Объединения
- •Переменные с изменяемой структурой
- •Примеры программ
- •Организация списков и их обработка
- •Операции со списками при связном хранении
- •Построение обратной польской записи
- •Односвязный линейный список, очередь
- •Двусвязный линейный список
- •Циклический список, кольцо
- •Двусвязный циклический список
- •Примеры программ
- •Деревья
- •Потоки и файлы
- •Файлы Основные сведения о файловой системе
- •Организация посимвольного ввода и вывода
- •Определение конца файла feof()
- •Организация ввода и вывода строк
- •Удаление файлов
- •Дозапись потока
- •Позиционирование в файле
- •Текстовые и двоичные файлы
- •Функции fread() и fwrite()
- •Примеры программ
- •Хеширование
- •Схемы хеширования
- •Метод открытой адресации с линейным опробыванием
- •Метод цепочек
- •Машинное представление графов
- •Примеры программ
- •Литература
Параметры по умолчанию
Иногда в общем объявлении функции описывается больше параметров, чем в требуется в некотором частном случае при ее вызове. Например, если мы хотим в некоторой функции выделять память для динамического размещения в ней числового массива, то наряду с размерностью выделяемой памяти (первый параметр) в функцию можно передавать и некоторый инициализатор(второй, необязательный параметр). Однако если мы его не хотим явно передавать ему может быть присвоено некоторое значение по умолчанию. Чтобы избежать засорения программы вызовами вроде memory(k,0), функция описывается так:
void* memory(long, int =0);
Инициализатор второго параметра является параметром по умолчанию. То есть, если в вызове дан только один параметр, в качестве второго используется параметр по умолчанию. Например:
Параметр по умолчанию проходит проверку типа во время описания функции и вычисляется во время ее вызова. Задавать параметр по умолчанию возможно только для последних параметров, поэтому
int f(int, int =0, char* =0); // верно
int g(int =0, int =0, char*); // ошибка
int h(int =0, int, char* =0); // ошибка
Отметим, что пробел между * и = является существенным (*= является операцией присваивания):
int f(char*=0); // синтаксическая ошибка
Передача массива в функцию
Если в качестве передаваемого аргумента используется массив, то в функцию передается указатель на массив. При вызове функции в списке аргументов записывается имя массива являющееся адресом первого.
Можно использовать три варианта описания массива, в качестве формального параметра функции.
1. Параметр в функции может быть объявлен как массив соответствующего типа с указанием его размера.
#include <stdio.h>
int max(int ms[10]) // прототип функции fun
{ int k=ms[0];
for(int i=1; i<10; i++)
if(k<ms[i]) k=ms[i];
return k;
}
main()
{ int mas[3][4], i, j;
for(i=0; i<3; i++)
{ for(j=0; j<4; j++) scanf( ”%d”&mas[i][j]);
printf(“\nмаксимальное значение в строке %d =%d”, i,fun(mas[i]));
}
}
В этом случае выполняется преобразование mas[i] к указателю на целый тип, и в функцию передается адрес mas[i][0]. В функции находится максимальное значение каждой строки и выводится на экран.
2. Массив в качестве параметра в функции может быть объявлен без указания его размера. Так как сам массив в стек не копируется, то размер массив в общем случае компилятору не требуется.
int max(int ms[]) // прототип функции fun
{ // тело функции аналогично опмсанному выше
}
3. Наиболее распространенный способ – объявление параметра-массива указателем на соответствующий тип данных. Функцию можно описать следующим образом:
int max(int *ms)
{ // тело функции аналогично опмсанному выше
}
Во всех случаях в функцию передается адрес первого элемента массива, то есть указатель соответствующего типа.
В С каждая функция должна иметь уникальное имя. В С++ функции можно переопределять, то есть одно и то же имя можно использовать для вызова различных функций. В этом случае вызов функции определяется либо по количеству параметров, либо по их типу, либо по типу возвращаемого результата, или и тем и другим.