Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Informatika_1 / 1pr opr / ЛАБОРАТОРНИЙ ПРАКТИКУМ / ЛАБОРАТОРНИЙ ПРАКТИКУМ.doc
Скачиваний:
52
Добавлен:
07.02.2016
Размер:
791.55 Кб
Скачать

Лабораторна робота №12 Тема роботи: “ Масиви у мові с”

Мета роботи: дати навички студентам розв’язувати задачі з використанням одномірних масивів.

Основні питання, які розглядаються в лабораторній роботі: поняття одномірного масиву, розмірності масиву, розміру масиву, опису масиву; отримання кількісних характеристик масиву, створення масиву за правилом, перетворення масиву.

Рекомендована література

  1. Романовская Л.М. и др. Программирование в среде Си для ПЭВМ ЕС/Л.М.Романовская, Т.В.Русс, С.Г.Свитковский. – М.: Финансы и статастика, 1991. – 352 с. Ст.29-30

  2. В.В.Подбельский, С.С.Фомин Программирование на языке Си. -М.:Финансы и статистика, 1999. Ст.101-109

  3. В.С.Проценко, П.Й. Чалий, А.Б. Ставровський Техніка програмування мовою Ci,-К., Либідь, 1993.Ст.27-32

  4. Березин Б.И., Березин С.Б. Начальный курс С и С++. – М.: ДИАЛОГ-МИФИ, 1999. – 288 с.Ст.83-97

  5. Г.Шилдт Справочник программиста по С/С++. : Пер. с англ.: Уч. пос.. – М. : Издательский дом «Вильямс», 2000. – с. 21-25

Хід роботи:

  1. Вивчити теоретичний матеріал.

  2. Виконати індивідуальне завдання.

  3. Скласти звіт, в якому відповісти на теоретичні питання, описати програму, привести контрольний приклад виконання програми.

Контрольні запитання:

    1. Що таке регулярні структури?

    2. Яка структура має назву масив?

    3. Що таке розмірність масиву?

    4. Що таке розмір масиву?

    5. Як описується одновимірний масив у мові С?

    6. Як використовується одновимірний масив в якості параметру підпрограми у мові С?

    7. Що таке відкритий масив як параметр підпрограми?

    8. Чому масив називають регулярною структурою?

    9. Чи можна змінити розмір масиву при виконанні програми?

    10. Які типи даних можна використовувати в якості базового типу масиву?

    11. Які методи впорядкування масивів Ви знаєте?

    12. Що таке метод обміну впорядкування масиву?

    13. Що таке метод бульбашки?

    14. Як оптимізувати метод бульбашки?

    15. Яка робоча функція алгоритму бульбашки?

    16. Що таке алгоритм включення для сортування масиву?

    17. Що таке метод вибору сортування масиву?

    18. Який метод називають методом швидкого сортування?

    19. Яка робоча функція методу швидкого сортування?

    20. В чому особливість використання методу прапірця сортування масиву?

    21. Що називають двовимірнм рядком?

    22. Якою може бути розмірність масиву у мові С?

    23. Як обробляються рядки у двовимірному масиві?

    24. Які властивості мають елементи, які знаходяться на головній діагоналі?

    25. Які властивості елементів, розташованих під побічною діагоналлю?

Теоретичні відомості

У мові C визначені наступні типи: регулярні (масиви), комбіновані (записи та об’єднання), множини, рядкові, файлові, об’єктні. Для об’яви ідентифікаторів використовують декларатори.

декларатори

приклад

<identifier>

int a; long l;

<declarator>[]

char b[]; int d[][];

<declarator>[constant-expression>]

int g[10]; double d[3][7]

*<declarator>

char *p; float **f;

<declarator>()

int s();

<declarator>(<arg-type-list>)

void b(int a);

(<declarator>)

void (*v)();

У квадратних дужках задається кількість елементів масиву.

Ключове слово typedef дозволяє створити нове ім’я вже існуючому типу даних. Шаблон наступний:

typedef <спеціфікатор_типу> <нове_ім’я>;

Наприклад:

typedef unsigned char uint8;

Будь-який декларатор може бути укладений у круглі дужки. Складний декларатор – це ідентифікатор, визначений більш ніж одним деклоратором масиву, покажчика або функції.

При інтерпретації складних деклараторів може бути запропоновано просте правило, що читається в такий спосіб: "зсередини-назовні". Потрібно почати з ідентифікатора й подивитися вправо, є чи квадратні або круглі дужки. Якщо вони є, то проінтерпретувати цю частину декларатора, потім подивитися ліворуч, якщо чи зірочка. Якщо на будь-якій стадії праворуч зустрінеться закриваюча кругла дужка, то спочатку необхідно застосувати всі ці правила усередині круглих дужок, а потім продовжити інтерпретацію, на останньому кроці інтерпретується специфікатор типу. У наступному прикладі проілюстровані ці правила. Послідовність кроків при інтерпретації пронумерована.

char *(*(*var) ()) [10];

^ ^ ^ ^ ^ ^ ^

7 6 4 2 1 3 5

1. Ідентифікатор var визначений як

2. Покажчик на

3. Функцію, що повертає

4. Покажчик на

5. Масив з 10 елементів, котрий складається

6. З покажчиків на

7. Величини типа char.

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

int *var[5]; - масив покажчиків на величини типу int.

int (*var)[5]; - покажчик на масив величин типу int.

long *var(long, long); - функція, що повертає покажчик на величину типу long.

long (*var) (long, long); - покажчик на функцію, що повертає величину типу long.

Також для структур визначений оператор sizeof, який повертає розмір у байтах заданого виразу або типу:

sizeof(<тип>)

Наприклад, можна дізнатися довжини стандартних типів

printf("%d", sizeof(float )); // 4

Одномірний масив

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

Вводити і виводити масиви можна тільки поелементно. Визначення масиву можливо також через визначення масиву як константи:

const int p[4] = { 1, 2, 3, 4 };

Масив р із постійних цілих значень, індексується масив з нуля, тобто

p[3]=4 а p[0]=1

Операції над масивами це фактично операції над значеннями їх покажчиків, дозволені операції – порівнювання, присвоювання та додавання і віднімання від цілого числа. Наприклад, якщо задати int *t, то t – це покажчик типу int, який вказує на початок цього масиву. Операції, дозволені над елементами масиву, визначаються базовим типом масиву.

Програміст повинен обов’язково слідкувати за тим, щоб не вийти за межі виділеної пам’яті.

Приклад 1. Дано натуральне число n і масив дійсних чисел а[1..n]. Знайти кількість додатних та від’ємних елементів.

#include <stdio.h>

const n = 5;

void main()

{

float a[n];

int i,n1,n2;

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

scanf("%f", &(a[i]));

for (n1=n2=i=0; i<n; i++)

printf("\n%f", a[i]);

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

if (a[i]>0) n1++;

else if (a[i]<0) n2++;

printf("\n+=%i", n1);

printf("\n-=%i", n2);

return;

}

Сортування – це процес розташування елементів по зростанню (спаданню).

Обмінне сортування (бульбашками).

Цей метод заснований на порівнянні пари сусідніх елементів і перестановці їх у необхідному порядку.

Приклад 2. Задано ціле n та масив дійсних чисел А[n]. Впорядкувати його в порядку зростання методом бульбашки.

#include <stdio.h>

const n = 7;

void main()

{

float t, a[n]={3,7,2,-1,5,0,4};

int i,j;

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

printf("\n%f", a[i]);

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

for (j=0; j<(n-i-1); j++)

if (a[j]<a[j+1])

{

t = a[j];

a[j] = a[j+1];

a[j+1] = t;

};

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

printf("\n%f", a[i]);

return;

}

Крім одномірних масивів, часто доводиться вирішувати конкретні задачі з матрицями - двомірними масивами, а також із тривимірними й n-мірними масивами. При цьому варто розглядати кожний рядок матриці як одномірний масив усередині одномірного. Визначати масиви потрібно як і будь-яку змінну за допомогою деклараторів, наприклад:

int *max;

int matrix[3][4];

float tr[13][4][2];

Або за допомогою констант:

const n = 3;

int *max1[n];

int max2[n][n+1] = {

{ 1, 2, 3, 4},

{ 8, 5, 7, 6},

{ 9, 0, 11, 12}

};

Можливо створювати нові типи:

const m = 5;

typedef double Matrix[m][m];

Matrix a, b, c;

Звертатися до елементів вище визначених масивів можливо через операнд розіменування або через індексний оператор масиву – квадратні дужки [], який визначений через оператор розіменування:

<ім’я_масиву>[<вираз>]

*((<ім’я_масиву>) + (<вираз>))

Наприклад:

*max2 // покажчик на одномірний масив int[n+1], нульовий рядок

**max2 // 1 – елемент max[0][0]

*max2[2] // 9 – елемент max[2][0]

Для роботи з кожним елементом матриці варто утворити два цикли для перегляду рядків і для перегляду стовпчиків, для n-мірного масиву – n циклів.

Приклад. Дано квадратну матрицю розміру . Одержати транспоновану матрицю.

#include <stdio.h>

const n = 3;

void main()

{

int i,j;

long double Mx[n][n], temp;

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

for (j=0; j<n; j++)

scanf("%Lf", Mx[i]+j);

for (i=0; i<n; i++, printf("\n"))

for (j=0; j<n; j++)

printf("%10Lg", Mx[i][j]);

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

for (j=i+1; j<n; j++)

{

temp = Mx[i][j];

Mx[i][j] = Mx[j][i];

Mx[j][i] = temp;

}

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

for (j=0, printf("\n"); j<n; j++)

printf("%10Lg", Mx[i][j]);

}

Індивідуальні завдання: Створити програму на мові С для приведеної задачі згідно варіанту.

    1. Задані дві послідовності x1, …xn та y1, …, yn цілих чисел. Визначити, чи є друга послідовність підпослідовністю першої (чи можна з першої послідовності викреслити деякі члени так, щоб залишилася друга).

    2. Задані дві квадратні матриці цілих чисел порядка n. Знайти послідовність з нулів та одиниць b1, b2, …, bn таку, що bі =1, коли кількість від'ємних та невід'ємних елементів і-го рядка першої матриці співпадає відповідно кількості від'ємних та невід'ємних елементів і-го рядка другої матриці.

    3. Задані дійсні числа x1, …xn, дійсна квадратна матриця порядку n. Отримати дійсну матрицю розміра n(n+1), вставивши у початкову матрицю між k та k+1 (k<n) стовпчиками новий стовпчик з елементами x1, …xn.

    4. Задана квадратна матриця. Знайти суми елементів, які розташовані на лініях, паралельних головній діагоналі у верхньому трикутнику.

    5. Задана квадратна матриця. Знайти найменше з значень елементів стовпчика, який має найбільшу суму модулів елементів. Якщо таких декілька, то отримати перший з них.

    6. Задані дійсні числа x1, …x8. Отримати дійсну квадратну матрицю порядку 8:

    1. Задана дійсна квадратна матриця. В рядках з від'ємним елементом на головній діагоналі знайти суму всіх елементів.

    2. Задано одновимірній масив, елементами якого є цифри. Впорядкувати його по зростанню. Використати функцию отримання випадкового числа.

    3. Задані два масива а[1..n] та b[1..n].Розглянемо всі можливі суми добутків ai*bj , в кожному з яких ніякі аіта bj не зустрічаються два рази. Серед таких сум знайти максимальну.

    4. Прямокутне поле m на n. Деякі з них зафарбовані в чорний колір. Відомо, що всі чорні клітини можуть бути розбиті на декілька прямокутників, які неперетинаються та не мають загальних вершин. Кольори клітинок задані у вигляді масиву типу

array [1//m] of array [1..n] of Boolean;

Підрахувати кількість чорних прямокутників.

    1. Задано масив x1, …xn цілих чисел. Не викорстовуючи інших масивів, переставити елементи масиву в оберненому порядку.

    2. Задано два масиви x1<= …<=xn та y1<= …<=yk З'єднати їх в масив z1<= …<=zm Кожний елемент повинен в входити в масив z1, …zm стільки разів, скільки він входить в цілому в масиви X та Y.

    3. Задані дійсні x1, …x3n , які визначають на площині n квадратів з сторонами, паралельними координатним осям: x1, x2 – координати центру першого квадрата, x3 – довжина його сторони; x4, x4 – координати центру другого квадрата, x6 – довжина його сторони; і т.д. Чи є точки, які належать всім квадратам. Якщо так, то визначити координати однієї з них.

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

    5. Отримати квадратну матрицю цілих чисел порядку 7, елементами якої є числа 1, 2, ..., 49, розташовані в ній по спіралі.

    6. Задана дійсна квадратна матриця, всі елементи якої різна. Знайти найбільший елемент серед тих, що розташовані на головної та побічної діагоналях та поміняти його з елементом, який стоїть на перетині цих діагоналей.

    7. Отримати квадратну матрицю порядка n:

    1. Отримати квадратну матрицю порядка n:

    1. Задана квадратна матриця порядка n. Отримати матрицю А2.

    2. Задана квадратна матриця порядка n. Отримати матрицю АВ; елементи матриці В обчислюються за формулою:

21. Задані квадратні матриці А та В порядка n. Отримати матрицю А(В-Е)+С, де Е – одинична матриця порядка n, а елементи матриці С обчислюються за формулою

    1. Задана квадратна матриця порядка n. Отримати обернену матрицю.

22. Дано натуральне число n. Скільки різноманітних цифр зустрічається в його десятковому записі.

23. Дано натуральне число n і масив цілих чисел a[1..n]. Одержати числа, узяті по одному з кожної групи рівних елементів.

24. Дано натуральне число n і масив дійсних чисел р[1..n], дійсне число a. Виконати бінарний пошук елементу, що дорівнює a, попередньо відсортувавши масив по зростанню.

25. Дано натуральне число n і масив дійсних чисел а[1..n]. Перетворити його, впорядкувати його останні k парних елементів по спаданню значень елементів.