Массив описать как указатель на указатель C++

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
uncontrol1
Сообщения: 11
Зарегистрирован: 27 дек 2015, 10:09

Даны массивы F-фамилий студентов и S-результаты сессии (5 оценок) , причем s- результат сессии F студента.
Отсортировать массив S по сумме баллов и вывести на экран вместе с фамилиями.
"Нужно инициализировать F и S"! (нужна помощь в этом)

Код: Выделить всё

#include "stdafx.h"
#include <iostream>
#include<algorithm>
#include<numeric>
using namespace std;
 
bool sortSFunc(int**a, int**b) {
    int aS = 0, bS = 0;
    aS = accumulate(*a, *a + 5, 0);
    bS = accumulate(*b, *b + 5, 0);
        return aS > bS;
}
int main(int argc,char**argv)
{
    int n = 4;
    char** F;
    int** S;
 
    int*** sortedS = new int**[n];
    for (int i = 0; i < n; i++)
        sortedS[i] = S + i;
    sort(sortedS, sortedS + n, sortSFunc);
    for (int i = 0; i < n; i++)
        cout << F[sortedS[i] - S] << ":" << accumulate(*sortedS[i], *sortedS[i] + 5, 0) << endl;
    delete[] sortedS;
    return 0;
}
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Да хоть инициализируй, хоть оставляй как есть, результат один будет - не заработает ничего. С указателями напутано, ведь компаратор должен принимать сравниваемые значения по константной ссылке, а не по указателю (см. здесь). А ещё скажу, что подход выбран неожиданный, я даже с первого взгляда не понял, как это работает - показалось, что вообще какой-то бред написан. Если бы я выполнял такую задачу, то сделал бы массив индексов и отсортировал бы его. Здесь же вместо ожидаемого массива индексов сделан массив указателей на строки с оценками, а при выводе от значения отнимается начало на массив, в результате чего мы всё равно приходим к индексу. Не логичнее ли хранить изначально значения без этой прибавки, что сведётся к сортировки массива из значений 0, 1, 2, 3?

По самому вопросу инициализации. Делается она вот так:

Код: Выделить всё

const int STUDENTS_AMOUNT = 4;
const int MARKS_AMOUT = 5;

const char* F[STUDENTS_AMOUNT] = {"Petrov", "Ivanov", "Sidorov", "Bobrov" };

int S[STUDENTS_AMOUNT][MARKS_AMOUT] = 
{
   {3, 4, 5, 2, 4},
   {5, 2, 5, 5, 4},
   {5, 4, 4, 2, 3},
   {1, 1, 2, 2, 1}
};
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить