- •3. Строение памяти. Системы счисления. Двоичная система счисления
- •8. Расширенные Бэкуса-Наура формы (рбнф), Способы записи синтаксиса языка: Диаграммы Вирта. Расширенные Бэкуса-Наура формы (рбнф).
- •12. Операторы выбора: оператор if, оператор switch. Операторы выбора.
- •1. Принципы объектно-ориентированного программирования. Основными свойствами ооп являются:
- •18. Создание собственных функций-манипуляторов.
- •1.Assign(const string& str);
- •31. Последовательные контейнеры.
18. Создание собственных функций-манипуляторов.
ostream &имя_манипулятора (ostream &поток) { //код return поток;}
#include <iostream.h> #include <iomanip.h> ostream &setup (ostream &stream) {stream.setf(ios::left); stream <<setw(10)<<setfill(' $'); return stream;} int main (){ cout <<10<<" "<<setup <<10; system ("pause"); return 0;}
istream &имя_манипулятора (istream &поток) {//код return поток;}
#include <iostream.h> #include <iomanip.h> istream &prompt(istream &stream) {cin>>hex; cout <<"Enter number using hex format:"; return stream;} int main (){ int i; cin >>prompt>>i; cout <<i; system ("pause"); return 0;}
19. Методы обмена с потоками. Ниже приведены функции чтения, определенные в классе istream. gcount() - возвращает количество символов, считанных с помощью последней функции неформатированного ввода; get () - возвращает код извлеченного из потока символа или EOF; get(c) - возвращает ссылку на поток, из котороого выполнялось чтение, и записывает извлеченный символ в с; get(buf,num,lim='\n') - считываем num-l символов (или пока не встретится символов lim) и копирует их в символьную строку buf. Вместо символа lim в строку записывается признак конца строки ('\0'). Символ lim остается в потоке. Возвращает ссылку на текущий поток; getline(buf, num, lim='\n') - аналогична функции get, но копирует в buf и символ lim; ignore (num, lim = EOF) - считывает и пропускает символы до тех пор, пока не будет прочитано num символов или не встретится разделитель, заданный параметром Lim. Возвращает ссылку на текущий поток; peek () - возвращает следующий символ без удаления его из потока или EOF, если достигнут конец файла; putback(c) - помещает в поток символ с, который становится текущим при извлечении из потока; read(buf, num) - считывает num символов (или все символы до конца файла, если их меньше num) в символьный массив buf и возвращает ссылку на текущий поток; readsome(buf,num) - cчитывает num символов (или все символы до конца файла, если их меньше num) в символьный массив buf и возвращает количество считанных символов; seekg(pos) - устанавливает текущую позицию чтения в значение pos; tellg() - возвращает текущую позицию чтения потока; В классе ostream определены функции для неформатированного вывода: flush () -записывает содержимое потока вывода на физическое устройство; put (c) - выводит в поток символ с и возвращает ссылку на поток; seekg(pos) - устанавливает текущую позицию записи в значение pos; tellg() - возвращает текущую позицию записи потока; write (buf, num) - записывает в поток num символов из массива buf и возвращает ссылку на поток.
20. Открытие и закрытие файлов. В С++ файл открывается в . Различают 3 типа потока:
ifstream in; //ввод ofstream out; //вывод fstream both; //ввод и вывод
После создания потока необходимо его ассоциировать его с файлом. Для этого существует функция open() - 3 параметра
open()
void open(const char *filename, int mode, int access=filebuf::openprot);
(1-ый - имя файла, 2-ой - указывает каким способом открывается файл и может принимать одно из следующих значений: 1) ios::app -указывает на то, что выводимые данные будут добавлятся в конец файла это значение может быть использована только для потоков вывода; 2) ios::ate - вызывает поиск конца файла в момент открытия; 3)ios::binary - обуславливает открытия файла для двоичной операции; 4)ios::in - задает возможность ввода из файла; 5)ios::nocreate - данная функция задает такой режим, при котором функция open может открыть только существующий файл; 6)ios::noreplace - не позволяет открыть файл, если он уже существует, но не указанные атрибуты ios::app или ios::ate; 7)ios::out - указывает то, что файл предназначен для вывода; 8)ios::trunk - обуславливает уничтожение содержимого файла и сокращает его длину до 0.
Атрибут |
Значение |
0 |
Нормальный файл, открытый доступ |
1 |
Файл только для чтения |
2 |
Скрытый файл |
4 |
Системный файл |
8 |
Архивный файл |
21. Файловый ввод/вывод. Чтение и запись в текстовые файлы. fstream.h ifstream in; //ввод ofstream out; //вывод fstream both; //ввод и вывод Чтение и запись в текстовые файлы. #include <iostream.h> #include <fstream.h> int main(){ char ch; int i; float f; char str [80]; ifstream in ("test.txt"); if (!in) { cout <<"Cannot open file.\n"; return 1; } in>>i; in>>f; in>>ch; in>>str; cout <<i<<" "<<f<<" "<<ch<<"\n"; cout <<str<<"\n"; int.close(); system ("pause"); return 0; }
22. Файловый ввод/вывод. Двоичный ввод/вывод. fstream.h ifstream in; //ввод ofstream out; //вывод fstream both; //ввод и вывод Двоичный ввод/вывод. ostream &put(char cb);
ios::binary
Имеется несколько способов для записи и чтения двоичных данных файлов. Метод get (istream &get(char &cb); ) читает единственный символ из ассоциированного потока и помещает его значение в переменную являющейся параметром. Метод put (ostream &put(char cb);)пишет переменную параметр в поток.
#include <iostream.h> #include <fstream.h> int main() { char ch; ifstream in ("test.txt"), ios::in | ios::binary); if (!in) { cout <<"Cannot open file.\n"; return 1;} while (in) { // in будет нулем при достижении конца файла in.get (ch); cout <<ch; } in.close(); system ("pause"); return 0; }
istream &read(insigned char *buf, int num); - читает num байт в ассоциированный поток записывает в переменную buf ofstream &write(const unsigned char *buf, int num); - пишет num байт в ассоциированный поток из buf
23. Файловый ввод/вывод. Произвольный доступ. fstream.h ;ifstream in; //ввод; ofstream out; //вывод; fstream both; //ввод и вывод Произвольный доступ. Система ввода/ вывода С++ позволяет осуществлять произвольный доступ с использованием функций seekg и seekp.
ifstream &seekg (streamoff offset, seek_dir origin); - метод seekg перемещает указатель get pointer на offset позиций от некоторого параметра origin ostream &seekp (streamoff offset, seek_dir origin); -
Система ввода\вывода С++ обрабатывает 2 указателя, ассоциированных с каждым файлом. Один из них get pointer, который отслеживает где именно в файле будет производиться следующая операция чтения. И указатель put pointer , который отслеживает где в файле будет осуществляться следующие операции вывода.
Величина |
Значение |
Ios::beg |
Начало файла |
ios::cur |
Текущее положение |
ios::end |
Конец файла |
#include <iostream.h> #include <fstream.h> int main() { char ch; ifstream in ("test.txt", ios::in | ios::binary); if (!in) { cout <<"Cannot open file .\n"; return 1; }in.seekg(1,ios::beg); while (in.get(ch)) cout<<ch; in.close(); system ("pause"); return 0; }
24. Строковые потоки. Как было показано, поток может быть привязан к файлу, т.е. массиву символов, хранящемуся не в основной памяти, а, например, на диске. Точно так же поток можно привязать к массиву символов в основной памяти. char* p = new char[message_size]; ostrstream ost(p,message_size); do_something(arguments,ost); display(p);
С помощью стандартных операций вывода функция do_something может писать в поток ost, передавать ost подчиняющимся ей функциям и т.п. Контроль переполнения не нужен, поскольку ost знает свой размер и при заполнении перейдет в состояние, определяемое fail(). Затем функция display может послать сообщение в "настоящий" выходной поток. Такой прием наиболее подходит в тех случаях, когда окончательная операция вывода предназначена для записи на более сложное устройство, чем традиционное, ориентированное на последовательность строк, выводное устройство. Например, текст из ost может быть помещен в фиксированную область на экране. Аналогично, istrstream является вводным строковым потоком, читающим из последовательности символов, заканчивающейся нулем:
void word_per_line(char v[], int sz) /* печатать "v" размером "sz" по одному слову в строке */ { istrstream ist(v,sz); // создать istream для v char b2[MAX]; // длиннее самого длинного слова while (ist>>b2) cout <<b2 << "\n"; }
Завершающий нуль считается концом файла. Строковые потоки описаны в файле <strstream.h>.
25. Потоки ввода/вывода в массивы. Для создания потока, способного вводить и выводить данные в массив, надо использовать следующую функцию-конструктор класса strstream:
strstream iostr (char *buf, int size, int mode);
Здесь buf указывает на строку, используемую для операций ввода/вывода. Величина size указывает на размер массива. Параметр mode служит для определения режима. Для нормальных операций ввода/вывода параметру mode присваивается значение ios::in | ios::out. Для ввода массив должен оканчиваться нулем.
Следующая программа использует массив для ввода и для вывода: // выполняет как ввод, так и вывод #include <iostream.h> #include <strstrea.h> int main() { char iostr[80]; strstream ios (iostr, sizeof(iostr), ios::in | ios::out); int a, b; char str[80]; ios << "1734 534abcdefghijklmnopqrstuvwxyz"; ios >> a >> b >> str; cout << a << " " << b << " " << str << endl; }
Эта программа сначала пишет два числа и буквы алфавита в массив, а затем читает их.
26. Обработка исключительных ситуаций. Исключительные ситуации – это механизм, который до сих пор вызывает много споров, как среди противников объектного подхода, так и среди его сторонников.
Условно исключения можно разделить на три типа:контролируемые; некотролируемые; фатальные. Контролируемые исключения могут происходить при нормальном выполнении системы и в большинстве своем характеризуют такие ситуации, как ошибки соединения с внешним сервисом, неверный пользовательский ввод и т.д. Некотролируемые исключения – это исключения, которые возникают вследствие выполнения некорректного кода. Эти исключения, как правило, могут быть перехвачены, но исправлению подлежат лишь в единичных случаях. К таким исключениям относят исключения возникающие при обращении по нулевому указателю, вызове несуществующего или защищенного метода, в результате неверного приведения типов и т.д. Фатальные исключения описывают ошибки, большую часть которых приложение не должно перехватывать. К ним относятся такие ситуации, как нехватка памяти, переполнение стека, попытка оперирования уже уничтоженным потоком приложения, внутренняя ошибка виртуальной машины или интерпретатора и многие другие. Возвращение успешности выполнения операции Самый простой метод заключается в том, чтобы вернуть особое значение, если произошла ошибка. Например, false.
static void vain(String[] args) {
if ( !parseXML(xml) ) {
// Error } }
protected function parseXML(String xml) {
[...] }
Данный подход не дает абсолютно никакой информации, чтобы разработчик мог корректно восстановить поток приложения. В данном случае мы просто видим, что произошла ошибка. Тип и характер ошибки клиент данной функции узнать не может.
Возвращение кода ошибки. Этот вариант можно детализировать, если ввести в приложение набор констант, обозначающих различные виды ошибок.
27. Шаблоны функций. Многие алгоритмы не зависят от типов данных с которыми они работают. В С++ существует возможность передать информацию о типе в качестве параметра. Реализовано это с помощью шаблонов. С помощью шаблона можно определить алгоритм, который будет применяться к данным различных типов. А конкретный тип данных передается функции на этапе компиляции Формат простейшей функции-шаблона:
template <class Tupe> заголовок { /*тело функции*/ }
В общем случае функция шаблон может содержать несколько параметров:
template <class A, class B, int i> void f() {...} Пример: template <class Type> void sort_vybor (Type *b, int n) { Type a; // буферная переменная for (int i=0; i<n-1; i++) { int imin = i; for (int j=i+1; j<n; j++) if (b[j] <b[min]) imin =j; a=b[i];b[i]=b[imin]; b[imin]=a;}} #include <iostream.h> #include <windows.h> #include <class Type> void sort_vybor(Type *b, int n); int main(){ const int n=5; int i, b[n]; for (i=0; i<n; i++) cin >>b[i]; sort_vyb(b,n); // Сортировка целочисленного массива for (i=0; i<n; i++) cout <<b[i] << " "; cout <<endl; double a[] = {0.22, 117, -0.08, 0.21, 42.5}; sort_vybor(a,5); // Сортировка массива вещественных чисел for (i=0; i<5; i++) cout << a[i]<< " "; system ("pause"); return 0; }
28. Шаблоны классов. Параметризованный класс создаёт семейство родственных классов, которые можно применять к любому типу данных, передаваемому в качестве параметра
class Node{ public: int d; //Данные Node *next; // Указатель на последующий узел Node *prev; // Указатель на предыдущий узел Node (int dat = 0) { // Конструктор d=dat; next = 0; prev=0;}}; class List { class Node{ ... }; Node *pbeg, *pend; //Указатели на начало и конец списка public: List ()
void add(int d); //Добавление узла в конец списка Node *find(int i); //Поиск узла по ключу
List <<int> List_int; List<double> List_double; Block <char,128> buf; Block <monstr,100> stado; Синтаксис описания шаблона:
template <описание_параметров_шаблона> определение_класса; Правила описания шаблона 1. Шаблоны методов не могут быть виртуальными. 2. Шаблоны классов могут содержать статические элементы, дружественные функции и классы. 3. Шаблоны могут быть производными как от шаблонов, так и от обычных классов, а также являться для них базовыми. 4. Внутри шаблона нельзя определять дружественные шаблоны.
29. Классы стандартной библиотеки C++ . Строковый класс. Классы стандартной библиотеки С++ можно разделить на группы в соответствие с их назначением: 1. Потоковые классы. 2. Строковый класс. 3. Контейнерные классы, реализующие наиболее распространенные структуры для хранения данных(списки, вектора, множества). 4. Итераторы , предназначенные для унифицированного доступа к элементам контейнерных и других классов. 5. Математические классы, осуществляющие решение уравнений, нахождения значений некоторых математических функций. Присваивания и добавление частей строк
