Дисциплина: Объектно-ориентированное программирование
Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования
![]() | «Московский государственный технический университет имени Н.Э. Баумана» (МГТУ им. Н.Э. Баумана) |
ФАКУЛЬТЕТ Информатика и системы управления
КАФЕДРА Компьютерные системы и сети
Отчет
по домашней работе 2.1
Дисциплина: Объектно-ориентированное программирование
Название домашней работы: Функции
Студент гр. ИУ6-22 __________________ М.Ю. Чуриков
(Подпись, дата) (И.О. Фамилия)
Преподаватель __________________ __________________
(Подпись, дата) (И.О. Фамилия)
Москва, 2016
Часть 2.1. Функции.
Дан упорядоченный по неубыванию значений элементов массив целых чисел a, натуральное k и некоторое целое число b. Написать программу, осуществляющую удаление из массива a элемента с номером k и вставляющую элемент, равный b, в массив a так, чтобы упорядоченность его не нарушилась. Для поиска места воспользоваться алгоритмом дихотомического поиска. При программировании использовать функцию. Вывести на печать исходный и сформированный массив.
Текст программы:
#include "stdafx.h"
#include <iostream>
#include <locale.h>
#include <cstring>
#include <conio.h>
using namespace std;
struct el
{
int value;
el *next = NULL;
el *prev = NULL;
};
el* GetAtIndex(el* first, int index)
{
int idx = 0;
for (el* it = first; it != NULL; it = it->next)
{
if (idx == index)
{
return it;
}
idx++;
}
return NULL;
}
el* GetLast(el* first)
{
el* last = first;
for (el* it = first; it != NULL; it = it->next)
{
last = it;
}
return last;
}
void AddAfterElem(el* addAfter, int value)
{
el* next = addAfter->next;
el* p = new el();
p->prev = addAfter;
p->next = addAfter->next;
p->value = value;
if (addAfter->next != NULL)
addAfter->next->prev = p;
addAfter->next = p;
}
el* RemElem(el* first, int index)
{
int idx = 0;
el* prev = NULL;
for (el* it = first; it != NULL; it = it->next)
{
if (idx == index)
{
if (it == first)
{
el* del = first;
first = it->next;
if (first != NULL)
first->prev = NULL;
delete del;
}
else
{
prev->next = it->next;
if (it->next != NULL)
it->next->prev = prev;
}
break;
}
idx++;
prev = it;
}
return first;
}
el* AddElem(el* first, int value)
{
el* p = NULL;
el* last = GetLast(first);
p = new el;
p->value = value;
if (first == NULL)
first = p;
else
{
last->next = p;
p->prev = last;
}
return first;
}
el* listFirst = NULL;
int CountElems(el* first, el* last)
{
int count = 0;
for (el* it = first; it != last; it = it->next)
count++;
if (last != first && last && last != first->next)
count++;
return count;
}
el* AddToSorted(el* first, int count, int value)
{
// insert to start
if (first->value >= value)
{
el* p = new el();
p->next = first;
first->prev = p;
if (first == listFirst)
{
listFirst = p;
}
p->value = value;
return p;
}
el* last = GetAtIndex(first, count-1);
int len = CountElems(first, last);
if (value >= first->value && value <= last->value && count >= 2)
{
el* e1 = NULL;
// get mid, check for left & right parts
el* mid = GetAtIndex(first, count / 2);
if (value >= first->value && value <= mid->value)
e1 = AddToSorted(first, CountElems(first, mid), value);
else
e1 = AddToSorted(mid, CountElems(mid, last), value);
return e1;
}
// insert to end
if (value >= last->value)
{
AddAfterElem(last, value);
return listFirst;
}
return NULL;
}
void PrintArr(el* first)
{
for (el* it = first; it != NULL; it = it->next)
{
printf(" %d", it->value);
}
printf("\n");
}
int main(int argc, const char * argv[])
{
el* first = NULL;
first = AddElem(first, 1);
first = AddElem(first, 2);
first = AddElem(first, 3);
first = AddElem(first, 4);
first = AddElem(first, 5);
first = AddElem(first, 6);
first = AddElem(first, 7);
first = AddElem(first, 8);
first = AddElem(first, 9);
first = AddElem(first, 10);
first = AddElem(first, 11);
PrintArr(first);
int k = 0;
printf("\nEnter k: ");
scanf("%d", &k);
int count = CountElems(first, GetLast(first));
if (k < 0 || k > count)
printf("\nNo such element!");
else
{
first = RemElem(first, k-1);
PrintArr(first);
}
int b = 0;
printf("\nEnter b: ");
scanf("%d", &b);
el* last = GetLast(first);
count = CountElems(first, GetLast(first));
listFirst = first;
AddToSorted(first, count, b);
first = listFirst;
PrintArr(first);
_getch();
return 0;
}
Скриншоты:
Вывод: Научился использовать дихотомический поиск при работе с функциями в Microsoft Visual Studio 2008 на языке C++.
Блок-схема: