| 
  Пример 12.8. На складе хранятся пустые ящики для упаковки товара. Известно, что вместимость одного пакета с конфетами x кг. Какова суммарная масса пакетов с конфетами, которые можно упаковать в такие ящики, заполнив ящик целиком? 
Этапы выполнения задания 
I. Исходные данные: массив а, количество чисел n, число x. 
II. Результат: количество ящиков — k, суммарная масса — s. 
III. Алгоритм решения задачи. 
1. Ввод исходных данных.  2. Инициализация счетчика и значения суммы:  k = 0; s = 0;  3. Просматривая массив, проверим, является ли текущий элемент числом, кратным x (в этом случае ящик будет заполнен целиком). Если кратен, то  увеличим счетчик k на 1, а переменную s — на значение найденного элемента массива.  4.  Вывод результата. 
IV. Описание переменных: n, x, k — int, a – vector <int>. 
 Пример 12.9. Имеется список мальчиков 10 В класса и результаты их бега на 100 м. Для сдачи норматива необходимо пробежать дистанцию не более чем за 16 с. Вывести фамилии учащихся, которые не выполнили норматив по бегу. Сколько таких учащихся в классе? Исходные данные хранятся в текстовом файле input.txt. Результат вывести в текстовый файл output.txt. 
Этапы выполнения задания 
Исходные данные: массивы fam (фамилии учащихся) и r (результаты бега в секундах), количество учащихся n. 
II. Результат: фамилии тех учащихся, которые не выполнили норматив по бегу. 
III. Алгоритм решения задачи. 
1. Ввод исходных данных.  2. Инициализация счетчика: k = 0;  3. Будем просматривать массив с результатами и проверять, является ли текущий элемент числом, большим 16 (норматив не сдан). Если такое значение найдено, то выведем элемент массива fam с соответствующим номером и увеличим значение счетчика на 1.  4. Вывод значения счетчика. 
IV. Описание переменных:   n, k – int, r – vector <double>,  fam – vector <string>. 
Пример 12.10. В двух линейных массивах x и y, заданных случайным образом, хранятся координаты точек плоскости (–200 ≤ x[i], y[i] ≤ 200). Определить, каких точек больше — лежащих внутри или снаружи области, ограниченной окружностью радиуса r, с центром в начале координат (будем считать, что точки, лежащие на окружности, лежат внутри области). 
Этапы выполнения задания 
I. Исходные данные: x, y — массивы чисел, r — радиус окружности, n — количество точек. 
II. Результат — одно из сообщений: «внутри точек больше», «снаружи точек больше» или «точек поровну». 
III. Алгоритм решения задачи. 
1. Ввод исходных данных.  2. Инициализация счетчиков: k1 = 0; k2 = 0;  3. Будем просматривать все точки и для каждой проверять принадлежность области. Если x2 + y2 ≤ R2, то точка лежит внутри области, тогда увеличим значение счетчика k1 на 1, если нет, то увеличим на 1 значение счетчика k2.  4. Сравним значения k1 и k2 и выведем результат. 
IV. Описание переменных: n, k1, k2 — int, x, y – vector <int>. 
Пример 12.11. Задан одномерный массив из n целых чисел. Определить количества элементов, которые являются числами Смита. Вывести те элементы, которые являются числами Смита. (Число Смита — такое составное число, сумма цифр которого равна сумме цифр всех его простых сомножителей.) Например, числом Смита является 202 = 2  × 101, поскольку 2 + 0 + 2 = 4 и 2 + 1 + 0 + 1 = 4. 
Этапы выполнения задания 
I. Исходные данные: а — массив чисел, n — количество чисел в массиве. 
II. Результат: числа Смита и их количество в массиве. 
III. Алгоритм решения задачи. 
1. Ввод исходных данных.  2. Инициализация счетчика: k = 0;  3. Будем просматривать каждый элемент массива и определять, является ли он числом Смита. Для проверки создадим функцию check, которая будет получать в качестве параметра элемент массива, а также возвращать значение true, если число является числом Смита, и false в противном случае. 
3.1. Найдем сумму цифр числа. 3.2. Будем разлагать число на простые множители и для каждого множителя находить сумму цифр.  3.3. Для разложения числа на простые множители будем делить его сначала на 2 (пока делится), затем на 3. На 4 число уже делиться не будет, будем делить на 5 и т. д. Закончится разложение тогда, когда после всех делений число станет равным 1. 
4. Также нам понадобится функция sum, которая для числа будет возвращать его сумму цифр. 
  
IV. Описание переменных:  n, k – int, a – vector <int>. 
Пример 12.12. Задан одномерный массив из n строк. Данные в массиве читаются из текстового файла input.txt. Каждая строка является предложением из слов, разделенных пробелами. Найти и вывести в текстовый файл output.txt те предложения, в которых нечетное количество слов. Сколько предложений вывели? 
Этапы выполнения задания 
I. Исходные данные: а — массив строк, n — количество строк в массиве. 
II. Результат: искомые строки и их количество. 
III. Алгоритм решения задачи. 
1. Ввод исходных данных.  2. Инициализация счетчика: k = 0;  3. Будем просматривать каждую строку и определять, сколько в ней слов. Для проверки создадим функцию check, которая будет получать в качестве параметра элемент массива и возвращать количество слов в строке. Если количество слов является нечетным числом, то выведем строку и увеличим значение счетчика. 
3.1. Перед каждым словом предложения, кроме первого, стоит пробел. Слово начинается с символа, который пробелом не является.  3.2. Добавим пробел перед первым словом, тогда количество слов будет определяться количеством сочетаний пар символов: пробел и не пробел. 
IV. Описание переменных:  n, k – int, а – vector <string>. | 
Пример 12.8. 
V. Программа: 
| 
 #include <iostream> 
#include <vector> 
  
using namespace std; 
  
int main() 
{ 
  setlocale(0,""); 
  int n; 
  cout << "n = "; 
  cin >> n; 
  vector <int> a(n); 
  for (int i = 0; i < n; i++) 
    cin >> a[i]; 
  int x; 
  cout << "масса конфет "; 
  cin >> x; 
  int s = 0, k = 0; 
  for (int i = 0; i < n; i++) 
    if (a[i] % x == 0){ 
      k++; 
      s += a[i]; 
    } 
  cout << "упаковали " << k; 
  cout << " ящиков, масса "; 
  cout << s << " кг" << endl; 
  return 0; 
} 
 | 
 
 
VI. Тестирование. 
  
VII. Анализ результатов. Ящики, удовлетворяющие условию задачи, имеют массу 15, 25, 10, 20, 45. 
Пример 12.9. 
V. Программа: 
| 
 #include <iostream> 
#include <fstream> 
#include <vector> 
#include <string> 
  
using namespace std; 
  
int main() 
{ 
  ifstream fin ("input.txt"); 
  ofstream fout ("output.txt"); 
  int n; 
  fin >> n; 
  fin.ignore (); 
  
  vector <string> fam(n); 
  vector <double> r(n); 
  for (int i = 0; i < n; i++) 
    fin >> fam[i] >> r[i]; 
  int k = 0; 
  for (int i = 0; i < n; i++) 
    if (r[i] > 16){ 
      fout << fam[i] << endl; 
      k ++; 
    } 
  fout << "не сдали норматив "; 
  fout << k << " учащихся" << endl; 
  return 0; 
} 
 | 
 
 
VI. Тестирование. 
   
  
VII. Анализ результатов. Результат Сидорова 21, а Королева 16.1, что превышает норматив. 
Пример 12.10. 
V. Программа: 
| 
 #include <iostream> 
#include <vector> 
#include <ctime> 
#include <cstdio> 
  
using namespace std; 
  
int main() 
{ 
  srand(time(NULL)); 
  int n, r; 
  cout << "n = "; 
  cin >> n; 
  cout << "r = "; 
  cin >> r; 
  vector <int> x(n), y(n); 
  for (int i = 0; i < n; i++){ 
    x[i] = rand() % 401 - 200; 
    y[i] = rand() % 401 - 200; 
  } 
  int k1 = 0, k2 = 0; 
  for (int i = 0; i < n; i++) 
    if (x[i] * x[i] + y[i] * y[i]           <= r * r) 
      k1++; 
    else 
      k2++; 
  if (k1 > k2) 
    cout << "vnutri"; 
  else 
    if (k1 < k2) 
      cout << "snarugi"; 
    else 
      cout << "porovnu"; 
  cout << endl; 
  return 0; 
} | 
 
 
VI. Тестирование. 
  
  
VII. Анализ результатов. По сообщениям, которые выдает программа, сложно судить о ее правильности. Для проверки можно вывести значения координат каждой точки в файл и при проверке ставить дополнительные пометки. Например, «+», если точка внутри, и «-», если снаружи. 
Пример 12.11. 
V. Программа: 
| 
 #include <iostream> 
#include <vector> 
  
using namespace std; 
  
int sum(int x) 
{ 
  int s = 0; 
  while (x >0){ 
    s += x % 10; 
    x /= 10; 
  } 
  return s; 
} 
  
bool check(int x) 
{ 
  int s1 = sum(x); 
  int s2 = 0; 
  int d = 2; 
  //разложение на простые множители 
  while (x != 1){ 
    while (x % d == 0){ 
      s2 += sum(d); 
      x /= d; 
    } 
    d++; 
  } 
  return (s1 == s2); 
} 
  
int main() 
{ 
  int n; 
  cout << "n = "; 
  cin >> n; 
  vector <int> a(n); 
  for (int i = 0; i < n; i++) 
    cin >> a[i]; 
  int k = 0; 
  for (int i = 0; i < n; i++) 
    if (check(a[i])){ 
      k++; 
      cout << a[i] << " "; 
  } 
  cout << endl << "vsego " << k; 
  cout << " chisel Smita" << endl; 
  return 0; 
} | 
 
 
VI. Тестирование. 
  
  
Пример 12.12. 
V. Программа: 
| 
 #include <iostream> 
#include <fstream> 
#include <vector> 
#include <string> 
#include <windows.h> 
  
using namespace std; 
using namespace std::__cxx11; 
  
int check(string x) 
{ 
  int k = 0; 
  x = " " + x; 
  int len = x.length(); 
  for (int i = 0; i < len - 1; i++) 
    if (x[i] == ' ' && x[i + 1] != ' ') 
      k++; 
  return k; 
} 
  
int main() 
{ 
  SetConsoleCP(1251); 
  SetConsoleOutputCP(1251); 
  ifstream fin("input.txt"); 
  ofstream fout("output.txt"); 
  int n; 
  fin >> n; 
  fin.ignore(); 
  vector <string> a(n); 
  for (int i = 0; i < n; i++) 
    getline(fin, a[i]); 
  int k = 0; 
  for (int i = 0; i < n; i++) 
    if (check(a[i]) % 2){ 
      fout << a[i] << endl; 
      k++; 
    } 
  fout << "Всего - " << k; 
  fout << " строк(–а, –u)" << endl; 
  return 0; 
} | 
 
 
VI. Тестирование. 
   
  
 
 |