- •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.4.3. Передача массивов в функцию
Чтобы передать массив в функцию надо указать его имя в списке аргументов функции при ее вызове, например, для вызова функции сортировки целочисленного массива a из 100 элементов используется синтаксис:
sort(a, 100);
Так как в С++ имя массива – это константный указатель, значением которого является адрес первого элемента массива, то в этом вызове в функцию передается адрес массива. Массив всегда передается в функцию по ссылке (в функцию передается адрес массива-аргумента). Формальный параметр функции для массива должен иметь синтаксис:
тип элементов имя [ ]
или
тип элементов имя [максимальный размер массива]
или
тип элементов *имя
Примеры задания формальных параметров-массивов:
void sort (int a[], int n)
void sort (int a[100], int n)
void sort (int *a, int n)
Если в теле функции изменяются значения элементов массива, то изменяется сам передаваемый через параметр массив.
Пример программы вычисления суммы максимальных элементов двух целочисленных массивов из 20 и 15 элементов. В программе алгоритм поиска максимального элемента целочисленного массива из n элементов оформлен в виде функции.
#include <conio.h>
#include <iostream.h>
int max (int a[ ], int n); //поиск максимального элемента массива
void main()
{
int b[20], c[15];
int i; //номер элемента
for (i=0; i<20; i++)
cin>>b[i];
for (i=0; i<15; i++)
cin>>c[i];
cout<<” sum =”<< max(b,20)+ max(c,15);
getch();
}
int max (int a[ ], int n)
{
int amax; //значение максимального элемента
amax=a[0];
for (int i=1; i<n; i++)
if( a[i]>amax) amax=a[i];
return amax;
}
Пример программы удаления из текста символов, совпадающих с заданным символом. В программе алгоритм удаления символов, совпадающих с заданным символом, оформлен в виде функции.
#include <conio.h>
#include <iostream.h>
//Функция удаления из строки s символов c
void del(char s[ ], char c);
int main( )
{
char s[80]; //текст
char c; //удаляемый символ
cout<<”s? “;
cin.getline(s,80);
cout<<”c? “;
cin>>c;
del(s,c);
if (s[0]==’\0’)
cout<<”s is empty”; //строка стала пустой
else
cout<<s;
getch();
}
void del(char s[], char c)
{
int i=0; //номер сравниваемого символа строки
int j=0; //позиция символа, не совпадающего с символом с
while(s[i]!='\0') //цикл по всем символам строки
{
if (s[i]!=с)
{s[j]=s[i]; j++;}
i++;
}
s[j]='\0'; //завершение строки 0-символом
}
Тесты:
s: Ааа рaрр еaaеее, c: a результат: А ррр ееее
s: ааaaaaa, c: a результат: строка пуста
Если формальный параметр является многомерным массивом, то в таком формальном параметре необходимо указывать максимальные размеры по всем измерениям, кроме первого.
Синтаксис формального параметра двумерного массива:
тип элементов имя [][максимальное количество столбцов]
или
тип элементов имя [максимальное количество строк] [максимальное количество столбцов]
Пример программы удаления из матрицы целых чисел строки с заданным номером, в которой алгоритм удаления строки оформлен в виде функции:
#include <conio.h>
#include <iostream.h>
#include <iomanip.h>
//Функция удаления из матрицы a из n строк и m столбцов
// строки c номером k
void del(int a[ ][50], int &n, int m, int k);
void main( )
{
int a[100][50]; //матрица
int n, m; //количества строк и столбцов
int k; //номер удаляемой строки
cout<<”n, m? “;
cin>>n>>m;
cout<<”a? “;
for (int i=0; i<n; i++)
for (int j=0; j<m; j++)
cin>>a[i][j];
cout<<”k? “; cin>>k;
del(a, n, m, k); //вызов функции
if (n==0)
cout<<”a is empty”;
else
//Вывод матрицы в виде прямоугольника
for (int i=0; i<n; i++)
{
for (int j=0; j<m; j++)
cout<<setw(7)<<a[i][j];
cout<<endl;
}
getch();
}
void del(int a[][50], int &n, int m, int k)
{
for (int i=k; i<n-1; i++)
for (int j=0; j<m; j++)
a[i][j]=a[i+1][j];
n--;
}
В программе для форматирования вывода матрицы используется манипулятор вывода setw(7). Манипулятор определяет ширину поля вывода для любого значения a[i][j] в 7 позиций, что позволяет выровнять столбцы значений матрицы на экране. Манипулятор вывода setw доступен программе при наличии в ней директивы:
#include <iomanip.h>