Сортування масиву методом Шелла h2>
Звіт по практиці p>
Виконали: cт.гр. 97ЕЕ3 Тлумач М., Ерегін П., Синьова
Т. p>
Пензенський державний університет, Кафедра
"Економічна кібернетика" p>
Пенза 1998 p>
Завдання h2>
Мета роботи: вивчити метод Шелла для сортування
строкового масиву і застосувати цей метод на практиці. p>
Завданням на практичну роботу є розробка
програми на мові програмування Borland С + + v.3.1. для сортування масиву
рядків по їх індексному значенням. Значення елементів масиву і їх індекси
задаються користувачем з клавіатури. p>
Вступ h2>
В даний час індустрія виробництва комп'ютерів і
програмного забезпечення для них є однією з найбільш важливих сфер
економіки розвинених країн. Щорічно у світі продаються десятки мільйонів
комп'ютерів. Тільки в США обсяг продажів комп'ютерів складає десятки мільйонів
доларів і постійно продовжує рости. p>
У чому ж причини такого стрімкого зростання індустрії
персональних комп'ютерів та їх порівняльна вигідність для багатьох ділових
застосувань? p>
Простота використання, забезпечена за допомогою діалогового
способи взаємодії з комп'ютером. p>
Відносно високі можливості з переробки інформації,
наявність програмного забезпечення, а також потужних систем для розробки нового
програмного забезпечення. p>
Мова С + + - універсальна мова загального призначення,
область додатків якого - програмування систем в самому широкому сенсі.
Крім цього, С + + успішно використовується як у багатьох додатках, так і в потужних
операційних системах. p>
1 Вхідні дані h2>
Вхідними даними в програмі є число елементів
масиву, значення індексу кожного елемента і рядкові елементи масиву. Всі
ці дані вводяться користувачем з клавіатури за запитом програми. Число елементів
масиву не повинно перевищувати 32767. Індекси елементів масиву повинні бути
цілочисельними значеннями. p>
2 Вихідні дані h2>
Вихідними даними в програмі є вихідний і
відсортовано за методом Шелла масив, які виводяться на екран за запитом
користувача. p>
3 Архітектура програми h2>
Дана програма розроблена на мові програмування
С + + і складається з наступних функціональних модулів: p>
1) menu - обробник меню; p>
2) input - введення даних; p>
3) output - виведення даних; p>
4) sort - сортування Шелла; p>
5) Основна програма. p>
1.Функція menu: p>
Здійснює виведення на екран меню, опитування клавіатури в
нескінченному циклі і пересування кольорового курсору по пунктах меню. При натисканні
клавіші 'Esc' повертає -1, якщо натиснути клавішу з номером пункту меню
повертає цей номер, якщо натиснути клавішу 'Enter' повертає номер поточного
пункту меню. p>
Параметри для виклику функції menu: x, y - координати
меню на екрані, * capt - вміст меню. p>
2.Функції input: p>
Здійснює введення індексів і елементів масиву з
клавіатури, повертає кількість введених елементів. p>
Параметри для виклику функції mas []-вказівник на
масив, stn - номер перший вводиться елементу. p>
3.Функції output: p>
Здійснює висновок вмісту масиву на екран. p>
Параметри для виклику функції mas []-вказівник на
масив, num - число елементів масиву. p>
4.Функція sort: p>
Здійснює сортування масиву за індексами елементів
методом Шелла. p>
Сортування методом Шелла полягає в наступному:
спочатку окремо групуються і сортуються елементи, віддалені один від одного
на відстані 9. Після першого проходу елементи перегруповуються і знову сортуються
елементи, віддалені один від одного на відстані 5, потім сортуються елементи,.
віддалені один від одного на відстані 3, і нарешті, на четвертому проході йде
звичайна або одинарна сортування. p>
Параметри для виклику функції mas []-вказівник на
масив, num - число елементів масиву. p>
5. Основна програма: p>
Здійснює установку квітів, очищення екрана, виклик,
функції обробки меню і в залежності від повернутого значення виклик одній з
наступних функцій: input, output, sort. p>
Список літератури h2>
1. Вірт Н. Алгоритми та структури даних: Пер з англ. -М.:
Світ, 1989. - 360 с., Іл. P>
2.Бьярн Страуструп. Мова програмування С + +. у двох
частинах. Пер. з англ. Київ: "ДіаСофт", 1993.-296 с. іл. p>
ДОДАТОК 1 p>
Роздруківка програми p>
# include p>
# include
p>
# include
p>
# include p>
// Дані одного елемента масиву p>
struct one_elem ( p>
int n;// Індекс p>
char st [100];// Дані p>
); p>
// Обробка меню p>
int menu (int x, int
y, char * capt); p>
// Введення даних p>
int input (one_elem
mas [], int stn); p>
// Вивід даних p>
void
output (one_elem mas [], int num); p>
// Сортування Шелла p>
void sort (one_elem
mas [], int num); p>
// Обробка меню p>
int menu (int x, int
y, char * capt) ( p>
int n, m;// Лічильники p>
int num;// Кількість пунктів p>
int k;// Вибраний пункт p>
char * pt;// Тимчасовий покажчик на символ p>
char c;// Лічені з клавіатури символ p>
// Обчислюємо кількість пунктів p>
num = strlen (capt)/20; p>
// Курсор на нульовий елемент p>
k = 0; p>
// Нескінченний цикл обробки p>
for (;;) ( p>
// Вивід меню p>
pt = capt; p>
for (n = 0; n
gotoxy (x, y + n); p>
// зафарбовування пункту, на який вказує курсор p>
if (n == k) ( p>
// зафарбовування p>
textbackground (12); p>
textcolor (14); p>
) else ( p>
// Нормальний p>
textbackground (3); p>
textcolor (1); p>
) p>
cprintf ( "% d)", n +1); p>
for (m = 0; m <20; m + +)
cprintf ( "% c", * (pt ++)); p>
) p>
textbackground (3); p>
textcolor (1); p>
// Опитування клавіатури p>
c = getch (); p>
if (! c)
c = getch (); p>
// Перевірка, не натиснута Чи клавіша з цифрою p>
if
(((c-'1 ')> = 0 )&&(( c-'1')
// Установка покажчика в залежності від натиснутою цифри p>
k = c-'1 '; p>
// Запис у буфер клавіатури символу ENTER p>
ungetch (13); p>
) else ( p>
// Аналіз p>
switch (c) ( p>
// На початок p>
case (72): p>
if (k> 0) k -; else k = num-1; p>
break; p>
// Вниз p>
case (80): p>
if (k <(num-1)) k + +; else k = 0; p>
break; p>
// Вихід з
ESC - повертається -1 p>
case (27): p>
return -1; p>
// Вихід з
ENTER - повертається номер пункту p>
case (13):
return k; p>
) p>
) p>
) p>
) p>
// Введення даних p>
// повертає значення - кількість введених
елементів p>
// Вхідні параметри - вказівник на масив і номер
перший вводиться елемента p>
int input (one_elem
mas [], int stn) ( p>
clrscr ();
//Очищення масиву p>
int x;// Індекс p>
int num;
//Кількість введених елементів p>
int n;// Лічильник p>
char a [100];
//Дані p>
// Введення кількості елементів p>
printf ( "Кількість вводяться елементів: "); p>
scanf ( "% d", & num); p>
printf ( "Введіть, строчки формату X: Слово
n "); p>
// Введення елементів p>
for (n = 0; n
scanf ( "% d:% s", & x, a); p>
mas [n + stn]. n = x; p>
strcpy (mas [n + stn]. st, a); p>
); p>
return num; p>
) p>
// Вивід масиву p>
// Вхідні параметри - вказівник на масив і
кількість елементів p>
void
output (one_elem mas [], int num) ( p>
clrscr (); p>
int n;// Лічильник p>
printf ( "Вміст масиву: n "); p>
printf ( "Індекс Вміст n "); p>
// Вивід елементів p>
for
(n = 0; n
printf ( "% 5d% sn", mas [n]. n, mas [n]. st); p>
// Очікування ESC p>
gotoxy (1,24); p>
printf ( "Натисніть ESC для продовження ... "); p>
while
(getch ()! = 27); p>
) p>
// Сортування Шелла p>
void sort (one_elem
mas [], int num) ( p>
int stp [4] = (9,5,3,1);//
Кроки сортування p>
int fs, mn, p;
//Перший, мінімальний і поточний елементи p>
int n;
//Лічильник p>
one_elem prm;
//Тимчасова мінлива p>
// Цикл сортування p>
for (n = 0; n <4; n + +) ( p>
fs = 0;// Починати сортувати з початку p>
// Перебір всього масиву p>
while
(fs
// Пошук мінімального елементу p>
p = fs; p>
mn = fs; p>
while (p
if (mas [p]. n
p + = stp [n]; p>
) p>
// Якщо мінімальний елемент відрізняється від початкової,
поміняти їх місцями p>
if (mn> fs) ( p>
prm.n = mas [mn]. n; p>
strcpy (prm.st, mas [mn]. st); p>
mas [mn]. n = mas [fs]. n; p>
strcpy (mas [mn]. st, mas [fs]. st); p>
mas [fs]. n = prm.n; p>
strcpy (mas [fs]. st, prm.st); p>
) p>
fs + = stp [n];// Перехід до наступного елемента p>
) p>
) p>
) p>
// Основна програма p>
void main () ( p>
one_elem mas [100];
//Масив p>
int num;//
Кількість елементів p>
int st;// Вибраний пункт меню p>
textbackground (0); p>
textcolor (15); p>
clrscr (); p>
do ( p>
// Вивід меню p>
st = menu (30,5, "
Введення даних " p>
"Додавання даних" p>
"Виведення даних" p>
"Сортування Шелла" p>
"Вихід з програми" p>
"x0 "); p>
textbackground (0); p>
textcolor (15); p>
// Виконання дій в залежності від обраного
пункту p>
switch (st) ( p>
// Введення даних p>
case (0): p>
num = input (mas, 0); p>
break; p>
// Додавання даних p>
case (1): p>
num + = input (mas, num); p>
break; p>
// Вивід масиву p>
case (2): p>
output (mas, num); p>
break; p>
// Сортування p>
case (3): p>
sort (mas, num); p>
break; p>
) p>
// Вихід по ESC або останнього пункту p>
) while
((st <4) & & (st! =- 1 )); p>
clrscr (); p>
) p>
ДОДАТОК 2 p>
Результати роботи програми p>
Меню: p>
1) Введення
даних p>
2) Додавання
даних p>
3) Висновок
даних p>
4) Сортування
Шелла p>
5) Вихід з
програми p>
1) Введення даних: p>
Число вводяться елементів: 8 p>
Вводите рядки формату X: Слово p>
0: sign p>
1001: else p>
3000: yes p>
1535: but p>
1: past p>
412: cell p>
99: alert p>
2888: object p>
3) Висновок даних: p>
Вміст масиву: p>
Індекс Вміст p>
0 sign p>
1001 else p>
3000 yes p>
1535 but p>
1 past p>
412 cell p>
99
alert p>
2888 object p>
Натисніть ESC для продовження ... p>
2) Додавання даних: p>
Число вводяться елементів: 1 p>
Вводите рядки формату X: Слово p>
10000: hello p>
4) Сортування Шелла p>
3) Висновок даних: p>
Вміст масиву: p>
Індекс Вміст p>
0 sign p>
1 past p>
99
alert p>
412 cell p>
1001 else p>
1535 but p>
2888 object p>
3000 yes p>
10000 hello p>
Натисніть ESC для продовження ... p>
5) Вихід з програми p>
ДОДАТОК 3 p>
Блок-схема алгоритму програми p>
Для підготовки даної роботи були використані
матеріали з сайту http://kurslab.chat.ru/
p>