Advertisement
Guest User

Untitled

a guest
Jun 29th, 2016
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 19.15 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3. #include <time.h>
  4.  
  5. // доделал класс студента, спасибо за подсказку
  6.  
  7. /*Реализовать класс Group, который работает с разреженным массивом
  8. студентов (Student**). Обязательные поля: указатель на массив
  9. студентов, количество человек в группе, название группы,
  10. специализация группы, номер курса. Обязательные методы:
  11. конструктор по умолчанию (пустая группа), конструктор с одним
  12. параметром типа unsigned int (задаётся произвольное количество
  13. студентов - предусмотреть автоматическую генерацию фамилий, имён,
  14. возрастов и других данных), конструктор с параметром типа Group
  15. (создаётся точная копия группы). Реализовать следующие методы:
  16. показ всех студентов группы (сначала - название и специализация
  17. группы, затем - порядковые номера, фамилии в алфавитном порядке и
  18. имена студентов). Сделать методы добавления студента в группу,
  19. редактирования данных о студенте и группе, слияния двух групп,
  20. перевода студента из одной группы в другую, отчисления всех не
  21. сдавших сессию студентов, отчисления одного самого неуспевающего
  22. студента.*/
  23.  
  24. class Student
  25. {
  26. char* name;
  27. char* surname;
  28. char* patronymic;
  29. char* adress;
  30. char* phone;
  31. int* marks = nullptr;
  32. int totalMarks = 0;
  33. int* coursework = nullptr;
  34. int totalCoursework = 0;
  35. int* exam = nullptr;
  36. int totalExam = 0;
  37. int rating = 0;
  38. int age;
  39. public:
  40. Student(char* name, char* surname, char* patronymic)
  41. {
  42. SetAll(name, surname, patronymic);
  43. }
  44. Student(char* name, char* surname, char* patronymic, int age)
  45. {
  46. SetAll(name, surname, patronymic, age);
  47. }
  48. Student(char* name, char* surname, char* patronymic, int age, char* adress)
  49. {
  50. SetAll(name, surname, patronymic, age, adress);
  51. }
  52. Student(char* name, char* surname, char* patronymic, int age, char* adress, char* phone)
  53. {
  54. SetAll(name, surname, patronymic, age, adress, phone);
  55. }
  56. ~Student()
  57. {
  58. delete[]name;
  59. delete[]surname;
  60. delete[]patronymic;
  61. delete[]adress;
  62. delete[]phone;
  63. delete[]marks;
  64. delete[]coursework;
  65. delete[]exam;
  66.  
  67. }
  68. Student(const Student& original)
  69. {
  70. SetAll(original.name, original.surname, original.patronymic, original.age, original.adress, original.phone);
  71. delete[]marks;
  72. marks=CopyMarks(original.marks, original.totalMarks);
  73. delete[]coursework;
  74. coursework=CopyMarks(original.coursework, original.totalCoursework);
  75. delete[]exam;
  76. exam=CopyMarks(original.exam, original.totalExam);
  77.  
  78. totalMarks = original.totalMarks;
  79. totalCoursework = original.totalCoursework;
  80. totalExam = original.totalExam;
  81. rating = original.rating;
  82.  
  83. }
  84.  
  85. void SetAdress(char* adress)
  86. {
  87.  
  88. if (strlen(adress) < 3) return;
  89.  
  90. delete[]this->adress;
  91.  
  92. this->adress = new char[strlen(adress) + 1];
  93. strcpy_s(this->adress, strlen(adress) + 1, adress);
  94. }
  95. void SetPhone(char* phone)
  96. {
  97.  
  98. if (strlen(phone) != 12) return;
  99.  
  100. delete[] this->phone;
  101. this->phone = new char[strlen(phone) + 1];
  102. strcpy_s(this->phone, strlen(phone) + 1, phone);
  103. }
  104. void SetMark(int value)
  105. {
  106. SetMARK(this->marks, value, totalMarks);
  107. }
  108. void SetCoursework(int value)
  109. {
  110. SetMARK(this->coursework, value, totalCoursework);
  111. }
  112. void SetExam(int value)
  113. {
  114. SetMARK(this->exam, value, totalExam);
  115. }
  116. void ReSetMark(int value, int pos)
  117. {
  118. if (pos<0 || pos>totalMarks || value < 1 || value>12) return;
  119. this->marks[pos] = value;
  120. ResetRating();
  121. }
  122. void ReSetCoursework(int value, int pos)
  123. {
  124. if (pos<0 || pos>totalCoursework || value < 1 || value>12) return;
  125. this->coursework[pos] = value;
  126. ResetRating();
  127. }
  128. void ReSetExam(int value, int pos)
  129. {
  130. if (pos<0 || pos>totalExam || value < 1 || value>12) return;
  131. this->exam[pos] = value;
  132. ResetRating();
  133. }
  134. void PrintState()
  135. {
  136. cout << "Name: " << name << endl
  137. << "Surname: " << surname << endl
  138. << "Patronymic: " << patronymic << endl
  139. << "Adress: " << adress << endl
  140. << "Phone: " << phone << endl
  141. << "Marks: ";
  142.  
  143. if (totalMarks > 0)
  144. {
  145. for (int i = 0; i < totalMarks; i++)
  146. {
  147. cout.width(3);
  148. cout << marks[i];
  149. }
  150. }
  151. cout << endl
  152. << "Courseworks: ";
  153.  
  154. if (totalCoursework > 0)
  155. {
  156. for (int i = 0; i < totalCoursework; i++)
  157. {
  158. cout.width(3);
  159. cout << coursework[i];
  160. }
  161. }
  162. cout << endl
  163. << "Exams: ";
  164. if (totalExam > 0)
  165. {
  166. for (int i = 0; i < totalExam; i++)
  167. {
  168. cout.width(3);
  169. cout << exam[i];
  170. }
  171. }
  172. cout << endl
  173. << "Rating: " << rating << endl;
  174. }
  175. void BirthDay()
  176. {
  177. this->age++;
  178. }
  179. const char* const GetName() const
  180. {
  181. return name;
  182. }
  183. const char* const GetSurname() const
  184. {
  185. return surname;
  186. }
  187. const char* const GetPatronymic() const
  188. {
  189. return patronymic;
  190. }
  191. const int const GetAge()const
  192. {
  193. return age;
  194. }
  195. const char* const GetAdress() const
  196. {
  197. return adress;
  198. }
  199. const char* const GetPhone() const
  200. {
  201. return phone;
  202. }
  203. int* GetMarksList()
  204. {
  205. int* temp;
  206. temp = CopyMarks(coursework, totalCoursework);
  207. return temp;
  208.  
  209. }
  210. int* GetCourseworkList()
  211. {
  212. int* temp;
  213. temp = CopyMarks(coursework, totalCoursework);
  214. return temp;
  215.  
  216. }
  217. int* GetExamList()
  218. {
  219. int* temp;
  220. temp = CopyMarks(exam, totalExam);
  221. return temp;
  222. }
  223. const int const GetRating()const
  224. {
  225. return rating;
  226. }
  227. const int const GetTotalMarks()const
  228. {
  229. return totalMarks;
  230. }
  231. const int const GetTotalCoursework()const
  232. {
  233. return totalCoursework;
  234. }
  235. const int const GetTotalExams()const
  236. {
  237. return totalExam;
  238. }
  239.  
  240.  
  241. private:
  242. //+1 :)
  243. void SetField(char*& field, char* value)
  244. {
  245. if (strlen(value) < 3) throw "error";
  246.  
  247. field = new char[strlen(value) + 1];
  248. strcpy_s(field, strlen(value) + 1, value);
  249. }
  250.  
  251. void SetAll(char*name, char*surname, char*patronymic, int age = 18, char*adress = "Unknown", char*phone = "Unknown")
  252. {
  253. SetField(this->name, name);
  254. SetField(this->surname, surname);
  255. SetField(this->patronymic, patronymic);
  256. SetField(this->adress, adress);
  257. SetField(this->phone, phone);
  258.  
  259. SetAge(age);
  260.  
  261.  
  262. }
  263. int* CopyMarks( const int* OriginalField, const int totalMarks)
  264. {
  265. int* field = new int[totalMarks];
  266. for (int i = 0; i < totalMarks; i++)
  267. field[i] = OriginalField[i];
  268. return field;
  269. }
  270. void SetMARK(int*& originalField, int value, int& totalmrks)
  271. {
  272. if (value < 1 || value>12) return;
  273.  
  274. int*temp = new int[totalmrks + 1];
  275. for (int i = 0; i < totalmrks; i++)
  276. temp[i] = originalField[i];
  277. temp[totalmrks] = value;
  278. totalmrks++;
  279. delete[]originalField;
  280. originalField = temp;
  281. ResetRating();
  282.  
  283. }
  284. void ResetRating()
  285. {
  286. int midmark = 0;
  287. int midcourseworks = 0;
  288. int midexams = 0;
  289.  
  290. if (totalMarks != 0)
  291. {
  292. for (int i = 0; i < totalMarks; i++)
  293. midmark += marks[i];
  294. midmark = midmark / totalMarks;
  295. }
  296.  
  297. if (totalCoursework != 0)
  298. {
  299. for (int i = 0; i < totalCoursework; i++)
  300. midcourseworks += coursework[i];
  301. midcourseworks = midcourseworks / totalCoursework;
  302. }
  303.  
  304. if (totalExam != 0)
  305. {
  306. for (int i = 0; i < totalExam; i++)
  307. midexams += exam[i];
  308. midexams = midexams / totalExam;
  309. }
  310. rating = ((midmark*0.2 + midcourseworks*0.3 + midexams*0.5) * 100) / 12;
  311.  
  312. }
  313. void SetAge(int age)
  314. {
  315. if (age < 15 || age>55) this->age = 18;
  316. else this->age = age;
  317. }
  318. };
  319.  
  320. class Group
  321. {
  322. Student** students = nullptr;
  323. unsigned int GroupSize = 0;
  324. char* GroupName = nullptr;
  325. char* Specialization = nullptr;
  326. int course;
  327.  
  328. public:
  329. Group()
  330. {
  331. SetGroupName("Unnamed");
  332. SetSpecialization("Unnamed");
  333. this->course = 0;
  334.  
  335. }
  336. Group(unsigned int size)
  337. {
  338.  
  339. SetGroupName("Test");
  340. SetSpecialization("Programmers");
  341. this->course = 1;
  342. RandomizeStudents(size);
  343. }
  344. Group(const Group& original)
  345. {
  346. SetGroupName(original.GroupName);
  347. SetSpecialization(original.Specialization);
  348. GroupSize = original.GroupSize;
  349. course = original.course;
  350. students = new Student*[original.GroupSize];
  351. for (int i = 0; i < original.GroupSize; i++)
  352. {
  353. students[i] = new Student(*original.students[i]);
  354.  
  355. }
  356. }
  357. ~Group()
  358. {
  359. delete[]GroupName;
  360. delete[]Specialization;
  361. for (int i = 0; i < GroupSize; i++)
  362. {
  363. // this->students[i]->~Student();
  364. delete students[i];
  365. }
  366. delete[] students;
  367.  
  368. }
  369. void AddStudent(char* name, char* surname, int age)
  370. {
  371. AddStudent(name, surname, "Unknown", age, "Unknown", "Unknown");
  372. }
  373. void AddStudent(char* name, char* surname, char* patronymic)
  374. {
  375. AddStudent(name, surname, patronymic, 18, "nullptr", "nullptr");
  376. }
  377. void AddStudent(char* name, char* surname, char* patronymic, int age)
  378. {
  379. AddStudent(name, surname, patronymic, age, "nullptr", "nullptr");
  380. }
  381. void AddStudent(char* name, char* surname, char* patronymic, int age, char* adress)
  382. {
  383. AddStudent(name, surname, patronymic, age, adress, "nullptr");
  384. }
  385. void AddStudent(char* name, char* surname, char* patronymic, int age, char* adress, char* phone)
  386. {
  387. Student** temp = new Student*[this->GroupSize + 1];
  388.  
  389. for (int i = 0; i < this->GroupSize; i++)
  390. temp[i] = this->students[i];
  391. temp[this->GroupSize] = new Student(name, surname, patronymic, age, adress, phone);
  392.  
  393. delete[]this->students;
  394. this->students = temp;
  395. this->GroupSize++;
  396. RestructGroup();
  397. }
  398.  
  399. void DeleteStudent(int pos)
  400. {
  401. pos = pos - 1;
  402. Student** temp = new Student*[this->GroupSize + 1];
  403. for (int i = 0; i < pos; i++)
  404. temp[i] = this->students[i];
  405. for (int i = pos+1; i < this->GroupSize; i++)
  406. {
  407. temp[i-1] = this->students[i];
  408. }
  409. delete[]this->students;
  410. this->students = temp;
  411. this->GroupSize--;
  412.  
  413. }
  414. void SetGroupName(char* GroupName)
  415. {
  416. if (strlen(GroupName) < 2) return;
  417. delete[]this->GroupName;
  418. this->GroupName = new char[strlen(GroupName) + 1];
  419. strcpy_s(this->GroupName, strlen(GroupName) + 1, GroupName);
  420.  
  421. }
  422. void SetSpecialization(char* Specialization)
  423. {
  424. if (strlen(Specialization) < 2) return;
  425. delete[]this->Specialization;
  426. this->Specialization = new char[strlen(Specialization) + 1];
  427. strcpy_s(this->Specialization, strlen(Specialization) + 1, Specialization);
  428. }
  429. void SetCourse(int course)
  430. {
  431. if (course < 1 || course>6) return;
  432. this->course = course;
  433. }
  434. const char* const GetGroupName() const
  435. {
  436. return this->GroupName;
  437. }
  438. const char* const GetSpecialization() const
  439. {
  440. return this->Specialization;
  441. }
  442. const int const GetCourse() const
  443. {
  444. return this->course;
  445. }
  446. const int const GetGroupSize() const
  447. {
  448. return this->GroupSize;
  449. }
  450. void PrintGroupState()
  451. {
  452. cout << "GroupName: " << GroupName << endl
  453. << "Specialization: " << Specialization << endl
  454. << "Course: " << course << endl;
  455. for (int i = 0; i < GroupSize; i++)
  456. {
  457. cout << i + 1 << ": " << students[i]->GetSurname() << ' '
  458. << students[i]->GetName() << ' '
  459. << " Rating:" << students[i]->GetRating() << endl;
  460. }
  461. cout << endl;
  462. }
  463. void SetALLMarks(bool randomize = false)
  464. {
  465. SetMARK(0, randomize);
  466. }
  467. void SetALLCoursework(bool randomize = false)
  468. {
  469. SetMARK(1, randomize);
  470. }
  471. void SetALLExam(bool randomize = false)
  472. {
  473. SetMARK(2, randomize);
  474. }
  475.  
  476. void PrintStudent(int pos)
  477. {
  478. this->students[pos-1]->PrintState();
  479. cout << endl;
  480. }
  481.  
  482. static Group* IntegrationGroups(const Group* first, const Group* second)
  483. {
  484. if (first->GroupSize < 1 || second->GroupSize < 1)throw "Error :)";
  485. Group* temp = new Group;
  486.  
  487. // думал через конструктор копирования полностью скопировать первую группу,
  488. // но по механике получается, что я скопирую всех студентов с первой группы
  489. // а потом буду либо добавлять по 1-му со второй или заново целиком пересоздавать
  490. // массив(с большим обьемом) и еще раз копировать... Пришел к выводу, что это
  491. // лишнии затраты вычислительной мощности(не стоит привыкать к расточительности)
  492. //temp = first;
  493.  
  494. temp->SetGroupName(first->GroupName);
  495. temp->SetCourse(first->course);
  496. temp->SetSpecialization(first->Specialization);
  497. temp->GroupSize = first->GroupSize + second->GroupSize;
  498. temp->students = new Student*[temp->GroupSize];
  499. // копирование студентов первой группы
  500. for (int i = 0; i < first->GroupSize; i++)
  501. {
  502. temp->students[i] = new Student(*first->students[i]);
  503.  
  504. }
  505. // копирование студентов второй группы
  506. for (int i = 0; i < second->GroupSize; i++)
  507. {
  508. temp->students[i + first->GroupSize] = new Student(*second->students[i]);
  509. }
  510. temp->RestructGroup();
  511. }
  512.  
  513. void TransferStudent(Group* out, int PosStudent)
  514. {
  515. // решил сделать void и с 3 параметрами т.к. если сделать возвратное значние Group придется
  516. // пересоздавать группу, если Student то пользователь должен будет помнить какой параметр
  517. // возврящает функция и ее вписывать.
  518. // а так просто нужно из группы вызвать метод и вписать откуда
  519. /*
  520. AddStudent(out->students[PosStudent]->GetName(), out->students[PosStudent]->GetSurname(), out->students[PosStudent]->GetPatronymic(),
  521. out->students[PosStudent]->GetAge(), out->students[PosStudent]->GetAdress(), out->students[PosStudent]->GetPhone());
  522. //и еще несколько функций копирования оценок, но код ниже мне нравится больше
  523. */
  524.  
  525. Student** temp = new Student*[this->GroupSize + 1];
  526. for (int i = 0; i < this->GroupSize; i++)
  527. temp[i] = this->students[i];
  528. temp[this->GroupSize] = new Student(*out->students[PosStudent-1]);
  529.  
  530. delete[]this->students;
  531. this->students = temp;
  532. this->GroupSize++;
  533. RestructGroup();
  534. out->DeleteStudent(PosStudent);
  535.  
  536. }
  537.  
  538. void DeductionIsNotPassedSession(int MinPassValue) // отсчет производится по экзаминационному листу
  539. {
  540. if (MinPassValue > 12 || MinPassValue < 1) throw "Error";
  541.  
  542. for (int i = 0; i < GroupSize; i++)
  543. {
  544. cout << "Enter "<< i<<endl;
  545.  
  546. if (students[i]->GetTotalExams() == 0)
  547. {
  548. DeleteStudent(i + 1);
  549. i--;
  550. }
  551. else
  552. {
  553. int * ExamList = students[i]->GetExamList();
  554. int AverageValue = 0;
  555. for (int j = 0; j < students[i]->GetTotalExams(); j++)
  556. AverageValue += ExamList[j];
  557. AverageValue = AverageValue / students[i]->GetTotalExams();
  558. if (AverageValue < MinPassValue)
  559. {
  560. DeleteStudent(i+1);
  561. i--;
  562. }
  563. delete[]ExamList;
  564. }
  565.  
  566. this->PrintGroupState();
  567. }
  568. }
  569. void DeleteLaggingBehind()// расчет по рейтингу
  570. {
  571. int min=0;
  572. int tempvalue;
  573. for (int i = 0; i < GroupSize; i++)
  574. {
  575. tempvalue = students[i]->GetRating();
  576. if (students[min]->GetRating()>students[i]->GetRating())
  577. min = i;
  578. }
  579. DeleteStudent(min+1);
  580. }
  581. private:
  582.  
  583. void SetMARK(int choose, bool random)
  584. {
  585. int value;
  586. for (int i = 0; i < GroupSize; i++)
  587. {
  588. value = 0;
  589. if (random)
  590. {
  591. value = value = rand() % 11 + 1;
  592. }
  593. else
  594. {
  595. while (value < 1 || value>12);
  596. {
  597. cout << students[i]->GetSurname() << ' ' << students[i]->GetName() << " get: ";
  598. cin >> value;
  599. }
  600. }
  601. switch (choose)
  602. {
  603. case 0: students[i]->SetMark(value);
  604. break;
  605. case 1: students[i]->SetCoursework(value);
  606. break;
  607. case 2: students[i]->SetExam(value);
  608. break;
  609.  
  610. }
  611. }
  612. }
  613. void RandomizeStudents(unsigned int size)
  614. {
  615. for (int i = 0; i < size; i++)
  616. {
  617. int age = rand() % 41 + 15;
  618. AddStudent(GetName(), GetSurname(), age);
  619.  
  620. }
  621. SetALLMarks(true);
  622. SetALLMarks(true);
  623. }
  624. char* GetName()
  625. {
  626.  
  627. int temp = rand() % 19;
  628. switch (temp)
  629. {
  630. case 0: return "Вася";
  631. case 1: return "Петя";
  632. case 2: return "Антон";
  633. case 3: return "Серега";
  634. case 4: return "Боря";
  635. case 5: return "Славик";
  636. case 6: return "НеЗнамаКто";
  637. case 7: return "Люда";
  638. case 8: return "Катя";
  639. case 9: return "Маша";
  640. case 10: return "Лариса";
  641. case 11: return "Юля";
  642. case 12: return "Марина";
  643. case 13: return "Василиса";
  644. case 14: return "Вишенко";
  645. case 15: return "КтоТО";
  646. case 16: return "Чип";
  647. case 17: return "Дейл";
  648. case 18: return "Незнайка";
  649.  
  650. }
  651. }
  652. char* GetSurname()
  653. {
  654. int temp = rand() % 20;
  655. switch (temp)
  656. {
  657. case 0: return "Головастиков";
  658. case 1: return "Трюфель";
  659. case 2: return "Какашкинд";
  660. case 3: return "ХтоТУТ";
  661. case 4: return "Билайнер";
  662. case 5: return "Тампак";
  663. case 6: return "Абияк";
  664. case 7: return "Жижа";
  665. case 8: return "Жуйков";
  666. case 9: return "Бобрик";
  667. case 10: return "Голодняк";
  668. case 11: return "Заморило";
  669. case 12: return "Зябля";
  670. case 13: return "Лихобаба";
  671. case 14: return "Колотило";
  672. case 15: return "Кошмарик";
  673. case 16: return "Кукало";
  674. case 17: return "Недобой";
  675. case 18: return "Накидайло";
  676. case 19: return "Наливайка";
  677. }
  678. }
  679. void RestructGroup()
  680. {
  681. Student* temp;
  682. int value;
  683. int min;
  684. for (int i = 0; i < GroupSize; i++)
  685. {
  686. min = i;
  687. for (int j = i + 1; j < GroupSize; j++)
  688. {
  689. value = strcmp(students[min]->GetSurname(), students[j]->GetSurname());
  690. if (value > 0) min = j;
  691. if (value == 0)
  692. {
  693. value = strcmp(students[min]->GetName(), students[j]->GetName());
  694. if (value > 0) min = j;
  695. }
  696.  
  697. }
  698. // косвенная проверка чтобы лишний раз не делать замену
  699. if (min != i)
  700. {
  701. temp = students[i];
  702. students[i] = students[min];
  703. students[min] = temp;
  704. }
  705. }
  706.  
  707. }
  708.  
  709.  
  710. };
  711.  
  712.  
  713. void main()
  714. {
  715. setlocale(0, "RU");
  716. srand(time(NULL));
  717.  
  718. /* Student* a = new Student("vasya", "surname", "patronymic");
  719.  
  720. a->SetMark(12);
  721. a->SetCoursework(12);
  722. a->SetMark(12);
  723. a->PrintState();
  724. cout << endl;
  725. {
  726. cout << "Copy ctr\n";
  727. Student* B;
  728. B = a;
  729. B->PrintState();
  730. }
  731. cout << endl;
  732. a->PrintState();
  733. */
  734.  
  735. cout << "First:\n";
  736. Group* a = new Group(10);
  737.  
  738. a->SetALLExam(true);
  739. a->SetALLExam(true);
  740. a->PrintGroupState();
  741.  
  742. /*
  743. a->PrintStudent(1);
  744. {
  745. cout << "Copy ctr\n";
  746. Group* b = a;
  747. b->PrintGroupState();
  748. }
  749. cout << "original group \n";
  750. a->PrintGroupState();
  751. */
  752.  
  753. /*
  754. cout << "Second:\n";
  755. Group*b = new Group(3);
  756. b->PrintGroupState();
  757. cout << "Integration:\n";
  758. {
  759. Group* temp = new Group;
  760. temp=Group::IntegrationGroups(a, b);
  761. temp->PrintGroupState();
  762. }
  763. cout << "Original first:\n";
  764. a->PrintGroupState();
  765. a->TransferStudent(b, 2);
  766. a->PrintGroupState();
  767. b->PrintGroupState();
  768. */
  769.  
  770.  
  771.  
  772. // a->DeductionIsNotPassedSession(6);
  773. // a->PrintGroupState();
  774.  
  775. a->DeleteLaggingBehind();
  776. a->PrintGroupState();
  777.  
  778. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement