- •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. Матрица достижимости. Алгоритм Уоршалла
9.7. Чтение данных из двоичного файла
Функция read классов ifstream и fstream читает из файла заданное в функции количество байтов и записывает их по заданному в функции адресу оперативной памяти.
Синтаксис вызова функции read:
f.read (адрес, количество байтов)
где f – файловая переменная. Первый аргумент функции – указатель на символ. Например, оператор:
f.read((char*)&r,sizeof r);
считывает из файла sizeof r байтов и записывает их по адресу переменной r. Поток байтов считывается из текущего положения указателя файла. При открытии файла в режиме чтения первая порция данных считывается из начала файла. При считывании указатель файла перемещается в позицию, следующую после последнего считанного байта.
Пример программы, которая выводит на экран информацию о всех муниципальных округах заданного административного округа, записанных в двоичном файле:
#include <fstream.h>
#include <iostream.h>
#include <conio.h>
#include <string.h>
struct mo //модель муниципального округа
{
int number;
char name[20];
char ao[12];
char tel[12];
};
void read_file(char file_name[ ], char ao[ ]);
void main( )
{
char ao[12]; //административный округ
cout<<”ao? “;
cin>>ao;
read_file (“mo.mos”, ao);
getch();
}
void read_file(char file_name[ ],char ao[ ])
{
mo m; //муниципальный округ
ifstream f; //входной файловый поток
f.open(file_name, ios::in|ios::binary); //открытие файла для чтения
while(!f.eof())
{
f.read((char*)&m,sizeof m);
if(!f.eof()) //контроль конца файла
if(strcmp(m.ao,ao)==0)
cout<<m.number<<’ ‘<<m.name<<’ ‘<<m.ao<<’ ‘<<m.tel<<endl;
}
f.close();
}
9.8. Изменение данных двоичного файла
Данные одного типа в двоичном файле имеют одинаковую длину, поэтому их можно изменять «по месту» без использования вспомогательного файла. Для установки указателя файла в позицию, с которой надо изменять данные, используется функция классов ofstream и fstream seekp.
Синтаксис вызова функции seekp:
f.seekp (смещение в байтах, заданная позиция в файле)
где f – файловая переменная. Функция seekp перемещает указатель записи файла относительно позиции, заданной вторым параметром функции, на определенное первым параметром функции количество байтов.
Позиция указателя в файле задается символическими константами:
ios::beg - начало файла, задается по умолчанию;
ios::end - конец файла;
ios::cur - текущая позиция.
Пример программы, которая изменяет контактный телефон муниципального округа с заданным номером:
#include <fstream.h>
#include <iostream.h>
#include <conio.h>
struct mo //модель муниципального округа
{
int number;
char name[20];
char ao[12];
char tel[12];
};
/*Функция изменения контактного телефона муниципального округа с номером n на значение new_tel в двоичном файле*/
void edit (char file_name[], int n, char new_tel[]);
void main()
{
int n; //номер муниципального округа
char new_tel[12]; //новый телефон
cout<<” n? ”;
cin>>n;
cout<<”tel? ”;
cin>>new_tel;
edit (“mo.mos”,n, new_tel);
}
void edit (char file_name[],int n, char new_tel[])
{
fstream f; //изменяемый файл
mo m; //муниципальный округ
f.open(file_name, ios::in|ios::out|ios::binary); //открытие файла для //чтения и записи
while (!f.eof() ) //поиск изменяемой записи в файле
f.read((char*)&m,sizeof m);
if (!f.eof())
{
if(m. number ==n) //округ найден
break;
}
if (!f.eof()) //контроль конца файла
{
strcpy(m.tel,new_tel); //изменение записи в оперативной памяти
//Сдвиг указателя файла в начало изменяемой записи файла
f.seekp(-sizeof(f),ios::cur);
f.write((char*)&m,sizeof m); //изменение записи в файле
}
f.close();
}