b>3.4 Функции ввода-выводаВ этом параграфе автор рассказывает о наиболее важных стандартных функциях, которые позволяют вводить информацию с клавиатуры и выводить ее на экран. Ввод и вывод данных в C происходит через файловый интерфейс. При этом с устройствами, как, например, принтер или консоль обращаются как с файлами. В стандартной C-библиотеке для нескольких устройств существуют стандартные файлы: · stdin (стандартный ввод данных, клавиатура) · stdout (стандартный вывод, монитор) · stderr (ошибки вывода, монитор) С функциями ввода-вывода связан файл заголовка stdio.h стандартной библиотеки заголовков. В нем определены для применения функций необходимые функциональные прототипы, такие как типы и константы (макрокоманды), которые стоят в связи с реализацией и приложением функций. Кроме всего прочего определяется константа EOF, которая служит для внутренней идентификации конца файлов. Также существует специальная функция вывода информации - printf, которая имеет вид: int printf(контрольная строка, аргумент1, аргумент2, ... ). Функция printf копирует символы из формата стандартного вывода либо до конца строки, либо до символа %. Чтобы определить тип формата вывода, функция ищет следующие за % символы. Самый часто используемым является формат %d, который выводит целые числа в десятичной системе счисления. Стандартной функцией ввода данных в C является функция scanf, которая имеет следующий вид: scanf (контрольная строка, аргумент1, аргумент2,...). Она переводит соответственно в управляющую строку "контрольную строку" данного типа и формата. Она задает формат и назначает конвертированные значения через определенный адрес соответствующим переменным величинам arg1, arg2.... 4. Типы данных в C4.1 Числа и числовые системыВ этой параграфе автор рассказывает об основах представления чисел в компьютере. Значение числа Z = an an-1 ... a0 a-1 ... a-m в позиционной системе счисления по основанию B имеет вид: где 0 <= a <B. Например, в десятичной системе счисления число 1972 выглядит так:1972 = 1 * 103 + 9 * 102 + 7 * 101 + 2 * 100 Формой представления чисел в компьютере является двоичная. Недостатком этой системы является запутанная, монотонная последовательность цифр при изображении длинных двоичных чисел. Поэтому в информатике также используют часто восьмеричную и шестнадцатеричную системы счисления. Именно о них рассказывает автор в этой главе.Достаточно часто возникает необходимость преобразования чисел из одной системы в другую, в частности, в наиболее понятную человеку десятичную систему счисления. Правило преобразования из любой системы счисления в десятичную выглядит так:При переводе числа из любой системы в десятичную надо это число представить в виде суммы степеней основания его системы счисления.Дробные числа возможно изображать в информатике двумя способами:§ Изображение с фиксированной точкой (например, 1.25). При этом точка всегда стоит на своем месте в нужном разряде. § Изображение с плавающей точкой. При данном изображении число записывается таким образом, что точка скользит всегда к первой отличной от нуля цифре. Такая запись выглядит следующим образом: Z = М * BE, где M = 0.xxxxxxx...., 1/B <= М <1 Так как основа нам известна, то число может представляться мантиссой М и экспонентой E (нормализованное изображение). Например: Z = 42.5456 --> 0.425456 * 102 --> M = 425456, E = 2 4.2 Основные типы данныхВ этом разделе профессор перечисляет соответствующие категории языка C.К элементарным типам данных, использующихся в C относятся: char (символьный), int (целый), float (вещественный тип с одинарной точностью), double (вещественный тип с двойной точностью), void (пустой, используется для функций и указателей).Автор выделяет следующие виды констант, использующихся в языке Си:· целочисленные константы, которые имеют тип signed int. · Константы с плавающей точкой. Они представляются в десятичном или экспоненциальном виде и имеют тип double.· Символьные константы указываются в кавычках `'.· Литерные константы имеют тип String и расположены в кавычках “”.Затем Плате рассматривает основные арифметические операторы («-», «+», «*», «/», «%»), используемые в языке C. Здесь, в отличие от других языков программирования, присваивание значений записывается прямо в операторах, поэтому арифметические операции применяются во всех структурах, где есть операторы. В C также используется также два специальных оператора:o Инкремент (приращение на 1) - «++»o Декремент (отрицательное приращение на 1) - «--»Они могут стоять перед или после операнда, что задает порядок выполнения операций.Помимо этого в C используются логические операторы:· ! - логическое отрицание· && - логическое «и»· || - логическое «или»Профессор отдельно выделяет операторы сравнения, используемые в языке:· < - меньше· <= - меньше равно· > - больше· >= - больше равно· == - равно (тождественно)· != - не равноСпециального логического типа данных Boolean в C не существует, а считается, что Ш Неравно 0 - правда (значение 1)Ш Равно 0 - ложь (значение 0) Составные операторы используются для более компактной записи выражений в С. Автор показывает, что здесь возможны следующие записи:Выражение1 op= Выражение2, которая эквивалентна записи - Выражение1 = (Выражение1) op (Выражение2), где op - любой оператор.Затем профессор выделяет два основных вида массивов:§ Одномерные поля. Определим поле с 5 элементами - int n [5]; Тогда эти 5 переменных величин располагаются в памяти последовательно: |
n [0] | n [1] | n [2] | n [3] | n [4] | | | Элементы массива начинаются всегда с индекса 0 и кончаются индексом [n-1]. При этом не происходит проверка на допустимую область памяти компилятором. § Многомерные поля. Для многомерных массивов переменные величины задаются несколько другими типами индексов. Пример определения двумерного массива: float x [8] [30];Здесь первый элемент - x [0] [0], и соответственно последний x [7] [29]. Юрген Плате подходит к объяснению работы с символами и строками как с одномерными полями, которые имеют несколько особенностей. Строки могут инициализироваться также в классе памяти auto и должны быть замкнуты '\0 '. Например: char s[] = {'s','t','r','i','n','g','\0'};Массивы char могут инициализироваться также константами String - char s[] = "string";В C не имеется никаких специальных элементов языка для манипуляции строками символов. Ряд функций существуют в C-стандартной библиотеке (копирование, сравнение, длина строк). В отличие от массивов, которые работают с объектами одного типа, записи задают структуру для описания различных типов под общим именем. Преимущества этих структур состоит в объединении комплексных данных. Например, это персональные данные (Ф.И.О., адрес, социальный статус и т.д.) или студенческие данные (Ф.И.О, адрес, дисциплина, отметка и т.д.).Записи в языке C описываются с помощью ключевого слова struct:struct имя структуры {компонент(n)} переменная структуры (n);Для доступа к элементу записи используются 2 собственных оператора. При этом для прямого доступа необходима точка как разделитель переменной структуры и имени компонента, т.е переменная структуры . компонентСтруктуры могут иметь также элементы, которые являются signed(со знаком) или unsigned(без знака) int, а некоторые имеют битовую длину. Поэтому обозначают эти элементы как поля бита. При определении структуры число битов таких переменных величин указывается определенно, согласно синтаксису: typedef struct{ unsigned b1 : 1;unsigned b2 : 1;int : 6;int farbe : 4;} bitpack;Таким образом, в этой главе автором рассмотрены практически все типы данных, используемых в С и имеющих широкие возможности применения.5. ФайлыСледующей структуре, являющейся основным носителем информации в компьютере, автор посвятил отдельную главу. Файлы - это основная структура для постоянного хранения и ввода-вывода данных. Файлы состоят из различных компонентов определенного типа данных. В конец файла могут добавляться различные данные. Вместе с типом файла определяются и несколько стандартных операций с файлами (Open - открытие файла, Close - закрытие файла, Read - чтение из файла данных, Write - запись данных в файл).5.1 Типы доступаВ следующих параграфах автор определяет 2 основных типа доступа для файлов в Cи:1) Последовательные файлы использовались на заре развития компьютерной техники, так как запись на перфоленту или магнитную ленту могла вестись только последовательно. 2) Файлы с произвольным доступом. С появлением жестких дисков, которые позволяют обращаться к любым участкам памяти в любое время, появились файлы с произвольным доступом. В последовательных файлах позиционирование компонентов производится неявно и не подчиняется влиянию программы. В файлах с произвольным доступом операции считывания и записи дополняются указанием индекса компонентов. При этом индекс компонентов отсчитывается, как правило, от 1. Вместе с тем файл с произвольным доступом обладает сходством с типом данных "массив". Доступ к различным периферийным устройствам в C осуществляется с помощью указателей. При этом файл должен открываться до начала доступа и закрываться после. Для выполнения этих функций используется стандартный файл C-библиотеки <stdio.h>. Что касается самого распространенного типа файлов - текстовых, то в C они представляют собой файлы, компоненты которых буквы, т.е. символы типа char. Все тексты мы разделяем на строки, и здесь встает проблема: как определить конец строки, когда реализация текстовых файлов во всех программах разная? В Си используется, так называемый, буферный вывод. Это значит, что выводится только тогда, если конец строки посылается устройству вывода, или выводится совсем, если программа завершает свои действия. Здесь используют следующие функции языка C: · int putc(int c, FILE *f) - записывает символы в текстовые файлы. · int getc(FILE *f) - читает символы из файла. · int puts(const char *s) - записывает последовательность символов в файл. · char *gets(char *s) - чтение последовательности из файла. При бинарном вводе и выводе данные представлены в допустимой форме, а внутреннее изображение в памяти перенесет (побайтово) данные в файл. Например, для бинарной записи переменных величин long нужно 4 байт памяти. Необходимое количество памяти зависит от величины числа и соответственно от его формата. Функция fwrite записывает указанное количество элементов данных равной величины в файл. Здесь должны передаваться: · Адрес первого элемента данных. · Величина отдельного элемента данных. · Количество записываемых элементов данных · Выходной файл Затем автор рассказывает, как получить доступ к отдельным наборам данных файла с произвольным доступом. Для этого в C используются следующие команды: int fseek(FILE *f, long offset, int origin) Эта функция ставит указатель на определенную позицию в пределах файла. Функция позиционирует смещение (offset), которое считается в байтах. Значение origin устанавливается в соответствии со смещением (SEEK_SET oder 0 - смещение из начала файла, SEEK_END oder 1 - смещение из текущей позиции, SEEK_CUR oder 2 - смещение из конца файла) Функция long ftell (FILE *f) указывает текущую позицию в файле, на которой находится указатель файла. В случае ошибки ftell принимает значение -1. Функция void rewind (FILE *f) перемещает указатель на начало файла и удаляет значение ошибки. Таким образом, Юрген Плате в отличие от других авторов книг по программированию достаточно подробно описывает процесс работы с файлами, снабжая каждую операцию подробными комментариями и примерами на языке С. 6. Указатель В этой главе автор рассказывает об одном из важнейших понятий программирования в C - указателях. 6.1 Основы указателяУказатели - это такие же переменные величины, которые нуждаются в ячейках памяти. Указатель - это переменная величина, которая содержит адрес другого объекта. Потом можно получить доступ к этому объекту косвенно с помощью указателя. В этих адресах памяти содержится либо адреса других переменных величин, либо адреса функций.Указатели в языке C необходимо применять в следующих случаях: · при передаче параметра · при обработке массивов · для обработки текста · для доступа к специальным ячейкам памятиОбозначаются указатели следующим образом: int *pc; , т.е. переменная pc является указателем тип int.При этом используют преимущественно два типа указателей:1. Оператор адреса &, который применяется к объекту, доставляющему адрес этого объекта. Например, pc=&c.
Страницы: 1, 2, 3, 4
|