Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
практичні алгоритмізація дл студ.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
6.12 Mб
Скачать

Лабораторна робота №19. Тема: Сортування масивів

Мета: Освоїти роботу із сортуванням масивів.

Хід роботи

1. Напишіть дану програму, проаналізуйте її. Змініть значення SIZE 10 на свій номер по списку.

/* Програма сортує значення масиву в порядку зростання */

include <stdio.h>

define SIZE 10

main ()

{

int a[SIZE] = {2, 6, 4, 8, 10, 12, 89, 68, 45, 37};

int i, pass, hold;

printf("Data items in original order\n");

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

printf("%4d", a [i]);

for (pass = 1; pass <= SIZE - 1; pass++) /* проходів */

for (i = 0; i <= SIZE - 2; I++) /* один прохід */

if (a[i] > a[i + 1]){ /* одне порівняння */

hold = a[i] ; /* одна перестановка */

a[i] = a[i + 1];

a[i + 1] = hold;

}

printf(" \nData items in ascending order\n");

for (i = 0; i <= SIZE - 1; i++) printf("%4d" a [i]);

printf("\n");

return 0;

}

Data items in original order

2 6 4 8 10 12 89 68 45 37

Data items in ascending order

2 4 6 8 10 12 37 45 68 89

Лістингу 6.15. Сортування масиву бульбашковим методом

Сортування даних (тобто розташування даних в деякому спеціальному порядку, наприклад, за збільшенням або убуванню) є одним з найбільш важливих застосувань комп'ютера. Банк сортує усі чеки по номерах рахунків, щоб у кінці кожного місяця можна було підготувати особисті банківські декларації. Телефонні компанії сортують списки своїх рахунків по прізвищах і, усередині прізвищ, по іменах, щоб полегшити пошук телефонних номерів. Практично кожній організації доводиться сортувати які-нибудь дані (і у багатьох випадках - великі масиви даних). Сортування даних є захоплюючою проблемою, що вимагає найінтенсивніших зусиль дослідників в області інформатики. У цій главі ми обговоримо, можливо, найпростішу з відомих схем сортування.

Програма сортує значення елементів десятиелементного масиву а в порядку їх зростання. Використовувана нами методика називається бульбашковим сортуванням або сортуванням зануренням, оскільки менші значення, подібно до повітряних бульбашок у воді, поступово "спливають" у верхню частину масиву, тоді як великі значення опускаються вниз. Метод вимагає декількох проходів по масиву. На кожному проході порівнюються послідовні пари елементів. Якщо елементи розташовані в зростаючому порядку (чи якщо їх значення співпадають), ми нічого не міняємо. Якщо елементи пари розташовані в убуваючому порядку, їх значення в масиві міняються місцями.

Спочатку програма порівнює а[0] і а[1], потім а[1] і а[2], потім а[2] і а[3] і так далі, поки порівняння а[8] і а[9] не завершить прохід. Зверніть увагу, що хоча існує 10 елементів, виконується тільки дев'ять порівнянь. Із-за способу проведення послідовних порівнянь велике значення за один прохід може переміститися в масиві на багато позицій вниз, а невелике значення може переміститися тільки на одну позицію вгору. За перший прохід найбільше значення гарантовано опускається в нижній елемент масиву а[9]. За другий прохід друге за величиною значення гарантовано опускається в а[8]. За дев'ятий прохід дев'яте за величиною значення виявляється в а[1]. В результаті цього найменше значення залишається в а[0], отже для сортування масиву потрібно тільки дев'ять проходів, навіть якщо він складається з десяти елементів.

Сортування виконується за допомогою вкладеного циклу for. У разі потреби перестановки вона виконується шляхом трьох привласнень

hold = а[i];

а [ i ] = а [ i + 1 ] ;

а [i + 1] = hold;

де в додатковій змінній hold тимчасово зберігається одне з двох обмінюваних значень. Перестановка не може бути виконана тільки двома привласненнями

а [ i ] = а [ i + 1 ] ;

а [ i + 1] = а [ i ] ;

Якщо, наприклад, a[i] рівне 7 і a[i + 1] рівне 5, то після першого привласнення обидва значення дорівнюватимуть 5 і значення 7 буде втрачено. Звідси необхідність в додатковій змінній hold.

Головним достоїнством бульбашкового сортування є те, що її легко запрограмувати. Проте бульбашкове сортування виконується повільно. Це стає очевидним при сортуванні великих масивів. У вправах ми розробимо досконаліші версії бульбашкового сортування. Нині вже розроблені набагато ефективніші методи сортування, чим бульбашкова. Пізніше ми досліджуємо деякі з них. У поглиблених курсах навчання програмуванню методи сортування і пошуку розглядаються більш повно.

Приклад: обчислення середнього значення, медіани і найбільш вірогідного значення з використанням масивів

Тепер розглянемо значніший приклад. Комп'ютери часто застосовуються для збору і аналізу результатів різних досліджень і опитувань громадської думки. Програма аналізу даних опитування використовує масив response, що ініціалізував 99-у (див. символічну константу SIZE) відповідями опитування. Кожна з відповідей представлена числом від 1 до 9. Програма обчислює середнє, медіану і найбільш вірогідне з 99 значень.

Середнім значенням називається середньоарифметичне цих 99 значень. Функція mean обчислює середнє значення шляхом підсумовування 99 елементів і ділення результату на 99.

Медіаною називається "Серединне значення". Функція median визначає медіану шляхом виклику функції bubbleSort для сортування масиву відповідей в порядку зростання і вибору середнього елементу answer[SIZE / 2] відсортованого масиву. Майте на увазі, що у разі парного числа елементів медіана повинна обчислюватися як середнє значення двох "серединних" елементів. Функція median нині не забезпечує такої можливості. Для виведення масиву response викликається функція printArray.

2. Напишіть дану програму, проаналізуйте її. Змініть значення SIZE 99 на свій номер по списку.

/* Ця програма виробляє аналіз даних опитування.

Вона обчислює середнє значення, медіану і найбільш вірогідне значення */'

#include <stdio.h>

#define SIZE 99

void mean (int []);

void median (int []);

void mode(int [], int []);

void bubbleSort(int []);

void printArray(int []);

main ( )

{

int frequency[10] = {0},

response [SIZE = {6,7,8,9,8,7,8,9,8,9,

7,8,9,5,9,8,7,8,7,8,

6,7,8,9,3,9,8,7,8,7,

7,8,9,8,9,8,9,7,8,9,

6,7,8,7,8,7,9,8,9,2,

7,8,9,8,9,8,9,7,5,3,

5,6,7,2,5,3,9,4,6,4,

7,8,9,6,8,7,8,9,7,8,

7,4,4,2,5,3,8,7,5,6,

4,5,6,1,6,5,7,8,7};

mean(response);

median(response);

mode(frequency, response);

return 0;

}

void mean(int answer [])

int j, total = 0 ;

printf("%s\n%s\n%s\n", ''********", " Mean", "********");

for ( j = 0 ; j<=SIZE - l; j + + )

total += answer[j];

printf("The mean is the average value of the data\n"

"items. The mean is equal to the total of\n"

"all the data items devided by the number \n"

"of data items (%d). The mean value for \n"

"this run is: %d / %d = %.4f\n\n"

SIZE, total, SIZE, (float) total / SIZE);

}

void median(int answer[])

{

printf("\n%s\n%s\n%s\n%s"

"****************","Mean", "********",

"The unsorted array of responses is");

printArray(answer);

bubbleSort (answer);

printf ( "\n\nThe sorted array is");

printArrav(answer);

printf("\n\nThe median is element %d of \n"

"the sorted %d element array.\n"

"For this run the median is %d\n\n",

SIZE / 2, SIZE, answer[SIZE / 2));

void mode(int treq[], int answer[])

{

int rating, j, h, largest=0, modeValue=0;

printf ("\n%s\n%s\n%s\n"

"*********","Mode","*********");

for (rating=l; rating <= 9; rating++)

freq[rating] = 0;

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

++freq[answer[j]];

printf ("%s%lls%19s\n\n%54s\n%54s\n\n"

""Response","Frequency", "Histogram",

"1 1 2 2", "5 0 5 0 5");

for (rating=l; rating <= 9; rating++){

printf("%8d% lld ", rating, freq[rating]);

if (freq(rating)> largest){

largest = freq[rating] ;

modeValue = rating;

}

for (h =1; h <= freq[rating]; h++)

printf ("*");

printf("\n");

}

printf("The mode is the most frequent value.\n"

"For this run the mode is %d which occured"

" %d times.\n", modeValue, largest);

}

void bubbleSort (int a [ ])

{

int pass, j, hold;

for (pass=1; pass <= SIZE - 1; pass++)

for (j =0; j <= SIZE - 2; j+ + )

if (a [ j] > a[j +1]){

hold = а [ j ] ;

а [ j ] = а [ j +1 ] ;

a[j+1] = hold;

}

}

void printArray (int a[])

{

int j;

for (j=0; j <= SIZE - 1; j++) {

if (j % 20 == 0)

printf ("\n");

printf("%2d", a[j ] );

}

}

Програма аналізу даних опитування

Найбільш вірогідним значенням називається значення, яке найчастіше зустрічається серед 99 відповідей. Функція mode визначає найбільш вірогідне значення шляхом підрахунку числа відповідей кожного типу і вибору з них значення з найбільшою сумою. Ця версія функції mode не обробляє випадок декількох рівних сум, як в позаминулій програмі. Функція будує також гістограму для допомоги у визначенні найбільш вірогідного значення графічно. В наступній програмі міститься пробний прогін цієї програми. Цей приклад включає більшість стандартних методик, що зазвичай вимагаються в завданнях, пов'язаних з масивами, у тому числі передачу масиву у функцію.

********

Mean

********

The mean is the average value of the data

items. The Mean is equal to the total of

all the data items divided byy the number

of data items (99). The mean value

for this run is: 681 / 99 = 6.8788

********

Median

********

The unsorted array of responses i is

6 7 8 9 8 7 8 9 8 9 7 8 9 5 9 8 7 8 7 8

6 7 8 9 3 9 8 7 8 7 7 8 9 8 9 8 9 7 8 9

6 7 8 7 8 7 9 8 9 2 7 8 9 8 9 8 9 7 5 3

5 6 7 2 5 3 9 4 6 4 7 8 9 6 8 7 8 9 7 8

7 4 4 2 5 3 8 7 5 6 4 5 6 1 6 5 7 8 7

The sorted array is

1 2 2 2 3 3 3 3 4 4 4 4 4 5 5 5 5 5 5 5

5 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7

7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8

8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8

9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9

The median is element 49 of

the sorted 99 element array.

For this run the median is 7

********

Mode

********

Response Frequency Histogram

1 1 2 2

  1. 0 5 0 5

1 1

Лабораторна робота №1. Тема: Побудова блок-схем алгоритмів засобами програми Word 2010. 3

Лабораторна робота № 2. Тема: Робота та знайомство в середовищі програмування. Запуск програм на виконання. Редагування тексту. 5

Лабораторна робота №3. Тема: Побудова алгоритмів за допомогою DiagramDesigner. 6

Лабораторна робота №4. Тема:Створення лінійних програм. Процедури вводу та виводу в машинному коді. 8

Лабораторна робота №5. Тема: Написання програм використовуючі математичні функції. Освоєння арифметичних операторів. 10

Лабораторна робота №6. Тема: Написання програм використовуючи логічні значення Boolean. 12

Лабораторна робота №7. Тема: Типи в програмах. 15

Лабораторна робота №8. Тема: Оператор вибору в циклах середовища пргограмування. 17

Лабораторна робота №9. Тема: Використання процедур та функцiй. Звукові можливості Паскаля. 21

Лабораторна робота №10. Тема: Використання перелiчуваного та обмеженого типу даних. 25

Лабораторна робота №11. Тема: Одновимiрнi масиви. 27

Лабораторна робота №12. Тема: Використання множин. 30

ІІ семестр. Мова програмування С 34

Лабораторна робота №13. Тема: Проста програма на С: друк рядка тексту 34

Лабораторна робота №14. Тема: Арифметика в С. Використання операцій рівності і відношення 35

Лабораторна робота №15 . Тема: Структурна розробка програм. Структура вибору if. Структура вибору if/else. Структура повторення while 38

Лабораторна робота №16. Тема: Структурна розробка програм. Структура вибору if. Структура вибору if/else. Структура повторення while 41

Лабораторна робота №17. Тема: Програмні модулі в С. Функції математичної бібліотеки 47

Лабораторна робота №18. Тема: Приклади роботи з масивами 57

Лабораторна робота №19. Тема: Сортування масивів 67

Лабораторна робота №20. Тема: Покажчики 80

Лабораторна робота №21. Тема: Покажчики 97

Лабораторна робота №22. Тема: Форматоване введення/вивід 116

Лабораторна робота №23. Тема: Використання прапорів в рядку управління форматом printf 122

Лабораторна робота №24. Тема: Використання прапорів в рядку управління форматом printf 125

Лабораторна робота №25. Тема: Структури, об′єднання, операції з бітами і перечисленнями 128

Лабораторна робота №26. Тема: Створення файлу послідовного доступу 138

7 23 **********************

8 27 ****************************

9 19 ******************

The mode is the most frequent value.

For this run the mode is 8 which occurred 27 times.

Приклад виконання програми аналізу даних опитування