§ 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.3. Вывод массива по элементам.

3. Ввод значения k и вывод результата.

IV. Описание переменных:

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

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

Этапы выполнения задания

I. Исходные данные: массив s и количество учащихся n, номера фамилий – k1 и k2.

II. Результат: список заданных фамилий.

III. Алгоритм решения задачи.

Ввод исходных данных.
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. Тестирование: