Рефераты. Массивы

Массивы

B.I.Березін,С.Б.Березін(С.83) МАСИВИ І ПОКАЖЧИКИ

Раніше ми ввели типи даних в мові С, які називаються іноді базовими або

вбудованими. На основі цих типів даних мова С дозволяє будувати інші типи

даних і структури даних. Масив - один з найбільш простих і відомих структур

даних. Під масивом в мові С розуміють набір даних одного і того ж типу,

зібраних під одним ім'ям. Кожний елемент масиву визначається ім'ям масиву і

порядковим номером елемента, який називається індексом. Індекс в мові С

завжди ціле число.

ОГОЛОШЕННЯ МАСИВУ В ПРОГРАМІ

Основна форма оголошення масиву розмірності N така:

тип [размер1][размер2]...[размерН]

Частіше за все використовуються одновимірні масиви:

тип [розмір] ;

тип - базовий тип елементів масиву, розмір - кількість елементів

одновимірного масиву.

При описі двовимірного масиву оголошення має наступний вигляд:

тип [размері][размер2];

У цьому описі можна трактувати оголошення двовимірного масиву як

оголошення масиву масивів, т. е. масив розміру [размер2], елементами якого

є одновимірні масиви [размер1].

Розмір масиву в мові С може задаватися константою або константним

виразом. Не можна задати масив змінного розміру. Для цього існує окремий

механізм, званий динамічним виділенням пам'яті.

ОДНОВИМІРНІ МАСИВИ

У мові С індекс завжди починається з нуля. Коли ми говоримо про перший

елемент масиву, то маємо на увазі елемент з індексом 0. Еслі ми оголосили

масив

int a[100] ;

це означає, що масив містить 100 елементів від а[0] до а[99]. Для

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

цей масив:

кільк.байтів=*.

У мові С під масив завжди виділяється безперервне місце в оперативній

пам'яті.

У мові С не перевіряється вихід індексу за межі масиву. Якщо масив

а[100] описаний як цілочисельний масив, що має 100 елементів, а ви в

програмі вкажете а[200], то повідомлення про помилку не буде видане, а як

значення елемента а[200] буде видано деяке число, що займає відповідні 2

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

unsigned arr[40], long double al[1000], char ch[80].

|/*поміняти місцями max з min*/ |// Сортування і програвання масиву |

|#include main() |#include #include |

|{ int i,j,a[10], max. nmax, min, |#'\ nclude void main() { int |

|nmin, temp; clrscr(); for (i=0; imax) { max=a[i]; nmax=i;} |(a[i]>a[j]) { temp=a[i]; a[i]=a[j]; |

|else if(a[i] void main () ввели: Hello! Good luck! |

|Good |Результат: Hello! Good luck!|

Виведення виробляється функціями printf() або puts(). Обидві функції

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

кінці рядка, що виводиться символ нового рядка. У функції printf()

перехід на новий рядок треба передбачати в рядку формату самим.

ФУНКЦІЇ ДЛЯ РОБОТИ З РЯДКАМИ

Для роботи з рядками існує спеціальна бібліотека, опис якої

знаходиться в файлі string.h. Найчастіше використовуються функції

strcpyO, strcat(), strlenQ, strcmpO.

Виклик функції strcpy() має вигляд

strcpy(si, s2) ;

Функція strcpy() використовується для копіювання вмісту рядка s2 в

рядок s1. Масив s1 повинен бути досить великим, щоб в нього вмістився

рядок s2. Якщо місця мало, компілятор не видає вказівки на помилку або

попередження; це не перерве виконання програми, але може привести до

псування інших даних або самої програми і неправильній роботі програми

надалі. Виклик функції strcat() має вигляд

strcat(sl, s2) ;

Функція strcat() приєднує рядок s2 до рядка s1 і вміщує його в масив, де

знаходився рядок s1, при цьому рядок s2 не змінюється. Нульовий байт,

який завершував рядок s1, буде замінений першим символом рядка s2. їв

функції strcpyO, і в функції strcat() рядок, що виходить, автоматично

завершується нульовим байтом.

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

Резул ьтат:

Hello, World!

Hello, World! World!

#include

#і ncl ude

main () {

char s1[20], s2[20];

strcpy(s1 , "Hello, ");

strcpy(s2, "World!");

puts(s1);

puts(s2);

strcat(s1, s2);

puts(s1);

puts(s2);

}

Виклик функції strcmpO має вигляд

strcmp(sl, s2);

Функція strcmpO порівнює рядки si і s2 і повертає значення О, якщо рядки

однакові, тобто містять одне і те ж число однакових символів. Під

порівнянням рядків ми розуміємо порівняння в лексикографічному значенні,

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

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

одного рядка порівнюється з кодом символа другого рядка. Якщо вони

однакові, розглядаються другі символи тощо. Якщо зі лексикографічно (в

значенні словника) більше s2, то функція strcmpO повертає додатне значення,

якщо менше -від'ємне значення.

Виклик функції strlen() має вигляд

strlen(s) ;

Функція strlen() повертає довжину рядка з, при цьому завершальний

нульовий байт не враховується. Виклик length("Hello") поверне

значення 5.

Розглянемо застосування цієї функції для обчислення довжини рядка, що

вводиться з клавіатури.

#include

#incl ude m а і n () { char s(80], printf( "Введіть

рядок:");

gets(s);

printf( "Рядок\п%з\п має довжину %d символів \n", s, strlen(s)); }

ДВОВИМІРНІ МАСИВИ

Як ми вже зазначали, мова С допускає багатовимірні масиви, найпростішою

формою яких е двовимірний масив (two-dimentional array). Можна сказати, що

двовимірний масив - це масив одновимірних масивів .

Двовимірний масив int a[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] |

Перший індекс - номер рядка, другий індекс - номер стовпця. Кількість байт

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

Кільк.байтів = **.

У пам'яті комп'ютера масив розташовується безперервно по рядках, тобто

а[0][0], а[0][1], а[0][2], а[0][3], а[1][0], а[1][1], а[1] [2], а[2] [1],.

... а[2] [3] .

Потрібно пам'ятати, що пам'ять для всіх масивів, які визначені як

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

працює програма.

Часто двовимірні масиви використовуються для роботи з таблицями, що містять

текстову інформацію. Також дуже часто використовуються масиви рядків.

ІНІЦІАЛІЗАЦІЯ МАСИВІВ

Дуже важливо уміти ініціалізувати масиви, тобто привласнювати елементам

масиву деякі початкові значення. У мові С для цього є спеціальні

можливості. Самий простий спосіб ініціалізації наступний: в процесі

оголошення масиву можна указати в фігурних дужках список ініціалізаторів:

float а[6]={1.1, 2.2, 3.3, 4.0, 5, 6};

В іншому випадку така форма запису еквівалентна набору операторів:

а[0]=1.1; а[1]=2.2; ... а [5] =6.

Багатовимірні масиви, в тому числі і двовимірні масиви, можна

ініціалізувати, розглядаючи іх як масив масивів.

Ініціалізації int а[3][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

і int а[3][5]={{1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15}};

еквівалентні.

Кількість ініціалізаторів не зобов'язана співпадати з кількістю

елементів масиву. Якщо ініціалізаторів менше, то значення решти

елементів масиву не визначені.

У той же час ініціалізації

int а[3][5]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);

і

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

різні.

//change strings: 1-6, 2-5, 3-4

#i nclude

void mai n()

{ int temp, i, j, a[6][4]={1,2,3,4,

5,6,7,8,

9,10,11,12,

1 3,14,1 5,16,

17,18,19,20,

21 ,22,23,24};

for (i=0;i;

У цьому оголошенні тип - деякий тип мови С, визначальний тип об'єкта,

на який вказує покажчик (адреса якого містить); * - означає, що наступна за

нею змінна є покажчиком.

ОПЕРАЦІЇ НАД ПОКАЖЧИКАМИ

З покажчиками пов'язані дві спеціальні операції.: & і *. Обидві ці

операції є унарними, т. е. мають один операнд, перед якими вони ставляться.

Операція & відповідає операції "взяти адресу". Операція * відповідає

словам "значення, розташоване за вказаною адресою" .

Особливість мови С полягає в тому, що знак * відповідає двом операціям,

що не мають один до одного ніякого відношення: арифметичній операції

множення і операції взяти значення. У той же час сплутати їх в контексті

програми не можливо, оскільки одна з операцій унарна (містить один

операнд), інша - множення - бінарна (містить два операнди). Унарні

операції & і * мають найвищий пріоритет нарівні з унарним мінусом.

В оголошенні змінної, що є покажчиком, дуже важливий базовий тип. Якщо

покажчик має базовий тип int, то змінна займає 2 байти, char - 1 байт тощо.

Приклад.

int а=3, Ь=5;

int *р;

р = &а; /* тепер р вказує на а*/ Ь = *р; /* b тепер

дорівнює З*/ *р= 0; /*а тепер дорівнює О*/

&*а => а - розадресація.

Унарні оператори * і & мають більш високий пріоритет, ніж арифметичні

Страницы: 1, 2



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.