Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.59/64: Рейтинг темы: голосов - 64, средняя оценка - 4.59
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373

Создать массив с именами студентов и их средним балом

17.09.2018, 10:29. Показов 12520. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Определите студентов с лучшими успеваемостью, то есть с максимальным средним
баллом по трем предметам. Выведите по алфавиту список студентов, которые имеют
средний балл более 4.

Добавлено через 54 минуты
Вот сделал наброски. А дальше как реализовать я не знаю. Помогите пожалуйста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include <iostream>
#include <string>
using namespace std;
 
class Pasha
{
public:
    float phizika;
    float istoria;
    float matematyka;
 
};
class Masha
{
public:
    float phizika;
    float istoria;
    float matematyka;
 
};
class Dasha
{
public:
    float phizika;
    float istoria;
    float matematyka;
 
};
class Zhenya
{
public:
    int phizika;
    int istoria;
    int matematyka;
 
};
class Vlad
{
public:
    float phizika;
    float istoria;
    float matematyka;
 
};
class Ivan
{
public:
    float phizika;
    float istoria;
    float matematyka;
 
};
class Lera
{
public:
    float phizika;
    float istoria;
    float matematyka;
 
};
 
 
int main()
 
{
    setlocale(LC_ALL, "RU");
 
    Pasha Subject;
    {
        Subject.istoria = 5;
        Subject.matematyka = 5;
        Subject.phizika = 5;
    }
 
    Masha Subject;
    {
        Subject.istoria = 5;
        Subject.matematyka = 2;
        Subject.phizika = 3;
    }
 
    Dasha Subject;
    {
        Subject.istoria = 3;
        Subject.matematyka = 2;
        Subject.phizika = 4;
    }
 
    Zhenya Subject;
    {
        Subject.istoria = 5;
        Subject.matematyka = 2;
        Subject.phizika = 3;
    }
 
    Vlad Subject;
    {
        Subject.istoria = 4;
        Subject.matematyka = 4;
        Subject.phizika = 2;
    }
 
    Ivan Subject;
    {
        Subject.istoria = 4;
        Subject.matematyka = 5;
        Subject.phizika = 4;
    }
 
    Lera Subject;
    {
        Subject.istoria = 5;
        Subject.matematyka = 3;
        Subject.phizika = 2;
    }
 
 
 
  /* string students[7]{Pasha, Masha, Dasha, Zhenya, Vlad, Ivan, Lera};
 
   for (int i = 0; i < 7; i++) 
   {
       cout << students[i] << endl;
   }
 
   */
 
 
 
 
    system("pause");
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.09.2018, 10:29
Ответы с готовыми решениями:

Создать массив с именами студентов и их средним балом
Здравствуйте. Есть вот такое задание. Я написал код, всё работает, но когда закинул часть кода в .txt, а потом вызываю его, код с .txt не...

создать файл , что содержит список студентов с их средним балом на сесии . Обеспечить чтение ФАйла и выдачу фамилий студентов , которые учатся успешно
На Visual C++ нужно создать файл , что содержит список студентов с их средним балом на сесии . Обеспечить чтение ФАйла и выдачу фамилий...

Создать однонаправленый список изъять из списка студентов со средним балом ниже 3.5
Группа студентов(3 человека) .Анкетные данные ФИО и оценки(4) . Создать однонаправленый список изъять из списка студентов со средним балом...

31
115 / 83 / 43
Регистрация: 19.01.2018
Сообщений: 484
17.09.2018, 21:13
Студворк — интернет-сервис помощи студентам
sourcerer, честно говоря, std:: - очень снижает читабельность кода для студентов, т.е. когда я начинал только, а посл увиденного чуть в обморок не падал, ведь если провести глазами, по всюду одни двоеточия, а в мозгу они превращаются во что-то такое:

C++
1
;%:?*)(*(%;:(*)?%>><<>+^^&*&%$^&#@#$%%^&)&*8765467*8*6778900(7&^&686&^&899*&*&^^%*&^^%!@#@#$
0
17.09.2018, 21:17

Не по теме:

RostikTawer, Кому как, мне например приятнее читать кот с std:: ну естественно не кто как бы не запрещает using. А вот using namespace std; лучше не делать.

0
115 / 83 / 43
Регистрация: 19.01.2018
Сообщений: 484
17.09.2018, 21:20
Reavolt,

Не по теме:

я полностью согласен, но для простенькой программы типа "массив с именами студентов", подключения пространства имен ничем навредит

0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
17.09.2018, 21:44  [ТС]
C++
1
    std::sort(students.begin(), students.end(), by(name));
Эта часть кода не работает
Миниатюры
Создать массив с именами студентов и их средним балом  
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
18.09.2018, 06:05
Цитата Сообщение от DragonBorn88 Посмотреть сообщение
C++
1
std::sort(students.begin(), students.end(), by(name));
Эта часть кода не работает
DragonBorn88, написал же в комментарии:
Цитата Сообщение от sourcerer Посмотреть сообщение
C++
8
// required C++14 support
И даже в самой последней версии с переводом написал (а то вдруг Вы не умеете гугл-переводчиком пользоваться):
Цитата Сообщение от sourcerer Посмотреть сообщение
C++
10
// для работы этого макроса необходимо в своей IDE включить поддержку стандарта C++14
Смотрим прикреплённые темы, чтобы понять как это сделать в своей IDE.

Добавлено через 3 минуты
Цитата Сообщение от RostikTawer Посмотреть сообщение
sourcerer, честно говоря, std:: - очень снижает читабельность кода для студентов
RostikTawer, мне кажется, тогда лучше забыть про программирование вовсе, если такая мелочь способна сбить с толку. Кроме того, в условии задачи не было никаких ограничений по использованию тех или иных инструментов языка, а так же никаких ограничений по coding conventions.
Мораль: либо учимся использовать всю мощь языка (там, где это уместно), либо чётко оговариваем в ТЗ что можно использовать, а что нет.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
18.09.2018, 06:24
Лучший ответ Сообщение было отмечено DragonBorn88 как решение

Решение

Цитата Сообщение от DragonBorn88 Посмотреть сообщение
Здесь просто соединить его надо, или как?
DragonBorn88, ну да, я просто вынес объявление и определение класса в отдельный файл. Можно всё сделать в одном файле:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
#include <iostream>
#include <cstddef>
#include <vector>
#include <string>
#include <algorithm>
 
// Сортировка массива объектов пользовательского типа по заданному полю
// с помощью лямбда-выражения, ключевого слова auto и макроса:
#define by(x) [](const auto& a, const auto& b) { return a.x() < b.x(); }
// для работы этого макроса необходимо в своей IDE включить поддержку стандарта C++14
// thanks to Bekzhan Kassenov for great idea
// https://www.cyberforum.ru/cpp-beginners/thread1808516.html#post9550767
 
class Student
{
private:
    struct Course // предмет в виде отдельной структуры
    {
        // конструктор с двумя параметрами:
        Course(
            const std::string & n = "unspecified course",   // если параметр не задан явно, то имя курса по умолчанию будет "unspecified course"
            const std::size_t g = 0)                        // если параметр не задан явно, то оценка по умолчанию будет равна нулю
                : // список инициализаторов-членов:
            name(n), // 1-ый параметр инициализирует поле name значением строки n
            grade(g) // 2-ой параметр инициализирует поле grade значением переменной g
        {
            // тело конструктора пустое - так и задумано
            // поскольку инициализация полей уже реализована
            // с помощью списка инициализаторов-членов
        }
 
        std::string name;   // название предмета (например, "физика" или "история")
        std::size_t grade;  // оценка по данному предмету
 
        // перегруженный оператор вывода для нашего пользовательского типа Course:
        friend std::ostream & operator<<(std::ostream & os, const Course & c)
        {   // теперь благодаря этой дружественной функции-члену можно выводить
            // данные о заданном курсе на консоль привычным способом, например,
            // через библиотечный объект std::cout
 
            os << c.name << " (" << c.grade << ")";
            return os;
        }
    };
 
    std::string m_name;             // имя студента
    std::vector<Course> m_courses;  // список предметов
 
public:
    // Конструктор без параметров
    Student() :
        // Вызовет конструктор с двумя параметрами -
        // 1-ый параметр - константная ссылка на std::string
        // 2-ый параметр - константная ссылка на std::vector<Course>
        Student
            (
                "unnamed", // в качестве 1-го параметра передаём строковый литерал "unnamed" - компилятор сам приведёт его к типу std::string
                {} // в качестве 2-го параметра передаём пустой initializer list - так мы создаём и инициализируем дефолтными значениями std::vector<Course>
            )
    {
        // тело конструктора пустое - так и задумано
        // поскольку инициализация полей уже реализована
        // с помощью списка инициализаторов-членов
    }
 
    // Конструктор с двумя параметрами:
    Student(
        const std::string & name, // 1-ый параметр - константная ссылка на std::string
        const std::vector<Course> & courses) // 2-ый параметр - константная ссылка на std::vector<Course>
            :
        m_name(name),       // 1-ый параметр инициализирует поле m_name значением строки name
        m_courses(courses)  // 2-ой параметр инициализирует поле m_courses значениями коллекции (в нашем случае - вектора) courses
    {
        // тело конструктора пустое - так и задумано
        // поскольку инициализация полей уже реализована
        // с помощью списка инициализаторов-членов
    }
 
    // функция-член (сеттер) для перезаписи имени студента
    void set_name(const std::string & name)
    {
        m_name = name; // теперь имя студента (поле m_name) будет перезаписано - запишем туда значение, хранящееся в строке name
    }
 
    // функция-член (геттер) для получения данных (имени студента) из приватного поля m_name:
    std::string name() const
    {
        return m_name;
    }
 
    // функция-член для добавления нового курса в список курсов (в наш вектор)
    void add_course(const Course & course)
    {
        m_courses.push_back(course); // используем библиотечную функцию push_back -
        // она добавляет один элемент в конец вектора;
        // такая функция-член есть у всех векторов;
        // с функциями-членами вектора и других библиотечных
        // коллекций можно ознакомиться на справочных сайтах
        // например, на http://www.cplusplus.com/reference/vector/vector/
        // или на https://ru.cppreference.com/w/cpp/container/vector
    }
 
    // функция-член (геттер) для получения данных (всех курсов) из приватного поля m_courses:
    std::vector<Course> all_courses() const
    {
        return m_courses;
    }
 
    // функция-член (геттер) для получения курса по заданному имени курса (его мы передаём в качестве параметра):
    Course course_by_name(const std::string & courseName) const
    {
        Course result; // результат - сюда потом сохраним найденный курс
 
        // используем цикл for основанный на диапазоне для прохода по всему вектору m_courses:
        for (const auto elem : m_courses) // для каждого элемента коллекции m_courses
        {   // выполнить следующее:
            if (elem.name == courseName) // если имя курса равно courseName
            {
                result = elem; // тогда записываем в результат этот самый элемент (нужный курс найден в коллекции)
                break; // а раз он найден, до дальше продолжать цикл не нужно - прерываем цикл
            }
        }
 
        return result; // возвращаем из функции полученный результат
    }
 
    // функция-член для вычисления средней оценки:
    double average_grade() const
    {
        double result = 0;
 
        // используем цикл for основанный на диапазоне для прохода по всему вектору m_courses:
        for (const auto elem : m_courses) // для каждого элемента коллекции m_courses
        {
            result += elem.grade; // суммируем оценки по всем предметам и сохраняем результат в переменной result
        }
        return result / m_courses.size(); // используем библиотечную функцию-член size() -
        // она возвращает размер коллекции (то есть, количество элементов нашего вектора);
        // делим нашу сумму на количество элементов вектора - вуаля, получаем среднюю оценку
    }
 
    // перегруженный оператор вывода для нашего пользовательского типа Student:
    friend std::ostream & operator<<(std::ostream & os, const Student & s)
    {   // теперь благодаря этой дружественной функции-члену можно выводить
        // данные о заданном студенте на консоль привычным способом, например,
        // через библиотечный объект std::cout
        os << s.m_name << "'s info:\n";
        for (const auto elem : s.m_courses)
            os << elem << "\n";
        return os;
    }
};
 
int main()
{
    Student s1;
    s1.set_name("Vlad");
    s1.add_course({"maths", 5});
    s1.add_course({"chemistry", 5});
    s1.add_course({"physics", 4});
    std::cout << s1;
    std::cout << s1.name() << "'s average grade: " << s1.average_grade() << "\n\n";
 
    Student s2("Igor", {{"maths", 4}, {"chemistry", 3}, {"physics", 4}});
    std::cout << s2;
    std::cout << s2.name() << "'s average grade: " << s2.average_grade() << "\n\n";
 
    Student s3("Oleg", {{"maths", 3}, {"chemistry", 3}, {"physics", 4}});
    std::cout << s3;
    std::cout << s3.name() << "'s average grade: " << s3.average_grade() << "\n\n";
 
    Student s4("Gleb", {{"maths", 3}, {"chemistry", 3}, {"physics", 3}});
    std::cout << s4;
    std::cout << s4.name() << "'s average grade: " << s4.average_grade() << "\n\n";
 
    Student s5("Stas", {{"maths", 4}, {"chemistry", 4}, {"physics", 4}});
    std::cout << s5;
    std::cout << s5.name() << "'s average grade: " << s5.average_grade() << "\n\n";
 
    Student s6("Vera", {{"maths", 5}, {"chemistry", 5}, {"physics", 5}});
    std::cout << s6;
    std::cout << s6.name() << "'s average grade: " << s6.average_grade() << "\n\n";
 
    Student s7("Lada", {{"maths", 5}, {"chemistry", 5}, {"physics", 5}});
    std::cout << s7;
    std::cout << s7.name() << "'s average grade: " << s7.average_grade() << "\n\n";
 
    std::vector<Student> students;
    students.push_back(s1);
    students.push_back(s2);
    students.push_back(s3);
    students.push_back(s4);
    students.push_back(s5);
    students.push_back(s6);
    students.push_back(s7);
 
    std::sort(students.begin(), students.end(), by(name));
    for (const auto elem : students)
        std::cout << elem.name() << "\n";
}
Миниатюры
Создать массив с именами студентов и их средним балом  
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
18.09.2018, 06:51
А ещё можно и вот так макросами сделать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// с помощью макроса заменим итераторы, указывающие на начало и конец коллекции,
// на конструкцию all_elements_of:
#define all_elements_of(collection) collection.begin(), collection.end()
 
// Сортировка массива объектов пользовательского типа по заданному полю
// с помощью лямбда-выражения, ключевого слова auto и макроса:
#define by(getter) [](const auto& a, const auto& b) { return a.getter() < b.getter(); }
// для работы этого макроса необходимо в своей IDE включить поддержку стандарта C++14
// thanks to Bekzhan Kassenov for great idea
// https://www.cyberforum.ru/cpp-beginners/thread1808516.html#post9550767
 
//тогда в мэйне сортировку можно будет сделать так:
int main()
{
    // ...
 
    std::sort(all_elements_of(students), by(name));
 
    // ...
}
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
18.09.2018, 07:26
И даже так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#include <iostream>
#include <cstddef>
#include <vector>
#include <string>
#include <algorithm>
#include <iterator>
 
#define all_elements_of(collection) collection.begin(), collection.end()
#define to(collection) collection.begin()
#define by(getter) [](const auto& a, const auto& b) { return a.getter() < b.getter(); }
#define when(getter, greater_than, value) [](const auto& obj) { return obj.getter() > value; }
 
class Student
{
private:
    struct Course
    {
        Course(const std::string & n = "unspecified course", const std::size_t g = 0) :
            name(n), grade(g)
        {}
 
        std::string name;
        std::size_t grade;
 
        friend std::ostream & operator<<(std::ostream & os, const Course & c)
        {
            os << c.name << " (" << c.grade << ")";
            return os;
        }
    };
 
    std::string m_name;
    std::vector<Course> m_courses;
 
public:
    Student() : Student("unnamed",{})
    {}
 
    Student(const std::string & name, const std::vector<Course> & courses) :
        m_name(name), m_courses(courses)
    {}
 
    void set_name(const std::string & name)
    {
        m_name = name;
    }
 
    std::string name() const
    {
        return m_name;
    }
 
    void add_course(const Course & course)
    {
        m_courses.push_back(course);
    }
 
    std::vector<Course> all_courses() const
    {
        return m_courses;
    }
 
    Course course_by_name(const std::string & courseName) const
    {
        Course result;
 
        for (const auto elem : m_courses)
        {
            if (elem.name == courseName)
            {
                result = elem;
                break;
            }
        }
 
        return result;
    }
 
    double average_grade() const
    {
        double result = 0;
 
        for (const auto elem : m_courses)
        {
            result += elem.grade;
        }
        return result / m_courses.size();
    }
 
    friend std::ostream & operator<<(std::ostream & os, const Student & s)
    {
        os << s.m_name << "'s info:\n";
        for (const auto elem : s.m_courses)
            os << elem << "\n";
        return os;
    }
};
 
std::vector<Student> find_good_students(const std::vector<Student> & students)
{
    std::vector<Student> goodStudents(students.size());
 
    auto it = std::copy_if (all_elements_of(students), to(goodStudents), when(average_grade, greater_than, 4));
    goodStudents.resize(std::distance(goodStudents.begin(),it));
 
    return goodStudents;
}
 
int main()
{
    Student s1;
    s1.set_name("Vlad");
    s1.add_course({"maths", 5});
    s1.add_course({"chemistry", 5});
    s1.add_course({"physics", 4});
    std::cout << s1;
    std::cout << s1.name() << "'s average grade: " << s1.average_grade() << "\n\n";
 
    Student s2("Igor", {{"maths", 4}, {"chemistry", 3}, {"physics", 4}});
    std::cout << s2;
    std::cout << s2.name() << "'s average grade: " << s2.average_grade() << "\n\n";
 
    Student s3("Oleg", {{"maths", 3}, {"chemistry", 3}, {"physics", 4}});
    std::cout << s3;
    std::cout << s3.name() << "'s average grade: " << s3.average_grade() << "\n\n";
 
    Student s4("Gleb", {{"maths", 3}, {"chemistry", 3}, {"physics", 3}});
    std::cout << s4;
    std::cout << s4.name() << "'s average grade: " << s4.average_grade() << "\n\n";
 
    Student s5("Stas", {{"maths", 4}, {"chemistry", 4}, {"physics", 4}});
    std::cout << s5;
    std::cout << s5.name() << "'s average grade: " << s5.average_grade() << "\n\n";
 
    Student s6("Vera", {{"maths", 5}, {"chemistry", 5}, {"physics", 5}});
    std::cout << s6;
    std::cout << s6.name() << "'s average grade: " << s6.average_grade() << "\n\n";
 
    Student s7("Lada", {{"maths", 5}, {"chemistry", 5}, {"physics", 5}});
    std::cout << s7;
    std::cout << s7.name() << "'s average grade: " << s7.average_grade() << "\n\n";
 
    std::vector<Student> students;
    students.push_back(s1);
    students.push_back(s2);
    students.push_back(s3);
    students.push_back(s4);
    students.push_back(s5);
    students.push_back(s6);
    students.push_back(s7);
 
    std::vector<Student> goodStudents(find_good_students(students));
    std::sort(all_elements_of(goodStudents), by(name));
 
    for (const auto elem : goodStudents)
        std::cout << elem.name() << "\n";
}
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
18.09.2018, 08:44
Лучший ответ Сообщение было отмечено DragonBorn88 как решение

Решение

Ну и, на закуску, вариант-лайт - шлём к лешему инкапсуляцию (т.е. конструкторы, сеттеры, геттеры и дружественные функции-члены) и делаем всё на структурах:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include <iostream>
#include <cstddef>
#include <vector>
#include <string>
#include <algorithm>
#include <iterator>
 
#define all_elements_of(collection) collection.begin(), collection.end()
#define to(collection) collection.begin()
#define by(field) [](const auto& a, const auto& b) { return a.field < b.field; }
#define when(method, greater_than, value) [](const auto& obj) { return obj.method() > value; }
 
struct Student
{
    struct Course
    {
        std::string name;
        std::size_t grade;
 
        void show() const
        {
            std::cout << name << " (" << grade << ")\n";
        }
    };
 
    std::string name;
    std::vector<Course> courses;
 
    void add_course(const Course & course)
    {
        courses.push_back(course);
    }
 
    double average_grade() const
    {
        double result = 0;
 
        for (const auto elem : courses)
        {
            result += elem.grade;
        }
        return result / courses.size();
    }
 
    void show_info() const
    {
        std::cout << name << "'s info:\n";
        for (const auto elem : courses)
            elem.show();
    }
 
    void show_average_grade()
    {
        std::cout << name << "'s average grade: " << average_grade() << "\n\n";
    }
};
 
std::vector<Student> find_good_students(const std::vector<Student> & students)
{
    std::vector<Student> goodStudents(students.size());
 
    auto iter =
        std::copy_if(all_elements_of(students),
                     to(goodStudents),
                     when(average_grade, greater_than, 4));
 
    goodStudents.resize(std::distance(goodStudents.begin(), iter));
 
    return goodStudents;
}
 
int main()
{
    Student s1;
    s1.name = "Vlad";
    s1.add_course({"maths", 5});
    s1.add_course({"chemistry", 5});
    s1.add_course({"physics", 4});
    s1.show_info();
    s1.show_average_grade();
 
    Student s2;
    s2.name = "Igor";
    s2.add_course({"maths", 4});
    s2.add_course({"chemistry", 3});
    s2.add_course({"physics", 4});
    s2.show_info();
    s2.show_average_grade();
 
    Student s3;
    s3.name = "Oleg";
    s3.add_course({"maths", 3});
    s3.add_course({"chemistry", 3});
    s3.add_course({"physics", 4});
    s3.show_info();
    s3.show_average_grade();
 
    Student s4;
    s4.name = "Gleb";
    s4.add_course({"maths", 3});
    s4.add_course({"chemistry", 3});
    s4.add_course({"physics", 3});
    s4.show_info();
    s4.show_average_grade();
 
    Student s5;
    s5.name = "Stas";
    s5.add_course({"maths", 4});
    s5.add_course({"chemistry", 4});
    s5.add_course({"physics", 4});
    s5.show_info();
    s5.show_average_grade();
 
    Student s6;
    s6.name = "Vera";
    s6.add_course({"maths", 5});
    s6.add_course({"chemistry", 5});
    s6.add_course({"physics", 5});
    s6.show_info();
    s6.show_average_grade();
 
    Student s7;
    s7.name = "Lada";
    s7.add_course({"maths", 5});
    s7.add_course({"chemistry", 5});
    s7.add_course({"physics", 5});
    s7.show_info();
    s7.show_average_grade();
 
    std::vector<Student> students;
    students.push_back(s1);
    students.push_back(s2);
    students.push_back(s3);
    students.push_back(s4);
    students.push_back(s5);
    students.push_back(s6);
    students.push_back(s7);
 
    std::vector<Student> goodStudents(find_good_students(students));
    std::sort(all_elements_of(goodStudents), by(name));
 
    for (const auto elem : goodStudents)
        std::cout << elem.name << "\n";
}
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
18.09.2018, 10:00  [ТС]
Ещё нужно чтобы студенты с балом 4+ выводились по алфавиту. Я только что пытался сам сделать, так не выходит.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
18.09.2018, 10:11
Цитата Сообщение от DragonBorn88 Посмотреть сообщение
Ещё нужно чтобы студенты с балом 4+ выводились по алфавиту. Я только что пытался сам сделать, так не выходит.
DragonBorn88, в моём коде (тут и тут) те студенты, у кого средний балл больше 4, скопированы в вектор goodStudents. И выводятся они по алфавиту. Именно для этого я использовал библиотечную функцию std::sort с компаратором в виде лямбды, которую макрос подставляет.

Цитата Сообщение от DragonBorn88 Посмотреть сообщение
Я только что пытался сам сделать, так не выходит.
DragonBorn88, то, что Вы пытались сделать самостоятельно, мне отсюда не видно. Показывайте Вашу версию кода.
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
18.09.2018, 10:30  [ТС]
Уже все работает. Спасибо
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.09.2018, 10:30

Вывести студентов со средним балом 4.0 и ниже 3.5
Помогите пожалуйста с программкой, ибо очень мучаюсь( Среди 10 студентов(ввести самостоятельно), которые имеют по 4 оценки, определить...

Создать запрос: вывести список абитуриентов со средним балом
помогите создать запрос через конструктор запросов Запрос 8. Разработать запрос ,при помощи которого можно вывести список абитуриентов...

определить количество абитуриентов со средним балом не мение 4
необходимо определить количество абитуриентов со средним балом не мение 4. 5 абитуриентов надо вводить с клавиатуры их оценки тоже. у...

Вычислить общий средний балл всех студентов и распечатать список студентов со средним баллом выше общего
Задача следующая: вычислить общий средний балл всех студентов и распечатать список студентов со средним баллом выше общего среднего балла

Вывести номера кафедр, где число студентов со средним баллом 4,75 – 5,0 более 25% от общего числа студентов кафедры
Собственно, сабж. Получается только найти отдельно число студентов в каждой кафедре и отдельно число студентов, а сравнить их и вывести по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru