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

Ініціалізація багатовимірних масивів

Для виведення елементів кожного масиву в програмі викликається функція printArray. Зверніть увагу, що у визначенні функції параметр-масив специфікований як int а[][3]. Коли функція приймає як параметр одновимірний масив, в списку параметрів функції дужки, що відносяться до масиву, залишаються незаповненими. Перший індекс багатовимірного масиву також не потрібно, проте усі наступні індекси потрібні. Компілятор використовує ці індекси для визначення місцезнаходження в пам'яті елементів багатовимірних масивів. Усі елементи масиву зберігаються в пам'яті послідовно, незалежно від кількості індексів. У двовимірному масиві за першим рядком в пам'яті слідує другий рядок.

Вказівку значень індексів при оголошенні параметрів функції дає можливість компілятор повідомити нею про спосіб відшукування елементів в масиві. У двовимірних масивах кожен рядок по суті є одновимірним масивом. Для визначення місцезнаходження елементу в конкретному рядку компілятор повинен знати, скільки в точності елементів знаходиться в кожному рядку, щоб при зверненні до цього масиву він міг пропустити відповідне число блоків пам'яті. Таким чином, при зверненні до елементу а[1][2] у нашому прикладі компілятор знає, що для того, щоб дістатися до другого рядка (рядок 1), йому треба пропустити в пам'яті три елементи першого рядка.

Після цього компілятор звертається до третього елементу цього рядка (елемент 2).

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

for (column = 0; column <= 3; column++)

a [ 2 ] [ column ] = 0;

Ми встановлюємо третій рядок, отже, ми знаємо, що перший індекс завжди дорівнює 2 (0 це перший рядок, 1 - другий рядок). У циклі for змінюється тільки другий індекс (тобто індекс стовпця). Попередня структура for еквівалентна чотирьом операторам привласнення :

а [ 2 ] [ 0 ] = 0 ;

а [ 2 ] [ 1 ] = 0 ;

а [ 2 ] [ 2 ] = 0 ;

а [ 2 ] [ 3 ] = 0;

Наступна вкладена структура for підраховує суму усіх елементів масиву а.

total = 0;

for (row = 0; row <= 2; row++)

for (column = 0; column <= 3; column++)

total += a[row][column];

У цій структурі for елементи масиву підсумовуються відрядковий. Виконання зовнішньої структури for починається з установки row (тобто індексу рядка) в 0, так що за допомогою внутрішньої структури for можуть бути підсумовані елементи першого рядка. У зовнішній структурі for змінна row збільшується до 1, так що можуть бути підсумовані елементи другого рядка. Потім в зовнішній структурі for змінна row збільшується до 2, і підсумовуються елементи третього рядка.

У програмі що нижче, з використанням структур for над масивом stu - dentGrades розміром 3 на 4 виконуються деякі інші маніпуляції, звичайні для масивів. Кожен рядок масиву представляє студента, а кожен стовпець представляє оцінку за один з чотирьох іспитів, які студенти здавали в семестрі. Маніпуляції з масивами виконуються задопомогою чотирьох функцій. Функція minimum визначає найнижчу оцінку серед усіх студентів за семестр. Функція maximum визначає найвищу. Функція average визначає для цього студента його середню оцінку за семестр. Функція printArray виводить двовимірний масив в наочній табличній формі.

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

/* Приклад двовимірного масиву */

#include <stdio.h>

#define STUDENTS 3

#define EXAMS 4

int minimum(int [][EXAMS], int, int);

int maximum(int [][EXAMS], int, int);

float average (int [], int);

void printArray (int [] [EXAMS], int, int);

main ()

{

int student

Лабораторна робота №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

printf("The array is:\n");

printArray (studentGrades, STUDENTS, EXAMS);

printf ("\n\nLowest grade: %d\nHighest grade: %d\n",

minimum (studentGrades, STUDENTS, EXAMS),

maximum (studentGrades, STUDENTS, EXAMS));

for (student = 0; student <= STUDENTS - 1; student++)

printf("The average grade for student %d is %.2f\n"

student, average(studentGrades [student], EXAMS))

return 0;

}

5. Напишіть дану програму, проаналізуйте її..

/* Знаходить мінімальну оцінку */

int minimum (int grades[ ] [EXAMS], int pupils, int tests)

{

int i, j, lowGrade = 100;

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

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

if (grades[i][j] < lowGrade)

lowGrade = grades[i][j];

return lowGrade;

}

6. Напишіть дану програму, проаналізуйте її.

/* Знаходить максимальну оцінку */

int maximum(int grades[][EXAMS], int pupils, int tests){

int i, j, highGrade = 0;

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

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

if (grades [i][ j] < highGrade)

highGrade = grades[i][j];

return highGrade;

}

7. Напишіть дану програму, проаналізуйте її.

/* Визначає середню оцінку для цього студента */

float average(int setOfGrades[ ], int tests)

{

int i, total = 0;

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

total += setOfGrades[i];

return (float) total / tests;

}

8. Напишіть дану програму, проаналізуйте її.

/* Виводить масив */

void printArray(int grades[][EXAMS], int pupils, int tests)

{

int i, j;

printf (" [0] [1] [2] [3] ");

for (i = 0; i <= pupils - 1; i++){

printf("\nstudentGrades[%d] "i);

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

printf ( "%-5d", grades[i] [j ] );

}

}

The array is:

[0]

[1]

[2]

[3]

studentGrades[0]

77

68

86

73

studentGrades[1]

96

87

89

78

studentGrades[2]

70

90

86

81

Lowest grade: 68

Highest grade: 96

The average grade for student 0 is 76.00

The average grade for student 0 is 87.50

The average grade for student 0 is 81.75

Лістинг 6.22. Приклад використання двовимірних масивів

Кожна з функцій minimum, maximum і printArray приймає три параметри - масив studentGrades (званий в кожній з функцій grades), кількість студентів (рядків масиву) і кількість іспитів (стовпців масиву). У кожній з функцій по масиву grades виконується цикл з вкладеними структурами for. Наступна вкладена структура є фрагментом визначення функції minimum :

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

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

if (grades[i][ j] < lowGrade)

lowGrade = grades[i][j];

Виконання зовнішньої структури for починається з установки змінної i (тобто індексу рядка) в 0, так що в тілі внутрішньої структури for елементи першого рядка можуть порівнюватися із змінною lowGrade. У внутрішній структурі відбувається виконання циклу для чотирьох оцінок цього рядка і порівняння кожної оцінки з lowGrade. Якщо оцінка менша, ніж lowGrade, змінній lowGrade привласнюється значення цієї оцінки. Потім в зовнішній структурі індекс рядка збільшується до 1. Із змінною lowGrade порівнюються елементи другого рядка. Потім індекс рядка збільшується до 2, і із змінною lowGrade порівнюються елементи третього рядка. Коли виконання усієї структури закінчується, в lowGrade міститься найменша оцінка в двовимірному масиві. Функція maximum працює аналогічно функції minimum.

Функція average приймає два аргументи - одновимірний масив оцінок цього студента з ім'ям setOfGrades і число елементів (іспитів), що містяться в цьому масиві. При виклику функції average першим передаваним параметром є studentGrades[student], Це призводить до того, що у функцію передається адреса одного рядка двовимірного масиву. Параметр studentGrades[1] є початкова адреса другого рядка масиву. Не забувайте, що двовимірний масив по суті є масивом одновимірних масивів і що ім'я одновимірного масиву є адресою цього масиву в пам'яті. Функція обчислює суму елементів масиву, ділить загальний підсумок на число іспитів і повертає результат у вигляді числа з плаваючою точкою.