Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры по инфе, лучше пересмотреть их!!!!.docx
Скачиваний:
6
Добавлен:
15.04.2019
Размер:
127.67 Кб
Скачать

17.*Улучшенные алгоритмы сортировки: Шелла, быстрая сортировка

Сначала в исходной последовательности сортируются между собой элементы, отстоящие друг от друга на расстоянии n/2 элементов, затем на расстоянии n/4 и т.д. до тех пор пока не получим 2 последовательности, элементы которых отстоят друг от друга на расстоянии 1-го элемента. После этого делаем сортировку этой полученной последовательсти выбранным методом и на выходе имеем уже полностью отсортированную последовательность.

Быстрая - выбрать элемент, называемый опорным.

сравнить все остальные элементы с опорным, на основании сравнения разбить множество на три — «меньшие опорного», «равные» и «большие», расположить их в порядке меньшие-равные-большие. повторить рекурсивно для «меньших» и «больших».

18. *Модели динамических структур данных: стек, очередь

На базе линейных списков могут строится стеки, очереди и деки. Стек представляется как линейный список, в котором включение элементов всегда производятся в начала списка, а исключение - также из начала. Для представления его нам достаточно иметь один указатель - top, который всегда указывает на последний записанный в стек элемент. В исходном состоянии (при пустом стеке) указатель top - пустой. Очередь — это информационная структура, в которой для добавления элементов доступен только один конец, называемый хвостом, а для удаления — другой, называемый головой.

Выделим типовые операции над очередями:

добавление элемента в очередь (помещение в хвост);

удаление элемента из очереди (удаление из головы);

проверка, пуста ли очередь;

очистка очереди.

20. Файл. Понятие и объявление переменной файлового типа

Файл ― это потенциально бесконечная последовательность компонент одного и того же типа. Количество компонент в файле заранее не оговаривается. Файловый тип можно задать одним из трех способов:

<имя> = File of <тип>;

<имя> = TextFile;

<имя> = File;

Здесь <имя> - имя файлового типа (правильный идентификатор);

File, of - зарезервированные слова (файл, из); TextFile - имя стандартного типа текстовых файлов; <тип> - любой тип Object Pascal, кроме файлов. Например:

type

Fl = File of Char;

F2 = TextFile;

F3 = File;Имя файла – это любое выражение строкового типа, которое строится по правилам определения имён в MS-DOS (операционной системе ПК).

• имя содержит до восьми разрешённых символов; разрешённые символы – это прописные и строчные латинские буквы, цифры и специальные символы;

• имя начинается с любого разрешённого символа;

• за именем может следовать расширение – последовательность до трёх разрешённых символов; расширение, если оно есть, отделяется от имени точкой.

Перед именем может ставиться так называемый путь к файлу: имя диска и/или имя текущего каталога и имена каталогов вышестоящих уровней.

21. Понятие файла и потока данных. Стандартные потоки

Работа с потоками перенесена во многие другие языки:

C++: iostream из стандартной библиотеки C++.

Языки платформы .NET Framework (например, C#): Base Class Library, пространство имен System.IO.

Стандартные потоки ввода-вывода в системах типа UNIX (и некоторых других) — потоки процесса, имеющие номер (дескриптор), зарезервированный для выполнения некоторых «стандартных» функций. Как правило (хотя и не обязательно), эти дескрипторы открыты уже в момент запуска задачи (исполняемого файла).

Стандартный ввод

Поток номер 0 (stdin) зарезервирован для чтения команд пользователя или входных данных.

При интерактивном запуске программы по умолчанию нацелен на чтение с устройства текстового интерфейса пользователя (клавиатуры). Командная оболочка UNIX (и оболочки других систем) позволяют изменять цель этого потока с помощью символа «<». Системные программы (демоны и т. п.), как правило, не пользуются этим потоком.

Стандартный вывод

Поток номер 1 (stdout) зарезервирован для вывода данных, как правило (хотя и не обязательно) текстовых.

При интерактивном запуске программы по умолчанию нацелен на запись на устройство отображения (монитор). Командная оболочка UNIX (и оболочки других систем) позволяют перенаправить этот поток с помощью символа «>». Средства для выполнения программ в фоновом режиме (например, nohup) обычно переназначают этот поток в файл.

Стандартные потоки

Выполнение любой программы С++ начинаются с четырьмя предопределенными открытыми потоками, объявленными как объекты классов _withassign в iostream.h следующим образом:

extern istream_withassign cin; extern ostream_withassign cout; extern ostream_withassign cerr; extern ostream_withassign clog;

Их конструкторы вызываются всякий раз при включении iostream.h, но фактическая инициализация выполняется только один раз.

Все эти предопределенные стандартные потоки по умолчанию связаны с терминалом. Четыре стандартных потока предназначены для:

cin - стандартного ввода;

cout - стандартного вывода;

cerr - стандартного вывода ошибок;

clog - полностью буферизованного вывода ошибок.

В табл. 5 приведено назначение классов потокового ввода-вывода.

Таблица 5

Назначение классов потокового ввода-вывода

ios Потоковый базовый класс

Потоковые классы ввода

istream Потоковый класс общего назначения для ввода, являющийся базовым классом для других потоков ввода

ifstream Потоковый класс для ввода из файла

istream with assign Потоковый класс ввода для cin

istrstream Потоковый класс для ввода строк

Потоковые классы вывода

ostream Потоковый класс общего назначения для вывода, являющийся базовым классом для других потоков вывода

ofstream Потоковый класс для вывода в файл

ostream_withassign Потоковый класс ввода для cout, cerr, and clog

ostrstream Потоковый класс для вывода строк

Потоковые классы ввода-вывода

iostream Потоковый класс общего назначения для ввода-вывода, являющийся базовым классом для других потоков ввода-вывода

fstream Потоковый класс для ввода-вывода в файл

sir stream Потоковый класс для ввода-вывода строк

stdiostream Класс для ввода-вывода в стандартные файлы ввода-вывода

Классы буферов для потоков

Streambuf Абстрактный базовый класс буфера потока

filebuf Класс буфера потока для дисковых файлов

s trs treambuf Класс буфера потока для строк

stdiobuf Класс буфера потока для стандартных файлов ввода-вывода

Назначение почти всех классов следует из их названия. Классы группы _withassign являются производными соответствующих потоковых классов без этого окончания. Они перегружают операцию присваивания, что позволяет изменять указатель на используемый классом буфер.

Потоки ввода-вывода C++ предоставляют некоторые преимущества по сравнению с функциями ввода-вывода библиотеки С.

Безопасность типов. Сравним вызов функций библиотеки С и использование стандартных потоков С++. Вызов функции printf() выглядит следующим образом:

#include < stdio.h >

. . .

int n = 12;

char name[ ] = "Вывод строки на экран\n";

printf("%d %s", i, name);

Этот вызов приведет к следующей правильной печати:

12 Вывод строки на экран

Но если по невнимательности поменять местами аргументы для printf(), ошибка обнаружится только во время исполнения программы. Может произойти все что угодно - от странного вывода до краха системы. Этого не может случиться в случае использования стандартных потоков:

#include < iostream.h >

cout << i <<' ' << name << '\n';

Так как имеются перегруженные версии операции сдвига operator<< (), правая операция всегда будет выполнена. Функция cout<< i вызывает operator<< (int), a cout<< name вызывает operator<< (const char*). Следовательно, использование стандартных потоков является безопасным по типам данных.

Расширяемость для новых типов. Другим преимуществом стандартных потоков С++ является то, что определенные пользователем типы данных могут быть без труда в них встроены. Рассмотрим класс Data, данные которого необходимо печатать:

struct Data {

int x; char* y;};

Все, что нужно сделать, это перегрузить операцию << для нового типа Data. Соответствующая функция operator<< () может быть реализована так:

ostream &operator<< (ostream & out, const Data & р){

return out << p.x << ' ' << p.у;

}

После этого станет возможно осуществлять вывод:

#include < iostream.h >

struct Data {int x; char* y;

Data (int x, char* y){this->x = x; this->y = y;}

};

ostream &operator<< (ostream & out, const Data & p){

return out << p.x <<' '<< p.y;

}

void main(){

Data p(1, "Error");

cout << p<< '\n';

}