§ 11. Структурированный тип данных массив

11.5. Решение задач с использованием массивов

Операции, выполняемые с элементами массива, соответствуют операциям, которые выполняются над базовым типом элементов массива (пример 11.23).

Пример 11.24. Задан одномерный массив из целых чисел. Найти сумму и произведение элементов этого массива.

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

I. Исходные данные: массив a и количество элементов n.

II. Результат: sсумма элементов и p — произведение элементов массива.

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

1. Ввод исходных данных. Массив вводится поэлементно с клавиатуры. 
2. Определение начального значения для суммы (s = 0) и для произведения (p = 1).
3. В цикле добавляем очередной элемент массива к сумме и к произведению.
4. Вывод результата.

IV. Описание переменных: n, s, p — int, a – vector <int>.

Пример 11.25. Отметки по информатике за первую четверть для всех учащихся 10 Б класса записаны в текстовом файле (первое число в файле указывает количество учащихся). Успеваемость в классе будем считать хорошей, если средний балл больше 7, плохой — если средний балл ниже 4, в остальных случаях успеваемость средняя. Определить успеваемость класса по заданным отметкам.

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

I. Исходные данные: массив a для хранения отметок и количество учащихся n.

II. Результат — одно из слов: «хорошая», «средняя», «плохая» в зависимости от значения среднего балла.

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

1. Ввод исходных данных. Сначала вводим количество учащихся в классе, затем массив отметок.
2. Для определения успеваемости нужно вычислить средний балл (переменная sr). Средний балл определяется как сумма (переменная s) всех отметок, деленная на количество учащихся в классе. Начальное значение для суммы  – s = 0.
3. В цикле добавляем очередной элемент массива к сумме.
4. Делим полученную сумму на количество учащихся в классе.
5. Проверяем значение среднего балла и выводим результат.

IV. Описание переменных: n, s, p – int, sr – double, a – vector <int>.

Пример 11.26. Задано натуральное число n (1 < n < 5000). Определить, является ли это число простым.

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

I. Исходные данные: n — натуральное число.

II. Результат: вывод сообщения «простое» или «составное».

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

1. Ввод исходных данных. 
2. Известно, что число n является простым, если оно не делится ни на одно простое число, не большее чем . Максимальное число по условию — 5000, begin mathsize 16px style square root of 5000 space almost equal to space 70 comma 7107 end style. Создадим массив констант s_n из простых чисел, не больших 71. 
3. В цикле будем делить число n на каждое из чисел не больших  begin mathsize 16px style square root of straight n end style, хранящихся в массиве констант. Если число n не разделилось ни на одно из них, то число n — простое, иначе — составное. 
4. Проверяем, с каким условием закончил работу цикл: число является простым, если последний просмотренный элемент массива больше  begin mathsize 16px style square root of straight n end style (число ни на что не разделилось). 
5. Вывод результата.

IV. Описание переменных: n, — int, s_n – vector <int>.

Пример 11.23. Операции над базовым типом.

  • Если базовым типом элементов массива является тип int, то для элементов допустимы следующие операции: +, –, *, /, %.
  • Если в массиве хранятся числа типа double, то допустимыми будут операции +, –, *, /.
  • Если в массиве хранятся строки, то для каждого его элемента доступны строковые функции.

Пример 11.24.

V. Программа:

#include <iostream>

#include <vector>

 

using namespace std;

 

int main()

{

  int n;

  cout << "vvedi n=";

  cin >> n;

  vector <int> a(n);

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

    cin >> a[i];

  int s = 0;

  int p = 1;

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

    s += a[i];

    p *= a[i];

  }

  cout << "proizvedenie=" << p;

  cout << " summa=" << s << endl;

  return 0;

}

VI. Тестирование.

Пример 11.25.

V. Программа:

#include <iostream>

#include <fstream>

#include <vector>

 

using namespace std;

 

int main()

{

  ifstream fin("input.txt");

  setlocale(0, "");

  int n;

  fin >> n;

  vector <int> a(n);

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

    fin >> a[i];

  int s = 0;

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

    s += a[i];

  double sr = 1. * s / n;

  cout << "sr = " << sr << endl;

  if (sr > 7)

    cout << "хорошая" << endl;

  else

    if (sr < 4)

      cout << "плохая" << endl;

    else

      cout << "средняя" << endl;

  return 0;

}

VI. Тестирование.

Пример 11.26.

Условие s_n[i] <= sqrt(n) проверяется долго за счет вызова функции sqrt(n) и перехода к вычислениям с вещественным типом данных. Это условие обычно заменяют эквивалентным: s_n[i]*s_n[i] <= n.

V. Программа:

#include <iostream>

#include <vector>

 

using namespace std;

 

int main()

{

  vector <int> s_n = {2, 3, 5, 7, 11, 
  13, 17, 19, 23, 29, 31, 37, 41, 43, 
  47, 53, 59, 61, 67, 71};

  int n;

  cout << "n = ";

  cin >> n;

  int i = 0;

  while (s_n[i] * s_n[i] <= n

         && n % s_n[i])

    i++;

  if (s_n[i] * s_n[i] > n)

    cout << "prostoe" << endl;

  else

    cout << "sostavnoe" << endl;

  return 0;

}

VI. Тестирование.

Анализ результатов. Проверить правильность вычислений можно на калькуляторе или посмотреть в таблице простых чисел [1].


[1] Технические таблицы — http://tehtab.ru/guide/guidemathematics/guidemathematicsfigurestables/simplefigures/