§ 17. Массивы и структуры как параметры функций

17.4. Массивы структур. Поиск в массиве структур

Пример 17.8. В текстовом файле input.txt хранится информация о студентах. Для каждого студента указана его фамилия, город, из которого он приехал (название города — одно слово), и три числа — баллы за ЦТ, с которыми он поступил в ВУЗ. Посчитать количество студентов, у которых сумма баллов больше x (вводится с клавиатуры). Вывести в текстовый файл с именем otchet.txt  фамилии и суммарный балл студентов из указанного города (вводится с клавиатуры).

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

I. Исходные данные: структура student с полями fam, gorod, otm (массив из трех элементов). Данные считываются в массив структур.

II. Результат: список студентов из указанного города в файле и количество студентов с суммарным баллом, большим x, на экране. Если поиск не дал результата, то вывод соответствующего сообщения.

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

1. Ввод исходных данных с помощью функции vvod. В структуру добавим поле summa, в которое будем записывать суммарный балл для каждого студента при считывании данных.
2. 
Создаем две функции — одну для поиска по баллам, другую для поиска по городу.

2.1. Функция для поиска по баллам find_ball возвращает в качестве результата число студентов. Если функция вернула значение 0, то таких студентов нет.
2.2. Функция для поиска по городу find_gorod возвращает логическое значение. Функция будет сразу записывать найденные фамилии в файл. Если хотя бы одна фамилия была записана, то функция вернет true, иначе false — нет студентов из указанного города. Для того чтобы суммарные баллы выводились в один столбец, в качестве разделителя будем использовать символ табуляции.

3. После вызова каждой функции проверим, был ли поиск успешным, и выведем соответствующее сообщение.

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

Передача параметров по ссылке позволяет переслать большие структуры или массивы с минимальной затратой ресурсов. Однако здесь также могут возникнуть другие проблемы. Ссылки позволяют функции изменять значения аргументов напрямую. Однако это может быть нежелательно, если нужно, чтобы аргумент был доступен только для чтения.

В таком случае можно использовать передачу параметра по константной ссылке. Константная ссылка — ссылка на переменную, значение которой невозможно изменить через эту же ссылку. Для того чтобы ссылка была константной, нужно добавить перед описанием ключевое слово const. Если использовать константную ссылку в качестве параметра функции, то функция не изменит аргумент. При попытке это сделать получим ошибку компиляции (пример 17.9)

Пример 17.8.

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

#include <iostream>

#include <fstream>

#include <string>

#include <windows.h>

#include <vector>

 

using namespace std;

 

struct student

{

  string fam, gorod;

  vector <int> otm = vector<int>(3);

  int summa;

};

 

void vvod (vector <student> &d)

{

  ifstream fin ("input.txt");

  int r;

  fin >> r;

  fin.ignore();

  d.resize(r);

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

    fin >> d[i].fam >> d[i].gorod;

    fin >> d[i].otm[0] >> d[i].otm[1]

        >> d[i].otm[2];

    d[i].summa = d[i].otm[0]+

    d[i].otm[1]+ d[i].otm[2];

  }

}

 

int find_ball(vector <student> &d, int z)

{

  int k = 0;

  for (int i = 0; i < d.size(); i++)

    if (d[i].summa > z)

      k++;

  return k;

}

int find_gorod(vector <student> &d, string g)

 {

  bool f = false;

  ofstream fout ("otchet.txt");

  for (int i = 0; i < d.size(); i++)

    if (d[i].gorod == g){

      fout << d[i].fam << '\t';

      fout << d[i].summa << endl;

      f = true;

   }

  return f;

 }

 

int main()

{

  SetConsoleCP(1251);

  SetConsoleOutputCP(1251);

  vector <student> a;

  vvod (a);

  ///поиск по баллу

  int x;

  cout << " x = ";

  cin >> x;

  int m = find_ball(a, x);

  if (m){

    cout << "всего " << m ;

    cout << " студентов с баллом";

    cout << " больше " << x <<endl;

  }

  else{

    cout << "нет студентов с баллом";

    cout << " больше " << x <<endl;

  }

  ///поиск по городу

  string gor;

  cout << "название города" << endl;

  cin >> gor;

  if (find_gorod(a, gor))

    cout << "фамилии в файле" << endl;

  else{

    cout << "нет студентов из ";

    cout << "города " << gor <<endl;

  }

  return 0;

}

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

.

Пример 17.9. Программа: