- •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.5. Изменение данных в текстовом файле
Данные, которые записаны в текстовом файле, как правило, не могут быть изменены «по месту». Например, если изменять запись текстового файла
Иванова Нина 77412345678 8000
по месту ее нахождения в файле на запись
Васильева Нина 77412345678 8000
то конец изменяемой записи будет записан поверху следующей записи, так как новая фамилия содержит на два символа больше, чем прежняя фамилия. Для изменения данных в текстовом файле, в котором записи могут быть разных размеров, используется дополнительный файл.
Пример программы увеличения зарплаты работнику с заданным номером страховки на 20 процентов:
#include <fstream.h>
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>
struct worker
{
char number[12];
char fam[15];
char name[15];
int salary;
};
void main()
{
worker w; //работник
fstream f1; //изменяемый файловый поток
fstream f2; //дополнительный файловый поток
char name[12];//имя файла
char n[12]; //номер страховки для поиска работника
cout<<"name f1: "; cin>>name;
f1.open(name,ios::in); //открытие для чтения
f2.open(“b.txt”,ios::out); //открытие вспомогательного файла
cout<<”n? “; cin>>n; //ввод номера страховки
//Цикл чтения файла и поиска работника
while (!f1.eof())
{
f1>>r.number >>r.fam>>r.name>>r. salary;//чтение из файла
if (!f1.eof()) //контроль конца файла
{
if(strcmp(r.number,n)==0 )
break; //работник найден
//Запись данных в дополнительный файл
f2<<r.number <<’ ‘<<r.fam<<’ ‘<<r.name<<’ ‘<<r. salary <<endl;
}
}
if (f1.eof()) //работник не найден: исходный файл не изменяется
{
cout <<”No”;
f1.close();
f2.close();
remove((“b.txt”); //удаление вспомогательного файла
}
else //работник найден
{
r.salary+=0.2*r.salary; //изменение зарплаты работника
//Запись в дополнительный файл измененной записи и
// без проверки перезапись в него конца исходного файла
while (!f1.eof())//
{
f2<<r.number<<’ ‘<<r.fam<<’ ‘<<r.name<<’ ‘<<r.salary <<endl;
f1>>r. number >>r.fam>>r.name>>r.salary;
}
f1.close(); //закрытие исходного файла
f2.close(); //закрытие дополнительного файла
remove(name); //удаление исходного файла
//Переименование дополнительного файла
rename((“b.txt”,name);
}
}
9.6. Вывод в двоичный файл
Функция write классов ofstream и fstream выводит в файловый поток заданное в функции количество байтов, извлекая их из определенной в функции области оперативной памяти.
Синтаксис вызова функции write:
f.write (адрес, количество байтов)
где f – файловая переменная. Первый аргумент функции – указатель на символ. Например, оператор:
f.write ((char*)&w,sizeof w );
записывает в файл sizeof w байтов, извлекая их из переменной w, содержащей информацию о работнике. Так как выражение &w имеет тип worker *, то здесь используется операция преобразования типа «указатель на структуру» в тип char*. Поток байтов записывается в то место файла, на которое указывает указатель файла. При открытии файла в режиме out первая порция данных записывается в начало файла. При записи данных указатель файла перемещается в позицию, следующую после последнего записанного байта. Повторное выполнение функции write записывает следующую порцию байтов в смежный участок файла без всяких разделителей.
Пример программы, которая создает двоичный файл и записывает в него сведения о муниципальных округах Москвы. Каждый муниципальный округ имеет номер, название, контактный телефон и принадлежит определенному административному округу.
#include <fstream.h>
#include <iostream.h>
#include <conio.h>
struct mo //модель муниципального округа
{
int number; //номер
char name[20]; //название
char ao[12]; //административный округ
char tel[12]; //телефон
};
void write_file(char file_name[ ]); //функция создания файла
void main()
{
write_file(“mo.mos”);
}
void write_file(char file_name[ ])
{
mo m; //муниципальный округ
ofstream f; //выходной файловый поток
f.open(file_name,ios::out|ios::binary); //открытие двоичного файла
for (int i=1; i<=123; i++)
{
cout<<”number? “;
cin>>m.number;
cout<<”name? “;
cin.get();
cin.getline(m.name,20);
cout<<”ao? “;
cin>>m.ao;
cout<<”tel? “;
cin>>m.tel;
f.write((char*)&m,sizeof m);
}
f.close(); }