Задача с использованием массивов в С++
Задание выглядит так:
Напишите простую программу на C++, которая получает список учеников с клавиатуры с указанием имени и класса. Программа должна предоставлять общие оценки, среднюю оценку, максимальную оценку, а также имена и оценки всех учащихся с оценками выше средней.
Наша понимание и попытка решения:
Выбираем номер класса с 1го по 4й (к примеру), а после подтверждения, должен появится список учеников данного класса с оценками, в конце общих оценок нужно "приклеить" как-то еще среднюю оценку и максимальную оценку (если я правильно понимаю). Попытались сделать для одного класса...
И вот что у нас получилось:
#include <iostream>
using namespace std;
int main() {
cout << "Добро пожаловать!" << endl;
int numClass=0;
cout << "Выберите № класса: " ;
cin >> numClass;
char Names[][20]={"Вася","Петя","Маша","Нина","Коля","Даша","Света"};// ученики в 1 классе.
int GRADES[][30]={5,7,12,10,6,8,4,11};
cout << "Журнал оценок: " << endl;
for (int i = 0; i < 6; i++) {
cout << Names[i] <<"\t" ;
cout << GRADES[i] << endl;
}
return 0;
}
В моем представлении должно выглядеть как-то так:
Ответы (2 шт):
как-то так, не уверен в правильности, но вроде все работает, мне показалось в принципе использование векторов сильно упрощает жизнь, так что использовал их Можно конечно наверное написать по симпатичней и чуть более оптимизированно, но писал ночью, так что извиняюсь)
#include <iostream>
#include "vector"
#include <algorithm>
using namespace std;
// Функция для нахождения среднего балла учащихся только в заданном классе
float averageRating(vector<int> &grades, vector<int> &schoolClass, int numClass){
int sum = 0;
int count = 0;
for (int i = 0; i < grades.size(); ++i) {
if (schoolClass[i] == numClass) {
sum += grades[i];
count++;
}
}
return sum/count;
}
// функция чтобы убрать лишние оценки, людей кто учится в других классах для упрощения поиска min max
vector<int> helperForMaxMin(vector<int> &gredes, vector<int> &schoolClass, int numClass){
vector<int> helper;
for (int i = 0; i < gredes.size(); ++i) {
if (schoolClass[i] == numClass){
helper.push_back(gredes[i]);
}
}
return helper;
}
int main() {
cout << "Welcome" << endl;
int numClass = 0;
//не сделан ввод в вектор с клавиатуры, это делается через push_back(считывание происходит ввиде имя, класс, оценка)
vector<string> names ={"Vasya","Petya","Masha","Nina","Kolya","Dasha","Sveta"};// ученики в 1 классе.
vector<int> schoolClass = {1, 1, 4, 1, 1, 4};
vector<int> gredes={5,7,12,10,6,7};
cout << "Select a class number: " ;
cin >> numClass;
cout << "============================================================================================="<< endl;
// находим средний балл
float average = averageRating(gredes, schoolClass, numClass);
cout << "Average = " << average << endl;
//находим min и max
vector<int> helper = helperForMaxMin(gredes,schoolClass, numClass);
int max = *max_element(helper.begin(), helper.end());
int min = *min_element(helper.begin(), helper.end());
cout << "Max = " << max << endl;
cout << "Min = " << min << endl;
// ну и непосредственно сами ученики с подходящим нам классом и баллом выше среднего
cout << "Rating log: " << endl;
for (int i = 0; i < names.size(); i++) {
if ((schoolClass[i] == numClass) && (gredes[i] > average)){
cout << names[i] <<"\t" ;
cout << gredes[i] << endl;
}
}
return 0;
}
Конкретно в вашем коде массив с оценками двумерный - в каждой строке оценки одного ученика. Если у вас учеников 7, то и строк должно быть не менее 7.
int GRADES[10][30]={
{ 5, 7, 12, 10, 6, 8, 4, 11},
{ 7, 6, 11},
{ 5, 7, 12, 10},
{ 10, 6, 8, 4, 11},
{ 5, 7, 12, 10},
{ 10, 6, 8, 4, 11},
{ 7, 10, 6, 8, 4} };
Для решения задачи так, как вы понимаете, начните со структур данных. Первое что нужно - количество учеников. И желательно его ограничить (например не более 20), либо придется выделять массивы динамически - в куче. Почему вам советуют std::vector<> - это уже написанный массив в стандартной библиотеке, который сам может расширяться, если нужно.
Также количество учеников нужно чтобы знать, сколько их вводить - вы ведь не забыли, что у вас ввод с клавиатуры?
Удобнее сделать структуру на каждого ученика и потом сделать массив таких структур.
struct Student
{
char name[20]; // массив под имя
// string name; // вместо массива char[20]
int schoolСlass;
int grades[10];
int averageGrade; // средняя оценка ученика
};
const int maxStudents = 20;
Student students[maxStudents]; // массив из 20 учеников
// vector<Student> students; // динамический массив - замена обычному
Либо хранить в отдельных массивах
const int maxStudents = 20;
int numStudents = 10; // вводится с клавиатуры
char StudentsNames[maxStudents][20]; // массив под имена учеников
// string StudentsNames[maxStudents]; // вместо массива char[20][20]
// vector<string> StudentsNames; // вместо массива string[20]
int StudentsClasses[maxStudents]; // массив под классы учеников
const int maxGrades = 10; // макс количество оценок у каждого ученика
int StudentsGrades[maxStudents][maxGrades]; // двумерный массив под оценки учеников
Ну а дальше вам осталось:
- ввести количество учеников (не больше
maxStudents) - ввести имена учеников
- ввести класс для каждого ученика
- ввести количество оценок для ученика и потом ввести сами оценки
При вводе оценок:
- посчитать среднюю оценку у ученика
- посчитать среднюю оценку общую
- найти максимальную оценку
Ну а дальше - вывод.

