Advertisement
Anton0093

Задание2

Nov 16th, 2020
677
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.48 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. struct Student {
  9.    
  10.     int key;  //ключ
  11.    
  12.     string firstName; //имя
  13.     string lastName; //фамилия
  14.     string patronymic; // отчество
  15.     string subject; //предмет
  16.     int assessmentForTheSubject; //оценка за предмет
  17.    
  18.     string to_string() { //вывод данных
  19.         return std::to_string(key) + " " + lastName + " " + firstName + " "
  20.         + patronymic + " " + subject + " " + std::to_string(assessmentForTheSubject);
  21.     }
  22. };
  23.  
  24.     vector<Student> students;  //создаем вектор где элементами являются студенты
  25.  
  26.     ifstream fin("/Users/antontamarov/Desktop/db.txt"); //входящий поток
  27.  
  28.  
  29. size_t split(const std::string &txt, std::vector<std::string> &strs, char ch){
  30.     size_t pos = txt.find( ch ); //присваиваем pos число на котором находится символ ch в тексте text
  31.     size_t initialPos = 0;
  32.     strs.clear(); // чистим
  33.    
  34.     while( pos != std::string::npos ) {
  35.         //кладем в вектор строк txt символ находящийся на след позициях
  36.         strs.push_back( txt.substr( initialPos, pos - initialPos ) );
  37.         initialPos = pos + 1;
  38.        
  39.         pos = txt.find( ch, initialPos ); //приравниваем к pos найденный элемент из txt
  40.     }
  41.     //кладем в вектор строк txt символ находящийся на след позициях
  42.     strs.push_back( txt.substr( initialPos, std::min( pos, txt.size() ) - initialPos + 1 ) );
  43.    
  44.     return strs.size();
  45. }
  46.  
  47. void getDB() {
  48.    
  49.     string str;
  50.     vector<string> vector; //создаем вектор, состоящий из строк
  51.     int index = 0;
  52.    
  53.     while (getline(fin, str)) { //пока строка записывается в файл выполняем:
  54.         split(str, vector, ' ');
  55.         students.push_back(Student());
  56.         students[index].key = atoi(vector[0].c_str()); //atoi переводит строчку в тип int
  57.         students[index].lastName = vector[1];
  58.         students[index].firstName = vector[2];
  59.         students[index].patronymic = vector[3];
  60.         students[index].subject = vector[4];
  61.         students[index].assessmentForTheSubject = atoi(vector[5].c_str());
  62.         index++;
  63.     }
  64.     fin.close();
  65. }
  66.  
  67. void writeString(string* str) {
  68.     cin >> (*str);
  69. }
  70.  
  71. void writeKey(int* key) {
  72.     while (!(cin >> (*key)))
  73.     {
  74.         cout <<"Ошибка!!! Введите число";
  75.         cin.clear();
  76.         cin.ignore(numeric_limits<streamsize>::max(), '\n');
  77.     }
  78. }
  79.  
  80. void writeAssessmentForTheSubject(int* assessmentForTheSubject) {
  81.     while (!(cin >> (*assessmentForTheSubject)) || ((*assessmentForTheSubject) < 2
  82.                                                     || (*assessmentForTheSubject) > 5)){
  83.         cout << "Оценка должна быть в диапазоне от 2 до 5: ";
  84.         cin.clear();
  85.         cin.ignore(numeric_limits<streamsize>::max(), '\n');
  86.     }
  87. }
  88.  
  89. void getStudentByKey() {
  90.     int key;
  91.     bool isEmpty = true;
  92.    
  93.     cout << "Введите ключ: ";
  94.         writeKey(&key);
  95.    
  96.     for (Student &student : students)
  97.     {
  98.         //смотрим одинаковые значения ключа
  99.         if(student.key == key) {
  100.             cout << student.to_string() << endl;
  101.             isEmpty = false; //обновляем empty если такой студент существует
  102.             break; //выходим
  103.         }
  104.     }
  105.    
  106.     if (isEmpty) cout << "Такого студента не существует" << endl;
  107. }
  108.  
  109. void getStudentBySameSubjectAndAssessmentForTheSubject() {
  110.    
  111.     int assessmentForTheSubject;
  112.     string subject;
  113.     bool isEmpty = true;
  114.    
  115.     cout << "Введите название предмета: ";
  116.         writeString(&subject);
  117.    
  118.     cout << "Введите оценку: ";
  119.         writeAssessmentForTheSubject(&assessmentForTheSubject);
  120.    
  121.     for (Student &student : students)
  122.     {
  123.         //смотрим одинаковые значения предмета и оценки
  124.         if(student.subject == subject &&student.assessmentForTheSubject == assessmentForTheSubject) {
  125.             cout << student.to_string() << endl;
  126.             isEmpty = false;
  127.             break;
  128.         }
  129.     }
  130.     if (isEmpty) cout << "Таких студентов не существует" << endl;
  131. }
  132.  
  133. void menu() {
  134.     cout << "\nВыбирете пукт меню: \n\n";
  135.     cout << "[1] Получить запись по ключу\n" << endl;
  136.     cout << "[2] Вывод всех записей с одинаковым значением полей «Предмет», «Оценка за год»\n" << endl;
  137.  
  138. }
  139.  
  140. int main() {
  141.    
  142.     setlocale(LC_ALL, "Russian");
  143.     int key = 0;
  144.    
  145.     getDB();
  146.    
  147.     while(key !=2) {
  148.        
  149.         menu();
  150.         writeKey(&key);
  151.        
  152.         switch (key)
  153.         {
  154.             case 1:
  155.                 getStudentByKey();
  156.                 break;
  157.             case 2:
  158.                 getStudentBySameSubjectAndAssessmentForTheSubject();
  159.                 break;
  160.             default:
  161.                 cout << "Такого пункта меню нет";
  162.                 break;
  163.         }
  164.     }
  165.     return 0;
  166. }
  167.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement