§ 11. Структураваны тып даных масіў

11.4. Увод і вывад элементаў масіву

Для таго каб працаваць з масівам, неабходна задаць пачатковыя значэнні элементаў масіву. Зрабіць гэта можна некалькімі спосабамі:

1) вызначэнне элементаў масіву як канстант;

2) увод элементаў масіву з клавіятуры;

3) выкарыстанне выпадковых лікаў для вызначэння значэнняў;

4) выкарыстанне функцый (уласных ці стандартных) для вызначэння значэнняў;

5) увод элементаў масіву з тэкставага файла.

Элементам масіву можна задаць значэнні пры апісанні (прыклады 11.11, 11.12). У гэтым выпадку колькасць элементаў не задаецца, а вызначаецца аўтаматычна.

Пры ўводзе элементаў масіву з клавіятуры кожны элемент павінен уводзіцца асобна. Калі колькасць элементаў, што ўводзяцца, вызначана, то можна выкарыстаць цыкл for (прыклад 11.13).

Пры апісанні вектара яго памер можа быць зададзены пераменнай. Важна, каб значэнне гэтай пераменнай было вызначана да апісання вектара. Гэта значэнне можа быць зададзена з дапамогай каманды прысвойвання ці ўведзена з клавіятуры (прыклад 11.14).

Пры ўводзе радкоў трэба памятаць, што  прабел выкарыстоўваецца як раздзяляльнік. Калі выкарыстоўваць для ўводу каманду cin, то элементамі масіву могуць быць толькі асобныя словы радка (прыклад 11.15). Калі трэба, каб элементамі масіву былі радкі з прабеламі, то для ўводу неабходна каманда getline (прыклад 11.16).

Часам бывае зручна задаваць элементы масіву выпадковым чынам. Для гэтага выкарыстоўваецца функцыя rand(), якая генеруе выпадковы цэлы лік з прамежку [0; 32768). Калі элементы масіву павінны належаць адрэзку [a; b], то можна вызначыць значэнне элемента масіву як a[i]= rand() % (b – a + 1) + a; (прыклад 11.17).

Рэчыўны выпадковы лік у прамежку [0, 32.768) можна атрымаць так: a[i]= 1. * rand() / 1000;

Выводзіць элементы масіву можна ў радок (прыклад 11.18) ці ў слупок (прыклад 11.19). Калі элементы масіву выводзяцца ў радок, то паміж імі трэба выводзіць знак-раздзяляльнік (часцей за ўсё выкарыстоўваюць прабел), інакш усе лікі будуць раздрукаваны запар як адзін лік з вялікай колькасцю лічбаў. Выводзіць элементы масіву можна не толькі ў прамым парадку, але і ў адваротным (прыклад 11.20).

Прыклад 11.21. Напісаць праграму, якая сфарміруе масіў з n цотных лікаў з адрэзка [20, 70] выпадковым чынам. Запісаць лікі з масіву ў тэкставы файл. Вывесці на экран k-ы элемент масіву.

Этапы выканання задання

I. Зыходныя даныя: колькасць элементаў n і масіў a.

II. Вынік: шуканы элемент.

III. Алгарытм рашэння задачы.

1. Увод зыходных даных.
2. Генерацыя масіву.

2.1. Для таго каб элементы масіву былі толькі цотнымі, неабходна кожны атрыманы элемент памнажаць на 2. 
2.2. Паколькі элементы памнажаюцца на два, межы зыходнага адрэзка трэба паменшыць у 2 разы.
2.3. Вывад масіву па элементах.

3. Увод значэння k і вывад выніку.

IV. Апісанне пераменных:

n, k – int, a – vector <int>.

Прыклад 11.22. Напісаць праграму, якая прачытае з тэкставага файла спіс прозвішчаў навучэнцаў, запіша іх у масіў і выведзе са спіса прозвішчы з нумарамі ад k1 да k2.

Этапы выканання задання

I. Зыходныя даныя: масіў s і колькасць навучэнцаў n, нумара прозвішчаў  k1 і k2.

II. Вынік: спіс зададзеных прозвішчаў.

III. Алгарытм рашэння задачы.

1. Увод зыходных даных.
2. Вывад выніку
.

IV. Апісанне пераменных:

n, k1, k2 – int, a – vector <string>.

Калі для тэсціравання праграмы выкарыстоўваюцца прозвішчы, напісаныя кірыліцай, то важна захаваць тэкставы файл у той жа кадзіроўцы, якая ўстанаўліваецца для кансолі. Па змоўчанні для Блокнота можа быць устаноўлена кадзіроўка UTF-8.

Прыклад 11.11. Апісанне лікавага масіву, элементы якога з’яўляюцца канстантамі. 

vector <int> simple_numb = {2, 3, 5, 7, 11};

Прыклад 11.12. Апісанне масіву, элементы якога з’яўляюцца радковымі канстантамі.

vector <string> c_rgb = {"red", "green", "blue"};

 Прыклад 11.13. Увесці элементы масіву a з клавіятуры.

vector <int> a(10);

cout << "vvedi 10 chisel" << endl;

 for (int i = 0; i < 10; i++)

  cin >> a[i];

 Прыклад 11.14. Увесці зададзеную колькасць элементаў масіву a.

int n;

cout << "kol-vo chisel" << endl;

cin >> n;

vector <int> a(n);

cout << "vvedi chisla" << endl;

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

  cin >> a[i];

Прыклад 11.15. Увод масіву радкоў (без прабелаў):

int n;

cout << "kol-vo elementov" << endl;

cin >> n;

vector <string> s(n);

cout << "vvedi slova " << endl;

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

  cin >> s[i];

Прыклад 11.16. Увод масіву радкоў (з прабеламі): 

int n;

cout << "kol-vo elementov" << endl;

cin >> n;

cin.ignore();

vector <string> s(n);

cout << "vvedi stroki" << endl;

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

  getline (cin,  s[i]);

Прыклад 11.17. Выпадковым чынам задаць n элементаў масіву А. Кожны элемент — лік з адрэзка [-20; 20].

int n;

cout << "kol-vo elementov" << endl;

cin >> n;

vector <int> a(n);

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

  a[i] = rand() % 41 - 20; 

 Прыклад 11.18. Вывад элементаў масіву ў радок (праз прабел):

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

  cout << a[i] << " "; 

cout << endl;

Калі элементы масіву задаюцца выпадковым чынам, то пасля генерацыі іх трэба вывесці. Гэта неабходна для праверкі правільнасці работы, інакш незразумела, з якімі данымі працуе праграма.

Прыклад 11.19. Вывад элементаў масіву ў слупок (па адным у радку):

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

  cout << a[i] << endl;

Прыклад 11.20. Вывад элементаў масіву ў радок (у адваротным парадку):

for (int i = n - 1; i >= 0; i--)

  cout << a[i] << " ";

cout << endl;

Прыклад 11.21.

V. Праграма:

#include <iostream>

#include <fstream>

#include <vector>

#include <ctime>

#include <cstdlib>

 

using namespace std;

 

int main()

{

  srand(time(NULL));

  int n;

  cout << "n = ";

  cin >> n;

  vector <int> a(n);

  ofstream fout("output.txt");

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

    a[i] = 2 * (rand() % 26 + 10);

    fout << a[i] << " ";

  }

  int k;

  cout << "k = ";

  cin >> k;

  cout << a[k];

  return 0;

}

VI.Тэсціраванне:

Прыклад 11.22.

V. Праграма:

#include <iostream>

#include <fstream>

#include <vector>

#include <windows.h>

 

using namespace std;

 

int main()

{

  SetConsoleCP(1251);

  SetConsoleOutputCP(1251);

  ifstream fin("input.txt");

  int n;

  fin >> n;

  fin.ignore();

  vector <string> s(n);

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

    fin >> s[i];

  int k1, k2;

  cout << "k1 = ";

  cin >> k1;

  cout << "k2 = ";

  cin >> k2;

  for (int i = k1; i <= k2; i++)

    cout << s[i] << endl;

  return 0;

}


VI. Тэсціраванне: