- •Лабораторные работы. Сборник задач.
- •Оглавление
- •Часть 1. Лаборатоные работы
- •Работа со структурами и объединениями …………………………………….91
- •3 Задача
- •4 Задача
- •5 Задача
- •6 Задача
- •Дополнительное условие:использование цикла с предусловием.
- •1 Задача
- •2 Задача
- •Дополнительное условие: программа написана без использования функции.
- •Дополнительное условие: программа написана с использованием функций.
- •3 Задача
- •Дополнительное условие: программа написана без использования функции.
- •Дополнительное условие: программа написана с использованием функции.
- •4 Задача
- •Дополнительное условие: программа написана без использования функции
- •Дополнительное условие: программа написана с использованием функции.
- •Самостоятельная работа
- •Лабораторная работа №3
- •Самостоятельная работа
- •1 Задача
- •2 Задача
- •1 Задача
- •2 Задача
- •3 Задача
- •Лабораторная работа №6
- •1 Задача
- •1 Задача
- •2 Задача
- •3 Задача
- •1 Задача
- •1 Задача
- •2 Задача
- •3 Задача
- •4 Задача
- •Синтаксический анализатор
- •Самостоятельная работа
- •1 Задача
- •2 Задача
- •3 Задача
- •Работа с каталогами
- •Самостоятельная работа
- •1 Задача
- •2 Задача
- •1 Задача
- •2 Задача
- •3 Задача
- •1 Задача
- •2 Задача
- •1 Задача Реализовать очередь, состоящую из целых чисел
- •Комментарий:
- •2 Задача
- •1 Задача
- •Идеально-сбалансированные деревья
- •1 Задача
- •2 Задача
- •1 Задача
- •2 Задача
- •3 Задача
- •1 Задача
- •2 Задача
- •3 Задача
- •1 Задача
- •1 Задача
- •1 Уровень сложности
- •2 Уровень сложности
- •3 Уровень сложности
- •1 Уровень сложности.
- •2 Уровень сложности
- •3 Уровень сложности
- •1 Уровень сложности
- •Работа с несколькими массивами
- •Преобразование массива
- •Изменение элементов массива
- •2 Уровень сложности Формирование массива и вывод его элементов
- •Анализ элементов массива
- •Преобразование массива
- •Изменение элементов массива
- •Удаление и вставка элементов
- •Серии целых чисел
- •3 Уровень сложности Множества точек на плоскости
- •1 Уровень сложности
- •2 Уровень сложности
- •3 Уровень сложности
- •1 Уровень сложности
- •2 Уровень сложности
- •3 Уровень сложности
- •1 Уровень сложности
- •2 Уровень сложности
- •3 Уровень сложности
- •Not простое_логическое
- •(Простое_логическое знак_операции простое_логическое)
- •Построить синтаксический анализатор для понятия предложение.
- •1 Уровень сложности
- •2 Уровень сложности
- •1 Уровень сложности
- •Примеры:
- •Двусвязные списки
- •1 Уровень сложности
- •2 Уровень сложности
- •3 Уровень сложности
1 Задача Реализовать очередь, состоящую из целых чисел
<Queue.h>
// описание типа структуры элемента очереди
typedef struct mynode
{
int info;
struct mynode* next;
}node,*list;
// описания типа структуры очередь
typedef struct myquene
{
// задание количества элементов в очереди
int num;
// объявление указателя на начало очереди
node* beg;
// объявление указателя на конец очереди
node* end;
}quene;
// инициализация очереди
void initial(quene* q);
// функция проверки очереди на «пустоту»
bool queneempty(quene* q);
// функция добавления одного элеменнта в очередь
bool additem(int x,quene* q);
// функция печать элементов очереди
void print(quene* q);
<Queue.cpp>
#include <string.h>
#include "malloc.h"
#include <stdio.h>
#include “Queue.h”
int main()
{
quene plist;
int n;
char ch;
initial(&plist);
printf("Do you want to add number?\n");
ch=getchar();
while (ch=='y')
{
scanf("%d",&n);
additem(n,&plist);
printf("Do you want to add number?\n");
getchar();
ch=getchar();
}
if (queneempty(&plist)) printf("There is not struct!\n");
else
print(&plist);
return 0;
}
<Queue_fun.cpp>
#include <string.h>
#include "malloc.h"
#include <stdio.h>
#include “Queue.h”
// инициализация очереди
void initial(quene* q)
{
q->beg=q->end=NULL;
q->num=0;
}
// функция проверки очереди на «пустоту»
bool queneempty(quene* q)
{
if (q->num==0) return true;
else return false;
}
// функция добавления одного элеменнта в очередь
bool additem(int x,quene* q)
{
node* p;
bool f;
p=(node*)malloc(sizeof(node));
if (p==NULL) f=false;
else
{
p->info=x;
p->next=NULL;
f=true;
}
if (queneempty(q))
{
q->beg=p;
q->end=p;
q->num=1;
}
else
{
q->end->next=p;
q->num++;
q->end=p;
}
return(f);
}
// функция печати элементов очереди
void print (quene* q)
{
node* p;
if (queneempty(q)) puts("pusto");
else
{
p=q->beg;
for (int i=0;i<q->num;i++)
{
printf("%d ",p->info);
p=p->next;
}
printf("\n");
}
}
Комментарий:
Очередь– это линейный список информации, работа с которой происходит по принципу “первый пришел – первый ушел”. Это значит, что первый помещенный в очередь элемент будет получен из нее первым, второй помещенный элемент будет изменен вторым и т.д.
2 Задача
Построить отсортированный двусвязный список, состоящий из целых чисел и распечатать его значения. Написать функции удаления и вставки элемента, стоящего на заданной позиции. Выбор действий пользователя реализовать с помощью меню.
<LinkedList.h>
#include <stdio.h>
// создание списка
void linked_list();
// проверка пустоты списока
bool empty();
// задание размера списка
int size();
// функция добавления нового элемента <element> в список на позицию <pos>
void add(int element, int pos);
// функция удаления элемента из списка с позиции <pos>
void remove(int pos);
// функция получение элемента списка на позиции <pos>
int get(int pos);
// функция очистки списка
void clear();
<LinkedList.cpp>
#include "LinkedList.h"
// структура, хранящая в себе число (данные) и указатель на следующий элемент коллекции
struct Node
{
int data;
struct Node* prev;
struct Node* next;
};
// главный элемент списка
Node* head;
// задание размера списка
int listSize;
void linked_list()
{
// создание головного узла списка
head = (Node*) malloc (sizeof(Node));
head->data = INT_MIN;
head->next = NULL;
head->prev = NULL;
// задание начального размера списка
listSize = 0;
}
// проверка, является ли список пустой
bool empty()
{
return head->next == NULL;
}
// размер списка
int size()
{
return listSize;
}
// добавление нового элемента <element> в список на позицию <pos>
void add(int element, int pos)
{
// если запрашиваемая позиция больше размера списка - выход
if (pos > listSize)
{
return;
}
// если список пустой - добавляем первый элемент
else if (empty())
{
Node *newNode = (Node*) malloc (sizeof(Node));
newNode->data = element;
newNode->prev = head;
newNode->next = NULL;
head->next = newNode;
}
// если добавляем на первую позицию (замещаем первый элемент)
else if (pos == 0)
{
Node *newNode = (Node*) malloc (sizeof(Node));
newNode->data = element;
newNode->prev = head;
newNode->next = head->next;
head->next = newNode;
}
else
{
// создаем новый узел для обхода
Node* tmp = (Node*) malloc (sizeof(Node));
tmp->data = head->data;
tmp->next = head->next;
// ищем нужную позицию
for(int i = -1; i < pos - 1; i++, tmp = tmp->next);
// создаем новый узел и вставляемго его в список
Node *newNode = (Node*) malloc (sizeof(Node));
newNode->data = element;
newNode->next = tmp->next;
tmp->next = newNode;
}
// увеличиваем коллекцию на 1
listSize++;
}
// удаление элемента из списка с позиции <pos>
void remove(int pos)
{
// если запрашиваемая позиция больше размера списка - выход
if (pos > listSize)
{
return;
}
// если удаляем последний элемент списка (по количеству)
else if (listSize == 1)
{
int ret = head->next->data;
head->next = NULL;
}
// если список не пуст
else if (!empty())
{
// создаем узел для обхода
Node* tmp = (Node*) malloc (sizeof(Node));
tmp->data = head->data;
tmp->next = head->next;
// ищем нужную позицию
for(int i = -1; i < pos - 1; i++, tmp = tmp->next);
// заменяем указатели
int ret = tmp->next->data;
tmp->prev = tmp;
tmp->next = tmp->next->next;
}
// уменьшаем размер списка
listSize--;
}
// получение элемента списка на позиции <pos>
int get(int pos)
{
// если запрашиваемая позиция больше размера списка - минимальное целое
if (pos > listSize)
{
return INT_MIN;
}
// если список не пуст
else if (!empty())
{
// создание узла для обхода
Node* tmp = (Node*) malloc (sizeof(Node));
tmp->data = head->next->data;
tmp->prev = head;
tmp->next = head->next->next;
// поиск нужной позиции и возвращение значения
for(int i = 0; i < pos; i++, tmp = tmp->next);
return tmp->data;
}
// возвращаем минимальное целое в любом случае, кроме описанных
return INT_MIN;
}
<main.cpp>
#include "LinkedList.h";
// вывод меню управления на экран
void printMenu()
{
printf("\n\n-------- Menu --------\n");
printf("1. Add element to List\n");
printf("2. Remove element from List\n");
printf("3. Get List element\n");
printf("4. Print List\n");
printf("5. List size\n");
printf("6. Exit\n");
printf("\n");
printf("Your choise: ");
}
// вывод списка на экран
void print()
{
for (int i = 0; i < size(); i++)
{
printf("[%d] = %d\n", i, get(i));
}
}
int main(int argc, char* argv[])
{
// инициализация переменных
int choice = 0, data = 0, pos = 0;
linked_list();
while(true)
{
printMenu();
scanf("%d", &choice);
switch(choice)
{
case 1 :
printf("\nInput new element: ");
printf("\n\tPosition: ");
scanf("%d", &pos);
printf("\tData: ");
scanf("%d", &data);
add(data, pos);
break;
case 2 :
printf("\n\tDelete from position: ");
scanf("%d", &pos);
remove(pos);
break;
case 3 :
printf("\nInput number of element: ");
scanf("%d", &pos);
data = get(pos);
if (data == INT_MIN)
{
printf("\nList is empty");
}
else
{
printf("\n%d element in List is: %d", pos, data);
}
break;
case 4 :
printf("\nList contents is: \n");
print();
break;
case 5 :
printf("\nList size is: %d", size());
break;
case 6:
return 0;
}
}
return 0;
}
Самостоятельная работа
Даны две очереди. Реализовать функции создания новых очередей: пересечения и объединения данных очередей.
Лабораторная работа №18
Разряженные матрицы
Цель: применение на практике знаний работы с разряженными матрицами.
Методические рекомендации: лабораторная работа рассчитана на 2 часа и состоит из анализа одного разобранного задания.
Самостоятельная работа не предусмотрена.
Обязательное зачетное задание.
Необходимый уровень знаний: