Недавно начал програмировать на с++ и возник вопрос. Написал программу которая показывает список учеников и их оценки. Создал два вектора для имени и оценки. Интересует вопрос как отсортировать список по убыванию оценок студентов (сначала самый высокий бал). Затем вывести все имена и оценки в отсортированном виде.(отсортировать могу,но не могу связать имя и оценку)`
#include "stdafx.h"
#include <iostream>
#include <string>
#include "std_lib_facilities.h"
vector<string> name_of_students;
vector<double> marks_of_students;
void name() {
cout << "Type the name of student ";
string name;
cin >> name;
name_of_students.push_back(name);
}
int mark() {
cout << "Type the mark of this student";
int mark;
cin >> mark;
marks_of_students.push_back(mark);
return mark;
}
void main(){
cout << "How many student in your class?";
int number_of_students;
cin >> number_of_students;
for (int i = 0; i < number_of_students; i++) {
name();
mark();
}
cout << "Number of students is " << name_of_students.size() << "
people.\n";
for (int i = 0; i < name_of_students.size(); i++) {
cout << name_of_students[i] << " " << marks_of_students[i] << "marks\n";
}
keep_window_open();
}
Для таких вещей принято вместо использования двух объектов, использовать один. Тобишь список оценок - это, по сути, один объект, в котором есть список учеников, каждому из которых присвоены оценки. Таким образом, лучше сделать структуру (на самом деле есть вариант получше, но это сложнее, я напишу ниже). Что-то вроде:
class Student {
private:
std::string name_;
unsigned short digit_;
public:
//сдесь конструктор и функции
}
В результате вам нужно будет создать один вектор, а не два. А дальше начинается интересное. В стандартной библиотеке есть функция sort
, которая принимает итератор на начало, конец и предикат. Если что-то из этого не знакомо - что ж, придется познакомится.
Итак, далее пишем:
std::vector<Student> list;
...
std::sort(list.begin(), list.end(),
[](const Studeng &a, const Student &b){return a.digit() < b.digit();});
Метод digit
, я думаю, сами сможете реализовать. Кстати, если не знаете что за конструкция приведена - это лямбда. Можно поступить по другом: определить operator<
в классе соответствующим образом, и тогда предикат можно опустить. Так, кстати говоря, почти любой контейнер можно отсортировать (кроме тех, которые сами элементы упорядочивают).
Выше я писал о лучшем методе: это использовани map
, но думаю, это будет еще сложновато для вас. Вкратце, для использования map
(или, если использовать эту структуру, то можно и set
обойтись) обязательно нужно указать либо operator <
в классе, либо при инициализации контейнера указать предикат. В этих классах, благодоря древовидной структуре, элементы сами упорядочиваются.
У вас есть заполненный вектор для оценок студентов:
vector<double> marks_of_students;
И в пространстве имен std
определены некоторые функторы для облегчения решений подобных задач. Один из них std::greater_equal
. Вам остается только сортировать ваш вектор по такому критерию, и никакие струтуры не нужны.
Программу вашу можно было написать иначе: можно определить и вектор пар имен и оценок, чтобы не создать два вектора, можно определить структуру, как вам подсказывали, можно написать несколькими десятками способами... Только вам самим решать в каком стиле и как. Для такой тривиальной программы допустимо и так, как вы написали. Так что отсортируйте ваш вектор оценок например так:
std::sort(marks_of_students.begin(), marks_of_students.end(),
std::greater_equal<double>());
и используйте наздоровье...
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Как создать enum который будет доступен везде? Я вот например создал enum и с ним все нормально работает в классах где создаю а вот в класе наследнике...
Есть строка с датой и времнем в определенном формате
Ищу пример реализации программного управления транзакциями в Spring Boot и Spring Data JPAВезде только для spring framework
Коллеги, добрый день! Вот такой стек исключения выдается при запуске собранного мавеном джарника моего приложения: