Лабораторна робота № 20. Символьні масиви

Мета:

Здобути навики використання середовища розробки мови C++, познайомитися з символьними масивами, здобути навички написання програм.

Короткі теоретичні відомості до роботи.

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

Розглянемо програму, яка демонструє об’яву рядка і взаємодію з операцією cout<<.

//файл PART3\3_08.ccp

/* Символьні масиви-рядки і вивід cout<<. */

#include “c:\cpp\subprog\\roll.h”

#include “c:\cpp\subprog\\roll_txt.h”

typedef char STRING; //псевдонім char

typedef char * STRINGP; //псевдонім char *

main () {

char string[]=”first string”;

k=sizeof (string);

cout<< string

<<” по імені, розмір масиву string=”<<k<<end1;

for (i=0; i<k; i++) cout<< string[i];

cout<< “по елементне\n”<<end1;

char *string1P=”POINTER”;

cout<< string1P<<”по показнику string1P”;

char *string2P[]={“second string”};

cout<<”\n\n”<< *string2P<<” по імені з разименованням”;

char string3[]={“’t’, ‘h’, ‘i’, ‘r’, ‘d’, ‘ ‘, ‘s’, ‘t’, ‘r’, ‘i’, ‘n’, ‘g’, ‘\0’”};

I= sizeof (string3);

cout<<”\n\n”<<string3

<<” по імені, розмір масиву string3”<<I<<end1;

for (i=0; i<I; i++) cout<< string3[i];

cout<< “по елементне”;

STRING string4[]=”forth string”;

cout<<”\n\n”<< string4<<” по імені \n”;

m=4; cout<<”\n\n”<<string4[m]<<” елемент з індексом”<<m;

STRING *string5P[]={”fifth string”};

cout<<”\n\n”<< *string5P;

cout<<” по імені з разименованням”;

STRING string6P[]={”sixth string”};

cout<<”\n\n”<< *string6P;

cout<<” по імені з разименованням”;

m=3; cout<<(*string6P)[m]<<” елемент з індексом”<<m;

STRING string7P[]={”seventh “, “ string”};

cout<<”\n\n”<<string7P[0] <<string7P[1];

cout<<” по елементне\n”;

i=1; j=2; cout<<string7P[i][j]<<” елемент з індексом”<<i<<’,’<<j;

cout<<”\n\n”<<string //вивід рядка

<<’ ‘<<(void *) string; //вивід адреси

pause(0); return 0; }

На початку програми об’явлений без посередній фіксації розміру і ініціалізовний рядком масив

char string[]=”first string”;

Компілятор підраховує кількість символів у подвійних лапках (12) і додає ще один (службовий і невідомий): \0 – символ закінчення рядка, або нульовий, тому розмір масиву – 13. Комбінація \0 сприймається компілятором як один символ. При об’яві масиву з фіксованим розміром слід передбачити елемент для нульового символу. Нульовий символ використовується при програмуванні. Операція cout<< виводить масив string по імені, тобто по показнику.

Кожний елемент рядка може використовуватися самостійно, як змінна типу char, що ілюструється по елементним виводом масиву string у циклі. Вивід нульового символу ігнорується, але на його місце може бути виведений вміст буферу пам’яті.

Можна об’явити і ініціалізувати показник на рядок

char *string1P=”POINTER”;

і вивести рядок по показнику.

Далі об’явлений і ініціалізовний масив показників

char *string2P[]={“second string”};

Його можна вивести по імені з разименованням.

Масив char string3[] ініціалізовний по елементне, як звичайний масив символьних елементів, нульовий символ заданий явно. Масив виведений і по імені. І по елементне у циклі, причому нульовий символ проігнорований. Компілятор вивів черговий символ із буферу.

Для того, щоб у тексті програми рядкові масиви виділялися, скористуємося запропонованими методами в С++ при створенні псевдонімів для типів змінних з ключовим словом typedef.

typedef char STRING;

Цей вираз визначає, що в об’яві можна змінювати тип char на STRING. Далі рядковий масив можна об’являти таким чином:

STRING string4[ ]={”…”};

Об’ява масиву показників буде виглядати так:

STRING *string5[ ]={”…”};

Однак, для масиву показників теж доцільно вести псевдонім:

STRING string6P[ ]={”…”};

Усі три варіанти розглянуті у програмі.

Рядки можуть бути елементами масиву

STRING string7P[]={”seventh “, “ string”};

Кожний елемент зберігається в пам’яті, як рядки: “ seventh\0” і “string\0”, які завершуються нульовими символами. Технічне у масиві розміщені тільки показники на перший символ відповідного рядка. Доступ до окремих елементів самих рядків зберігається. Вивід нульового символу, як відзначено раніше, ігнорується.

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

Для виводу адреси рядка потрібно привести тип показника до типа void *. Це слід робити для будь-якого показника на змінну, коли потрібно вивести її адресу, так як операція cout<< у C++ за замовчуванням виводить самий рядок. Наприклад:

char *string= “test”;

cout << string //вивід рядка

<< ‘ ‘<<(void *) string; //вивід адреси

Ця операція зроблена для масиву string і string2P. У першому випадку виводиться масив по імені і адреса (показник). У другому – замість рядка виводиться адреса, тому що це масив символів, і ще раз адреса після (у даному випадку зайвого) приведення типу показника.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: