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);
} } }}
КОНТРОЛЬНЫЙ ПРИМЕР ВЫПОЛНЕНИЯ ПРОГРАММЫ
В качестве примера возьмём исходный файл “Test.exe” и запустим его . На экране появляется окно собщения о наличии необходимых файлов. Для продолжения выполнения программы пользователь нажимает клавишу F2 , в результате чего на экране появляется гистограмма , характеризующая скорость выполнения сортировки массивов. Воспользовавшись клавишей Esc , пользователь выходит с графического режима в режим отображения меню. При нажатии пользователем клавиши F1 на экране появляется окно помощи которое содержит название программы, данные о разработчике, назначение, функциональные клавиши используемые в программе, и возможные проблемы при ее выполнении.Нажатие клавиши Esc приводит к закрытию окна помощи. Для выхода из программы пользователь должен нажать клавишу F10.