Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
учебное пособие ОАиП.doc
Скачиваний:
11
Добавлен:
25.04.2019
Размер:
2.63 Mб
Скачать

Примеры программ

Пример . Используя поля бит, написать программу вычисляющую остаток от деления целого числа на 4.

#include<stdio.h>

struct pole

{ unsigned int p1:1; // младший бит числа

unsigned int p2:1;

int p3:14;

}*p ;

int main()

{ int n=26;

p=(pole*)&n; // указатель р содержит адрес числа n

printf("\nостаток от деления числа на 2 = ");

if(p->p1) puts(" 1");

else puts(" 0");

printf("\nостаток от деления числа на 4 = ");

if(p->p1 && p->p2) puts(" 3");

else if(!p->p1 && p->p2) puts(" 2");

else if(p->p1 && !p->p2) puts(" 1");

else puts(" 0");

return 0;

}

Пример . Используя поля бит и объединения можно изменить рассмотренную выше программу вычисляющую остаток от деления целого числа на 2 и 4.

#include <stdio.h>

#include<conio.h>

int main(int) // вычисление остатка от деления на 2 , 4

{ struct pole

{ union

{ struct

{ unsigned i1:1;

int:1;

} st1;

struct

{ unsigned i1:2;

}st2;

} un;

int:14;

};

pole *pl;

int k;

scanf("%d",&k);

pl=(pole *)&k;

clrscr();

printf("\nостаток от деления на 2 =%d",pl->un.st1.i1);

printf("\nостаток от деления на 4 =%d",pl->un.st2.i1);

}

Организация списков и их обработка

Динамические переменные чаще всего реализуются как связанные структуры, списки.

Список – это набор динамических элементов (чаще всего структурных переменных) связанных между собой каким либо способом.

Списки бывают линейными и кольцевыми, односвязными и двусвязными.

Динамические переменные, как правило, имеют тип “структуры”, так как должны содержать помимо значения (целого, вещественного и т.д.), ссылку на другую динамическую переменную. Чтобы связать динамические переменные в цепочку, надо в каждой компоненте иметь ссылку на предыдущую компоненту, так как это не массив и различные компоненты могут быть размещены в произвольных областях памяти.

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

typedef struct element // структура элемента хранения

{ float val; // элемент списка

element *n ; // указатель на элемент хранения

} SPIS;

SPIS *p; // указатель текущего элемента

SPIS *dl; // указатель на начало списка

Для выделения памяти под элементы хранения необходимо пользоваться функцией malloc(sizeof(element)) или calloc(l,sizeof(element)). Формирование списка в связанном хранении может осуществляется операторами:

p=( SPIS*)malloc(sizeof(SPIS);

p->val=10; p->n=NULL;

dl=( SPIS*)malloc(sizeof(SPIS));

dl->val=7; dl->n=p;

В последнем элементе хранения (конец списка) указатель на соседний элемент имеет значение NULL. Получаемый список изображен на рис.11.

Рис. 11 . Связное хранение линейного списка.

При работе со списками на практике чаще всего приходится выполнять следующие операции:

- поиск элемента с заданным свойством;

- определение первого элемента в линейном списке;

- добавление нового элемента до или после указанного узла;

- исключение определенного элемента из списка;

- упорядочивание узлов линейного списка.

Ниже приведены фрагменты программ и схемы демонстрирующие некоторые из операций над списками.