
- •Содержание
- •Лабораторная работа №9 классы хранения и видимость переменных
- •Теоретические сведения
- •Варианты индивидуальных заданий
- •Приложение 1
- •Лабораторная работа №10 препроцессорные средства
- •Теоретические сведения
- •1. Состав директив препроцессора и стадии препроцессорной обработки
- •2. Стадии препроцессорной обработки
- •3. Замены в тексте программы
- •4. Цепочка подстановок
- •5. Включение текстов из файлов
- •6. Условная компиляция
- •7. Операция defined
- •8. Макроподстановки средствами препроцессора
- •9. Моделирование многомерных массивов
- •10. Отличия макросов от функций
- •11. Препроцессорные операции в строке замещения
- •12. Вспомогательные директивы
- •13. Реакция на ошибки
- •14. Пустая директива
- •15. Встроенные (заранее определенные) макроимена
- •Варианты индивидуальных заданий
- •Лабораторная работа № 11 динамическое распределение памяти
- •Теоретические сведения
- •1. Функции malloc и free
- •2. Операторы new и delete
- •Варианты индивидуальных заданий
- •Лабораторная работа № 12 структура данных «список»
- •Теоретические сведения
- •1. Основные определения
- •2. Операции над списками
- •3. Пример реализации односвязного списка с помощью массива структур
- •4. Пример реализации двусвязного списка с помощью массива данных
- •Варианты индивидуальных заданий
- •Лабораторная работа №13 очереди. Операции над очередями. Деки
- •Теоретические сведения
- •1. Понятие очереди. Операции над очередями. Кольцевая очередь. Дек
- •2. Программная реализация очереди на основе массива
- •Варианты индивидуальных заданий
- •Лабораторная работа №14 стеки. Очереди. Операции над стеками и очередями
- •Теоретические сведения
- •1. Понятие стека. Операции над стеком
- •2. Программная реализация стека на основе массива
- •Варианты индивидуальных заданий
- •Лабораторная работа №15
- •Анализ пузырьковой сортировки. Пузырьковая сортировка обладает несколькими характеристиками:
- •2. Сортировка методом выбора
- •3. Сортировка методом вставки
- •4. Сортировка методом Шелла
- •5. Сортировка методом Хоора
- •6. Алгоритмы поиска
- •Варианты индивидуальных заданий
- •Приложение 2
- •Лабораторная работа №16 программирование алгоритмов вычислительной математики
- •Теоретические сведения
- •1. Методы Симпсона
- •Варианты индивидуальных заданий
- •Литература
2. Программная реализация очереди на основе массива
Пример 13.1
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
/////////////// Queue for int positive (x>0)
typedef struct
{
int *queue;
int head;
int tail;
int size;
} QUEUE;
int Init(QUEUE* Queue, int nSize);
int Extract(QUEUE* Queue);
int Add(QUEUE* Queue, int nElement);
void Clear(QUEUE* Queue);
int GetSize(QUEUE* Queue);
void Free(QUEUE* Queue);
Программа реализации кольцевой очереди на основе массива – queue.cpp:
#include "queue.h"
/////////////// Queue for int positive (x>0)
//////////////////////////////////////////
int Init(QUEUE* Queue, int nSize)
{
Queue->queue = (int*)malloc(nSize*(sizeof(int)));
if (Queue->queue == NULL) return -1;
Queue->size = nSize;
Queue->head = 0;
Queue->tail = 0;
return nSize;
}
///////////////////////////////////////////
int Extract(QUEUE* Queue)
{
int w;
if (Queue->head == Queue->tail) return -1;
w = Queue->queue[Queue->head];
if (Queue->head == Queue->size - 1)
Queue->head = 0;
else
Queue->head++;
return w;
}
///////////////////////////////////////////
int Add(QUEUE* Queue, int nElement)
{
if (Queue->tail +1 == Queue->head)
return -1; // Очередь заполнена - запись невозможна!
if ((Queue->tail == Queue->size )&&( Queue->head>1))
Queue->tail=0; //Достигнут конец памяти, выделенной под очередь
// Следует перейти в начало, если там есть свободные элементы
else return –1; //Свободных элементов нет, вырабатываем отказ
Queue->queue[Queue->tail++] = nElement;
return 1;
}
///////////////////////////////////////////
void Clear(QUEUE* Queue)
{
Queue->head = 0;
Queue->tail = 0;
}
///////////////////////////////////////////
int GetSize(QUEUE* Queue)
{
if (Queue->head == Queue->tail)
return 0; // Очередь пуста
if (Queue->head < Queue->tail)
return (Queue->tail - Queue->head);
else
return (Queue->size - (Queue->head - Queue->tail));
}
///////////////////////////////////////////
void Free(QUEUE* Queue)
{ free(Queue->queue); }
Тестовая программа:
#include "queue.h"
/////////////////////////// Print of queue information
void Print(QUEUE *Queue)
{
if (Queue->head == Queue->tail)
printf("\nQueue is empty!");
else
printf ("\nhead=%u, tail=%u, (%d-%d)", Queue->head, Queue->tail,
Queue->queue[Queue->head], Queue->queue[Queue->tail-1]);
}
void main()
{
QUEUE Queue;
Init(&Queue,4); Print(&Queue);
Add(&Queue,10); Print(&Queue);
Add(&Queue,11); Print(&Queue);
Add(&Queue,12); Print(&Queue);
Extract(&Queue); Print(&Queue);
Add(&Queue,13); Print(&Queue);
Extract(&Queue); Print(&Queue);
Add(&Queue,21); Print(&Queue);
Extract(&Queue); Print(&Queue);
Add(&Queue,22); Print(&Queue);
GetSize(&Queue);
Extract(&Queue); Print(&Queue);
Extract(&Queue); Print(&Queue);
Extract(&Queue); Print(&Queue);
Clear(&Queue); Print(&Queue);
Add(&Queue,31); Print(&Queue);
Extract(&Queue); Print(&Queue);
Free(&Queue);
getch();
}