Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы.doc
Скачиваний:
59
Добавлен:
07.03.2016
Размер:
3.6 Mб
Скачать

8.5. Символьні масиви

Рядкових змінних у C++ немає, для цього використовуються масиви символів (символьні масиви) Символом кінця рядку є символ ASCII-нуля, '\0'.

Припустимо необхідно зберегти ім’я людини, вік, зарплату. Числові змінні віку та зарплати оголошуються наступним чином:

int age;

float salary;

Рядкова змінна не має місця, але можна створити масив символів:

char name[15];

У пам’яті резервується місце під масив, який складається з 15 символів.

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

char name[6] = "Маша";

У пам’яті ЕОМ:

[0]

М

[1]

А

[2]

Ш

[3]

А

[4]

\0

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

name[0] = 'П';

У пам’яті ЕОМ:

[0]

П

[1]

А

[2]

Ш

[3]

А

[4]

\0

При виведенні результату можна зазначити тільки ім’я рядку:

cout<<name; //Результат: Паша

Можна оголосити масив символів наступним чином:

char cc[] = {'a', 'b', 'c'};

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

char bb = cc[1]; // Змінній bb привласнено

// значення 'b'

cout<<сс;

ПОМИЛКА! Наприкінці ланцюжка символів немає ASCII-нуля, виведення відбуватиметься доти, поки не зустрінеться '\0'.

Програма помилкова.

void main()

{

char name[20];

name = "Петя"; //Не можна імені масиву

//привласнити значення, що

//можливо тільки при

//оголошенні.

}

Для ініціалізації масиву існує 5 основних засобів. 3 з них ініціалізуються під час оголошення.

#include <iostream>

using namespace std;

void main()

{

// 1-й засіб

char f1[] = "Привіт";

// 2-й засіб

char f2[7] = "Привіт";

// 3-й засіб

char f3[] = {'П','р','и','в','і','т','\0'};

// 4-й засіб

char f4[7];

//використання бібліотечної функції

strcpy(f4, "Привіт");

// 5-й засіб

char f5[7];

f5[0]= 'П';

f5[1]= 'р';

f5[2]= 'и';

f5[3]= 'в';

f5[4]= 'і';

f5[5]= 'т';

f5[6]= '\0';

}

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

Приклад:

char nam[]={'T','e','d','\0','E','v','a','\0',

'S','a','m','\0'};

Номер елемента

Значення

[0]

T

[1]

Е

[2]

D

[3]

\0

[4]

E

[5]

V

[6]

A

[7]

\0

[8]

S

[9]

A

[10]

M

[11]

\0

cout <<nam; //Надрукує Ted

cout <<nam+4; //Надрукує Eva

cout <<nam+8; //Надрукує Sam

Використання вказівок на символи.

Розглянемо 2 рядки:

char cara[]="Привіт";

char *cp = "Москва";

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

cara = "Привіт"; //Невірно

cp = "Київ"; //Можна: занесення у вказівку

//нового рядка.

Приклад:

#include <iostream>

using namespace std;

void main()

{

char name[20] = "Іван Петров";

char *t = name;

strcpy(t+5,"Сидоров");

cout <<t; //Іван Сидоров

}

Запам’ятовування масивів рядків.

char names[5][20]=

{

{"Наташа"},

{"Георгій"},

{"Ан"},

{"Оля"},

{"Льоша"}

};

Таблиця займає в пам’яті багато місця. Нераціонально використовується пам’ять.

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

1-й варіант

2-й варіант

char *names[5]=

{

{"Наташа"},

{"Георгій"},

{"Ан"},

{"Оля"},

{"Льоша"}

};

char *names[]=

{

"Наташа",

"Георгій",

"Ан",

"Оля",

"Льоша"

};

Рядки можуть знаходитися в будь-якому масиві пам’яті

[0]

Наташа\0

[1]

Георгій\0

[2]

Ан\0

[3]

Оля\0

[4]

Льоша\0

cout << *names; //Друкує Наташа

cout << *(names+1); //Георгій

Робота з вказівками на рядки набагато ефективніше, ніж з самими рядками. Наприклад, сортування рядків за допомогою масиву вказівок виконується швидше. Під час сортування змінюються тільки вказівки, а не вміст рядків.

Приклад:

При запровадженні чисел від 1 до 7 на екран виводиться день тижня

#include <iostream>

using namespace std;

void main()

{

char *dn[]=

{

"Понеділок",

"Вівторок",

"Середа",

"Четвер",

"П’ятниця",

"Субота",

"Неділя"

};

int day_num;

do

{

cout <<"Введіть день тижня(1-7) ";

cin >> day_num;

}

while ((day_num < 1)||(day_num > 7));

cout << *(day_num - 1 + dn) << "\n";

}