Библиотека времени выполнения
В определении языков Си и C++ отсутствуют операторы ввода-вывода, операции над строковыми данными и аналогичные средства, имеющиеся в других языках программирования. Этот недостаток компенсируется добавлением в системы программирования Си и C++ библиотек функций, подключаемых к рабочим программам при редактировании связей и называемых библиотеками времени выполнения. Отделение этих библиотек от компилятора позволяет в случае необходимости использовать различные варианты этих библиотек, например для различных компьютеров или операционных систем. Часть функций из библиотек времени выполнения стандартизована, в стандарте зафиксированы имя функции, ее назначение, перечень и типы параметров, тип возвращаемого значения. Другие функции ориентированы на конкретные компьютеры и ОС, способы их вызова и использования могут быть различными в системах программирования разных фирм. Чтобы обеспечить возможность контроля правильности вызова функций при компиляции программы, в систему программирования входят файлы заголовков функций времени выполнения. В файлах заголовков определяются прототипы библиотечных функций, а также константы и типы данных, используемые этими функциями. В Си++ определены следующие файлы заголовков: Assert.H - содержит макросы для сообщений об ошибках при выполнении условия, задаваемого программистом. Макрос - упорядоченная последовательность команд, выполняющая определенные действия. Ctype. Н - функции для проверки и преобразования данных типа char; Float. H - макросы для операций над числами с плавающей точкой; Limits.H - макросы, задающие диапазоны представления целых; Locale. Н - представление даты, времени, денежных единиц; Math. Н - пакет стандартных математических функций; Setjump. H - имена типов и функции для реализации операторов перехода, используется редко; Signal.H - макросы для сигнализации об ошибках согласно стандарту ANSI; Stdarg. Н - макросы для вызова функций с переменным числом аргументов; Stddef.H - определение общих типов для указателей, типов size_t и null; Stdio. Н - стандартные функции ввода-вывода; Stdlib.H - определение общих типов, переменных и функций; String. Н - функции для операций над строковыми данными; Time. Н - структуры и функции для операций с датами и временем. В C++ добавлены операции с комплексными числами и десятичными данными: Bcd.Н – данные из десятичной системы счисления; Complex.H - функции и операции над комплексными числами. Имеются также файлы прототипов функций для распределения и освобождения динамической памяти, использования средств DOS и BIOS. Чтобы использовать какие-либо функции из библиотек времени выполнения, в программу должен быть включен файл-заголовок с прототипами требуемых функций. Добавление в программу файла-заголовка обеспечивается препроцессорной директивой # include < имя файла>. Любая программа использует входные данные, осуществляя вывод результатов, поэтому файл заголовков stdio.hприсутствует во всех программах. Функции ввода-вывода используют понятие " потока", рассматриваемого как последовательность байтов. Поток связывается с дисковым файлом или другим устройством ввода-вывода, в т.ч с консолью, когда ввод осуществляется с клавиатуры, а вывод - на экран монитора. Предусмотрены несколько стандартных потоков: stdin - стандартный ввод; stdout - стандартный вывод; stderr - для вывода сообщений об ошибках; stdprn - стандартное устройство печати; stdaux - стандартный последовательный порт. Потоки stdin, stdout и stderr обычно связываются с консолью, но могут быть перенаправлены на другие устройства. Назначение двух последних потоков зависит от используемой аппаратуры. Стандартные потоки автоматически открываются при запуске Си-программы и закрываются при ее завершении. В свою очередь, потоки, создаваемые программистом, открываются функцией fopen и закрываются функцией fclose. Функции ввода-вывода из stdio.h разбиваются на четыре группы: ввод-вывод байтов, ввод-вывод строк, форматный ввод-вывод и прямой (бесформатный) ввод-вывод. Отметим отдельные элементы первых трех групп, предназначенные для ввода из потока stdin и вывода в поток stdout. Функция ввод-вывод int getchar () служит для ввода одного символа с клавиатуры и возвращает код символа, преобразованный к типу int. Например, функция int putchar (int с) выводит символ «с» в очередную позицию на экране монитора Для ввода строки с клавиатуры служит функция char * gets (char * buf), считывающая коды нажатых клавиш (до симвода новой строки или нажатия клавиши Enter) и помещает эти коды в буфер, адрес которого задается параметром buf; в конце строки добавляется нулевой байт. Вывод строки выполняет функция int puts (char * string), выводящая строку по адресу string на экран, пока в строке не встретится нулевой байт, и возвращает код последнего выведенного символа. Функции форматного ввода-вывода принимают в качестве параметров строку с описанием формата представления данных на внешнем устройстве и список вводимых или выводимых данных. Строка описания формата состоит из обычных символов, управляющих символов (новой строки, возврата каретки и т.п.) и спецификаций полей ввода или вывода. Спецификация начинается символом %, за которым следуют коды флагов, размер поля ввода (вывода), число цифр в дробной части числа, префикса данного размера и кода типа формата. Обязательно указывается тип формата, остальные компоненты формата задаются по необходимости. Некоторые коды типа формата: d - для представления целого со знаком в десятичной системе счисления; i - для представления целого без знака в десятичной системе счисления; f - для представления числа с плавающей точкой в естественной форме; е или Е - представление числа с плавающей точкой в экспоненциальной форме; s - ввод-вывод строковых данных; с - ввод-вывод символов. Для форматного вывода служит int printf (char*format..) функция, имеющая список параметров переменной длины, при этом количество дополнительных параметров должно соответствовать числу спецификаций формата в форматной строке. Данные для вывода могут задаваться выражениями, ответственность за правильное задание спецификации формата для каждого выводимого данного лежит на программисте. Пример применения функции Printf; printf (" \n x=%d, у = %f %s", x, у, st); При выполнении этой функции просматривается строка формата слева направо, и символы, не являющиеся спецификациями формата, копируются на выводное устройство. Управляющий символ \n переводит курсор на экране к началу следующей строки. Когда встречается спецификация формата, выбирается очередной аргумент из списка вывода, преобразуется в соответствии с форматом и выводится в очередную позицию экрана. Для правильного вывода требуется, чтобы переменная х была типа int, у - float, а переменная st - char*. Форматный ввод выполняет int scanf (char*format,...) функция, в которой список ввода должен задавать указатели на вводимые переменные. Если в строке формата присутствуют символы, не входящие в спецификации форматов и не являющиеся пробельными, то во входном потоке должны присутствовать те же символы. Пробельными символами считаются знаки пробела, табуляции, новой строки; они считываются из потока ввода, но не участвуют в формировании входных данных. Когда в форматной строке встречается спецификация формата, во входном потоке пропускаются пробельные символы, а последующие символы интерпретируются в соответствии с типом формата, преобразуются во внутреннее представление, после чего полученное значение записывается в память по адресу очередного элемента списка ввода. Например, для ввода двух переменных целого типа и одной переменной вещественного типа применяется оператор вызова функции scanf (" %d %d %f", fixl, & x2, & y); где x1 и х2 типа int, а у - float. Во входном потоке вводимые значения должны разделяться хотя бы одним пробелом. Недостатком функций ввода-вывода является отсутствие контроля соответствия типов форматов и типов вводимых (выводимых) данных, часто приводящее к ошибкам в программах. В C++ есть собственные средства потокового ввода-вывода, обеспечивающие жесткий контроль типов в операциях. Для этого определены новые стандартные потоки: cin - для ввода данных; cout - для вывода данных; сеrr - вывод сообщений об ошибках без буферизации вывода; clog - вывод сообщений об ошибках с буферизацией вывода. В качестве знака операции вывода определены символы < <, азнаком операции ввода - символы», те же, что и для операции сдвига. Компилятор по контексту определяет, какую операцию задают эти символы: ввод-вывод или сдвиг. Чтобы использовать средства ввода-вывода C++, в программу должен быть включен файл-заголовок iostream.h: # include < iostream.h> В операциях вывода левым операндом должен быть поток вывода, правым операндом - выводимое данное. Результатом операции вывода является поток вывода, что позволяет записывать вывод в виде цепочки операций «, например: cout < < " x1=" < < x1 < < " х2=" < < х2 < < " \n"; Для базовых типов данных определены их преобразования при выводе и точность представления на устройстве вывода. Эти характеристики можно менять, применяя функции, называемые манипуляторами. В операции ввода левым операндом должен быть поток ввода, а правым операндом - имя вводимого данного для арифметических данных или указатель char*для ввода строк, например: cin» xl» x2» st; Операции ввода-вывода выполняются слева направо и последний оператор эквивалентен оператору ((cin» xl)» x2)» st; или трем операторам cin» xl; cin» х2; cin» st; Ниже приведен пример программы, запрашивающей у пользователя два целых числа и выводящей на экран их сумму: # include < iostream.h> int x, у; int main {) { cout «" x - "; cin» x; //Запрос и ввод значения х cout «" \n у = "; cin» у; //Запрос и ввод значения у cout «" \n" «" х + у = " «х + у; return 0;
5. ПРАКТИЧЕСКИЙ ПРИМЕР НА С++ Задание. Реализовать арифметические действия с целыми числами большого размера (до 1040) без использования «больших» типов данных. В качестве примера вычислить 30!, 2100, 330+550, (350-240)/555555.
|