
- •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. Матрица достижимости. Алгоритм Уоршалла
4.3. Типовые алгоритмы работы с массивами
Массив используется для хранения последовательности однотипных данных и выполнения над этой последовательностью операций. Типовые операции над массивами:
поиск в массиве;
вычисление суммы, количества и произведения определенных элементов массива;
сортировка массива;
удаление определенных элементов из массива;
добавление элементов в массив;
формирование массива.
Пример программы подсчета отрицательных чисел в массиве из n (n<=100) вещественных чисел:
#include <iostream.h>
#include <conio.h>
void main ()
{
float a[100]; //массив чисел
int n, i; //количество элементов в массиве и индекc элемента
int k; //количество отрицательных чисел в массиве
cout<<”n? “;
cin>>n;
cout<<”a? “;
for (i=0; i<n; i++) //цикл ввода массива
cin>>a[I];
k=0;
for (i=0; i<n; i++) //цикл поиска и подсчета отрицательных чисел
if (a[i]<0
k++;
cout<<”k=”<<k;
getch();
}
Пример программы сортировки массива из n вещественных чисел (n<=100) по возрастанию методом прямого обмена (пузырьковым методом):
#include <iostream.h>
#include <conio.h>
void main ()
{
float a[100]; //массив чисел
int n, i; //количество элементов в массиве и индекc элемента
int k; //номер прохода массива при сортировке
cout<<”n? “; cin>>n;
cout<<”a? “;
for (i=0; i<n; i++) //цикл ввода массива
cin>>a[i];
//Сортировка пузырьковым методом
for (k=1; k<n; k++)
for (i=0; i<k-1; i++)
if (a[i]>a[i+1])
{int t; t=a[i]; a[i]=a[i+1]; a[i+1]=t;} //перестановка элементов
cout<<”a:”<<endl;
for (i=0; i<n; i++) //цикл вывода массива на экран
cout<<a[i]<<’ ‘;
getch();
}
Пример программы удаления из массива, содержащего n целых чисел, последнего отрицательного элемента:
#include <iostream.h>
#include <conio.h>
void main ()
{
int a[100]; //массив чисел
int n, i ,j; //количество элементов массива, индекcы элементов
cout<<”n? “; cin>>n;
cout<<”a? “;
for (i=0; i<n; i++) //цикл ввода массива
cin>>a[i];
i=n-1; //начальное значение индекса для поиска с конца
while (i>=0 && a[i]>=0) //цикл поиска отрицательного числа
i--;
if (i>=0) //число найдено, номер числа i
{
for (j=i; j<n-1; j++) //удаление a[i], сжатие массива
a[j]=a[j+1];
n--; //количество элементов будет на 1 меньше
}
for (i=0; i<n; i++) //вывод массива
cout<<a[I]<<’ ‘;
getch();
}
Тесты:
n=5, a: 1 –2 –3 5 6 результат: a: 1 –2 5 6, n=4
n=5, a: -1 –2 –3 –4 -6 результат: a: -1 –2 –3 –4, n=4
n=5, a: 1 2 3 4 5 результат: a: 1 2 3 4 5, n=5
Пример программы формировния нового массива из отрицательных чисел целочисленного массива размера n (n<=100):
#include <iostream.h>
#include <conio.h>
void main ()
{
int a[100], b[100]; //исходный и формируемый массивы
int n, i, j; //количество элементов в массиве и индекcы элементов
cout<<”n? “; cin>>n;
cout<<”a? “;
for (i=0; i<n; i++) //цикл ввода массива
cin>>a[i];
j=0; //индекс первого элемента в формируемом массиве
for (i=0; i<n; i++) //цикл поиска a[i]<0 и запись их в массив
if (a[i]<0)
{ b[j]=a[I]; j++;}
if (j==0) //новый массив пуст
cout<<”b is empty”;
else //вывод сформированного массива
{
cout<<”b:”;
for (i=0; i<j; i++)
cout<<b[i]<<’ ‘;
}
getch();
}
Тесты:
n=5, a: 1 -2 3 -4 -5 результат b: -2 -3 -5
n=5, a: -1 -2 -3 -4 -5 результат b: -1 -2 -3 -4 -5
n=5, a: 1 2 3 4 5 результат : b is empty