
- •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.3. Чтение текстового файла
Текстовый файл поделен на строки. Строки могут быть разной длины. Данные в строках текстового файла разделены пробельными символами.
Для чтения данных из текстового файла используется операция >> «извлечь из потока». Ее правым операндом может быть числовая, символьная и строковая переменная, а левым операндом – файловая переменная. Операция >> читает данные из текстового файла, разделенные пробельными символами, преобразует данные из символьного формата в двоичный формат согласно типу правого операнда и записывает данные в переменную, указанную в качестве правого операнда.
Пример чтения из начала текстового файла с именем «a.txt» двух чисел:
ifstream f;
int x;
float y;
f.open(“a.txt”);
f>>x>>y;
Каждая файловая переменная имеет связанный с ней указатель, указывающий на позицию файла, из которой будут считываться данные (текущую позицию файла). При открытии файла в режиме чтения указатель указывает на начало файла. При чтении очередного данного указатель перемещается к следующему данному в файле.
Пример программы поиска в текстовом файле информации о работниках, зарплата которых меньше заданного значения. О каждом работнике в текстовом файле последовательно записанна информация: номер страховки, фамилия, имя, зарплата.
#include <fstream.h>
#include <iostream.h>
#include <conio.h>
struct worker //модель работника
{
char number[12]; //номер страховки
char fam[15]; //фамилия
char name[15]; //имя
int salary; //зарплата
};
void main()
{
worker w; //информация о работнике
ifstream f; //входной файловый поток
char name[12]; //имя файла
int x; //зарплата для поиска работников
cout<<"x? "; cin>>x;
cout<<"name? "; cin>>name;
f.open(name); //открытие файла для чтения
//Цикл чтениия файла и вывода данных файла на экран
while (!f.eof()) //пока не конец файла
{
f>>w.number >>w.fam>>w.name>>w.salary; //чтение данных о //работнике
if(!f.eof()) //контроль конца файла
if (w. salary<x)
cout<<w.number <<’ ‘<<w.fam<<’ ‘<<w.name<<’ ‘ <<w.salary <<endl;
}
f.close();//закрытие файла
getch();
}
В программе используются функции файловых потоков eof и close. Функция eof имеет значение false, если указатель файла не достиг конца файла. Значение функция eof становится равным true при попытке чтения данных из конца файла. В программе в теле цикла while повторно контролируется конец файла. При отсутствии такого контроля данные о последнем работнике буду выведены два раза, если зарплата последнего работника меньше заданной.
Функция close закрывает файл и разрывает связь между файловой переменной и конкретным файлом. Вызывать эту функцию необходимо перед изменением режима работы с файлом, переименованием или удалением файла, а также при завершении записи данных в файл. В данной программе оператор f.close(); не обязателен.
9.4. Создание текстового файла
Для записи данных в текстовый файл используется операция << (поместить в поток). Она извлекает данные из оперативной памяти (из переменной), преобразует их из двоичного формата в текстовый формат и записывает данные в файл в позицию указателя файла. После записи данных в файл указатель файла перемещается в позицию, следующую за последним записанным данным.
Пример записи в начало текстового файла с именем a.txt двух чисел:
ofstream f1;
int x=10;
float y=2.5;
f.open(“a.txt”);
f1<<x<<’ ‘<<y;
Пример программы записи в текстовый файл данных о работниках:
#include <iostream.h>
#include <fstream.h>
struct worker //тип работник
{
char number [12]; //номер страховки
char fam[15]; //фамилия
char name[15]; //имя
int salary; //зарплата
};
void main()
{
woker w;
ofstream f; //выходной поток
char name[20]; //имя файла
int n; //количество работников
cout<<"filename: ";
cin>>name;
f.open(name); //открытие файла в режиме создания
//Запись в файл данных о работниках
cout<<”n?”;
cin>>n;
for(int i=1; i<=n; i++)
{
cout<<”number? ”; cin>>w. number;
cout<<”fam? ”cin >>w.fam;
cout<<” name? ”cin>>w.name;
cout<<” salary? ”cin>>w.salary;
f<<w.number <<’ ‘<<w.fam<<’ ‘<<w.name<<’ ‘<<w.salary <<endl;
}
f.close(); //закрытие файла (обязательно)
}
В примере файл открывается по умолчанию в режиме создания. Если существует файл с именем name, то его размер становится равным 0. Данные о каждом работнике записываются в отдельные строки файла. Элементы данного об одном работнике в файле разделяются пробелами.
Для записи данных в конец существующего файла файл надо открывать в режиме ios::app. В этом режиме файл не очищается, а указатель файла при открытии файла устанавливается на конец файла.
Пример фрагмента программы записи информации об одном работнике в конец файла.
f.open(name, ios::app);//для записи данных в конец
cin>>w.number>>w.fam>>w.name>>w. salary >>w.nal;
f<<w. number<<’ ‘<<’ ‘<<w.fam<<’ ‘<<w.name<<’ ‘<<w. salary <<endl;
f.close();//обязательно