• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Массивы Структур

  • Автор темы BAMP94
  • Дата начала
B

BAMP94

На основе сводной экзаменационной ведомости, включающей фамилии студентов и оценки по дисциплинам (математика, физика, программирование, история), подсчитать средний балл для каждого студента и вывести ведомость в порядке невозрастания среднего балла. Заранее огромная благодарность тому, кто поможет.
 
R

rrrFer

Код:
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <algorithm>
const int NVAL = 4;				//! количество предметов
struct Stud { 					//! студент
int vals[NVAL]; 				//!< оценки студента:
//!< <оценка по матерматике> ... <истории>
std::string name; 				//!< имя студента
};

float rate(Stud& a) {				//! функция расчета среднего балла
float t = 0.f;
for(int i = 0; i < NVAL; ++i)
t += a.vals[i];
return t / NVAL;
}

int main() {
std::ifstream ifst("input.txt");	 // файл с данными о студенте, записанными в формате:
// <имя студента> <оценка по матерматике> ... <истории>
std::vector<Stud*> studs;		// массив студентов (вектор - это почти массив, только 
// его размер может увеличиваться во время выполнения
// и гарантируется что вектор будет уничтожен при выходе 
// из области видимости {утечки памяти не будет})

while (0 == ifst.eof()) {		// считываем студентов с файла	
Stud *stud = new Stud;		// один студент
ifst >> stud->name;
for (int i = 0; i < NVAL; ++i)
ifst >> stud->vals[i];
studs.push_back(stud);
}
ifst.close();

std::sort(studs.begin(), studs.end(), [](Stud* a, Stud *b) {
return rate(*a) < rate(*b);
});

for (std::vector<Stud*>::iterator it = studs.begin(); studs.end() != it; ++it) {
std::cout << (*it)->name;
for(int i = 0; i < NVAL; ++i)
std::cout << ' ' << (*it)->vals[i];
std::cout << std::endl;
}

// освобождаем память:
for (std::vector<Stud*>::iterator it = studs.begin(); studs.end() != it; ++it)
delete *it;

}

компилировать в mingw с флагом -std=c++11, как-то так:
g++ main.cpp -std=c++11 -o main

или поставить 2010 или более новую студию и в настройки проекта вписать тоже -std=c++11

Добавлено: пример файла input.txt:
Petrov 2 2 2 2
Sidorov 3 3 3 3
Medvedev 4 3 4 5
Putin 5 5 5 5
Shoigu 3 4 3 3
 
B

BAMP94

Спасибо огромное =) :) извини что сразу не ответил, запамятовал, очень выручил.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!