Смекни!
smekni.com

Алгоритмы и структуры данных. Программирование в Cи (стр. 4 из 7)

При переводе числа из любой системы в десятичную надо это число представить в виде суммы степеней основания его системы счисления.

Дробные числа возможно изображать в информатике двумя способами:

- Изображение с фиксированной точкой (например, 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 (пустой, используется для функций и указателей).

Автор выделяет следующие виды констант, использующихся в языке Си:

· целочисленные константы, которые имеют тип signedint.

· Константы с плавающей точкой. Они представляются в десятичном или экспоненциальном виде и имеют тип 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 и должны быть замкнуты '&bsol;0 '. Например: char s[] = {'s','t','r','i','n','g','&bsol;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:

· intputc(intc, FILE *f) - записывает символы в текстовые файлы.

· intgetc(FILE *f) – читает символы из файла.

· intputs(constchar *s) – записывает последовательность символов в файл.

· char *gets(char *s) – чтение последовательности из файла.

При бинарном вводе и выводе данные представлены в допустимой форме, а внутреннее изображение в памяти перенесет (побайтово) данные в файл. Например, для бинарной записи переменных величин long нужно 4 байт памяти. Необходимое количество памяти зависит от величины числа и соответственно от его формата.

Функция fwrite записывает указанное количество элементов данных равной величины в файл. Здесь должны передаваться:

· Адрес первого элемента данных. · Величина отдельного элемента данных. · Количество записываемых элементов данных · Выходной файл

Затем автор рассказывает, как получить доступ к отдельным наборам данных файла с произвольным доступом. Для этого в C используются следующие команды:

intfseek(FILE *f, longoffset, intorigin)

Эта функция ставит указатель на определенную позицию в пределах файла. Функция позиционирует смещение (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 необходимо применять в следующих случаях: