Волжский университет имени В.Н.Татищева
Факультет “Информатика и телекоммуникации”
Кафедра “Информатика и системы управления”
КУРСОВАЯ РАБОТА
по дисциплине: “Системное программное обеспечение”
Тема:
«Стандартные библиотечные функции С++»
Содержание
Введение
1. Стандартные библиотеки языка Си
1.1 Файлы заголовков
1.2 О стандартных библиотеках
1.3 Стандарт ANSI C
2.Стандартные функции библиотеки math.h
3.Математические ошибки4. Программная часть4.1 Постановка задачи4.2 Описание разработаннойпрограммы5/>/>. Заключение6. Список используемой литературы
Приложение 1
Приложение 2
Введение
C++ являетсяязыком «общения» человека с компьютером. Основным«читателем» текстов на языке C++ является транслятор, в обязанностикоторого входит проверка правильности текста программы и его последующий переводна язык процессора.
Языкпрограммирования позволяет описывать алгоритмы и данные. Однако еговыразительные возможности не исчерпываются множеством содержательных алгоритмови связанных с ними структур данных. Даже самые абсурдные с точки зрения программиста,реализующего сколько-нибудь значимый алгоритм, предложения языка остаютсяабсолютно правильными и корректными для транслятора. Примеры, основанные насодержательных алгоритмах, неизбежно оставляют за рамками изложения множествапредложений, на которых, порой, и выявляются характерные черты языка.
C++ — этосложный, логически стройный и красивый язык. Его хорошее знание приводит кмастерскому владению этим языком. И здесь уже будет по силам решение любойзадачи.
Программа — это последовательность инструкций,предназначенных для выполнения компьютером. В настоящее время программыоформляются в виде текста, который записывается в файлы. Этот текст являетсярезультатом деятельности программиста и, несмотря на специфику формальногоязыка, остаётся программой для программиста.
Процесссоздания программы предполагает несколько этапов. За этапом разработки проектапрограммы следует этап программирования. На этом этапе пишется программа.Программистами этот текст воспринимается легче двоичного кода, посколькуразличные мнемонические сокращения и имена заключают дополнительную информацию.
Файл сисходным текстом программы обрабатывается транслятором, который осуществляетперевод программы с языка программирования в понятную машине последовательностькодов. Процесс трансляции разделяется на несколько этапов.
На первомэтапе исходный текст подвергается лексической обработке. Программа разделяетсяна предложения, предложение делится на элементарные составляющие (лексемы).Каждая лексема распознаётся и преобразуется в соответствующее двоичноепредставление. Этот этап работы транслятора называют лексическим анализом.
Затем наступает этап синтаксического анализа. На этом этапеиз лексем собираются выражения, а из выражений — операторы. В ходе трансляциипоследовательности терминальных символов преобразуются в нетерминалы.Невозможность достижения очередного нетерминала является признакомсинтаксической ошибки в тексте исходной программы.
Послесинтаксического анализа наступает этап поэтапной генерации кода. На этом этапепроисходит замена операторов языка высокого уровня инструкциями ассемблера, азатем последовательностями машинных команд.
Системыпрограммирования, реализующие язык программирования C++, предусматриваютстандартные приёмы и средства, которые делают процесс программирования болеетехнологичным, а саму программу более лёгкой для восприятия.
Языкипрограммирования предназначены для написания программ. Однако было бы страннописать всякий раз одни и те же программы или даже одни и те же подпрограммы(например, подпрограмму вывода информации на дисплей или на принтер — этаподпрограмма требуется практически в каждой программе).
К счастью,проблема многократного использования программного кода уже очень давно иуспешно решена.
Практическикаждая система, реализующая тот или иной язык программирования (транслятор,компоновщик и прочее программное окружение) имеет набор готовых к использованиюфрагментов программного кода. Этот код может находиться в разной степениготовности. Это могут быть фрагменты текстов программ, но, как правило, этообъектный код, располагаемый в особых файлах. Такие файлы называютсябиблиотечными файлами.
Дляиспользования библиотечного кода программисту бывает достаточно указать впрограмме требуемый файл и обеспечить вызов соответствующих функций. Дляиспользования библиотечного кода бывает достаточно стандартного набора языковыхсредств. Решение всех остальных проблем транслятор и компоновщик берут на себя.Разумеется, программисту должно быть известно о существовании подобныхбиблиотек и о содержании библиотечных файлов.
1. Стандартные библиотекиязыка Си
1.1 Файлы заголовков
Использование текстовыхфайлов заголовков (header-файлов), которые вставляются в текст программы наязыке Си с помощью директивы include препроцессора Си, является традиционнойтехникой программирования на языке Си, обеспечивающей синтаксическуюправильность использования библиотечных функций (в том числе и системныхвызовов) в прикладной программе. Ранее файлы заголовков, главным образом,содержали определения типов и символических констант (констант, которымсопоставлены имена посредством директивы define препроцессора Си), используемыхв интерфейсах соответствующих библиотечных функций. Корректное применениефайлов заголовков позволяло программистам не заботиться о правильности типовданных, используемых при обращении к библиотечным функциям и обработке ихрезультатов.
Однако, традиционныефайлы заголовков не гарантировали того, что набор параметров вызываемойбиблиотечной функции соответствовал ее интерфейсу, поскольку объявлениефункции, содержащее ее интерфейс, в файле компиляции отсутствовало. В лучшемслучае ошибки такого рода устойчиво проявлялись во время выполнения программы,хотя далеко не всегда было просто понять их природу. В худшем случае ошибкавозникала при переносе программы, поскольку одноименные библиотечные функциидействительно обладали разными интерфейсами в разных средах, и в исходнойоперационной среде ошибки в параметрах не было.
Эту проблему удалосьрешить (хотя и не абсолютно) за счет введения в язык Си понятия прототипафункции. Грубо говоря, прототип функции – это часть ее объявления, содержащаятолько интерфейс (без тела функции). Наличие прототипа любой функциидопускается в любом файле компиляции, даже не обязательно содержащем вызов этойфункции. Однако, если вызов функции содержится в файле компиляции, то наборпараметров вызова должен точно соответствовать интерфейсу вызываемой функции,определенному в ее прототипе.
Дальнейший ходрассуждений очевиден. Для группы родственных библиотечных функций делаетсяобщий файл заголовков, содержащий необходимые определения типов данных исимволических констант, а также набор прототипов этих библиотечных функций.После включения в файл компиляции такого файла заголовков на стадии компиляциибудут обнаружены все синтаксические ошибки обращения к библиотечным функциям.Однако это решение не абсолютно. Это действительно так, поскольку в принципеникто не может заставить программиста на языке Си включать в текст программывсе требуемые файлы заголовков. Пусть этот вопрос решает каждый программист вотдельности.
Последнее замечаниеотносительно файлов заголовков. В последнее время они содержат большоеколичество операторов условной компиляции, относящихся большей частью копределению символических констант. Дело в том, что в зависимости от версииоперационной системы значения констант, используемых с одним и тем же смыслом,часто меняются. Конечно, прикладная программа не должна зависеть от такихизменений. Наличие операторов условной компиляции внутри файла заголовковразрешает эту проблему.
1.2 О стандартныхбиблиотеках
С++ и его стандартные библиотеки спроектированы так, чтобыобеспечивать переносимость. Имеющаяся на текущий момент реализация языка будетидти в большинстве систем, поддерживающих C. Из С++ программ можно использоватьC библиотеки, и с С++ можно использовать большую часть инструментальных средств,поддерживающих программирование на C.
В языке Си стандартнаябиблиотека более сильно интегрирована с языком по сравнению с другими языкамипрограммирования высокого уровня. Без использования функций стандартнойбиблиотеки не может быть написана ни одна серьезная программа на языке Си, вчастности потому, что в самом языке нет никаких средств ввода/выводаинформации.
Стандартную библиотекуфункций языка Си можно разделить на две категории: функции, которые имеются вбиблиотеке любой системы программирования языка Си для различных операционныхсистем и различных архитектур компьютеров, и функции, которые являютсяуникальными в рамках какой-либо системы программирования или обеспечиваютдоступ к специфическим возможностям конкретной операционной системы, илисвязаны с конкретной архитектурой компьютера.
Функции первой категорииобразуют переносимое ядро библиотеки; программы, в которых используются толькотакие библиотечные функции, могут быть перенесены в другую системупрограммирования, другую операционную систему или на другой тип архитектурыкомпьютера с наименьшими затратами. Плата за универсальность — невозможностьвоспользоваться специфическими средствами, предоставляемыми конкретнойвычислительной средой.
Функции второй категориипредоставляют возможность получить доступ к функциям ядра данной операционнойсистемы к внутренним структурам данной операционной системы, к регистрам используемыхаппаратных устройств. Кроме того, ко второй категории относятся функции,которые добавлены в библиотеку, исходя из личных предпочтений разработчиковконкретной системы программирования — как им видится удобный набор средств дляразработки различных алгоритмов — сравните, например, функции memset и setmem.
Со времени принятиястандарта языка Си, что окончательно произошло в 1989 году, в системахпрограммирования Си такие необоснованные расширения библиотек практическиисчезли, но в ранних версиях языка подобный разнобой был очень велик. Ксожалению, наборы функций второй категории не согласованы даже для различныхсистем программирования в рамках одной операционной системы на одном типеархитектур компьютеров. Это четко прослеживается на примере системпрограммирования Turbo C от Borland и Microsoft C: библиотечные функции,обеспечивающие интерфейс для вызова одной и той же функции операционнойсистемы, могут иметь не только разные параметры, но и разные названия.
Эти несогласованностиобъяснялись, с одной стороны, коммерческими соображениями стремлением удержатьпод контролем рынок программного обеспечения, чтобы пользователи, начавшиепрограммировать с использованием одной системы программирования, покупали затемболее новые программные продукты той же фирмы, а с другой стороны, позднимпоявлением стандарта на язык и на его библиотеки и независимые эволюции отверсии к версии каждой системы программирования [3]. (Напомним, что стандартязыка был принят примерно через пятнадцать лет после его появления и черездесять лет после того, как его уже начали активно использовать) При этом, надоотметить, происходило постепенное сближение различных систем программированияпо мере того, как каждая из них заимствовала наиболее ценные идеи уконкурентов. Так, различия между библиотеками последних систем программированияTurbo C и Microsoft C практически отсутствуют.
1.3 Стандарт ANSI C
Здесь содержатсянестрогие выдержки из стандарта ISO/IEC 9899:1993 — Programming language C,касающиеся некоторых соглашений о стандартных библиотеках.
1. Каждая функцияописывается в библиотеке, где содержатся прототипы (описания) нескольких схожихфункций (например, функции ввода/вывода) и, при необходимости, требуемыеструктуры данных и макроопределения. Библиотека подключается путем указаниядирективы препроцессора #include за которым следует заголовокбиблиотеки;
2. Стандартнымизаголовками являются: , , ,, , , ,, , , ,, , , ,, , , ,, , , ;
3. Все стандартныебаблиотеки могут включаться в программу в любом месте, предусмотренномсинтаксисом языка, кроме библиотеки (результат зависит отзначения переменной NDEBUG). Это не оказывает никакого влияния на эффективностьпрограммы. Однако корректное выполнение любой функции, может быть произведено,только если библиотека, ее описывающая, будет включена в программу раньшевызова этой функции;
4. Программа не можетсодержать переменных, имена которых лексически полностью совпадают смакроопределениями в какой — либо подключенной библиотеки. В противном случае,препроцессор в программе заменит имена макросов на вновь определенные, а не набиблиотечные выражения;
5. Библиотеки не должнывключать определения локальных переменных без указания external (externallinkage).
2. Стандартные функции библиотеки math.h
Имя функции: ACOS
#include
double acos(x);
double x;
Описание: Функция acosвозврaщaет арккосинус x в интервале от 0 до n. Значение x должно быть между -1и 1.
Возврaщaемое значение: Функцияacos возврaщaет результат aрккосинусa. Если x меньше -1 или больше 1, acos устaнaвливaетerrno в EDOM, печaтaет сообщение об ошибке DOMAIN в stderr и возврaщaет 0.
Обрaботкa ошибок может быть модифицировaнa при изменении процедурыmatherr.
Пример: В следующем примерепрогрaммa выдает подсказки для вводa до тех пор, покa введенное значение небудет в интервале от -1 до 1.
#include
int errno;
main()
{ float x,y;
for (errno=EDOM;errno==EDOM;y=acos(x))
{ printf(«Cosine=»);
scanf(“%f”,&x);
errno = 0; }
printf(«Arc cosine of %f = %f\n»,x,y); }
Обрaзец выводa:
Cosine = 3
acos: DOMAIN error
Cosine = -1.0
Arc cosine of -1.000000 = 3.141593
Имя функции: ASIN
#include
double asin(x);
double x;
Описание. Функция asin вычисляетарксинус x в интервале -n/2 до n/2. Значение x должно быть между -1 и 1.
Возвращаемое значение: Функцияasin возвращает результат арксинуса. Если x меньше -1 или больше 1, asinустанавливает errno в EDOM, печатает сообщение об ошибке DOMAIN в stderr ивозвращает 0.
Обрaботкa ошибок может быть модифицировaнa при изменении процедурыmatherr.
Пример:
#include
int errno;
main()
{ float x, y;
for (errno=EDOM; errno==EDOM; y=asin(x)) {
printf(«Синус = „);
scanf(“%f,&x);
errno=0; }
printf (»арксинус от %f=%f\n”,x,y); }
ВЫВОД:
Синус = -1.001
asin: DOMAIN error
Синус = -1
Арксинус от -1.000000 = -1.570796
Имя функции: ATAN-ATAN2
#include
double atan(x);
double(x);
double atan2(y,x);
double x;
double y;
Описание: atan и atan2 функциивычисляют арктангенс x и y/x соответственно: atan возвращает значение впределах от -пи/2 до пи/2; atan2 возвращает значение в пределах от -пи до пи.
Возвращаемое значение: atan иatan2 возвращают значение арктангенса.0, если оба аргумента функции atan2нулевые; при этом errno устанавливается в EDOM и печатается сообщение об ошибкеDOMAIN в stderr.
Обработку ошибки можно изменить, используя команду matherr.
Пример:
#include
printf(“%.7f\n”,atan(1.0));
printf(“%.7f\n«atan2(-1.0,1.0);
ВЫВОД:
0.7853982
-0.7853982
Имя функции: CABS
#include
double cabs(z);
struct compex z;
Описание: Cabs функция вычисляетабсолютное значение комплексного числа. Комплексное число должно иметьструктуру типа complex, определенный в math.h в следующем виде:
struct complex { double x,y; };
Вызов cabs эквивалетно sgrt(z.x*z.x+x.y*z.y)
Возвращаемое значение: Cabsвозвращает абсолютное значение. Нет кодов ошибок.
Пример:
#include
struct complex value;
double d;
value.x=3.0;
value.y=4.0;
d=cabs(value);
Имя функции: CEIL
#include
double ceil(x);
double x;
Описание: Ceil функциявозвращает самое маленькое целое, которое больше или равно значению числа сплавающей точкой.
Возвращаемое значение: Число сплавающей точкой. Нет кодов ошибок.
Пример:
#include
double y;
y=ceil(1.05); /*y=2.0 */
y=ceil(-1.05); /*y=-1.0 */
Имя функции: FABS
#include
double fabs(x);
double x; значение с плавающей точкой
Описание: Функция fabsвозвращает абсолютное значение своего аргумента с плавающей точкой.
Возвращаемое значение: Функцияfabs возвращает абсолютное значение своего аргумента. Возвращаемого значения вслучае ошибки нет.
Пример:
#include
double x,y;
y = fabs(x);.
Имя функции: FLOOR
#include
double floor(x);
double x; значение с плавающей точкой.
Описание: Функция floorвозвращает значение с плавающей точкой, представляющее наибольшее целое,которое меньше или равно x.
Возвращаемое значение: Функцияfloor возвращает результат с плавающей точкой. Возвращаемого значения в случаеошибки нет.
Пример:
#include
double y;
y = floor(2.8); /* y = 2.0 */
y = floor(-2.8); /* y = -3.0 */
Имя функции: FMOD
#include
double fmod(x,y);
double x; значение с плавающей точкой.
double y;
Описание: Функция fmod вычисляетостаток от деления x на y с плавающей точкой, где x=iy+f, i — целое, f — имееттот же знак, что x; а абсолютное значение x меньше, чем абсолютное значение y.
Возвращаемое значение.: Функция fmodвозвращает остаток с плавающей точкой. Если y равно 0, функция возвращает 0.
Пример:
#include
double x,y,z;
x = -10.0;
y = 3.0;
z = fmod(x,y); /* z = -1.0 */.
Пример:
#include
int errno;
main()
{ float x,y;
for (errno=EDOM; errno==EDOM; y=asin(x)) {
printf(»Sine=”);
scanf(“%f”, &x);
errno = 0; }
printf(«Arc sine of %f\n»,x,y);}
На выходе:
Sine = -1.001
asin: DOMAIN error
Sine = -1
Arc sine of -1.000000=-1.570796
Имя функции: LDEXP
#include
double ldext(x,exp);
double x; значение с плавающей точкой
int *exp; целая экспонента
Описание.: Функция ldexpвозвращает x, умноженное на 2 в степени exp.
Возвращаемое значение: ldexp возвращаетx, умноженное на 2 в степени exp.В случае переполнения результата функция возвращает+HUGE или -HUGE (в зависимости от знака x) и устанавливает errno в ERANGE.
Пример:
#include
double x,y;
int p;
x = 1.5;
p = 5;
y = ldexp(x,p); /* y = 48.0 */
Имя функции: POW
#include
double pow(x,y);
double x; возводимое число
double y; степень числа x
Описание: Функция pow вычисляетx, возведенное в степень y.
Возвращаемое значение: Функцияpow возвращает значение x в степени y. Если y равна 0, pow возвращает значение1. Если x равно 0 и y отрицательная, pow устанавливает errno в ERANGE ивозвращает HUGE. Если x отрицательное, а y не является целой, функция печатает сообщениеоб ошибке DOMAIN в stderr, устанавливает errno в ERANGE и возвращает либо положительное,либо отрицательное значение HUGE. В случае переполнения или потери значимостиникакого сообщения не печатается.
Пример:
#include
double x = 2.0, y = 3.0, z;
z = pow(x,y); /* z = 8.0 */
Имя функции: SIN-SINH
#include
double sin(x); вычисляет синус x
double sinh(x); вычисляет гиперболический синус x
double x; радиан
Описание: Функции sin и sinhвычисляют соответственно синус и гиперболический синус x.
Возвращаемое значение.:Функция sinвозвращает синус x. Если x большой, то может возникнуть частичная потерязначимости результата. В этом случае sin вырабатывает ошибку PLOSS, носообщения не печатает. Если x настолько большой, что теряется общая значимостьрезультата, тогда sin печатает сообщение об ошибке TLOSS в stderr и возвращает 0.В обоих случаях errno устанавливается в ERANGE. Функция sinh возвращаетгиперболический синус x. Если результат большой, sinh возвращает значение HUGE(отрицательное или положительное, в зависимости от знака x) и устанавливаетerrno в ERANGE.
Обрaботкa ошибок может быть модифицировaнa при изменении процедурыmatherr.
Пример:
#include
double pi = 3.1415926535,x,y;
x = pi/2;);
y = sin(x); /* y равен 1.0 */
y = sinh(x); /* y равен 2.3 */
Имя функции: SQRT
#include
double sqrt(x);
double x; неотрицательное значение с плавающей точкой
Описание: Функция sqrt вычисляетквадратный корень x.
Возвращаемое значение: Функцияsqrt возвращает результат вычисления квадратного корня. Если x — отрицательное,функция печатает сообщение об ошибке DOMAIN в stderr, устанавливает errno вEDOM и возвращает 0.
Обрaботкa ошибок может быть модифицировaнa при изменении процедурыmatherr.
Пример:
#include
#include
double x,y,z;
if ((z = sqrt(x+y))==o.0)
if((x+y)
perror(«sqrt of a negative number»);
Имя функции: TAN-TANH
#include
double tan(x); вычисляет тангенс x
double tanh(x); вычисляет гиперболический тангенс x
double x; радиан
Описание: Функции tan и tanh вычисляютсоответственно тангенс и гиперболический тангенс x.
Возвращаемое значение: Функцияtan возвращает тангенс x. Если x большой, при вычислениях может возникнуть частичнаяпотеря значимости. В этом случае tan вырабатывает ошибку PLOSS, но сообщения непечатает. Если x настолько большой, что общая значимость результата теряется,тогда tan печатает сообщение об ошибке TLOSS в stderr и возв ращает 0. В обоихслучаях errno устанавливается в ERANGE. Функция tanh возвращает гиперболическийтангенс x.
Возвращаемого значения в случае ошибки нет.
Пример:
#include
double pi,x,y;
pi = 3.1415926535;
x = tan(pi/4.0); /* x равен 1.0 */
y = tanh(x); /* y равен 1.6 */
3. Математические ошибки
Ошибки, приведенные ниже, порождаются математическимипроцедурами библиотеки Си. Эти ошибки соответствуют только тем типам ошибок,которые объявлены в , и возвращаются функцией matherr.
Таблица 1. Ошибка Описание DOMAIN
Аргумент для функции находится вне области определения функции.
(например log(-1)); OVERFLOW
Результат очень большой для предоставления его в возвращаемом значении.
(например exp(1000)); PLOSS Возникла частичная потеря значимости. SING
Особенность аргумента: аргумент для функции имеет неверное значение(например, пересылается значения 0 к той функции, которая требует ненулевого значения).
(например pow(0,-2)); TLOSS
Возникла общая потеря значимости.
(например sin(10e70)) UNDERFLOW
Результат очень маленький для предоставления его в возвращаемом значении.
(например exp(-1000));
Имя функции: matherr
Описание: Процедура обработки ошибок операций с плавающей точкой, модифицируемая пользователем. Функция matherr вызывается для обработки ошибок, генерируемых функциями из библиотеки математических функций
Синтаксис #include
int matherr(struct exception *e);
matherr служит в качестве пользовательской ловушки, (функции определяемой пользователем) которую вы можете написать сами (смотрите пример). matherr сожно использовать для отслеживания ошибок области определения и выхода за пределы диапазона, происходящих в математических функциях. Она не отслеживает исключительных ситуаций, возникающих при работе со значениями с плавающей точкой (например при делении на 0). Для отслеживания таких ошибок смотри функцию signal.
Вы можете модифицировать процедуру matherr специально для вашего случая (то есть она будет отлавливать определенные типы ошибок); модифицированная функция matherr должна возвращать 0, если она не может обработать данную ошибку, и 1, если ошибка успешно обработана. Если функция matherr возвращает ненулевое значение, сообщение об ошибке не печатается, и переменная errno не изменяется.
Ниже приведена структура exception (определенная в файле math.h):
struct exception {
int type;
char *Function;
double arg1, arg2, retval;
};
Составные части структуры exception обозначают следующее:
Таблица 2.Имя Что это Type тип произошедшей математической ошибки; тип enum определен в typedef_mexcep (смотрите определение после данного списка). Function указатель на символьную строку с нулевым окончанием, содержащую имя библиотечной математической функции, которая выдала ошибку. arg1,arg2 аргументы (переданные данной функции), которые вызвали ошибку; если функции передается только один аргумент, он хранится в arg1. Retval стандартное возвращаемое значение для функции matherr; вы можете модифицировать это значение.
Параметр typedef_mexcep, также определенный в файле math.h,перечисляет следующие символические константы, представляющие собой возможныематематические ошибки: (см. Таблицу 1).
Исходный код для функции matherr, определенной по умолчанию находится на дистрибутивных дисках с системой Turbo C++.
Стандарт UNIX функции matherr несовместим со стандартом ANSI C. Если вам требуется версия функции matherr для системы UNIX, пользуйтесь программой matherr.c, поставляемой на дистрибутивных дискетах пакета Turbo C.
Возвращаемое По умолчанию функция matherr возвращает 1 если значение ошибка UNDERFLOW или TLOSS, иначе 0. Функция matherr также может модифицировать параметр e->retval, который посредством функции matherr передается в вызывающую программу. Когда функция matherr возвращает 0, (означающий, что обработать ошибку она не может), функция _matherr устанавливает переменную errno и печатает сообщение об ошибке. Когда функция matherr возвращает ненулевое значение, (означающее, что ошибка успешно обработана), глобальная переменная errno не устанавливается и сообщение об ошибке не выводится.
Переносимость matherr доступна на многих компиляторах Си, однако она не поддерживается стандартом ANSI C.
matherr в стиле системы UNIX (которая печатает сообщение и завершает выполнение программы) поставляется вместе с пакетом Turbo C++ в файле MATHERR.C. matherr может не поддерживаться в дальнейших версиях Turbo C++.
Пример:
#include
#include
#include
int matherr(struct exception *a);
{
if (a -> type == DOMAIN)
{
if(strcmp(a -> name, «sqrt») == 0)
{
a -> retval = sqrt (-(a -> arg1));
return (1);
}
}
return (0);
}
int main(void)
{
double x,y;
x = -2.0;
y = sqrt(x);
printf(«Значение, скорректированное matherr: %lf\n»,y);
return 0;
}
/>/>/>/>/>4. Программная часть/>/>/>/>/> 4.1Постановка задачи
Перед началом выполнения данной курсовой работы я поставилдля себя целью изучить принципы работы с математической библиотекой, функции исистемные вызовы языка С++, позволяющие выполнять геометрические,тригонометрические и другие нестандартные математические расчёты. В курсовойработе я буду создавать и описывать программу, которая позволит выполнятьрасчёты по заданным параметрам, введённых с клавиатуры.
Данная программа в дальнейшем может быть использованастудентами для изучения математической библиотеки на лабораторных занятиях поизучению теоретического материала и приобретения практических навыков подисциплине «Системное Программное Обеспечение», а также программа может бытьиспользована в работе с операционной системой MS DOS.
/> 4.2Описание разработанной программы
Моя программа предназначена для демонстрации работы созданноймной библиотеки.
В программе организовано псевдографическое меню, в которомможно выбрать один из нескольких пунктов:
1) Площадькруга.
2) Объёмцилиндра.
3) Площадьцилиндра.
4) Площадьтрапеции.
5) Объёмпирамиды.
6) Объёмшара.
7) Площадьсферы.
8) Факториал.
9) Выход.
При выборе соответствующего пункта, необходимо нажать клавишуEnter, для того чтобы приступить к расчётам или, если выбран пункт «Выход»,выйти из программы. Для немедленного выхода из программы необходимо нажатьклавишу ESC.
В программе я использую встроенные библиотеки С++.
Таблица. 3Название библиотеки Описание функции Iostream.h Потоки ввода \ вывода Conio.h Прототип функции задержки Math.h Использование математических функций
А также помимо стандартных библиотек, подгружается matfac.cpp- разработанная мной библиотека.
Почти в любой программе не обойдешься без собственныхфункций, они упрощают программирование, программа становится более понятна иудобна в изучении.
В моей программе я использую несколько своих функций вызываемыхиз основной программы.
· f1-f8- функции соответствующие описанным выше пунктам меню (Площадь круга, Объёмцилиндра, …, Выход.).
· sw –функция для вызова других функций (f1-f8).
· mn –функция для организации меню.
В функции sw и mn в качестве аргументов передаются переменнаясоответствующая выбранному пункту меню, а также массив строк.
Непосредственно из функций f1-f8 передаются аргументы ивызываются описанные мною функции из matfac.cpp.
С помощью директив #include в головную программу выключаютсядругие файлы: matfac.cpp. Предположим что все они находятся в корневойдиректории диска С:. Если это не так, то необходимо изменить соответствующиедирективы #include.
Листинги исполняемой программы kurs.cpp и подгружаемогомодуля matfac.cpp представлены в приложениях 1 и 2.
5. Заключение
В данной курсовой работе мной был рассмотрен стандартныймодуль для работы с математическими функциями на языке C++ “math.h”. А такжеразработан собственный модуль для вычисления площади, объёмов геометрическихфигур и других параметров. Данная работа позволила мне более углубленно изучитьработу с математическими функциями, различные тонкости языка. В курсовой работебыла создана и описана программа, позволяющая вычислять некоторыегеометрические величины.
Данная работа может использоваться в учебных целях, а на основекода модуля могут осуществляться различные разработки дополнительных функцийдля работы с математическими функциями, на лабораторных занятиях по изучениютеоретического материала и приобретения практических навыков по дисциплине«Системное Программное Обеспечение».
6. Список используемой литературы
1. М.И.Болски. Язык программирования Си. 1988г.
2. Б.И.Березин. Начальный курс С и С++. М.,2001г.
3. Интернетресурсы (www.citforum.ru)
Приложение 1
Листинг основной программы (kurs).
#include
#include
#include
#include
//#include
void f1(char menu [9][30])// Площадь круга
{
float r;
gotoxy(15,10);
cout
cout>r;
cout
getch();
}
void f2(char menu [9][30])// Объём цилиндра
{
float r,h;
gotoxy(15,10);
cout
cout>r;
cout>h;
cout
getch();
}
void f3(char menu [9][30])// Площадь цилиндра
{
float r,h;
gotoxy(15,10);
cout
cout>r;
cout>h;
cout
getch();
}
void f4(char menu [9][30])// Площадь трапеции
{
float a,b,h;
gotoxy(15,10);
cout
cout>a;
cout>b;
cout>h;
cout
getch();
}
void f5(char menu [9][30])// Объём пирамиды
{
float a,b,h;
gotoxy(15,10);
cout
cout>a;
cout>b;
cout>h;
cout
getch();
}
void f6(char menu [9][30])// Объём шара
{
float r;
gotoxy(15,10);
cout
cout>r;
cout
getch();
}
void f7(char menu [9][30])// Площадь сферы
{float r;
gotoxy(15,10);
cout
cout>r;
cout
getch();
}
void f8(char menu [9][30])// Факториал
{float r;
gotoxy(15,10);
cout
cout>r;
cout
getch();
}
short sw(short k,char menu[9][30])//вызов функций
{
short kod=1;
switch (k)
{
case(1):f1(menu);break;
case(2):f2(menu);break;
case(3):f3(menu);break;
case(4):f4(menu);break;
case(5):f5(menu);break;
case(6):f6(menu);break;
case(7):f7(menu);break;
case(8):f8(menu);break;
case(9):cout
}
}
void mn (short k, char menu [9][30])//меню
{
clrscr();
textattr(7);
for(int i=1;i
{
gotoxy(15,i+5);
if (k==i) {
textattr(2);
cprintf(menu[i]);
textattr(7);
} else cprintf (menu[i]);
}
}
void main ()
{
clrscr();
char menu [9][30];//массив строк
strcpy (menu[1],«Площадь круга»);
strcpy (menu[2],«Объём цилиндра»);
strcpy (menu[3],«Площадь цилиндра»);
strcpy (menu[4],«Площадь трапеции»);
strcpy (menu[5],«Объём пирамиды»);
strcpy (menu[6],«Объём шара»);
strcpy (menu[7],«Площадь сферы»);
strcpy (menu[8],«Факториал»);
strcpy (menu[9],«Выход»);
short k=1, kod=1;
mn (k, menu);
do
{
kod=getch();
switch (kod)//определить нажатые клавиши
{
// case (27):{ return;};break;//ESC
case (80):{k++;if (k>9) k=9; mn(k,menu);};break;//стрелка вверх
case (72):{k–;if (k
case (13):clrscr();kod=sw(k,menu);mn(k,menu);break;//enter
}
} while (kod!=27); //ESC
}
Приложение 2
Листинг модуля “matfac.cpp”.
#include
#define M_PI 3.14159265358979323846
float fac (float n) //factorial_1
{
float f=0;
if (n!=0)
{
f=1;
for (int i=1;i
{
f*=i;
}
} else f=0;
return f;
}
float Sokr (float r) //площадь груга_2
{
return (M_PI*r*r);
}
float VCil (float r,float h) //объём цилиндра_3
{
return (M_PI*r*r*h);
}
float SCil (float r,float h) //площадь цилиндра_4
{
return (M_PI*2*r*(r+h));
}
float STrap (float a,float b,float h) //площадь трапеции_5
{
return ((a+b)/(2*h));
}
float VPir (float a,float b,float h) //объём пирамиды_6
{
return ((a*b*h)/3);
}
float VSfer (float r) //объём шара_7
{
return (4*M_PI*r*r)/3;
}
float SSfer (float r) //площадь сферы_8
{
return (4*M_PI*r*r);
}