Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовик.docx
Скачиваний:
8
Добавлен:
08.03.2016
Размер:
203.08 Кб
Скачать

for(j=0;j<=i-1;j++)

If (Mass[j]> Max)

Max= Mass[j];

Mass[j]= Mass[n];

Mass[n]=Max;

I,j,max

Приложение 3

Руководство пользователя

Внешний вид программы представлен на Рис. Ошибка! Текст указанного стиля в документе отсутствует. .1

Рис. Ошибка! Текст указанного стиля в документе отсутствует..1 - Внешний вид программы

Пользователь вводит в поле «Количество элементов» размер массива и нажимает кнопку «Сортировать». По-умолчанию в этом поле стоит число 10000, т.к. это условие задания. Если мы вводим число меньше 10000, то получаем сообщение о неправильности ввода Рис. Ошибка! Текст указанного стиля в документе отсутствует. .2

Рис. Ошибка! Текст указанного стиля в документе отсутствует..2 - Ввод числа меньшего чем 10000

Если мы вводим в поле «Количество элементов» символы не являюшиеся числами или вещественное число, то у нас выйдет следующее сообщение:

Рис. Ошибка! Текст указанного стиля в документе отсутствует..3 - Ввод неверного числа

Если же мы ввели корректное число то программа выдаст сообщение что сортировка завершена (Рис. Ошибка! Текст указанного стиля в документе отсутствует. .4)

Рис. Ошибка! Текст указанного стиля в документе отсутствует..4 - Сообщение о завершении сортировки

После нажатия кнопки «OK» отобразится гистограмма (Рис. Ошибка! Текст указанного стиля в документе отсутствует. .5)

Рис. Ошибка! Текст указанного стиля в документе отсутствует..5 – Гистограмма

Цифрами здесь показано время выполнения алгоритма в миллисекундах. Красный столбец – алгоритм простого выбора, зеленый это сортировка вставками и синий - подсчет сравнений.

Кроме того программа записывает 3 тестовых файла. Алгоритм простого выбора создает файл «SimpleChoose.txt». Внешний вид файла приведен на Рис. Ошибка! Текст указанного стиля в документе отсутствует. .6

Рис. Ошибка! Текст указанного стиля в документе отсутствует..6 - Алгоритм простого выбора

Алгоритм сортировки вставками создает файл «InsertionSort» (Рис. Ошибка! Текст указанного стиля в документе отсутствует. .7)

Рис. Ошибка! Текст указанного стиля в документе отсутствует..7 - Алгоритм сортировки вставками

Алгоритм подсчета сравнений создает файл «CountCompares» (Рис. Ошибка! Текст указанного стиля в документе отсутствует. .8)

Рис. Ошибка! Текст указанного стиля в документе отсутствует..8 - Метод подсчета сравнений

Приложение 4

Листнинг

Модуль MainUnit.h

//---------------------------------------------------------------------------

#ifndef MainUnitH

#define MainUnitH

//---------------------------------------------------------------------------

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <ExtCtrls.hpp>

#include <Time.h>

#include <stdio.h>

//---------------------------------------------------------------------------

class TForm1 : public TForm

{

__published: // IDE-managed Components

TImage *Img_Gis;

TLabel *L_KolEl;

TEdit *Ed_KolEl;

TButton *Btn_Sort;

TLabel *Label1;

void __fastcall Btn_SortClick(TObject *Sender);

private: // User declarations

// Очищает поле и рисует оси

void DrawField(void);

// Метод простого выбора

int SimpleChoose(int *Mass,int Kol);

// Метод простых вставок

int InsertionSort(int *Mass,int Kol);

// Метод подсчета сравнений

int CountCompares(int *Mass,int Kol);

// Изображение гистограммы

void DrawGis(int first,int second,int third);

public: // User declarations

__fastcall TForm1(TComponent* Owner);

};

//---------------------------------------------------------------------------

extern PACKAGE TForm1 *Form1;

//---------------------------------------------------------------------------

#endif

Модуль MainUnit.cpp

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "MainUnit.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

this->DrawField();

}

//---------------------------------------------------------------------------

void TForm1::DrawField(void)

{

int xo,yo; // Начало координат

// Устанавливаем начало координат

xo = 20;

yo = Img_Gis->Height - 20;

// Очищаем поле

this->Img_Gis->Canvas->Brush->Color = clWhite;

this->Img_Gis->Canvas->FloodFill(10,10,clYellow,fsBorder);

// Рисуем оси

this->Img_Gis->Canvas->MoveTo(xo,yo);

this->Img_Gis->Canvas->LineTo(xo,20);

this->Img_Gis->Canvas->MoveTo(xo,yo);

this->Img_Gis->Canvas->LineTo(Img_Gis->Width - 20,yo);

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Btn_SortClick(TObject *Sender)

{

long i,Kol; // Индекс и количество элементов массива

int *Mass1, *Mass2, *Mass3, // Указатели на массивы

// Время работы алгоритмов

simplechoose, // Простого выбора

insertionsort, // Простых вставок

countcompares; // Подсчет сравнений

// Включаем генератор случайных чисел

randomize();

try

{

// Считываем количество элементов с формы

Kol = StrToInt(Ed_KolEl->Text);

if(Kol>=10000)

{

// Создаем динамические массивы

Mass1 = new int[Kol];

Mass2 = new int[Kol];

Mass3 = new int[Kol];

// Заполняем массивы случайными числами

for(i=0;i<Kol;i++)

{

Mass1[i] = random(Kol*2);

Mass2[i] = Mass1[i];

Mass3[i] = Mass1[i];

}

// Вызываем методы сортировки

simplechoose = SimpleChoose(Mass1,Kol);

insertionsort = InsertionSort(Mass2,Kol);

countcompares = CountCompares(Mass3,Kol);

// Выводим сообщение о конце операции

Application->MessageBox("Сортировка завершена","Сообщение", MB_OK);

// Рисуем гистограмму

DrawGis(simplechoose,insertionsort,countcompares);

}

else

Application->MessageBox("Количество элементов не должно быть меньше 10000",

"Повторите ввод", MB_OK);

}

catch(EConvertError&)

{

Application->MessageBox("Вы ввели ошибочное число",

"Повторите ввод", MB_OK);

}

}

//---------------------------------------------------------------------------

// Метод простого выбора

int TForm1::SimpleChoose(int *Mass,int Kol)

{

FILE *f;

int start, end, vremya, // Начало и конец отсчета

i,j, // Индексы

Max,n; // Максимальный элемент и его номер

// Начинаем отсчет времени

start = clock();

// Выполняем сортировку

for(i=Kol-1;i>0;i--)

{

//Устанавливаем начальное значение и номер

//для максимального элемента

Max = Mass[i];

n =i;

// Ищем максимальный элемент

for(j=0;j<=i-1;j++)

{

if (Mass[j]> Max)

{

Max= Mass[j];

Mass[j]= Mass[n];

Mass[n]=Max;

}

}

}

// Заканциваем отсчет времени

end = clock();

vremya = end - start;

// Записываем осортированный массив в файл

f = fopen("SimpleChoose.txt","w");

for(i=0;i<Kol;i++)

fprintf(f," %d",Mass[i]);

// Закрываем файл

fclose(f);

return vremya;

}

//---------------------------------------------------------------------------

// Метод простых вставок

int TForm1::InsertionSort(int *Mass,int Kol)

{

FILE *f;

int start, end, vremya, // Начало и конец отсчета

i,j,k, // Индексы

Tmp; // Буфер

// Начинаем отсчет времени

start = clock();

// Выполняем сортировку

for(i=0;i<Kol;i++)

{

Tmp=Mass[i];

for(j=i-1;j>=0 && Mass[j]>Tmp;j--)

Mass[j+1] = Mass[j];

Mass[j+1] = Tmp;

}

// Заканциваем отсчет времени

end = clock();

vremya = end - start;

// Записываем осортированный массив в файл

f = fopen("InsertionSort.txt","w");

for(i=0;i<Kol;i++)

fprintf(f," %d",Mass[i]);

// Закрываем файл

fclose(f);

return vremya;

}

//---------------------------------------------------------------------------

// Метод подсчета сравнений

int TForm1::CountCompares(int *Mass,int Kol)

{

FILE *f;

int start, end, vremya, // Начало и конец отсчета

i,j,k, // Индексы

*b, *c; // Вспомогательные массивы

// Создаем вспомогательные массивы

b = new int[Kol];

c= new int[Kol];

// Начинаем отсчет времени

start = clock();

// Производим сортировку

for (i =1; i <= Kol ; i ++)

c[i]=0;

for (i=Kol; i>=2;i--)

for(j=i-1; j>=1; j--)

if (Mass[i]<Mass[j])

c[j]++;

else

c[ i ]++;

for (i =1; i <= Kol ; i ++)

b[c[i]] = Mass[i];

// Заканциваем отсчет времени

end = clock();

vremya = end - start;

// Записываем осортированный массив в файл

f = fopen("CountCompares.txt","w");

for(i=0;i<Kol;i++)

fprintf(f," %d",b[i]);

// Закрываем файл

fclose(f);

return vremya;

}

//---------------------------------------------------------------------------

// Изображение гистограммы

void TForm1::DrawGis(int first,int second,int third)

{

int Max; // Максимальное время

float del, // Точек на деление

xo,yo, // Начало координат

w,h; // Ширина и высота столбца

char str[10]; // Время в милисекундах

Max = first;

if (second > Max)

Max = second;

if(third > Max)

Max = third;

del = (float)(Img_Gis->Height-40)/Max;

// Очищаем поле

DrawField();

// Устанавливаем начало координат

xo = 20;

yo = Img_Gis->Height - 20;

w = (Img_Gis->Width - 40)/3;

// Рисуем гистограммы

// Метод простого выбора

if (first!=0)

h = (int)first*del;

else

h=0;

Img_Gis->Canvas->Rectangle(xo,yo,xo+w,yo-h);

this->Img_Gis->Canvas->Brush->Color = clRed;

this->Img_Gis->Canvas->FloodFill(xo+w/2,yo-h/2,clBlack,fsBorder);

itoa(first,str,10);

this->Img_Gis->Canvas->Brush->Color = clWhite;

this->Img_Gis->Canvas->TextOut(xo+10,yo-h-15,str);

// Метод простых вставок

if (second!=0)

h = (int)second*del;

else

h=0;

Img_Gis->Canvas->Rectangle(xo+w,yo,xo+2*w,yo-h);

this->Img_Gis->Canvas->Brush->Color = clGreen;

this->Img_Gis->Canvas->FloodFill(xo+w+w/2,yo-h/2,clBlack,fsBorder);

itoa(second,str,10);

this->Img_Gis->Canvas->Brush->Color = clWhite;

this->Img_Gis->Canvas->TextOut(xo+w+10,yo-h-15,str);

// Метод подсчета сравнений

if (third!=0)

h = third*del;

else

h=0;

Img_Gis->Canvas->Rectangle(xo+2*w,yo,xo+3*w,yo-h);

this->Img_Gis->Canvas->Brush->Color = clBlue;

this->Img_Gis->Canvas->FloodFill(xo+2*w+w/2,yo-h/2,clBlack,fsBorder);

itoa(third,str,10);

this->Img_Gis->Canvas->Brush->Color = clWhite;

this->Img_Gis->Canvas->TextOut(xo+2*w+10,yo-h-15,str);

}

27