Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции C.DOC
Скачиваний:
3
Добавлен:
16.08.2019
Размер:
41.47 Кб
Скачать

Структуры, списки.

Структура позволяет объединять данные разных типов и объединение под первым названием. В качестве полей могут быть любые типы. Для доступа:

Имя переменной структурного типа. Имя поля.

PS поле = (*PS ). поле

Р - указатель на структуру

Переименование типов

typedef -даем новое имя уже существуюющему типу

typedef int INTEGER;

INTEGER - тоже что и int

typedef struct {описание полей} MyStruct

MyStruct а;

Struct {описание полей}

Списки.

Структура данных, в которых есть элементы и для связи между ними используются поля связи, в которых стоят адреса или ссылки на другие элементы

гол 0

адрес след

Struct EL ist {

Struct EList * Prev

Struct EList * NEXT

Char Дата

}; * prev

typedef struct EList EList

Struct List {

EList * Head;

EList * Tail

}

typedef Struct List List

Для первого элемента списка поле prev содержит NULL, для последнего поле Next =NULL.

Пустой список: переменная типа List в полях Head и Tail = 0

ПРИМЕР:

Функция, которая вставляет новый элемент в список после указанного элемента в этом списке.

Входные параметры:

  1. список, в который вставлять List L;

  2. элемент, после которого вставлять Е типа Еlist

  3. инф. часть элемента, который будет вставлять charД.

Выходные параметры:

  1. L - модифицировать

  2. L и выходной параметр

  3. Может быть указатель на новый элемент и признак ошибки либи удача OK(очень хорошо).

Структуры тоже можно представить по значению.

По ссылке:

Elist * Elist Ins (List L

Elist * E

char Д)

Если *Е = NULL => вставляем на первый элемент.

  1. нормальный

  2. последний

  3. вставить как самый первый

  4. в пустой список

Возможные ошибки: нехватка памяти;

функция возвращает NULL

если OX , то возвращает функцию.

Возможные гадости: вместо Д - пакость .Проверить можно, но дорого

не пустой список , E = NULL

или голова или хвост - NULL.

Тип программы:

Elist * t;

if (!(t = (Elist * ) malloc(sizeof (Elist))))) четные (NULL);

Функция malloc возвращает указатель не типизированный.

Операция преобр. типа: (тип) выражение.

если NULL, то ! NULL = 1 if - истино и return(NULL)

if(E) {

t -> Next = E -> Next;

E -> Next = t; если в середину

}

else {

t -> Next = L -> Head;

L -> Head = t; если самый первый

}

t -> prev = E; замыкает ссылку на элемент

if (t-> Next) (t -> Next)-> Prev = t; проверка,если

else L -> Tail = t; в конец списка.

t-> Data = D;

return (t);

} / * Ins EList * /

free (char) - освобождение памяти.

Работа с файлами

P > f . a - стандартный вывод в указанный файл.

P < f . a - ввод из файла f . a

#define EOF(-1) - при считывании с помощью стандартного вводо вывода проверка на конец

файла.

int getchar (void); - чтение символа из стандартного ввода , возвращает значение типа int.

while (( c = getchar( )) ! = EOF) {.......}

int putchar (char) - служит для вывода символа на ст. вывод

printf (char * format, аргумента ); - форматные преобразования и вывод

% -на экран, если управляющий символ

% [ширина] d - аргумент - целое число в десятичной форме . Выдать на ст. вывод.

% u - беззнаковое целое, десятичное.

o - беззнаковое целое , восьмеричное.

x - беззнаковое целое, шестнадцатиричное.

c - символ

s - строка или массив символов с % 0 в коце int scanf (char * format , аргумент) - считывает из входного потока данные.

Несоответствие format оначает конец ввода.

аргумент = & i - адрес.

char * gets(char *); - читает до конца строки.

int puts(char *) - вывод строки.

FILE - тип файла

Описание указателя на структуру файла.

FILE * f;

FILE * fopen (char * name, char * mode)

r - read - чтение функция открытия файла

w - write - запись если нельзя его открыть , то возвращ. 0

a - append - дописывать

b - бинарный

if (!( f = fopen (.....))) return (ошибка);

fclose (FILE *); - закрытие файла и освобождение

int fputc ( char , FILE *);

fprintf ( FILE * )

fscanf (FILE , )

СТРУКТУРНЫЙ ПОДХОД К СИ

Лексика языка

1.1 Алфавит языка

1.2 Комментарии

1.3 Идетефикаторы и разделители

1.4 Зарезервированные слова: (зарезервированные слова в качестве имен, переменных использовать нельзя)

1.5 Константы

Сколярные типы данных и операций.

2.1 Поняти леводопустимого выражения

( Loalue - выражение ,которое может стать в левой части присваивания) для имен массивов это не допустимо, а также *( p1 - p2 ) , f(.......) = - вызов функции.

2.2 Целые

2.3 Вещественные

2.4 Перечислимые

2.5 Прочие операции:

“, ” Н/ пр выр1, выр2, выр3 результат = выр3.

условная операция:

выр1 ? выр2 : выр3.

2.6 Преобразования типов.

Преобразование типа:

(тип) выражение

sizeof (тип) - размер типа

sizeof (имя переменной) - размер соответствуюющей переменной

char m[200] , *

sizeof (m) -> 200 размер массива

sizeof (pm) -> размер указателя соответствующего типа.

a + + , + + a , a - - , - - a.

a + + , ~ a : = a + 1 ; a - - , ~ a : = a - 1.

a = 5;

b = a + + ; -> b = 5

b = + + a ; -> b = 6

a + = 5 ; ~ a = a + 5

a * = 7 ; ~ a = a * 7

Преобразование типов : Операция явного преобразования типов

(тип) выражение.

(тип) - результирующий тип

Приоритетность типов :

enum, char, chort -> int -> long -> double

chort double

insigned <- signed

Если выражения встречаются знаковые , то они ->

flort -> double (всегда перед выполнением).

Указатель на тип Т = массив типа Т

char * pc , mc [200]

pc = mc (присвоение адреса самого первого эламента массива). ~ pc = & mc [0].

Указатель типа Т1 = указатель типа Т2 (это допустимо)

Указатель на функцию = имя функции;

2.7 ПОРЯДОК ВЫПОЛНЕНИЯ ОПЕРАЦИЙ:

Для операций && , // , ?: , - гарантируется порядок вычисления операндов слева на право для остальных порядок не гарантируется f (....) + g(....)

(b1 + b2 ) + b3 - скобки игнорируются

b1 && b2 b1 - сначало b2 - потом

В языке СИ используется сокращенное вычисление выражений

b1 && b2 - если b1 = 0, то b2 - не вычисл.

b1 // b2 - если b1 = 1, то b2 - не вычисл.

2.8 ПРИОРИТЕТЫ

Обратить внимание на левостороннии и правостороннии операции

+ + + - левосторонняя операция

. -> - правосторонняя операция

3.0 ОПЕРАТОРЫ. УПРАВЛЕНИЕ СТРУКТУЫ

4.0 УКАЗАТЕЛИ И МАССИВЫ

4.1 Операции * и амперсант (&)

Примеры :

char *p; указатель на char

char **p; указатель на указатель на char

char *f( ); функция возвращяющая указатель начала

char (*f( )) ( ); указатель на функцию которая возвращает char

char cm [5] массив char

char *pcm [5] массив указателей на char

char (*cpm) [5] ; указатель на массив из 5 char

char *p; указатель на символ

cpm + + на 5 байт

p + + на 1 байт

4.2 Арифметика указателей

pe ie pe - выражение типа указатель

pe1 pe2 ie - целое выражение

Выражается в размерах объекта.

pe1 отношение pe2

<

>

== не гарантируется для указателей правильность

!=

Во всех реализациях гарантируется правильность операций сравнения.

5.0 СТРУКТУРЫ. ОБЪЕДИНЕНИЯ . ЗАПИСЬ.

5.1 Структуры:

Описание определение переменных

Инициализация

структ. тип S={ значение поля 1, …} ;

Доступ к полям

Для переменных структурного типа разрешена операция присваивания, которая понимается как побитовае копирование структуры

5.2 Объединение.

Описание

имя -объед {

тип1 , поле1 ;

………………

} ;

Определение переменных и определение типа стр.

Для полей выделяется одна и таже область памяти и длина ее равна max длины поля.

5.3 Записи: (битовые поля)

Основная цель - упоковать в запись несколько типов полей

Описание:

struct имя - записи {

int поле1 :цел1;

int поле2 : цел2; - количество битов,котор. занимает каждое из полей

};

Доступ к полям записей

r. поле1

6.0 Функции

6.1 Определение и обращение к функции прототипу

[тип возвращ. значения] имя функции ([список параметров])

если опущен => INT

{

тело

}

Обращение к функции:

имя функции ([список фактических параметров])

Прртотип функции: Определение функции должно предшествовать ее использованию.

Описание прототипа:

[extern] [тип возвращ. значения ] имя функции ([……]);

имя функции это внешее (глобальное) имя.

В языке СИ функции рекурсивны.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]