- •1.1. Элементы языка программирования
- •Основные правила записи программы:
- •1.2. Алфавит языка
- •1.3. Лексемы
- •1.4. Концепция данных
- •2.2. Операции
- •2.2.1. Арифметические операции
- •2.2.2. Операции присваивания
- •2.2.3. Операции отношения
- •2.2.4. Логические операции
- •2.2.5. Поразрядные операции
- •2.2.6. Вычисление выражений
- •3. Структурное программирование
- •3.1. Общая характеристика операторов
- •3.2. Оператор-выражение
- •3.3. Условный оператор
- •3.4. Составной оператор
- •3.5. Операторы для программирования циклов
- •3.5.1. Оператор цикла for
- •3.5.2. Оператор цикла while
- •3.5.3. Оператор цикла do while
- •3.5.4. Оператор break
- •3.5.5. Оператор continue
- •3.6. Оператор goto
- •3.7. Пустой оператор
- •3.8. Оператор switch
- •3.9. Оператор return
- •4. Массивы
- •4.1. Объявление массива
- •4.2. Обращение к элементам массива
- •4.3. Типовые алгоритмы работы с массивами
- •4.4. Многомерные массивы
- •5. Строки
- •5.1. Объявление строки
- •5.2. Посимвольная обработка строк
- •5.3. Ввод строк
- •5.4. Библиотечные функции для работы с текстом
- •6. Указатели
- •6.1. Объявление указателей
- •6.2. Операции над указателями
- •6.3. Связь между указателями и массивами
- •6.4. Функция strtok для выделения лексем из текста
- •6.5. Динамические массивы
- •7. Структуры и объединения
- •7.1. Объявление структуры
- •Компонент структуры может быть любого типа, кроме типа объявляемой структуры.
- •7.2. Операции над структурами
- •7.3. Объявление объединения
- •8. Модульное программирование
- •8.1. Нисходящее проектирование и программирование
- •8.2. Определение и вызов функции
- •8.3. Место определения функции в программе
- •8.4. Обмен данными между функциями
- •8.4.1. Использование глобальных переменных
- •8.4.2. Использование аппарата формальных и фактических параметров
- •8.4.3. Передача массивов в функцию
- •8.5. Перегрузка функции
- •8.6. Шаблон функции
- •8.7. Рекурсивные функции
- •8.8. Функции с параметрами по умолчанию
- •8.9. Передача в функцию другой функции
- •9. Работа с файлами
- •9.1. Текстовые и двоичные файлы
- •9.2. Объявление файловых переменных
- •9.3. Чтение текстового файла
- •9.4. Создание текстового файла
- •9.5. Изменение данных в текстовом файле
- •9.6. Вывод в двоичный файл
- •9.7. Чтение данных из двоичного файла
- •9.8. Изменение данных двоичного файла
- •9.9. Организация файла с произвольным доступом
- •10. Данные с динамической структурой
- •10.1. Линейный список
- •10.1.1. Специальные типы линейных списков
- •10.1.2. Реализация линейного списка с помощью массива
- •10.1.3. Реализация линейного списка с помощью связанного однонаправленного списка
- •10.1.4. Реализация линейного списка с помощью связанного двунаправленного списка
- •10.2. Деревья
- •10.2.1. Основная терминология
- •10.2.2. Реализация двоичных деревьев поиска Для реализации дерева поиска используются массивы и связанные указателями элементы [3, 4].
- •10.2.3. Сбалансированные деревья
- •Основные достоинства в-дерева:
- •10.3. Графы
- •10.3.1. Определения
- •10.3.2. Реализация графа с помощью списков смежности
- •10.3.3. Реализация графа с помощью матрицы смежности
- •10.3.4. Поиск кратчайших путей. Алгоритм Дейкстры
- •10.3.5. Матрица достижимости. Алгоритм Уоршалла
8.6. Шаблон функции
Шаблон функции задает единственное определение алгоритма функции, которое может использоваться для разных типов данных. Компилятор по вызовам функций автоматически создает из шаблона перегруженные функции с одинаковым кодом, но разными типами данных.
Назначение шаблона:
автоматическое создание перегруженных функций;
уменьшение размера исходного кода программы.
Шаблон следует использовать в тех случаях, когда в программе используется один и тот же алгоритм для разных типов данных и запись этого алгоритма на языке С++ одинакова.
Синтаксис определения шаблона функции:
template <class имя1, class имя2, …,class имяn>
заголовок функции
{тело функции}
Синтаксис прототипа шаблона функции:
template <class имя1, class имя2, …,class имяn>
заголовок функции;
где имя1, имя2, …,имяn… - имена параметрических типов шаблона, настраиваемых на конкретный тип аргумента при вызове функции.
Параметрический тип может использоваться в шаблоне функции для объявления:
типа формального параметра функции;
типа возвращаемого функцией значения;
типа локальной переменной.
Все параметрические типы, введенные в шаблоне, должны обязательно использоваться в формальных параметрах шаблона. Использование параметрического типа только для локальных переменных и /или для возвращаемого шаблоном значения недостаточно.
Пример программы удаления из числовых массивов чисел с заданным значением. Алгоритмы ввода, вывода и удаления элементов массивов оформлены в виде шаблонов функций. Шаблоны функций тестируются для трех массивов.
#include <iostream.h>
#include <conio.h>
//Прототипы шаблонов функций
template <class t>
void input (t a[], int n);
template <class t>
void output (t a[], int n);
template <class t>
void del (t a[], int &n, t x);
void main()
{
int a[100], b[100];
float c[100];
int n; //количество чисел в массиве
int xi; //значение удаляемых из целочисленного массива чисел
float xf; //значение удаляемых из вещественного массива чисел
cout<<”n_int? ”;
cin>>n;
input(a,n);
output(a,n); //вывод исходного массива
cout<<”x_int? ”;
cin>>xi;
del (a,n, xi);
output(a,n); //вывод массива после удаления из него чисел
cout<<”n_int? ”;
cin>>n;
input(b,n);
output(b,n); //вывод исходного массива
cout<<”x_int? ”;
cin>>xi;
del (b,n, xi);
output(b,n); //вывод массива после удаления из него чисел cout<<”n_float? ”;
cin>>n;
input(c,n);
output(c,n); //вывод исходного массива
cout<<”x_float? ”;
cin>>xf;
del (c,n, xf);
output(c,n); //вывод массива после удаления из него чисел
getch();
}
//Определения шаблонов функций
template <class t>
void input (t a[], int n)
{
cout<<”array: “;
for (int=0; i<n; i++)
cin>>a[i];
}
template <class t>
void output (t a[], int n)
{
if (n==0)
cout<<” array is empty”<<endl;
else
{
for (int i=0; i<n; i++)
cout<<a[i]<<” “;
cout<<endl;
}
}
template <class t>
void del (t a[], int &n, t x)
{
int i, j;
j=0;
for (i=0; i<n; i++)
if (a[i]!=x)
{ a[j]=a[i]; j++;}
n=j;
}
Первый вызов функции, например, input(a,n), приводит к созданию варианта функции ввода целочисленного массива. При повторном вызове функции с теми же типами фактических параметров, которые встречались ранее, например, input(b,n), компилятор не создает повторно код функции ввода массива целых чисел.
В этом примере параметрический тип использовался только для формальных параметров. В следующем примере он используется и для локальной перменной шаблона функции.
Пример программы вычисления средних значений числовых массивов разных типов: целого и вещественного. Алгоритм вычисления среднего оформлен в виде шаблона функции.
#include <iostream.h>
#include <conio.h>
//Определение шаблона функции ввода массива
template <class t>
void input (t a[], int n)
{
cout<<”array int “;
for (int=0; i<n; i++)
cin>>a[i];
}
//Определение шаблона функции вычисления среднего
template <class t>
float avg (t a[], int n)
{
t s=0; // параметрический тип для локальной переменной
for (int i=0; i<n; i++)
s+=a[i];
return (float)s/n;
}
void main()
{
int b[100];
float c[100];
int n;
cout<<”n_b? ”; cin>>n;
input(b,n);
cout<<”avg_b=”<<avg (b,n) <<endl;
cout<<”n_c? ”; cin>>n;
input(c,n);
cout<<”avgb=”<<avg (c,n) <<endl;
cout<<”avgb=”<<avg (b,5);
getch();
}