Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Значение режима по умолчанию

Режимы открытия файла

Режим открытия Значение режима открытия
Чтение текстового файла ios::in
Запись в текстовый файл ios::out
Запись в конец текстового файла ios::app
Изменение (чтение и запись) текстового файла ios::in | ios::out
Удаление содержимого текстового файла ios::trunc
Удаление содержимого текстового файла и запись в файл ios::trunс | ios::out
Чтение двоичного файла ios::in | ios::binary
Запись в двоичный файл ios::out | ios::binary
Запись в конец двоичного файла ios::app | ios::binary
Изменение (чтение и запись) двоичного файла ios::in | ios::out | ios::binary
Удаление содержимого двоичного файла ios::trunc | ios::binary
Удаление содержимого двоичного файла и запись в файл ios::trunс | ios::out | ios::binary

 

Таблица 7

Тип файловой переменной Значение режима открытия файла по умолчанию
ifstream ios::in
ofstream ios::trunc | ios::out
fstream ios::in | ios::out

 

Примеры объявления и открытия файлов:

ifstream f1; //переменная для чтения из файла

f1.open(“a.txt”); // по умолчанию режим чтения текстового файла

ofstream f2; //переменная для создания и вывода в файл

f2.open(“b.txt”); //по умолчанию режим записи в текстовый файл

fstream f3; //переменная для чтения и изменения файла

f3.open(“c.txt”);//по умолчанию режим изменения текстового //файла

ifstream f4; //переменная для чтения из файла

f4.open(“d.ddd”,ios::binary|ios::in);//режим ввода двоичного файла

ofstream f5; //переменная для записи в файл

f5.open(“d.txt”, ios::app); //режим записи в конец текстового файла

fstream f6; //переменная для чтения и изменения файла

f6.open(“f.dat”, ios::binary|ios::in|ios::out); //режим изменения

//двоичного файла

ofstream f7; //переменная для записи в файл

f7.open(“e.ddd”,ios::binary|ios::out); //режим создания двоичного //файла и записи в него данных, по умолчанию существующий //файл усекается до нулевой длины

 

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();//обязательно

 

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(); }

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();

}

9.9. Организация файла с произвольным доступом

Файл, в котором доступ к любой записи выполняется без доступа к предшествующим записям, называется файлом с произвольным доступом. Для работы с файлами с произвольным доступом кроме рассмотренной ранее функции seekp, используются функции seekg, tellp, tellg.

Функция seekg перемещает указатель считывания файла относительно заданной вторым операндом функции позиции на определенное первым параметром количество байтов.

Синтаксис вызова функции seekg:

f.seekg(смещение в байтах, заданная позиция)

где f – файловая переменная.

Функция tellp определяет текущую позицию указателя записи от начала файла, а функция tellg – позицию указателя считывания. Значение позиции задается в байтах.

Синтаксис вызова функций tellp и tellg:

f. tellp()

f.tellg()

Необходимым условием организации файла с произвольным доступом является одинаковая длина всех записей файла. Кроме того каждая запись файла должна иметь уникальное значение некоторого поля или совокупности полей. Минимальное количество полей записи, значение которых однозначно определяет запись в файле называется первичным ключом. Так записи двоичного файла с информацией о муниципальных округах имеют одинаковую длину, а номер муниципального округа является певичным ключом записей файла. Если номерам муниципальных округов присвоены значения от 1 до 123, то при расположении записей в файле по возрастанию значений номеров муниципальных округов, адрес записи (номер байта от начала файла) можно определить по формуле:

(Номер муниципального округа -1) * длина записи

Для такой организации файла можно реализовать прямой доступ к записи по номеру муниципальнго округа. В программе на языке С++ позицию чтения информации о заданном муниципальном округе в файле можно установить с помощью функции seekg, смещение в которой относительно начала файла можно задать по приведенной выше формуле.

Пример функции, в которой выполняется чтение из двоичного файла с произвольным доступом информации о муниципальном округе с заданным номером:

void read_record(char file_name[], int n)

{

mo m;

ifstream f; //файловый поток

f.open(“mo.mos”, ios::in|ios::binary); //открытие файла для чтения

//Перемещение указателя к записи

f.seekg((n-1)*(sizeof m),ios::beg);

f.read((char*)&m,sizeof m); //чтение записи

cout<<m.number<<’ ‘<<m.name<<’ ‘<<m.ao<<’ ‘<<m.tel;

f.close();

}

 

10. Данные с динамической структурой

 

Данные, которые при работе программы изменяют свой размер и/ или структуру, называются данными с динамической структурой. Примерами таких данных являются: линейные и циклические списки, деревья, графы.

10.1. Линейный список

Линейный список – это последовательность элементов, как правило, одного типа. Элементы в списке упорядочены по положению: элемент в списке из n элементов a1, а2, …аn может занимать одно из положений от 1 до n. Каждый элемент аi имеет предшествующий (кроме первого) и последующий (кроме последнего) элементы. Над линейным списком выполняются операции: вставка элемента, исключение элемента, поиск, упорядочивание, просмотр, очистка и другие.

Структура данных в виде линейного списка используется во многих прикладных задачах, например, при учете товаров на складе, продаже и резервировании билетов на самолеты. В программировании используют два способа хранения элементов линейного списка в оперативной памяти:

· в массиве;

· в связанном указателями списке структур.

Способ хранения определяет способ программной реализации структуры данных.

10.1.1. Специальные типы линейных списков

В программировании часто используют специальные типы линейные списков, которые имеют специальные названия.

Стек – это линейный список, в котором все включения, исключения и доступ выполняются только с одного конца списка, называемом вершиной стека. Дисциплина обслуживания стека обозначается аббревиатурой LIFO (last-in-first-out: последний пришел – первым ушел). Над стеком выполняют операции:

· возвращение элемента из вершины стека;

· удаление элемента из вершины стека;

· вставка элемента в вершину стека;

· очистка стека;

· проверка стека на пустоту.

Стек в программировании часто используется для временного хранение данных, например, стек программы используется для хранения локальных переменных вызываемых подпрограмм. По мере выполнения подпрограмм стек программы освобождается.

Очередь – это линейный список, в котором все включения элементов выполняются с одного конца списка, называемого концом очереди, а исключения элементов и доступ к элементам - с другого конца списка, называемого началом очереди. Дисциплина обслуживания очереди обозначается аббревиатурой FIFO (fist-in-first-out: первый пришел – первый ушел). Над очередью выполняют операции:

· возвращение элемента из начала очереди;

· удаление элемента из начала очереди;

· вставка элемента в конец очереди;

· очистка очереди;

· проверка очереди на пустоту.

Примером очереди является очередь заданий на печать к одному принтеру при использовании компьютеров локальной сети.

Очередь с приоритетами – это линейный список, в котором все элементы имеют приоритет. Включения в очередь с приоритетами выполняются с одного конца. Первым обслуживается (исключается и просматривается) элемент с наибольшим приоритетом. Если несколько элементов имеют равный приоритет, то первым обслуживается элемент, который был включен в очередь раньше. Примером очереди с приоритетами является очередь заданий на печать к одному принтеру, для заданий, имеющих разный приоритет.

Дек – это линейный список, в котором операции включения, исключения и доступа выполняются только на концах списка. Существуют два специальных типа дека: дек с ограниченным входом и дек с ограниченным выходом. В деке с ограниченным входом включение элементов выполняется только с одного конца, а исключение элементов и доступ к элементам – с двух концов. В деке с ограниченным выходом исключение элементов и доступ к ним выполняется только с одного конца дека, а включение элементов – с двух концов.

10.1.2. Реализация линейного списка с помощью массива

При реализации списка с помощью массива элементы списка располагаются в смежных участках памяти. Такое представление списка позволяет:

· легко просматривать весь список;

· быстро находить элемент списка по его положению (индексу);

· эффективно выполнять операции добавления/ удаления в конец списка;

· использовать алгоритмы быстрого поиска элемента для упорядоченного списка.

Недостатки реализации:

· большие временные затраты на выполнение операций включения и исключения элементов в середину или начало списка, так как эти операции требуют перемещения всех последующих элементов на одну позицию к концу (началу) массива;

· память под массив должна выделяться с запасом, чтобы исключить переполнение массива;

· выделенный объем памяти сохраняется за списком даже при удалении части элементов из списка (для динамического массива можно изменить размер памяти под список во время выполнения программы, но операция изменения размера памяти требует выполнения копирования элементов массива в новый массив и приводит к большим временным затратам).

Пример программы, выполняющей операции: включение в конец списка, исключение из начала списка, поиск номера элемента с заданным значением. Для реализации списка используется статический массив целых чисел.

#include <iostream.h>

#include <conio.h.

сonst int size=100; //максимальная длина списка

//Функция включает в конец списка из n элементов число х, при

//переполнении списка ok=false

void insert (int &n, int a[], int x, bool &ok);

//Функция исключает последний элемент из списка и

//возвращает его значение х, при пустом списке ok=false

void del (int &n, int a[], int &x, bool &ok);

//Функция находит номер первого элемента со значением х и

// возвращает его, при отсутствии элемента возвращает -1

int search(int n, int a[], int x,);

void main()

{

int a[size]; //массив для хранения списка

int n; //текущий размер списка

int x, m; // значение элемента списка и его номер

bool ok; //признак выполнения операции

cout<<”n? “; cin>>n;

cout<<”a? “;

//Ввод списка в массив

for (int i=0; i<=n-1; i++)

cin>>a[i];

cout<<”x? “; cin>>x;

//Поиск позиции вхождения х в список

m=search(n,a,x);

if (m==-1)

cout<<”No”<<endl;

else

<<”m=”<<m<<endl;

cout<<”x? “; cin>>x;

//Включение элемента со значением х в список

insert(n,a,x,ok);

if (!ok)

cout<<”Error”<<endl;

//Исключение последнего элементаиз списка

del(n,a,x,ok);

cout<<”x=”<<x;

getch();

}

void insert (int &n, int a[], int x, bool &ok)

{

if (n==size)

ok=false;

else

{

a[n]=x;

n++;

ok=true;

}

}

void del (int &n, int a[], int &x, bool &ok)

{

if (n==0)

ok=false;

else

{

x=a[n];

n--;

ok=true;

}

}

int search(int n, int a[], int x,)

{

for (int i=0; i<=n-1; i++)

if (a[i]==x)

return i;

return -1;

}

 

Библиографический список

 

1. Павловская Т.А. С/ С++. Программирование на языке высокого уровня. – СПб.: Питер, 2002

2. Дейтл Х.М., Дейтл П.Дж. Как программировать на С++. – М.: Бином -2000

3. Вирт Н. Алгоритмы и структуры данных. – СПб.: Невский Диалект, 2001

4. Ахо А., Хопкрофт Дж., Ульман Дж. Структуры данных и алгоритмы. – М.: Издательский дом «Вильямс», 2001

5. Седжвик Р. Фундаментальные алгоритмы на С++. Алгоритмы на графах. Часть 5. – М.: ДиаСофт, 2002

6. Алексеев В.Е., Таланов В.А. Графы и алгоритмы. Структуры данных. Модели вычислений. – М.: Бином, 2006


СОДЕРЖАНИЕ

Введение. 3

1. Знакомство с языком С++. 4

1.1. Элементы языка программирования. 4

1.2. Алфавит языка. 6

1.3. Лексемы.. 7

1.4. Концепция данных. 8

2. Основные типы данных. 9

2.1....... Обьявление переменных. 9

2.2. Операции. 11

2.2.1. Арифметические операции. 13

2.2.2. Операции присваивания. 15

2.2.3. Операции отношения. 15

2.2.4. Логические операции. 16

2.2.5. Поразрядные операции. 17

2.2.6. Вычисление выражений. 19

3. Структурное программирование. 21

3.1. Общая характеристика операторов. 21

3.2. Оператор-выражение. 21

3.3. Условный оператор. 22

3.4. Составной оператор. 23

3.5. Операторы для программирования циклов. 24

3.5.1. Оператор цикла for 24

3.5.2. Оператор цикла while. 25

3.5.3. Оператор цикла do while. 26

3.5.4. Оператор break. 27

3.5.5. Оператор continue. 28

3.6. Оператор goto. 29

3.7. Пустой оператор. 29

3.8. Оператор switch. 29

3.9. Оператор return. 31

4. Массивы.. 32

4.1. Объявление массива. 32

4.2. Обращение к элементам массива. 32

4.3. Типовые алгоритмы работы с массивами. 34

4.4. Многомерные массивы.. 37

5. Строки. 39

5.1. Объявление строки. 39

5.2. Посимвольная обработка строк. 39

5.3. Ввод строк. 41

5.4. Библиотечные функции для работы с текстом.. 42

6. Указатели. 45

6.1. Объявление указателей. 46

6.2. Операции над указателями. 46

6.3. Связь между указателями и массивами. 51

6.4. Функция strtok для выделения лексем из текста 51

6.5. Динамические массивы.. 53

7. Структуры и объединения. 55

7.1. Объявление структуры.. 55

7.2. Операции над структурами. 56

7.3. Объявление объединения. 59

8. Модульное программирование. 60

8.1. Нисходящее проектирование и программирование 60

8.2. Определение и вызов функции. 62

8.3. Место определения функции в программе. 64

8.4. Обмен данными между функциями. 68

8.4.1. Использование глобальных переменных. 69

8.4.2. Использование аппарата формальных и фактических параметров 71

8.4.3. Передача массивов в функцию.. 75

8.5. Перегрузка функции. 79

8.6. Шаблон функции. 82

8.7. Рекурсивные функции. 87

8.8. Функции с параметрами по умолчанию.. 88

8.9. Передача в функцию другой функции. 90

9. Работа с файлами. 93

9.1. Текстовые и двоичные файлы.. 93

9.2. Объявление файловых переменных. 94

9.3. Чтение текстового файла. 97

9.4. Создание текстового файла. 99

9.5. Изменение данных в текстовом файле. 101

9.6. Вывод в двоичный файл. 103

9.7. Чтение данных из двоичного файла. 105

9.8. Изменение данных двоичного файла. 106

9.9. Организация файла с произвольным доступом.. 108

10. Данные с динамической структурой. 109

10.1. Линейный список. 110

10.1.1. Специальные типы линейных списков. 110

10.1.2. Реализация линейного списка с помощью массива. 112

10.1.3. Реализация линейного списка с помощью связанного однонаправленного списка. 114

10.1.4. Реализация линейного списка с помощью связанного двунаправленного списка. 119

10.2. Деревья. 122

10.2.1. Основная терминология. 122

10.2.2. Реализация двоичных деревьев поиска. 124

10.2.3. Сбалансированные деревья. 128

10.2.4. В-деревья. 130

10.3. Графы.. 132

10.3.1. Определения. 132

10.3.2. Реализация графа с помощью списков смежности. 134

10.3.3. Реализация графа с помощью матрицы смежности. 137

10.3.4. Поиск кратчайших путей. Алгоритм Дейкстры.. 143

10.3.5. Матрица достижимости. Алгоритм Уоршалла. 146

Библиографический список. 148

 


Андреева Людмила Петровна

 

<== предыдущая лекция | следующая лекция ==>
Характеристики текстовых и двоичных файлов | История, предмет, структура информатики
Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 330; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.32 сек.