- •Объектно-ориентированное программирование Курсовой проект «Сортировка и поиск в массивах»
- •Введение
- •1.Алгоритмы сортировки
- •1.1.Сортировка методом пузырька
- •1.2.Сортировка методом Выбора (метод локального минимума)
- •1.3.Сортировка методом Вставки
- •1.4.Сортировка Быстрым методом
- •2.Алгоритмы поиска
- •2.1.Прямой поиск
- •2.2.Бинарный поиск
- •2.3.Интерполяционный поиск
- •3.Реализация оценки эффективности алгоритмов в программе
- •3.1.Исходные данные
- •3.2.Способы оценки эффективности
- •3.3.Реализация подсчета кол-ва сравнений, присваиваний и эффективности в программе
- •3.4.Реализация замера времени выполнения алгоритмов сортировки в программе
- •3.5.Реализация представления результата в программе
- •4.Результат определения эффективности алгоритмов
- •5.Структура прграммы
- •5.1.Интерфейс программы
- •5.2.Описание структуры программы
- •5.2.1.Глобальная структура для хранения статистики
- •5.2.2.Основной модуль Unit1.Cpp (для Формы Form1)
- •5.2.3.Модуль Unit2.Cpp (для Формы GrafForm)
- •6.4.Файл Unit2.Cpp
- •Заключение
- •Список используемой литературы
6.4.Файл Unit2.Cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
#include "Unit1.h"
#include "math.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TGrafForm *GrafForm;
// массив для хранения размерностей массивов
short arSize[4] = {5,7,9,25};
// массив для хранения значений цвета для каждого метода сортировки
TColor arColors[4] = {clRed, clBlue, clFuchsia, clLime}; //,clAqua};
//---------------------------------------------------------------------------
__fastcall TGrafForm::TGrafForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
// функция округления вещественного числа до ближайшего целого
float Round(float Argument, int Precision)
{
float div = 1.0;
if(Precision >= 0)
while(Precision--)
div *= 10.0;
else
while(Precision++)
div /= 10.0;
return floor(Argument * div + 0.5) / div;
}
//---------------------------------------------------------------------------
// функция вывода графика по результатам сортировки
// Параметр:
// Fill = 0 - для вывода графика для массивов с убывающим порядком
// Fill = 1 - для вывода графика для массивов со случаным порядком
void PutGraf(short Fill)
{
// переменная для определения наибольшего времени выполнения сортировки
double MaxT;
short i, j, x0, y0, xres, yres;
// начальные x, y
x0 = 30;
y0 = 700;
// разрешение графика в пикселях
xres = 600;
yres = 680;
// рисуем оси системы координат x, y
GrafForm->Repaint(); // стираем все, что нарисовали ранее
GrafForm->Canvas->Pen->Color = clBlack; // устанавливаем черный цвет
GrafForm->Canvas->MoveTo(x0-10,y0);
GrafForm->Canvas->LineTo(x0+xres+10,y0);
GrafForm->Canvas->MoveTo(x0,y0+10);
GrafForm->Canvas->LineTo(x0,y0-yres-10);
GrafForm->Canvas->MoveTo(x0,y0);
// определяем наибольшее время выполнения по всем сортировкам для текущей режима заполнения
MaxT = -0.1; // присваиваем отрицательное начальное значение
for (i = 0; i < 4; i++) // цикл перебора по методам сортировки
for (j = 0; j < 4; j++) // цикл перебора по размерностям массивов
if (Form1->Methods[i].Tsort[Fill][j] > MaxT)
MaxT = Form1->Methods[i].Tsort[Fill][j];
// присваиваем меткам на оси Y значения времени выполнения
GrafForm->lbTime9->Caption = FloatToStr(Round(MaxT,2)) + " с";
GrafForm->lbTime8->Caption = FloatToStr(Round(MaxT/7*6,2)) + " с";
GrafForm->lbTime7->Caption = FloatToStr(Round(MaxT/7*5,2)) + " с";
GrafForm->lbTime6->Caption = FloatToStr(Round(MaxT/7*4,2)) + " с";
GrafForm->lbTime5->Caption = FloatToStr(Round(MaxT/7*3,2)) + " с";
GrafForm->lbTime4->Caption = FloatToStr(Round(MaxT/7*2,2)) + " с";
GrafForm->lbTime3->Caption = FloatToStr(Round(MaxT/7,2)) + " с";
GrafForm->lbTime2->Caption = FloatToStr(Round(MaxT/14,2)) + " с";
GrafForm->lbTime1->Caption = FloatToStr(Round(MaxT/28,2)) + " с";
//нарисуем график на осях системы координат
for (j = 0; j < 4; j++){ // цикл перебора методов сортировки
GrafForm->Canvas->Pen->Color = arColors[j]; //меняем цвет карандаша в соответствии с текущим методом сортировки
for (i = 0; i < 4; i++) //цикл перебора размерностей массивов
//рисуем непрерывную линию
//на каждой итерации X увеличивается в зависимости от значения размерности массива
//значение Y берется из структуры результатов сортировки
GrafForm->Canvas->LineTo(Round(xres*arSize[i]/25,0)+x0,y0-Round(yres/MaxT*Form1->Methods[j].Tsort[Fill][i],0));
GrafForm->Canvas->MoveTo(x0,y0); // возвращаем обратно карандаш в позицию x0,y0 для следующей итерации (нового метода сортировки)
}
//рисуем диаграмму результатов (справа) сортировки массива с 5 элементами
MaxT = -0.1; //переменная для определения максимального времени выполнения для массиво с 5 элементами
//определим максимальное время для 5 эл.
for (i = 0; i < 4; i++) // цикл перебора всех методов сортировки
if (Form1->Methods[i].Tsort[Fill][0] > MaxT)
MaxT = Form1->Methods[i].Tsort[Fill][0];
GrafForm->lbMax5->Caption = MaxT;
// выводим результаты в виде ширины закрашенной панели (макс.ширина = 250)
GrafForm->pnSelect5->Width = floor(250/MaxT*Form1->Methods[0].Tsort[Fill][0]);
GrafForm->pnInsert5->Width = floor(250/MaxT*Form1->Methods[1].Tsort[Fill][0]);
GrafForm->pnPuzir5->Width = floor(250/MaxT*Form1->Methods[2].Tsort[Fill][0]);
GrafForm->pnQuick5->Width = floor(250/MaxT*Form1->Methods[3].Tsort[Fill][0]);
//рисуем диаграмму результатов (справа) сортировки массива с 7 элементами
MaxT = -0.1;
for (i = 0; i < 4; i++)
if (Form1->Methods[i].Tsort[Fill][1] > MaxT)
MaxT = Form1->Methods[i].Tsort[Fill][1];
GrafForm->lbMax7->Caption = MaxT;
GrafForm->pnSelect7->Width = floor(250/MaxT*Form1->Methods[0].Tsort[Fill][1]);
GrafForm->pnInsert7->Width = floor(250/MaxT*Form1->Methods[1].Tsort[Fill][1]);
GrafForm->pnPuzir7->Width = floor(250/MaxT*Form1->Methods[2].Tsort[Fill][1]);
GrafForm->pnQuick7->Width = floor(250/MaxT*Form1->Methods[3].Tsort[Fill][1]);
//рисуем диаграмму результатов (справа) сортировки массива с 9 элементами
MaxT = -0.1;
for (i = 0; i < 4; i++)
if (Form1->Methods[i].Tsort[Fill][2] > MaxT)
MaxT = Form1->Methods[i].Tsort[Fill][2];
GrafForm->lbMax9->Caption = MaxT;
GrafForm->pnSelect9->Width = floor(250/MaxT*Form1->Methods[0].Tsort[Fill][2]);
GrafForm->pnInsert9->Width = floor(250/MaxT*Form1->Methods[1].Tsort[Fill][2]);
GrafForm->pnPuzir9->Width = floor(250/MaxT*Form1->Methods[2].Tsort[Fill][2]);
GrafForm->pnQuick9->Width = floor(250/MaxT*Form1->Methods[3].Tsort[Fill][2]);
//рисуем диаграмму результатов (справа) сортировки массива с 25 элементами
MaxT = -0.1;
for (i = 0; i < 4; i++)
if (Form1->Methods[i].Tsort[Fill][3] > MaxT)
MaxT = Form1->Methods[i].Tsort[Fill][3];
GrafForm->lbMax25->Caption = MaxT;
GrafForm->pnSelect25->Width = floor(250/MaxT*Form1->Methods[0].Tsort[Fill][3]);
GrafForm->pnInsert25->Width = floor(250/MaxT*Form1->Methods[1].Tsort[Fill][3]);
GrafForm->pnPuzir25->Width = floor(250/MaxT*Form1->Methods[2].Tsort[Fill][3]);
GrafForm->pnQuick25->Width = floor(250/MaxT*Form1->Methods[3].Tsort[Fill][3]);
}
//---------------------------------------------------------------------------
//обработка события нажатия переключателя "Убывающий порядок"
void __fastcall TGrafForm::rbUClick(TObject *Sender)
{
PutGraf(0);
}
//---------------------------------------------------------------------------
//обработка события нажатия переключателя "Случайный порядок"
void __fastcall TGrafForm::rbRClick(TObject *Sender)
{
PutGraf(1);
}
//---------------------------------------------------------------------------
//вывод графика при старте
void __fastcall TGrafForm::FormActivate(TObject *Sender)
{
GrafForm->rbU->Checked = true;
PutGraf(0);
}
//---------------------------------------------------------------------------