Смекни!
smekni.com

Анализ методов сортировки одномерного массива (стр. 5 из 5)

window(2, 3, 79, 3);

puts(" быстрым методом и методом слияния. После чего определяется время сор-");

window(2, 4, 79, 4);

puts(" тировки массива каждым методом и результат выводится в виде гисто-");

window(2, 5, 79, 5);

puts(" граммы.");

window(2, 6, 79, 6);

window(20, 10, 60, 15);

textcolor(WHITE);

textbackground(LIGHTGRAY);

cprintf("+------------------------------------------------------------------+");

cprintf("¦ НЕОБХОДИМЫЕ ФАЙЛЫ ПРИСУТСТВУЮТ ¦");

cprintf("¦ (для тестировния нажмите F2) ¦");

cprintf("+------------------------------------------------------------------+");

closegraph();

}

}

//------------< Окно сообщения ошибок>-----------

void Error()

{

window(20, 10, 60, 15);

textcolor(WHITE);

textbackground(LIGHTGRAY);

cprintf("+----------------- Ошибка ----------------+");

cprintf("¦ ¦ ");

cprintf("¦ ¦");

cprintf("¦ ¦");

cprintf("+---------------------------------------------+");

}

//-------------< Функцияпомощи >----------------

help()

{

int n = 1;

FILE *hl; // Указатели на файл

char string[78];

if ((hl = fopen("test.hlp", "r")) != NULL) // Проверка на открытие файла

{

windows(0);

window(2, 2, 78, 23);

textcolor(BLACK);

while (fgets(string, 78, hl) != NULL && n < 23)

{

gotoxy(1, n++); // Построчный вывод файла

cputs(string); // помощи

}

window(36, 1, 44, 1);

printf(" Помощь "); // Вывод заголовка помощи

while (27 != getch());

}

else{

Error();

window(29, 12, 52, 12);

textcolor(BLACK);

cprintf("Файл TEST.HLP ненайден");

getch();

windows(1);

}

fclose(hl);

windows(1);

return 0;

}

//--------< Функцияпостроениягистограмм>-------

grafix(double simvol[2])

{

double CopySimvol[2]; // Масивколичествасимволов

long float max = 0;

int gdriver = DETECT, gmode, errorcode;

int midx = 50; // Обявление переменных

int midy = 410; // с заданними начальными

int i, s; // значениями

int siz = 100;

int otst = 10;

int rovn = 45;

char chis[2];

char buf[10];

initgraph(&gdriver, &gmode, "");

errorcode = graphresult(); // Записькодошибки

if (errorcode != grOk) // Проверканаошибку

{

Error(); // Вызовфункцииокна

window(26, 12, 54, 12);

textcolor(BLACK);

cprintf("Драйвер EGAVGA.BGI ненайден");

getch();

windows(1);

return 0;

}

for (int y = 0; y < 2; y++) // Оприделениемаксимального

if (max < simvol[y]) // числа

max = simvol[y];

for (int b = 0; b < 2; b++) // Оприделениевысотыстолбцов

CopySimvol[b] = simvol[b] * 200 / max;

setfillstyle(CLOSE_DOT_FILL,9);

for (int n = 0; n < 2; n++) // Построениестолбцовилиний

{

setcolor(BLUE);

bar3d(midx + otst + siz * n, midy - CopySimvol[n], midx + siz* (n+1 ), midy, 15, 1);

setcolor(BROWN);

line(midx + rovn + siz * n, midy + otst, midx + rovn + siz * n, midy + otst * 2);

sprintf(chis, "%d", n + 1);

setcolor(GREEN);

outtextxy((midx + rovn + siz * n) - 2, midy + otst * 2, chis);

setcolor(CYAN);

sprintf(buf, "%lf", simvol[n]);

outtextxy((midx + rovn + siz * n) - 15, midy - CopySimvol[n] - rovn, buf);

}

setcolor(BROWN);

line(midx, 100, midx, midy + otst); // Построениеоси Y

line(midx, midy + otst, 280, midy + otst); // Построениеоси X

line(midx - otst, midy - 200, midx, midy - 200); // Построение

line(midx - otst, midy - 100, midx, midy - 100); // линии

settextstyle(DEFAULT_FONT, HORIZ_DIR, 1);

setcolor(GREEN);

outtextxy(535, 460, "ESC ");

outtextxy(10, 205, "100");

outtextxy(10, 305, "50");

outtextxy(350, 235, "1. Сортирвка массива быстрым");

outtextxy(350, 250, " методом");

outtextxy(350, 280, "2. Сортирвка массива методом");

outtextxy(350, 295, " слияния");

setcolor(LIGHTBLUE);

outtextxy(300, 423, "метод");

outtextxy(570, 460, "Выход");

settextstyle(DEFAULT_FONT, HORIZ_DIR, 2);

outtextxy(220, 30, "ГИСТОГРАММА");

settextstyle(DEFAULT_FONT, VERT_DIR, 1);

outtextxy(48, 160, "время");

while (27 != getch()); // Проверка на символ ESC

closegraph();

windows(1);

return 0;

}

/*qsort:сортирует v[left]...v[right] повозрастанию*/

void qqsort( int v[], int left, int right)

{

int i,last;

delay(1);

void swap( int v[], int i, int j);

if(left>=right) /*ничего не делается если*/

return; /* в массиве менее двух эл-тов */

swap(v,left,(left+right)/2); /*делящий эл-нт переносится в v[0]*/

last=left;

for(i=left+1;i<=right;i++) /*делениеначасти*/

if(v[i]<v[left])swap(v,++last,i);

swap(v,left,last); /*перезапоминается делящий элемент*/

qqsort(v,left,last-1);

qqsort(v,last+1,right);

}

void swap( int v[], int i, int j)

{

long int temp;

temp=v[i];

v[i]=v[j];

v[j]=temp;

}

/*SRECMG -- РЕКУРСИВНАЯ СОРТИРОВКА СЛИЯНИЕМ*/

void srecmg(a,n)

int a[],n;

{

void merge( int*, int, int);

int i;

delay(1);

if(n>1)

{i=n/2;srecmg(a,i);srecmg(a+i,n-i);merge(a,i,n);}

}

/*merge--слияниедвухподсписков*/

#define MAX(x,y) ((y)<(x)?(x):(y))

void merge( int*w, int l1, int l2)

{

int*a,*pa,*pb,i;

a=( int*)calloc(l2+2,sizeof( int));

pa=a;pb=a+l1+1;

for(i=0;i<l1;i++) *pa++=w[i];

for(i=l1;i<l2;i++) *pb++=w[i];

*pa=*pb=MAX(w[l1-1],w[l2-1])+1;

pa=a;pb=a+l1+1;

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

w[i]=(*pa<*pb?*pa++:*pb++);

free(a);

}

#define ww 700

//-------< Функция вызова разных методов >-------

file()

{ void qqsort( int *, int,int);

void srecmg( int*, int);

double simvol[2];

int s;

clock_t start,start2,end,end2; int t=0;

int gener1[ww],gener2[ww]; //Генератор случайных чисел

randomize(); //Устанавливает генератор в 0

for ( s=0 ; s < ww ; s++)

{ gener1[s]= ( rand()%100 ); // rand()-функциягенератора

gener2[s] =gener1[s];

}

{ start=clock();

qqsort(gener1,0,ww-1);

end=clock();

simvol[0] = ((end - start)/CLK_TCK);

}

{ start2 =clock();

srecmg(gener2,ww);

end2=clock();

simvol[1] = ((end2 - start2)/CLK_TCK);

}

grafix(simvol); // Вызов функции построения гистограмм

windows(1);

return 0;

}

//-------------------< Меню >--------------------

void main()

{

char press;

windows(1);

while (1)

{

press = getch(); // Опросклавиатуры

switch(press)

{

case 59: help(); break; // Вызовпомоши

case 60: file(); break; // Запуск гистограммы

case 68: { // Выход из программы

window(1, 1, 80, 25);

textbackground(BLACK);

clrscr();

exit(1);

} } }}


Приложение 2

КОНТРОЛЬНЫЙ ПРИМЕР ВЫПОЛНЕНИЯ ПРОГРАММЫ

В качестве примера возьмём исходный файл “Test.exe” и запустим его . На экране появляется окно собщения о наличии необходимых файлов. Для продолжения выполнения программы пользователь нажимает клавишу F2 , в результате чего на экране появляется гистограмма , характеризующая скорость выполнения сортировки массивов. Воспользовавшись клавишей Esc , пользователь выходит с графического режима в режим отображения меню. При нажатии пользователем клавиши F1 на экране появляется окно помощи которое содержит название программы, данные о разработчике, назначение, функциональные клавиши используемые в программе, и возможные проблемы при ее выполнении.Нажатие клавиши Esc приводит к закрытию окна помощи. Для выхода из программы пользователь должен нажать клавишу F10.


Пример выводимой гистограммы.