§ 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 — няма студэнтаў з названага горада. Для таго каб сумарныя балы выводзіліся ў адзін слупок, у якасці раздзяляльніка будзем выкарыстоўваць сімвал табуляцыі.

  1. Пасля выкліку кожнай функцыі праверым, ці быў пошук паспяховым, і выведзем адпаведнае паведамленне.

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. Праграма: