Задача с использованием массивов в С++

Рейтинг: -1Ответов: 2Опубликовано: 01.03.2023

Задание выглядит так:

Напишите простую программу на 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;
}

Вот что у нас получилось((

В моем представлении должно выглядеть как-то так:

введите сюда описание изображения

Ответы

▲ 0

как-то так, не уверен в правильности, но вроде все работает, мне показалось в принципе использование векторов сильно упрощает жизнь, так что использовал их Можно конечно наверное написать по симпатичней и чуть более оптимизированно, но писал ночью, так что извиняюсь)

#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;
}
▲ 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)
  • ввести имена учеников
  • ввести класс для каждого ученика
  • ввести количество оценок для ученика и потом ввести сами оценки

При вводе оценок:

  • посчитать среднюю оценку у ученика
  • посчитать среднюю оценку общую
  • найти максимальную оценку

Ну а дальше - вывод.