Г. Шилтд - Самоучитель C++ (PDF), страница 85
Описание файла
PDF-файл из архива "Г. Шилтд - Самоучитель C++ (PDF)", который расположен в категории "". Всё это находится в предмете "практика расчётов на пэвм" из 3 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 85 страницы из PDF
^include <iostream>using namespace std;template <class X> X sum(X *data, int size)Iint i;X result = 0;for{i=0; i<size; i++) result += data[i];return result;1int main ( )int i[] - {1, 2, 3, 4};double d[] = {1.1, 2.2, 3.3, 4.4};629630___Самоучительcout « surn{i, 4) « endl;cout « sum(d, 4) « endl;return 0;3. ^include <iostream>using namespace std;// Родовой класс для пузырьковой сортировкиtemplate <class X> void bubble (X *data, int size){register int a, b;X t;for{a=l; a<size;for (b=size-l; b>=a; b — )if(data[b-l] > data[b])t = data[b-l] ;data[b-l] = data[b]data[b] = t;int main{)int i[] = {3, 2, 5, 6, 1, 8, 9, 3, 6, 9);double d[] = {1.2, 5.5, 2.2, 3.3};int j ;bubble{i, 10);bubble (d, 4);// сортировка данных типа int// сортировка данных типа doublefor(j=0; j<10; j++) cout « i[j] «cout « endl;for(j=0; j<4; j++) cout « d[j] « 'cout « endl;return 0;4.
// Здесь показан родовой стек для хранения пар значений^include <iostream>using namespace std;ttdefine SIZE 10// Создание родового класса для стекаtemplate <class StackType> class stack {.C++ПриложениеВ.ОтветынавопросыирешенияупражненийStackType stckfSIZE] [2] ; // содержит стекint tos;// индекс вершины стекаpublic :void init() { tos =0;}void push (StackType ob, StackType ob2) ;StackType pop (StackType &ob2);I;// Размещение объектов в стекеtemplate <class StackType>void stack<StackType>: : push (StackType ob, StackType ob2)Iif (tos==SIZE) (cout « "Стек полон\п";return;>stck[tos] [0] = ob;stck[tos] [1] = ob2;tos++;// Выталкивание объектов из стекаtemplate <class StackType>StackType stack<StackType>: : pop (StackType &ob2)(if (tos— 0) (Icout « "Стек пуст\п";return 0; // возврат нуля при пустом стекеtos — ;ob2 = stck[tos] [1];return stck[tosj [0] ;}int main (){// Демонстрация символьных стековstack<char> si, s2; // создание двух стековint i ;char ch;// Инициализация стековsl.initO ;s2.init() ;s 1 .
push ( ' a ' , ' b ' ) ;r r rs2.push('x , z ) ;sl.pusht'b', 'd') ;_63?632______Самоучительs2.push( ' у ' , ' е ' ) ;s l . p u s h { ' c ' , 'a' ) ;s2.push('z', ' x ' ) ;for(i=0; i<3; i++) fcout « "Из стека 1:" « sl.pop(ch);cout « ' ' « ch « "\n";}for{i=0; i<3; i-n-J {cout « "Из стека 2:" « s2.pop(ch);cout « ' ' « ch « "\n";}// Демонстрация стеков со значениями типа doublestack<double> dsl, ds2; // создание двух стековdouble d;// Инициализация стековdsl.init () ;ds2.init() ;dsl.pushfl.l,ds2.push{2.2,dsl.push(3.3,ds2.push(4.4,dsl.
push (5. 5,ds2.push(6.6,2.0);3.0);4.0);5.0);6.0) ;7.0);for(i=0; i<3cout « "Из стека 1:" « dsl. pop (d);cout « ' ' « d « "\n";for(i=0;cout « "Из стека 2:" « ds2.pop(d);cout « ' ' « d « "\n";return 0;}5. Ниже представлены обычные формы инструкций try, catch и throw:try {// блок trythrow искл_ситуацияcatch (type arg) {// .C++ПриложениеВ.Ответынавопросыирешенияупражнений_6336. /* В этой программе показан родовой класс stack, в который встроенаобработка исключительных ситуаций*/ttinclude <iostream>using namespace std;^define SIZE 10// Создание родового класса stacktemplate <class StackType> class stack (StackType stck[SIZE]; // содержит стекint tos;// индекс вершины стекаpublic:void init() { tos = 0;} // инициализация стекаvoid push (StackType ch) ; // помещает объект в стекStackType pop О; // выталкивает объект из стека// Размещение объекта в стекеtemplate <class StackType>void stack<StackType>: :push(StackType ob){try {if (tos=SIZE) throw SIZE;}catch (int) {cout « "Стек полон\п";return;}stck[tos] = ob;tos++;// Выталкивание объекта из стекаtemplate <class StackType>StackType stack<StackType>: :pop(){try {if (tos==0) throw 0;icatch (int) {cout « "Стек пуст\п";return 0; // возврат нуля при пустом стеке)tos — ;return stckftos];634Самоучитель С++intmain(){// Демонстрация символьных стековstack<char> si, s2; // создание двух стековint i;// Инициализация стековsl.initO ;s2.init()jsi.push('a')s2.push('x'Jsl.pushCb1 )s2.push('y')si.push('c1)s2.push{'z')for(i=0; i<3for{i=0; i<4i++) cout « "Из стека 1:" « sl.popO « "\n";cout « "Из стека 2:" « s2.pop(J « "\n";// Демонстрация стеков со значениями типа doublestack<double> dsl, ds2; // создание двух стеков// Инициализация стековdsl.initO ;ds2.init () ;dsl.push(1.1);ds2.push(2.2);dsl.push(3.3);ds2.push(4.4);dsl.push(5.5};ds2.push(6.6);for(i=0; i<3; i++) cout « "Из стека 1:" « dsl.pop(J « "\nfor(i=0; i<4; i++) cout « "Из стека 2:" « ds2.pop() « "\nreturn 0;8.
Если при ошибке выделения памяти оператор new возбуждает исключительную ситуацию, вы можете быть уверены, что эта ошибка будет обработанатем или иным способом (даже путем аварийного завершения программы). Инаоборот, если при ошибке выделения памяти оператор new возвращает нулевой указатель, а вы забыли организовать контроль этого возвращаемогозначения, то такая ошибка может остаться незамеченной и в конечном итогепри попытке использования нулевого указателя привести к краху программы,причем будет чрезвычайно трудно обнаружить причину этого.ПриложениеВ.Ответы'на'вопросыирешенияупражнений_635ГЛАВА 12Повторение пройденного1. В C++ родовая функция определяет общий набор операций для данных разных типов.
Она реализуется с помощью ключевого слова template. Нижепредставлена основная форма родовой функции:template <classTtype> возвр_значвнив имя_фуихцкх(сп_параметров)2. В C++ родовой класс определяет все операции класса, но действительныеданные задаются в качестве параметра при создании объекта этого класса.Ниже представлена основная форма родового класса:template <class Ttype> class имя_класса3.
^include <iostream>using namespace std;// Возвращает значение а в степени btemplate <class X> X gexp{X a, X b){X i, result = 1;for(i=0; i<b; i++) result *= a;return result;}int main(){cout « gexp(2, 3) « endl;cout « g e x p U O . O , 2 .
0 ) ;return 0;4. ttinclude <iostreara>ttinclude <fstream>using namespace std;Самоучитель C++636template <class CoordType> class coord (CoordType x, y;public:coord(CoordType i, CoordType j ) { x = i; у = j; }void show() { cout « x « ", " « у « endl; }int main(){coord<int> •old, 2), o2{3, 4);ol.show() ;o2.show(};coord<double> o3{0.0, 0.23), o4(10.19, 3.098);o3.show();o4.show();return 0;15. Совместная работа инструкций try, catch и throw происходит следующим образом. Поместите все инструкции, для которых вы хотите обеспечить контроль исключительных ситуаций, внутри блока try. При возникновении исключительной ситуации она возбуждается с помощью инструкции throw и затем обрабатывается с помощью соответствующей инструкции catch.6.
Нет.7. Вызов функции terminate() происходит в том случае, если исключительнаяситуация возбуждается той инструкцией throw, для которой нет соответствующей инструкции catch. Вызов функции unexpected() происходит в томслучае, если исключительная ситуация не указана в списке типов инструкции throw.8. catch(...)Упражнения12.11. Динамическая идентификация типа необходима потому, что в C++ при компиляции программы не всегда есть возмозможность выяснить, на объект какого типа указывает указатель базового класса или ссылается ссылка базового класса.2.
Если класс BaseClass перестает быть полиморфным классом, на экране мыувидим следующее:Приложение В. Ответы на вопросы и решения упражнений637Тип переменной i — это intУказатель р указывает на объект типа BaseClassУказатель р указывает на объект типа BaseClassУказатель р указывает на объект типа BaseClass3. Да.4. if(typeid{*p) == typeid(D2)) ...5. Истинным.
Несмотря на то, что здесь используется один и тот же классшаблон, тип данных в каждой из версий различен.12.21. Оператор dynamic_cast позволяет проверить правильность выполнения операции приведения полиморфных типов.2. ^include <iostreara>#include <typeinfo>using namespace std;class В {virtual void f() {}};class Dl: public В (void f() {}>;class D2: public В {void f(J {}};int main { )(В *р;D2 Ob;p = dynamic_cast<D2 *> (sob);if{p) cout « "Приведение типов прошло успешно";else cout « "Приведение типов не произошло";return 0;3. int main О{int i ; ;Shape *p;638Самоучитель С+->-for(i=0; ip = generator!); // получение следующего объектаcout « typeid(*p) .name ( ) « endl;// объект изображается на экране только в том случае,// если это не объект типа NullShapeif {!dynamic_cast<Null3hape *> (p) )p->example () ;jreturn 0;4.
Нет. Указатели Вр и Dp указывают на объекты совершенно разных типов,12.31, Новые операторы приведения типов обеспечивают более безопасные и понятные способы выполнения операции приведения типов.2. ^include <iostream>using namespace std;void f (const double Si){double sv = const_cast<double s> (i) ;v = 100.0;}int main(){double x - 98.6;cout « x « endl;fix);cout « x « endl;return 0;3. Поскольку оператор const_cast лишает объекты атрибута const, его использование может привести к неожиданной и нежелательной модификацииобъектов.Приложение В. Ответы на вопросы и решения упражнений639Проверка усвоения материала главы 121.
Оператор typeid возвращает ссылку на объект класса type_Jnfo, содержащегоинформацию о типе,2. Для использования оператора typeid в программу необходимо включить заголовок <typeinfo>.3. Ниже представлены новые операторы приведения типов.ОператорНазначениеdynamic_castВыполняет операцию приведения полиморфных типовreinterpret_castПреобразует указатель на один тип в указатель на другой типstatic_castВыполняет операцию "обычного" приведения типовconst_castЛишает объекты атрибута const4.
#include <iostream># include <typeinfo>using namespace std;class A {virtual void f{){}1;class B: public A {1;class C: public В {int main ( ){A *p, a__ob;В b_ob;С c_ob;int i;cout « "Введите О для объектов типа А, "cout « "1 для объектов типа В или";cout « "2 для объектов типа С.\п";cin » i;if (i==l) p = fib_ob;else if(i==2) p = ic_ob;else p = &a_ob;Самоучитель C++640if(typeid(*p) == typeid(A)cout « "Объект А";if (typeidt*p) == typeid(B}cout « "Объект В";if(typeid(*p) == typeid(C)cout « "Объект С";return 0;5.
Оператор typeid можно заменить оператором dynamic_cast в ситуациях, когдаоператор typeid используется для проверки правильности выполнения операции приведения полиморфных типов.6. Оператор typeid возвращает ссылку на объект типа type_info.Проверка усвоения материала в целом1. Здесь представлена версия функции genera tor(), в которой для контроля завыделением памяти используется механизм обработки исключительныхситуаций./* Использование механизма обработки исключительных ситуаций дляотслеживания ошибок выделения памятиVShape *generator()try {switch{rand{) % 4)case 0:return newcase 1:return newcase 2:return newcase 3:return new{Line;Rectangle;Triangle;NullShape;catch (bad_alloc ba) {return NULL;}return NULL;2. Ниже представлена версия функции generator(), в которой используется оператор new(nothrow).Приложение В.