Главная Обратная связь

Дисциплины:

Архитектура (936)
Биология (6393)
География (744)
История (25)
Компьютеры (1497)
Кулинария (2184)
Культура (3938)
Литература (5778)
Математика (5918)
Медицина (9278)
Механика (2776)
Образование (13883)
Политика (26404)
Правоведение (321)
Психология (56518)
Религия (1833)
Социология (23400)
Спорт (2350)
Строительство (17942)
Технология (5741)
Транспорт (14634)
Физика (1043)
Философия (440)
Финансы (17336)
Химия (4931)
Экология (6055)
Экономика (9200)
Электроника (7621)






Робота з одновимірними числовими масивами



 

 

Мета роботи:ознайомлення зі структурами даних, зокрема з одно- вимірними числовими масивами (векторами); набуття навичок роботи з числовими масивами у програмах C/C++.

 

 

Теоретичні основи.

У масивах об’єднуються елементи одного типу. Елементи масиву ро-

зташовуються у пам’яті послідовно, починаючи з першого елементу (пер- ший елемент має індекс 0) .

Оскільки перший індекс масиву завжди дорівнює нулю, то для будь- якого оголошення на зразок:

 

 

t name[n];

 

 

де t – тип даних, припустимі значення індексів знаходяться у діапазоні від 0 до n–1. Використання індексу за межами цього діапазону призведе до звернень до областей пам’яті, що не належать масиву.

Отже для оголошення масиву необхідно оголосити змінну (ім’я ма- сиву) та додати слідом у квадратних дужках ціле число, котре буде визна- чати кількість елементів у масиві. Наприклад, оголошення:

 

 

int m[100];

 

 

визначає масив на ім’я m, здатний зберігати до 100 значень типу int.

Типові приклади оголошення вищезгаданого масиву:

 


 

або


#define MAX 100

int m[MAX];

 

 

const max=100; int m[max];


 

Аби сформувати вираз, що має відношення до конкретного елементу масиву, необхідно після імені масиву зазначити індекс цього елементу (у квадратних дужках). У якості індексу має бути цілий вираз – константа, змінна, результат функції тощо. Наприклад, оператор:

 

 

m[5]=55;

 

 

присвоює значення 55 шостому елементу масиву m.


 

 

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

 

 

for (int i=0;i<n;i++) m[i]=0;

 

 

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



Для ініціалізації необхідно оголосити масив (як зазвичай), після чого у фігурних дужках записати (через кому) список значень констант. Напри- клад, оголошення:

 

 

int m[10]={0,1,2,3,4,5,6,7,8,9};

 

 

створює масив із десяти цілих значень на ім’я m і послідовно присвоює значення від 0 до 9 кожному елементу масиву від m[0] до m[9].

Можна переписати розглянуте оголошення наступним чином:

 

 

int m[]={0,1,2,3,4,5,6,7,8,9};

 

 

У такому разі порожні квадратні дужки дозволяють компілятору ав- томатично визначати точний розмір пам’яті, необхідний для зберігання пе- рерахованих елементів.

При явному завданні розміру масиву не є обов’язковим завдання зна- чень для кожної позиції масиву. Наприклад, оголошення:

 

 

int m[10]={0,1,2,3,4};

 

 

створює масив із десяти цілих значень, але ініціалізує лише перші п’ять.

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

Якщо m – це ім’я певного масиву, то вираз sizeof(m) визначає число байт, що займає масив m у пам’яті, а sizeof(m[0]) – число байт, що займає один елемент масиву.

Під час попередньої ініціалізації масиву можна використовувати sizeof() для коректного визначення числа елементів масиву, наприклад:



 

 

int m[]={0,1,2,3,4};

#define MAX sizeof(m)/sizeof(m[0])

 

 

Аби не допустити подальших корегувань масиву, необхідно перед


 

 

його оголошенням вказати ключове слово const, наприклад: const float mas[]={0,1,2,3,4,5,6,7,8,9};

Зазвичай початковими значеннями масив заповнюється з клавіатури або файлу за допомогою циклу. Так, наприклад, наступний фрагмент про- грами демонструє заповнення масиву цілих чисел з клавіатури. Накопи- чення значень завершується коли користувачем введено число нуль, або коли вичерпано число комірок (MAX), попередньо виділене для зберігання масиву директивою #define:

 

 

n=0; /* n – лічильник елементів масиву */ do

{

printf("m[%i]=",n);

scanf("%i",&m[n]);

}

while((m[n++])&&(n!=MAX));

n=(m[n–1])?n:--n;

 

 

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

 

 

double Sum(double data[], int k)

{

double s=0;

while(k>0) s+=data[--k]; return s;

}

 

Викликати цю функцію можна, наприклад, наступним чином: printf(″Result=%lf\n″,Sum(m,n));

де n – кількість елементів у масиві m.

При передачі масиву у функцію передається не вміст масиву, а лише його адреса (ім’я масиву). Це означає, що функція оперує безпосередньо з параметром-масивом, тобто може змінювати його значення. Для уникнен-

ня таких змін використовуються параметри-константи, наприклад: void Func(const double data[], int k)


 

 

Можна також формальний параметр, через який задається масив, оголосити як вказівник, а для звертання у функції до елементів масиву ви- користовувати операцію розадресації.

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

 

 

Приклад завдання 9.1:

Дано натуральне число n та масив дійсних чисел a1, a2, …, an. Знайти серед членів масиву таке число (і його індекс), якомога наближене до сере- днього арифметичного усіх елементів масиву.

 

 

Розв’язок:

/* 9.1 */

#include <stdio.h>

#include <math.h>

#define MAX 100 main()

{

float a[MAX],x,y,s=0; unsigned int i,n,k; printf("n="); scanf("%i",&n); for(i=0;i<n;i++)

{

printf("a[%i]=",i); scanf("%f",&a[i]); s+=a[i];

}

x=fabs(a[0]–s/n); y=a[0];

k=0;

for(i=1;i<n;i++) if(x=(fabs(a[i]–s/n)<x))

{

y=a[i]; k=i;

}

printf("Result:%–7.2f\n",s/n); printf("a[%i]=%–7.2f",k,y);

return 0;

}


 

 

Результати роботи:

 

 

Завдання

(в задачах введення кожного елементу масиву завершується натисканням Enter,

введення припиняється введенням числа 0):

1.Дано два довільні одновимірні масиви цілих чисел М1 і М2 з однаковою кількістю елементів. Сформувати масив М3, елементами якого є числа, що утворюються за формулою M3[i]=M1[i]+M2[i].

2.З довільного одновимірного масиву дійсних чисел М1 сформувати ма- сиви: М2, який складається з додатних, і М3, який складається з від'єм- них елементів М1.

3.З довільного одновимірного масиву дійсних чисел М1 сформувати ма- сив М2, що складається з елементів М1, які більші за середнє арифмети- чне елементів М1.

4.У довільному одновимірному масиві натуральних чисел М знайти та вивести першу наявну послідовність чисел Фібоначчі, тобто таку, що задовольняє умовам: M[i]=1, M[i+1]=1, M[i+2]=M[i]+M[i+1].

5.З двох довільних одновимірних масивів цілих чисел М1 і М2 сформува- ти масив М3, що складається лише з тих елементів, котрі присутні і у М1 і у М2.

6.Дано два довільні одновимірні масиви цілих чисел М1 і М2. Сформувати масив М3, елементами якого є ті члени М2, що не присутні у М1.

7.Дано натуральне число n. Сформувати масив, елементами якого є циф- ри числа n.

8.У довільному одновимірному масиві дійсних чисел М обчислити дов- жину останньої послідовності, що задовольняє умові M[i+1]=M[i].

9.Знайти найбільший спільний дільник для елементів довільного однови- мірного масиву цілих чисел. Рекомендовано застосування алгоритму Евкліда.

10.У довільному одновимірному масиві цілих чисел М знайти і вивести

останню послідовність, що задовольняє умові M[i+1]=M[i]+1.

11.У довільному одновимірному масиві цілих чисел М знайти і вивести першу послідовність, що задовольняє умові M[i]=M[i+1]+1.

12.У довільному одновимірному масиві цілих чисел подвоїти непарні та потроїти парні елементи.


 

 

13.У довільному одновимірному масиві цілих чисел М видалити елементи, які менші за середнє арифметичне елементів М. Визначити кількість видалень.

14.Дано довільні одновимірний масив цілих чисел М та натуральне число

n. Визначити, якщо такі є, кількість чисел n у масиві М та їх індекси.

15.Дано довільні одновимірний масив дійсних чисел М1 та дійсні числа x та y (x<y). З масиву М1 сформувати масив М2, що складається з елемен- тів М1, які більші за число x та менші за число y.

16.Дано довільні одновимірний масив цілих чисел М та натуральне число

n. З масиву М1 сформувати масив М2, що складається з елементів М1, які не дорівнюють числу n.

17.Дано два довільні одновимірні масиви цілих чисел М1 і М2 з однаковою кількістю елементів n. Сформувати масив М3, елементами якого є чис- ла, що утворюються за формулою M3[i]=│M1[i]–M2[ni–1]│.

18.Дано два довільні одновимірні масиви дійних чисел М1 і М2 та дійсні числа x і y (x<y). Сформувати масив М3, елементами якого є ті члени М1, котрі більші за x, та ті члени М2, котрі менші за y. Спочатку розташува- ти елементи масиву М1.

19.Дано довільні одновимірний масив цілих чисел М та натуральне число

n. У масиві М видалити елементи, які дорівнюють n. Визначити кіль- кість видалень.

20.Дано довільні одновимірний масив дійсних чисел М1 та дійсні числа x та y (x<y). З масиву М1 сформувати масив М2, в якому замінено нулями усі числа, котрі більші за x та менші за y.

21.З довільного одновимірного масиву цілих чисел М1 сформувати масив

М2, що складається з таких елементів, що не повторювалися у М1.

22.У довільному одновимірному масиві цілих чисел визначити який з еле-

ментів (максимальний чи мінімальний) знаходиться ближче до середи- ни масиву.

23.У довільному одновимірному масиві цілих чисел розташувати на поча- тку масиву мінімальний, а на при кінці максимальний за значенням еле- менти масиву, не змінюючи порядку розташування інших елементів.

24.Дано довільні одновимірний масив дійсних чисел М та натуральне чис- ло n. У масиві М збільшити у n разів ті елементи, що мають парні по- рядкові номери та менші за n але більші за середнє арифметичне серед елементів М з непарними порядковими номерами.

25.Дано два довільні одновимірні масиви цілих чисел М1 і М2 та натураль- не число n. Сформувати масив дійсних чисел М3, елементами якого є числа, що утворюються за формулою M3[i]=M1[i]∙M2[i]. Елементи, яких недостає у меншому за розміром масиві, вважати рівними n.

26.Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти суму чисел менших середнього арифметичного.

27.Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти кількість від’ємних чисел більших (за модулем) свого номера (0<¦a(i)¦<i).

28.Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти найменше з чисел з парним номером.

29.Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти добуток від’ємних чисел.

30.Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти суму квадратів парних чисел.

31.Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти суму добутку додатних і добутку від’ємних.

32.Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти кількість чисел більших середнього арифметичного.

33.Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Знайти суму парних чисел.

34.Задано послідовність з N чисел: a(1), a(2), a(3),..., a(N). Визначити, чи є числа, які лежать на кінцях відрізка [a,b].

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

1. Коли у програмах С/С++ застосовуються масиви?

2. Який синтаксис оголошення масиву у С/С++?

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

4. Як можна ініціалізувати масив у С/С++?

5. Як здійснюється індексація елементів масиву?

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

7. Яким чином можна опрацьовувати одразу декілька елементів масиву?

8. Як здійснюється передача і опрацювання масивів у функціях?

9. Що таке задача пошуку у масиві?

 

 


 

 

12. Лабораторна робота №10. Робота з числовими матрицями

 

 

Мета роботи:ознайомлення зі структурами даних, зокрема з дво- вимірними числовими масивами (матрицями); набуття навичок роботи з числовими матрицями у програмах C/C++.

 

 

Теоретичні основи.

Масив може мати два або й більше вимірів. Такі масиви називаються

багатовимірними.

Найбільш розповсюдженим на практиці є використання двовимірних масивів або так званих матриць. Елементи таких масивів запам’ятовуються рядок за рядком. Можна вважати, що двовимірний масив є масивом одно- вимірних масивів (підмасивів).

Так, наприклад, після оголошення у програмі матриці дійсних чисел: int x[3][4];

розташування її елементів x[i][j] буде відповідати наступній таблиці:

 

 

x[0][0] x[0][1] x[0][2] x[0][3]
x[1][0] x[1][1] x[1][2] x[1][3]
x[2][0] x[2][1] x[2][2] x[2][3]

 

де перший індекс i є номером рядка, а другий j – номером стовпця (індек- сація кожного з вимірів починається з нуля).

У пам’яті комп’ютера елементи такого масиву розташується наступ- ним чином: x[0][0], x[0][1], x[0][2], x[0][3], x[1][0], x[1][1], x[1][2], x[1][3],

x[2][0], x[2][1], x[2][2], x[2][3] і займають 24 (12×2) байт пам’яті.

Ініціалізувати такий масив можна в один із наступних способів:

 


 

 

або


float x[3][4]={0.0,0.1,0.2,0.3,1.0,1.1,1.2,1.3,2.0,2.1,2.2,2.3};

 

 

float x[3][4]=

{


{0.0,0.1,0.2,0.3},

{1.0,1.1,1.2,1.3},

{2.0,2.1,2.2,2.3}

};

 

 

де, наприклад, вираз x[1][2] відповідає значенню 1.2.

До речі, в оголошенні багатовимірного масиву дозволяється залиша- ти порожніми перші квадратні дужки, тобто опускати розмірність найста-


 

 

ршого виміру, наприклад:

 

 

float x[][4]={0.0,0.1,0.2,0.3,1.0,1.1,1.2,1.3,2.0,2.1,2.2,2.3};

 

 

У цьому випадку кількість рядків матриці обчислюється як частка від ді- лення кількості даних (у даному прикладі їх дванадцять) на відому кіль- кість елементів у кожному рядку матриці (у даному прикладі – чотири).

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

 

 

int x[1][1]={100};

 

 

Для доступу до елементів багатовимірного масиву застосовується класична індексна форма звертання, тобто вказавши в окремих квадратних дужках значення індексу для кожного з вимірів, наприклад:

 


 

 

або


x[1][2]=(a+b)/c;

 

 

int i,j,n=3,m=4; for(i=0;i<n;i++)

for(j=0;j<m;j++) printf("%f ",x[i][j]);


 

В останньому прикладі розглянуто код виведення на екран дванадцяти дій- сних чисел – елементів двовимірного масиву.

Як вже зазначалося, при передачі масиву у функцію передається не вміст масиву, а лише його адреса (ім’я масиву).

Для передачі багатовимірного масиву у якості аргументу функції не- обхідно задати мінімум інформації, достатньої для перетворення індексних виразів в адреси пам’яті. Зокрема для двовимірного масиву достатньо пе- редати кількість стовпців аби компілятор зміг самостійно обчислити адре- си елементів на початку кожного рядка.

Визначимо, наприклад, символічні константи ROWS і COLS, що за- дають кількість рядків та стовбців відповідно у двовимірному масиві:

 

 

#define ROWS 5

#define COLS 8

 

 

Тепер можна оголосити, наприклад, наступну функцію AnyFn() з масивом у якості параметра:

 

 

void AnyFn(int data[ROWS][COLS]);


 

 

Можна навіть не зазначати кількість рядків: void AnyFn(int data[][COLS]);

В обох випадках компілятор перетворить вираз data[n][m] в адресу.

Аби організувати передачу в одну й ту ж саму функцію масивів з рі- зною кількістю рядків необхідно в оголошенні функції зазначити додатко- вий параметр, наприклад:

 

 

long Sum(int data[][COLS],int numRows);

 

 

Тут параметр numRows повідомляє функції AnyFn(), скільки рядків міс- тить масив data. Глобальна константа COLS, як і раніше, інформує компі- лятор і функцію про кількість стовпців в одному рядку.

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

 

 

long Sum(int data[][COLS],int numRows)

{

long s=0;

for(int r=0;r<numRows;r++)

for(int c=0;c< COLS;c++) s+=data[r][c]; return s;

}

 

Викликати цю функцію можна тепер для двовимірних масивів з різною кі- лькістю рядків, наприклад, наступним чином:

 

 

printf(″Result1=%li\n″,Sum(matrix1,n1)); printf(″Result2=%li″,Sum(matrix2,n2));

 

 

де n1 і n2 – відповідна кількість рядків у двовимірних масивах matrix1 і matrix2, попередньо оголошених, наприклад, наступним чином:

 

 

#define COLS 8

const int n1=5,n2=7;

int matrix1[n1][COLS], matrix2[n2][COLS];

 

 

Матриці доволі часто застосовуються у математиці, особливо під час розв’язку задач, що містять системи алгебраїчних та диференційних рів- нянь.


 

 

Приклад завдання 10.1:

Дано натуральні числа n та m, що визначають відповідно число ряд-

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

 

 

Розв’язок:

/* 10.1 */

#include <stdio.h>

#include <math.h>

#define ROWS 10

#define COLS 10 main()

{

float matrix[ROWS][COLS],a; unsigned int i,j,n,m; printf("n="); scanf("%i",&n);

printf("m="); scanf("%i",&m); for(i=0;i<n;i++)

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

{

printf("m[%i][%i]=",i,j);

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

if((!i)&&(i==j)) a=matrix[i][j];

else if(fabs(matrix[i][j])>fabs(a)) a=matrix[i][j];

}

printf("max=|%f|\n",a); printf("Source matrix:\n");

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

{

for(j=0;j<m;j++) printf("%5.0f",matrix[i][j]); printf("\n");

}

matrix[0][0]=matrix[0][m–1]=matrix[n–1][0]=matrix[n–1][m–1]=a; printf("Destination matrix:\n");

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

{

for(j=0;j<m;j++) printf("%5.0f",matrix[i][j]); printf("\n");

}

return 0;

}


 

 

Результати роботи:

 

 

Завдання:

1.Дано натуральні числа n та m, що визначають відповідно кількість ряд-

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

замінити ним елементи першого стовпця.

2.Дано натуральні числа n та m, що визначають відповідно кількість ряд- ків та стовпців у деякій заданій матриці дійсних чисел. Знайти серед членів цієї матриці мінімальний за абсолютним значенням елемент та замінити ним елементи останнього рядка.

3.Дано натуральні числа n та m, що визначають відповідно кількість ряд- ків та стовпців у деякій заданій матриці дійсних чисел, а також довільне дійсне число x. Знайти серед членів цієї матриці усі, більші за x, елеме- нти та їхні індекси.

4.Дано натуральні числа n та m, що визначають відповідно кількість ряд- ків та стовпців у деякій заданій матриці дійсних чисел, а також генеро- ване дійсне число x. Знайти серед членів цієї матриці усі, менші за x, елементи та їхню суму.

5.Дано натуральні числа n та m, що визначають відповідно кількість ряд- ків та стовпців у деякій заданій матриці дійсних чисел. Знайти пери- метр цієї матриці (суму елементів першого та останнього стовпців та рядків).


 

 

6.Дано натуральні числа n та m, що визначають відповідно кількість ряд- ків та стовпців у деякій заданій матриці дійсних чисел, а також генеро- ване дійсне число x. Замінити числом x усі елементи, що знаходяться на периметрі цієї матриці (елементи першого та останнього стовпців та рядків).

7.Дано натуральне число n, що визначає кількість рядків та стовпців у де- якій генерованій квадратній матриці дійсних чисел. Знайти слід (суму елементів головної діагоналі) цієї матриці.

8.Дано натуральне число n, що визначає кількість рядків та стовпців у де- якій генерованій квадратній матриці дійсних чисел. Знайти добуток елементів головної та побічної діагоналей цієї матриці.

9.Дано натуральні числа n та m, що визначають відповідно кількість ряд- ків та стовпців у деяких генерованих матрицях натуральних чисел М1 і М2. Отримати матрицю М3 шляхом додавання матриць М1 і М2.

10.Дано натуральне число n, що визначає кількість рядків та стовпців у де- якій заданій квадратній матриці цілих чисел М1. Виконати транспону- вання цієї матриці у матрицю М2, тобто рядки матриці зробити стовп- цями і навпаки.

11.Дано натуральне число n, що визначає кількість рядків та стовпців у де- якій генерованій квадратній матриці дійсних чисел. Переставити міс- цями елементи головної та побічної діагоналей цієї матриці.

12.Дано натуральні числа n та m, що визначають відповідно кількість ряд- ків та стовпців у деякій заданій матриці дійсних чисел М1. Отримати матрицю М2 шляхом обертання матриці М1 на 900 за годинниковою стрілкою.

13.Дано натуральні числа n та m, що визначають відповідно кількість ряд- ків та стовпців у деякій заданій матриці дійсних чисел М1. Отримати матрицю М2 шляхом обертання матриці М1 на 900 проти годинниковою стрілки.

14.Дано натуральні числа n та m, що визначають відповідно кількість ряд- ків та стовпців у деякій заданій матриці дійсних чисел М1. Отримати матрицю М2 шляхом обертання матриці М1 на 1800.

15.Дано натуральне число n, що визначає кількість рядків та стовпців у де- якій генерованій квадратній матриці цілих чисел М1. Отримати матри- цю М2, рядками якою є головна та побічна діагоналі матриці М1.

16.Дано натуральне число n, що визначає кількість рядків та стовпців у де- якій заданій квадратній матриці дійсних чисел М1. Отримати матрицю М2, стовбцями якою є побічна та головна діагоналі матриці М1.

17.Дано натуральне число n, що визначає кількість рядків та стовпців у де- якій заданій квадратній матриці цілих чисел. Переставити місцями го-

ловну та побічну діагоналі цієї матриці.

18.Дано натуральні числа n та m, що визначають відповідно кількість ряд- ків та стовпців у деякій заданій матриці цілих чисел, а також генерова-


 

 

не ціле число x. Замінити нулем усі елементи цієї матриці, що дорів- нюють x (якщо такі є).

19.Дано натуральні числа n та m, що визначають відповідно кількість ряд- ків та стовпців у деякій заданій матриці дійсних чисел М1, а також ге- нероване натуральне число x. Отримати матрицю М2 шляхом множення М1 на скаляр x.

20.Дано натуральні числа n та m, що визначають відповідно кількість ряд- ків та стовпців у деякій генерованій матриці дійсних чисел. Перестави- ти місцями перший і останній рядки цієї матриці.

21.Дано натуральні числа n та m, що визначають відповідно кількість ряд- ків та стовпців у деякій заданій матриці дійсних чисел. Знайти серед членів цієї матриці мінімальний за значенням елемент та вивести рядок значень, в якому він знаходиться.

22.Дано натуральні числа n та m, що визначають відповідно кількість ряд-

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

23.Дано натуральне число n, що визначає кількість рядків та стовпців у де- якій заданій квадратній матриці цілих чисел, а також генероване ціле число x. З’ясувати, чи є серед діагональних елементів цієї матриці чис- ло x та визначити його індекси.

24.Дано натуральне число n, що визначає кількість рядків та стовпців у де- якій заданій квадратній матриці дійсних чисел, та натуральне число x (x<n). Вивести спочатку рядок, а потім стовпець значень з номером x.

25.Дано натуральні числа n та m, що визначають відповідно кількість ряд- ків та стовпців у деякій генерованій матриці дійсних чисел, а також до- вільне дійсне число x. Замінити числом x усі елементи, за виключенням

елементів периметру (елементів першого та останнього стовпців та ря- дків) цієї матриці.

26.Для кожного рядка двовимірного масива D обчислити суму елементів колонок з парними номерами.

27.Визначіть кількість елементів, що не дорівнюють нулю, у кожній колонці двовимірного масиву B.

28.Визначити кількість від’ємних елементів у кожній колонці двовимірного масиву B.

29.Визначити найбільший елемент у кожній колонці двовимірного масиву E

30.Обчислити суму від’ємних елементів для кожного рядка двовимірного масиву F.

31.Перетворити двовимірний масив G, поділивши значення елементів кожного рядка на значення першого елементу цього рядка

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

33.Знайти найбільший елемент та його індекси у двовимірному масиві H

34.Визначити кількість від’ємних елементів кожного рядка двовимірного масиву C

35.Обчислити суму позитивних елементів двовимірного масиву D

 

 

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

1. Який масив вважається багатовимірним?

2. Що таке числова матриця?

3. Який синтаксис оголошення багатовимірного масиву у С/С++?

4. Як зберігаються елементи багатовимірного масиву і який обсяг па- м’яті вони займають?

5. Як здійснюється індексація елементів багатовимірного масиву?

6. Яким чином можна ініціалізувати багатовимірний масив у С/С++?

7. Яким чином можуть опрацьовуватися багатовимірні масиви у про- грамах С/С++?

8. Як здійснюється передача і опрацювання багатовимірних масивів у функціях?

9. Наведіть приклади практичного застосування багатовимірних масивів.


 

 

13. Лабораторна робота №11. Реалізація алгоритмів сортування масивів

 

 

Мета роботи:удосконалювання навичок роботи з одновимірними числовими масивами; набуття навичок розв’язку задач із застосуванням прямих (елементарних) методів сортування масивів у програмах C/C++.

 

 

Теоретичні основи.

При роботі з масивами найбільш розповсюдженими є задачі сорту-

вання (упорядкування).

Під час розв’язку задачісортування зазвичай висувається вимога мі- німального використовування додаткової пам’яті, що не припускає засто- сування додаткових (допоміжних) масивів. Упорядкування масиву – це зміна порядку розташування його елементів за певним критерієм. Напри-

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

Для оцінки швидкодії різних алгоритмів сортування, використову- ють, як правило, два показники – кількість присвоєнь та кількість порів- нянь.

Всі методи сортування можна поділити на дві великі групи – прямі (елементарні) та поліпшені (удосконалені) методи.

Прямі методи сортування по принципу, який лежить в основі методу, поділяються на три підгрупи:

– сортування вставкою (включенням);

– сортування вибором (виділенням);

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

Поліпшені методи сортування ґрунтуються на тих самих принципах, що і прямі, але використовують деякі оригінальні математичні ідеї для прискорення процесу сортування. Серед удосконалених методів сортуван- ня найчастіше використовуються методи Хоара, Шелла, пірамідальне сор- тування (за допомогою дерева), метод злиття тощо.

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

Під час сортуваннявставкою масив умовно поділяється на дві части- ни – відсортовану і не відсортовану. Елементи із не відсортованої частини

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


 

 

рший елемент (елемент із нульовим індексом), а у якості не відсортованої частини – усі інші елементи.

Для реалізації наведеного методу можна запропонувати декілька ал- горитмів, що будуть відрізнятися способом пошуку позиції вставки. Розг- лянемо один з них (упорядкування елементів за зростанням значень):

 

 

for(i=1;i<n;i++) /* n – кількість елементів у масиві */ for(j=0;j<=i–1;j++)

if (m[i]<m[j]) /* > – для упорядкування за спаданням */

{

t=m[i];

for(k=i;k>=j+1;k--) m[k]=m[k–1]; m[j]=t;

}

 

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

Розглянутий алгоритм може мати наступний вигляд (упорядкування

елементів за зростанням значень):

 

 

for(i=0;i<n–1;i++) /* n – кількість елементів у масиві */ for(j=i+1;j<n;j++)

if(m[j]<m[i]) /* > – для упорядкування за спаданням */

{

t=m[i]; m[i]=m[j]; m[j]=t;

}

 

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


 

 

останній позиції масиву буде стояти найбільший або найменший елемент (в залежності від умови упорядкування), тобто «спливла» перша «бульба- шка». Кожний наступний прохід обмінів виконується аналогічно, але тіль- ки до вже упорядкованої частини масиву.

Розглянемо алгоритм сортування обміном (упорядкування елементів за зростанням значень):

 

 

for(i=0;i<n–1;i++) /* n – кількість елементів у масиві */ for(j=0;j<n–i–1;j++)

if (m[j+1]<m[j]) /* > – для упорядкування за спаданням */

{

t=m[j]; m[j]=m[j+1];

m[j+1]=t;

}

 

У кожному конкретному випадку, в залежності від умов поставленої задачі, програміст сам вирішує питання щодо застосування того чи іншого алгоритму сортування масивів.

 

 

Приклад завдання 11.1:

Після введення з клавіатури одновимірного масиву цілих чисел виве-

сти на екран лише парні його елементи, відсортовані за спаданням. Вве- дення припинити введенням числа 0.

 

 

Розв’язок:

/* 11.1 */

#include <stdio.h>

#define MAX 100 main()

{

unsigned int i,j,k=0,n=0; int m[MAX],t;

do

{

printf("m[%i]=",n);

scanf("%i",&m[n]);

}

while((m[n++])&&(n!=MAX));

n=(m[n–1])?n:--n; /* n – кількість елементів масиву */

/* sortuvannya vyborom */


 

 

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

if(m[j]>m[i])

{

t=m[i]; m[i]=m[j]; m[j]=t;

}

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

if(!(m[i]%2))

{

k++;

printf("%8i",m[i]);

}

if(!k)printf("No results!"); return 0;

}

 

Результати роботи:

 

 

Завдання

(в усіх задачах введення кожного елементу масиву завершується натисканням

Enter, введення масиву припиняється введенням числа 0):

1.Вивести упорядковані за спаданням повторювані елементи довільного

одновимірного масиву цілих чисел та число цих повторень.

2.Упорядкувати за зростанням довільний одновимірний масив цілих чи- сел. Під час виведення масиву однакові елементи не повторювати.

3.У довільному одновимірному масиві цілих чисел видалити повтори еле- ментів. Масив упорядкувати.


 

 

4.Для двох однакових за розміром довільних одновимірних масивів дійс- них чисел з’ясувати, який з них потребує більше дій під час упорядку- вання за спаданням. Вивести назву застосованого методу сортування та значення критерію оцінювання його швидкодії.

5.Дано два довільні одновимірні масиви дійсних чисел М1 і М2. Сформу- вати злиттям цих масивів упорядкований масив М3.

6.Дано довільний одновимірний масив цілих чисел. Продемонструвати усі етапи його упорядкування за зростанням та назву застосованого ме- тоду сортування.

7.Дано довільний одновимірний масив цілих чисел. Визначити який пря- мий метод сортування потребує найменше дій під час упорядкування за зростанням та значення критерію оцінювання його швидкодії.

8.Дано довільний одновимірний масив цілих чисел. З’ясувати під час яко- го з упорядкувань (за зростанням чи за спаданням) виконується більше

дій. Вивести назву застосованого методу сортування та значення крите- рію оцінювання його швидкодії.

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

10.З довільного одновимірного масиву дійсних чисел сформувати упоряд- кований масив, в якому видалені максимальний та мінімальній за зна- ченнями елементи.

11.З довільного одновимірного масиву дійсних чисел сформувати упоряд- кований масив, в якому від’ємні числа піднесено у квадрат.

12.Дано довільний одновимірний масив цілих чисел. З’ясувати, чи є він упорядкованим. Відповідь сформулювати: «Yes >>» – якщо масив є упорядкованим за зростанням, «Yes <<» – якщо масив є упорядкованим

за спаданням або «No».

13.Упорядкувати за зростанням довільний одновимірний масиві цілих чи- сел М та потім вивести найдовшу в ньому послідовність чисел, що за- довольняє умові M[i+1]=M[i]+1.

14.Упорядкувати за зростанням довільний одновимірний масиві цілих чи- сел М та потім вивести останню в ньому послідовність чисел, що задо- вольняє умові M[i+1]=M[i]+1.

15.Упорядкувати за спаданням довільний одновимірний масиві цілих чи- сел М та потім вивести найпершу в ньому послідовність чисел, що за- довольняє умові M[i+1]=M[i]–1.

16.З довільного одновимірного масиву дійсних чисел М1 сформувати од- наково упорядковані масиви: М2, який складається з додатних, і М3, який складається з від'ємних елементів М1.

17.З довільного одновимірного масиву дійсних чисел М1 сформувати ма- сиви: М2, який складається з парних, і М3, який складається з непарних елементів М1. Масив М2 відсортувати за зростанням, а масив М3 за спа данням.

18.З довільного одновимірного масиву дійсних чисел М1 сформувати упо- рядкований за зростанням масив М2, який містить елементи масиву М1 з парними індексами.


 

 

19.Впорядкувати його другу половину по спаданню непарних елементів.

20.Впорядкувати його першу половину по зростанню елементів з парними індексами.

21.Впорядкувати останні k елементів по спаданню значень парних елементів.

22.Впорядкувати елементи, розташовані до першого від'ємного елемента в порядку зростання елементів.

23.Впорядкувати елементи, розташовані після максимального елемента по спаданню значень елементів.

24.Впорядкувати елементи, розташовані між першим і останнім від'ємним елементом по зростанню значень елементів.

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

26.Впорядкувати елементи, розташовані до мінімального елемента по зростанню значень елементів.

27.Дано довільний одновимірний масив цілих чисел М1 та натуральне чис- ло n. З масиву М1 сформувати упорядкований за спаданням масив М2, який містить елементи М1, що при цілочисловому діленні на n є парни- ми числами.

28.З довільного одновимірного масиву дійсних чисел М1 сформувати упо- рядкований за спаданням масив М2, який містить елементи М1, ціла ча- стина яких є непарними числами.

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

30.З довільного одновимірного масиву дійсних чисел М сформувати ма- сив, який містить упорядковані за зростанням елементи, що утворю- ються за формулою М[i]=М[i]–s, де s – середнє арифметичне додатних елементів М.

31.З довільного одновимірного масиву дійсних чисел М сформувати ма- сив, який містить упорядковані за спаданням елементи, що утворюють- ся за формулою М[i]=│М[i]– s │, де s – максимальний елемент М.

32.З довільного одновимірного масиву дійсних чисел М1 сформувати ма- сив М2, який містить упорядковані за спаданням округлені парні елеме- нти масиву М1.

33.Дано довільний одновимірний масив дійсних чисел М1 та генероване випадкове дійсне число n (n=0…1). З масиву М1 сформувати упорядко- ваний за зростанням масив М2, який містить елементи М1, дробова час- тина яких більша за n.

 

 

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

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

2. Які відомі методи сортування масивів і як оцінюється їхня швидкодія?

3. Навести алгоритм одного з прямих методів сортування масиву.

4. Як поліпшити швидкодію методу сортування масиву?

5. На яких засадах ґрунтуються поліпшені методи сортування масивів?

6. Як може виглядати функція, яка здійснює сортування масиву?


 

 

14.Лабораторна робота №12. Робота з символьними рядками

 

 

Мета роботи:подальше ознайомлення зі структурами даних, зок- рема з символьними рядками; набуття навичок роботи з рядками та засто- сування рядкових функцій у програмах C/C++.

 

 

Теоретичні основи.

Символьний рядок – особливий вид масиву, елементами якого є зна-

чення ASCII-кодів символів. Останнім символом рядка повинен бути так званий нуль-символом (ASCII 0) – ознака кінця рядка.

Оголосити символьний рядок можна двома способами – як масив ти- пу char або як рядковий вказівник на тип char, наприклад:

 

 

char s[128]; char *sPtr;

 

 

У першому випадку оголошується символьний масив s, що може зберігати від 1 до 128 елементів типу char з урахуванням останнього нуль- символу. Розмір пам’яті, що займає рядок s, суворо зафіксовано (у даному разі це 128 байт), у той час, як поточна довжина такого рядка може зміню- ватися в зазначених межах під час виконання програми.

Рядковий вказівник (див. друге оголошення) вказує на масив значень типу char, тобто є адресою місцезнаходження першого символу рядка.

Глобальні рядкові змінні оголошуються за межами усіх функцій про- грами, доступні із усіх її функцій та не потребують ініціалізації. Неініціалі- зовані локальні рядки доступні лише у своїх функціях та зберігають непе-

редбачувані значення.

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

 

 

char str1[80]= ″Borland C++″;

char str2[10]= ″″; /* літеральний нульовий рядок */ char str3[]=″My string″;

char str4[]={′s′,′t′,′r′,′i′,′n′,′g′,0}; char *sPtr=″string pointer″;

const char *str=″Літеральний рядок, довжиною у\ декілька рядків екрану″;

 

 

Якщо граничну кількість символів рядка не вказано або рядок ого- лошено як рядковий вказівник (наприклад, str3, str4 або sPtr, str), то розмір такого рядка встановлюється компілятором автоматично за кількістю еле- ментів-ініціалізаторів з урахуванням нуль-символу.


 

 

Нульовий рядок містить лише нуль-символ, а довжина такого рядка дорівнює нулю.

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

 

 

str1[9]=′\0′; /* str1=″Borland С″ */ str3[3]=′S′; /* str3=″My String″ */ sPtr[7]=′p′; /* sPtr=″string pointer″ */

 

 

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

 

 

*(sPtr+7)=′p′; /* вказівник на сьомий символ рядка sPtr */

 

 

Необхідно зауважити, що у С/С++ оператор присвоєння можна за- стосовувати лише до рядкових вказівників, наприклад:

 

 

sPtr=″new string pointer″;

 

 

Для присвоєння значень рядкам, оголошеним як символьні масиви, необхідно застосовувати спеціальні бібліотечні функції копіювання рядків (див. табл. 14.1).

Для введення символьного рядка застосовуються функції scanf()та

gets(), прототипи яких знаходяться у заголовному файлі stdio.h, наприклад:

 

 

scanf(″%s″,s1); gets(s2);

 

 

За допомогою функції scanf() можна ввести рядок до першого введе- ного пробілу, символу табуляції або натискання клавіші Enter. Функція gets() дозволяє ввести рядок, що містить будь-які розділові символи, проте не захищає користувача від введення зайвої кількості символів, ніж обумо- влено під час оголошення рядка.

Для виведення символьного рядка застосовуються функції printf()та

puts(), прототипи яких знаходяться у заголовному файлі stdio.h, наприклад:

 

 

printf(″%s″,s1); puts(s2);

 

 

У табл. 14.1 розташовано за абеткою стандартні функції мови, приз- начені для опрацювання символьних рядків.


 

 

Таблиця 14.1 – Стандартні функції опрацювання символьних рядків Функція Призначення #include atof()– перетворення рядка у дійсне число типу double stdlib.h atoi()– перетворення рядка у ціле число типу int stdlib.h atol()– перетворення рядка у довге ціле число типу long stdlib.h itoa()– перетворення цілого числа у рядок stdlib.h

ltoa()– перетворення довгого цілого числа у рядок stdlib.h ultoa()– перетворення беззнакового довгого цілого числа у рядок stdlib.h stpcpy()– копіювання рядка в рядок string.h

strcat()– додавання рядка до рядка (конкатенація) string.h

strchr()– пошук заданого символу, починаючи з початку рядка string.h strcmp()– порівняння двох рядків string.h strcmpi()– порівняння двох рядків без урахування регістру string.h strcpy()– копіювання рядка в рядок string.h strcspn()– пошук підрядка, що не містить задані символи string.h strdup()– копіювання рядка у динамічну пам’ять string.h stricmp()– порівняння двох рядків без урахування регістру string.h strlen()– визначення довжини рядка string.h

strlwr()– перетворення у рядку великих літер у малі string.h

strncat()– додавання частини рядка до рядка (конкатенація) string.h strncmp()– порівняння частини двох рядків string.h strncmpi()– порівняння частини двох рядків без урахування регістру string.h strncpy()– копіювання частини рядка в рядок string.h strnicmp()– порівняння частини двох рядків без урахування регістру string.h strnset()– заміна частини символів рядка заданим символом string.h strpbrk()– пошук у рядку першого будь-якого символу іншого рядка string.h strrchr()– пошук заданого символу, починаючи з кінця рядка string.h strrev()– змінення порядку розташування символів на зворотній string.h strset()– заміна усіх символів рядка заданим символом string.h strspn()– пошук підрядка, що містить задані символи string.h strstr()– пошук заданого підрядка string.h strtod()– перетворення рядка у дійсне число типу double stdlib.h strtok()– розкладання рядка на окремі підрядки string.h strtol()– перетворення рядка у довге ціле число типу long stdlib.h strtoul()– перетворення рядка у беззнакове довге ціле число stdlib.h strupr()– перетворення у рядку малих літер у великі string.h


 

 

У разі використання динамічної пам’яті (купи) для роботи з рядко- вими вказівниками необхідно скористатися спеціальними функціями malloc()або calloc() –для виділення та free() –для вивільнення пам’яті, з прототипами у заголовному файлі stdlib.h (див. приклад завдання 12.1).

В програмах С++ можна застосовувати також альтернативні опера- тори керування пам’яттю, а саме new– для виділення та delete– для виві- льнення пам’яті у купі.

 

 

Приклад завдання 12.1:

Дано довільний рядок та деякий підрядок. Визначити, якщо такі є,

усі входження цього підрядка в рядок та їхню кількість.

 

 

Розв’язок:

/* 12.1 */

#include <stdio.h>

#include <string.h>

#include <conio.h>

#include <stdlib.h>

#define MAXSTR 128 main()

{

const char enter='\r'; int i=0;

char s[MAXSTR],s1[MAXSTR],*p;

printf("s=");

do s[i]=getche(); while(s[i++]!=enter); s[i–1]='\0';

i=0;

printf("\n");

printf("s1="); gets(s1); puts("Results:");

p=(char *)malloc(MAXSTR); while(p=strstr(s,s1))

{

printf("%i) ",++i); puts(p); strcpy(s,p+strlen(s1));

}

free(p);

printf("Sum total << %s >> =%i",s1,i); return 0;

}


 

 

Результати роботи:

 

 

Завдання:

1.Дано рядок та деякий символ. Підкреслити у рядку всі входження вка-

заного символу, якщо такі там є.

2.Дано рядок та підрядок. Підкреслити у рядку всі входження вказаного підрядка, якщо такі там є.

3.Дано рядок та підрядок. Видалити всі входження підрядка в рядку, як-

що такі там є, підрахувавши кількість таких видалень.

4.Дано рядок та підрядок. Приєднати цей підрядок до початку та кінця початкового рядка.

5.Дано рядок та деякий символ. Виокремити у рядку всі входження вка- заного символу з обох сторін пробілами, якщо такі там є.

6.Дано рядок та підрядок. Виокремити у рядку всі входження вказаного підрядка з обох сторін пробілами, якщо такі там є.

7.Дано рядок та підрядок. Вставити вказаний підрядок у середину почат- кового рядка, виокремивши його з обох сторін двома пробілами.

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

9.Дано рядок. Розділити всі символи вказаного рядка пробілами.

10.Дано рядок та підрядок. Вставити вказаний підрядок у початковий ря- док через 2, 4, 8 … символів.

11.Дано рядок, підрядок та натуральне число n. Вставити вказаний підря- док у початковий рядок через кожні n символів.

12.Дано рядок та натуральне число n. Сформувати рядок, який би містив усі підрядки, що починаються з 2, 4, 8-го … символів початкового ряд- ка та мають довжину n символів.

13.Дано рядок та два підрядки s1 і s2. Замінити у рядку всі входження під- рядка s1, якщо такі там є, підрядком s2, підрахувавши кількість таких замін.

14.Дано рядок. Сформувати рядок, який би містив лише цифрові символи початкового рядка, якщо такі там є, та знайти кількість і суму цих сим-

волів.

15.Дано рядок. Сформувати рядок, який би містив відокремлені пробілами номери входжень цифрових символів початкового рядка, якщо такі там


 

 

є, та знайти суму цих номерів.

16.Дано рядок. Сформувати рядок, який би містив відокремлені пробілами значення ASCII-кодів символів початкового рядка, та знайти добуток

цих кодів.

17.Дано рядок у вигляді послідовності відокремлених комами натураль- них чисел 32…255. Сформувати рядок, вважаючи числа початкового рядка відповідними ASCII-кодами символів результуючого рядка.

18.Дано декілька рядків. Розташувати ці рядки за зростанням їх довжини та додати до кінця кожного з них, відокремивши символом «–», їх дов- жину.

19.Дано декілька рядків. Розташувати ці рядки за спаданням суми ASCII- кодів їх символів та додати до кінця кожного з них, відокремивши сим- волом «–», цю суму.

20.Дано декілька рядків. Об’єднати вказані рядки та відсортувати в ре-

зультуючому рядку символи за зростанням їх ASCII-кодів.

21.Дано декілька рядків. Об’єднати вказані рядки за принципом, що мен- ший рядок приєднується до кінця більшого.

22.Дано декілька рядків довжиною не більше як розмір текстового вікна.

Вирівняти наведений текст за правим краєм більшого з рядків.

23.Дано декілька рядків довжиною не більше як розмір текстового вікна.

Додати до кінця кожного з наведених рядків необхідну кількість сим- волів «*» аби вирівняти наведений текст за правим краєм більшого з рядків.

24.Дано декілька рядків та деякий підрядок. Вивести той з наведених ряд- ків, якщо такий там є, який містить якомога більше входжень шуканого підрядка.

25.Дано рядок, котрий закінчується деяким числом, та натуральне число n. З’ясувати, чи дорівнює те число n.

26.В тексті замінити усі символи ана символв’.

27.Підрахувати кількість символів у тексті, а також кількість пропусків.

28.Підрахувати кількість символів ‘а’ у тексті.

29.Вилучити усі символи ‘а’ з тексту.

30.Перевірити баланс дужок в арифметичному виразі. Повідомити результат перевірки.

31.В тексті зробити подвоєння символу ‘a’.

32.Зашифрувати уведений з клавіатури текст заміною вихідних символів на символи з кодом, більшим на три одиниці. Провести дешифрування.

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

 

 

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

1. Що таке символьний рядок?

2. Які типи рядкових змінних використовуються у C/C++?

3. Що таке глобальні та локальні рядкові змінні?

4. Як оголошуються та ініціалізуються рядкові змінні різних типів?

5. Що таке загальна та поточна довжина рядка?

6. Як здійснюється доступ до окремих символів рядка?

7. Як присвоюються значення рядковим змінним?

8. За допомогою яких функцій вводяться та виводяться рядки?

9. Яке призначення має заголовний файл string.h?

10.Які основні стандартні функції застосовуються для обробки рядків? 11.Яким чином вказівники використовуються для обробки рядків?

12. Як використовується динамічна пам'ять для зберігання і обробки

символьних рядків?


 

 

15.Лабораторна робота №13. Реалізація файлового обміну даними

 

 

Мета роботи:подальше ознайомлення зі структурами даних, зок- рема з файлами; набуття навичок обробки текстових та двійкових файлів у програмах C/C++.

 

 

Теоретичні основи.

Файл у мові С/С++ – абстрактне поняття, яким позначається сукуп-

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

Високорівневий обмін даними у С-програмах є уніфікованим завдя-

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

Для здійснення обміну даними між програмою та файлом необхідно насамперед створити відповідний потік у програмі, пов'язаний безпосеред- ньо з цим файлом, тобто відкрити файл для доступу (читання або запису):

 

 

FILE *f;

f=fopen(fileName,fileMode);

 

де fopen() – стандартна (stdio.h) функція відкриття існуючого (або створен- ня нового) фізичного файлу на ім’я fileName з заданим режимом обміну fileMode та його зв’язування з файловою змінною f.

Параметр fileName задає ім’я файлу, записане за правилами відпові- дної операційної системи, наприклад:

 

 

char fName1[]=″student.txt″;

char *fName2=″D:\\MYFILES\\pr1.cpp″;

 

 

Параметр fileMode задає один з наступних режимів відкриття файлу: Режим Двійковий Текстовий Опис

″r″ ″rb″ ″rt″ – відкриття файлу для читання

″w″ ″wb″ ″wt″ – відкриття або створення файлу для запису

″a″ ″ab″ ″at″ – відкриття файлу для доповнення даними

Прим. Режим без додаткового символу b або t є текстовим за замовчанням.

 

 

Для режиму ″r″ передбачається, що файл, призначений для відкрит- тя, вже існує. Режим ″w″ дозволяє створити новий або перезаписати старий


 

 

файл с таким самим ім’ям.

До ключової літери кожного з режимів можна додати знак «+», а са- ме: ″r+″, ″w+″, ″a+″ або ″rb+″, ″wb+″, ″ab+″ тощо, після чого відкриті фай-

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

Фу


Просмотров 2624

Эта страница нарушает авторские права

allrefrs.ru - 2020 год. Все права принадлежат их авторам!