Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791), страница 162
Текст из файла (страница 162)
Можно сделать класс для ввода по шаблону производным от яэ(геат. 17. ("4) Спроектируйте (и реализуйте) значительно лучший вид шаблона для проверки соответствия с шаблоном. Определитесь с тем, что считать лучшим. 18. (*2) Определите манипулятор вывода Ьаэея1, имеющий два аргумента — систему счисления п целое значение — н выводящий целое число в соответствии с системой счисления.
Например, Ьаэея( (2, 9) должно вывести! 001. 724 Глава 21. Потоки 19. 20. 21. 24. 25. 26. 27 (*2) Напишите манипуляторы, которые бы включали и выключали эхо при вводе символов. (" 2) Реализуйте ВоипЫ 1огт из 3 21А.6.3 для обычного набора встроенных типов. ("2) РеализуйтеВоипе1 /огт из ф 21А.6.3 так, чтобы операция вывода никогда не приводила к переполнению ее ширины (шЫЙ ()). Программисту нужно гаранти- ровать, что вывод никогда (незаметным образом) не обрежется и будет достигну- та указанная точность, (*3) Реализуйте манипулятор епсгур1 (й), который бы гарантировал зашифрован- ный вывод в ок1геат с ключом й.
Обеспечьте аналогичный манипулятор е/есгур1 () для 1к1геат. Введите средства, отключающие шифрование потока, чтобы последу- ющий ввод/вывод осуществлялся открытым текстом. ('2) Проследите путь символа через вашу систему от клавиатуры до экрана в сле- дующих инструкциях: сбег с; с1п»с, соиГ «с «еад1; ("2) Измените функцию геайп/з () Я 21.3.6) для обработки всех исключений. Подсказка: «выделение ресурса есть инициализация». (*2.5) Существует стандартный способ чтения, записи и представления дат в соответствии с национальными особенностями. Найдите его в документации на вашу реализацию и напишите маленькую программку чтения и записи дат при помощи э~ого механизма.
Подсказка: к1гис1 1т. ('2.5) Определите некий поток вывода под именем ок1гз1геат, который было бы можно прикрепить к массиву символов (С-строке) аналогично тому, как ок1Ппук1геат прикрепляется к к1г1пд. Однако не копируйте массив в или из ок1гк1геат. Поток ок1гк1геат должен просто обеспечить способ для записи в массив, являющийся его аргументом. Это можно использовать для форматирования в памяти следующим образом: сдаг Ьи/(теккауе кгее) окГгкГгеат окс (Ьи/, чпеккауе кгее~; Ыо котеГЬ1ад'(агдитепб окГ), // в»~вод в буфер Ьи/через ок1 соиг «Ьи/ // окс добавляет зовер~иаюи1иа 0 Операция вроде Ио коте1/к1пу может писать в поток ок1, передавать ок1 своим подоперациям и т.
д. при помощи стандартных операций вывода. Проверять, нет ли переполнения, не нужно, поскольку ок1 знает свои размеры и по заполнении 'перейдет в состояние/а11 (). Наконец, ч(1кр1ау () может записать сообщение в «настоящий» поток вывода. Этот прием может очень пригодиться в случаях, когда окончательная операция с(1кр1ау () связана с записью в какое-то более замысловатое устройство, чем традиционное, ориентированное на вывод строк. Например, текст из ок1 может быть помещен в область на экране с фиксированными размерами. Аналогично определите класс 1к1гк1геат как поток ввода строк, считывающий из заканчивающейся нулем строки символов.
Интерпретируйте завершающий нуль как конец файла. Такие строковые потоки входили в первоначальную библиотеку потоков, и их часто можно найти в <з1гз1геат.й>. ("2.5) Реализуйте манипуляторуепега1(), который бы восстанавливал изначаль- ный (универсальный) формат потока, так же как зс1еп11йс () (з 21А.6.2) заставля- ет поток использовать научный формат. Численные методы Цель еьтисления — понимание, а не числа.
— Р. В. Хэмминг ...но чаппо для учащихся числа — лучшии путь к пониманию. — А, Ролстон Введение — предельныс значения — математические функции — эа1аггау-- векторные операции -- срезы — з11се аггау — устранение временных массивов— дз11ее ап.ау — таян штау — 1пгйгес1 актау — сотр1ех — обобщенные алгоритьчыв случайные числа — советы — упражнения. 22.1. Введение Редко удается написать реальную программу, в которой не производились бы какие-нибудь расчеты. Однако по болыпей части в коде не требуется каких-либо серьезных математических вычислений кроме арифметических.
Данная глава представляет средства, которые стандартная библиотека предлагает тем, кто этим нс ограничивается. Ни С, ни С++ не проектировались специально для численных расчетов. Однако численные расчеты, как правило, возникают в контексте других задач — доступ к базам данных, работа с сетями, управление устройствами, графика, моделирование, финансовый анализ и т.
д. И С++ стал привлекательным средством вычислений, которые выполняются как часть болыпой системы. Более того, численные методы вышли далеко за рамки простых циклов над векторами чисел с плавающей точкой. А там, где нужны более сложные структуры данных, становятся полезными мощные средства С++. Научные и инженерные расчеты все чаще стали проводиться с использованием С++.
Поэтому появились специальные средства и приемы для поддержки таких расчетов. В этой главе описываются те части стандартной библиотеки, которые предназначены для поддержки численных методов. Здесь представлено несколько приемов решения проблем, традиционно возникающих, когда люди выражают математические вычисления на С++. Я нс пытаюсь учить численным методам. Вычисления — это сама по себе захватывающая тема. Чтобы вникнуть в нее, вам нужно пройти хороший курс по численным методам или, по крайней мере, прочитать хороший учебник — а не просто руководство по языку и учебное пособие, 726 Глава 22.
Численные методы 22.2. Предельные значения ")тобы сделать с числами что-нибудь интересное, нам, как правило, нужно знать кое-что о свойствах встроенных типов, определяемое реализацией, а не фиксируемое правилами самого языка (Я 4.6). Например, чему равно самое большое гп1? Какое самое маленькоефоа1? с(ои61е округляется нли обрезается при преобразовании вофоа1? Сколько бит в сйаг? Ответы на этн вопросы дают специализации шаблона питег!с ИтИя, представленного в заголовочном файле <1!т!1к>.
Например: оойЦ(с!ои6!е д, т1й ( (Г (питег!с Ит!1я<ипя!Олег!с!ьаг>.;гИу!1к!= 8) ( // необычные баь1пгы (с числол бит не В) ) !/ й < питенс Итпя<яЬог1>зт!и () )) питепс Ит!1к<кЬогг>,так ,') < 4 ( О ! не яожет храниться в яао«1 без потери точности ) !/(О<а ЬЬ с!<питепс' Итйя<с!оиЬ!е>керк!!оп ()) И = О; !/ (тяте«!с Ит!!я<С?иас!>г!я яресгайхеч!)( // информация о предельных значениях для типа зиад ) Каждая специализация дает необходимую информацию о типе ее аргумента. Таким образом, универсальный шаблон питегсс ИтИя — это просто средство записи для набора констант и встроенных функций: 1етр!а1е<с!аяз 7> с!акя питепс Итлк ( риЬИс ягаИс сопя16оо! 1к крее!айееч! =/а!ке; // доступна ли инфоряацик //для питепс !ипйя<Т>2 // неинтересные установки по улолчанию Реальная информация нахолится в специализациях.
Каждая реализация стандартной библиотеки обеспечивает специализацию питепс Итйя лля каждого фундаментального типа (символьных типов, целых типов, типов для чисел с плавающей точкой и логических типов), но не для других возможных кандидатов — например, ооЫ, перечислений или библиотечных типов (таких как сотр1ех<а1оиЬ(е>). Для интегральных типов, таких как сйаг, представляет интерес только некоторая часть информации. Вот питег!с Итйк<сйаг> для реализации, в которой сйаг состоит из 8 битов и имеет знак: с1акк питег!с Итуя<сааг> ( риЬИс кгайссопк1 Ьоо! !к крее!айхес! = 1гие; 0 да, у нас есть инфоряацик кгайс сопя!!п1 сцу!1к = 1, // число битов («двоичных цифр>), исключая знак я1аИс сопя1 Ьоо! 1к к!упе«1= 1«ие; // саагииеет знак кгапс сопя! Ьоо1 !к !п1еуег= 1гие; //сЬаг — зто интегральный >пап 727 22.2.
Предельные значения шйпе игайс слог тш () Ягою() ( ге!игл -128; ) // наиленьшее значение !лйпеигайс слагтах() 16гою()(ге!игл !27;) //наибольшее значение //лножество объявлениь), не шьеюи(их отношения к слог Отметим, что для целого со знаком количество цифр на 1 больше, чем количество бит, необходимое для хранения переменной данного типа. Болщнинство членов шаблона питег!с Йтйя предназначено для описания чисел с плавающей точкой. Например, вот как описывается возможная реализация для3!оай с!акк ли тепе Итйк /!оа1> ( рибйа к1айс соли! Ьоо1 !и кресса1сеес1 = 1гие; з1айссопи1ш1гайх = 2; //основание показателя степени (целого) кгайссопк1 !п1Й!уйи = 24; О количество (двоичних) цифр вяаньписсе игайс соли1 !л1 й!уйз!О = б; // количеслчво десятичных цифр в иантиссе игайс сопи! 6оо! !и и!унес) = 1гие, исайссопи1Ьоо! и шгеуег=/а!ке; и1айс сопи! Ьоо! !к ехас1 =/аьке; ига йс/(оп! тш () Ягою () ( ге1 игл 1 ! 7549435Е-ЗВР ) к 1айс/)па! тих () Ягою () ( ге1и гп 3 4028234 7Еч3ВГ; ) кгайс/!оа1 еркйоп !) Ягою () ( ге1игп 1 19209290Е-07Г; ) игайс/7оаз соиле! еггог() Ягою() (ге!игл 0,5Г;) и!айс /)о а! !л/!п!19 () Ягою () ( ге! игл /*какое - то значение */; ) игайс/!оа! Ои!е1 ХаА () 16г ою () ( ге1игп /*какое-то значение'/, ) игайс/!оа1и1упа1шу МаМ () 16гою () ( ге!игл /" какое-то знамение*/; ) и1айс/7 оп! и!епогт т!л () Ягою () ( ге!игл тш (); ) ззайс сопз1!п1 тт ехропел1= -!25; изайс сопи! Я1 т!л ехропенйО = -37; и1айс сопя! ш1 тих ехропел1= ч-!28, и1айс сопи! ш1 тик ехропепг!О = +38; якайс сопи Ьоо1 Ьак !л/спйу = 1гие; и1айс сопит Ьоо! Ьак ди!е! )УаХ= йие; з1айс соли! Ьоо! Ьак и!Опа!!пу )МаХ = 1гие, и1айс сопи!/!оа! с)споет и1у!е лак г!епогт = ч!елогт абзел1; //злененгп перечисления из <йт~!и> исайе голи! 6оо! Ьаи с!епогт 1окк =/а!ке, // соответствует )ЕС-559 к1айс салий Ьоо! !к !ес559 = 1гие; к1айс солз1Ьоо1!и Ьоипйей = Яие; игайс сопИ Ьоо! гк тос!и!о =!а!ие, игайс соля! Ьоо! 1гарк = 1гие; и1айс сопи! Ьоо! йп упеки Ье!оге = 1гие; и1айс сопи!/)оа! гоипс! ксу!е гоипй к1у!е = гошЫ 1о пеагеи1; О клемент перечисления из <!итй> Отметим, что ппп () — зто самое маленькое положительное нормализованное число, а ери!!оп — самое маленькое положительное число с плавающей точкой такое, что !+еряйоп- ! болыне нуля.