Професионална програма
Loading...
+ Нов въпрос
Smeshan avatar Smeshan 37 Точки

01. Sorting Players

Здравейте,

упражнявам се върху стари изпити и попаднах на тази задача тук.
И написах това решение: https://pastebin.com/UY3F5kkD
Може би не е най-елегатното, но все пак мисля, че трябва да работи, а получавам само 40/100 :?

Ще съм благодарен, ако някой може да отдели време и погледне какво може би изпускам.

Поздрави,
Илиян Павлов

Тагове:
0
C++ Fundamentals
j.petrov_90 avatar j.petrov_90 248 Точки

Привет, колега,

За жалост в миналите издания на С++ Fundamentals се учеха и други структури от данни.
Тези знания щяха да са ти полезни при решаването на тази задача.

Минали курсисти многократно изразяваха мнение, че упражненията трябва да са повече и затова с колегите от Софтуни разширихме 2та курса C++Fundamentals and C++Advanced into C++Fundamentals, C++Advanced, C++OOP.

Структурата от данни map щеше да ти реши 80% от задачата.

Все пак няколко думи за твоето решение:
Функцията ти 
void dealWithMultiAttempts(std::vector<std::string>& names, std::vector<int>& scores)
ми е твърде сложна.
Разбирам какво прави, но е твърде сложна.
Помисли как - не да въвеждаш всички данни и след това да се бориш с дубликати.
Например ако вече намериш дубликат можеш просто да добавяш нова информация към него.

Явно те е страх да върнеш контейнер по value от функцията.
Пробвай го, ще увеличи четимостта на кода ти поне 2 пъти.

Грешно се опитваш да четеш входа.
Ти го четеш по редове. След това четеш имената. След това четеш точките. Слет това се мъчиш динамично да обединиш последните 2 и става пълна каша.
Щом знаеш формата на входа... форматът на всеки ред...пробвай да го заредиш в поток и да четеш от потока.
Това със line.find(" ") е излишно.

Това е общо взето. Трудността ти в задачата сам си си я създал (това разделяне и в последствие обединяване).

Без 100 от 100 да не се връщаш! :)
Жив и здрав

1
Smeshan avatar Smeshan 37 Точки

100/100 :)

Благодаря за отговора, възползвах се от коментарите и ще ги имам в предвид и за напред.

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>

bool isItADuplicate(const std::string& nameOfPlayer,
                    const std::vector<std::string>& names,
                    int& index){
    for (int i = 0; i < names.size(); ++i) {
        if (nameOfPlayer == names[i]) {
            index = i;
            return true;
        }
    }
    return false;
}

void readInput(std::vector<std::string>& names, std::vector<int>& score) {
    std::string nameOfPlayer;
    int winsOfPlayer = 0;
    int losesOfPlayer = 0;
    int index = 0;
    int result = 0;

    std::string text;
    getline(std::cin, text);
    while (text != "End") {
        std::istringstream istr(text);   
        istr >> nameOfPlayer >> winsOfPlayer >> losesOfPlayer;
        result = winsOfPlayer - losesOfPlayer;
        if (isItADuplicate(nameOfPlayer, names, index)) {
            score[index] = score[index] + result;
            getline(std::cin, text);
            continue;
        }  
        names.push_back(nameOfPlayer);
        score.push_back(result);
        getline(std::cin, text);
    }
}

std::vector<std::string> sortPlayers(const std::vector<std::string>& names,
                                     const std::vector<int>& score) {
    std::vector<std::string> forPrint;
    for (int i = 0; i < names.size(); ++i) {
        //combine name + score in order to sort them
        forPrint.push_back(names[i] + ' ' + std::to_string(score[i]));
    }
    std::sort(forPrint.begin(), forPrint.end());
    return forPrint;
}

int main()
{
    std::vector<std::string> names;
    std::vector<int> score;
    std::vector<std::string> results;

    readInput(names, score);
    results = sortPlayers(names, score);

    //print
    for (std::string player : results) {
        std::cout << player << std::endl;
    }
}


Не съм на напълно доволен как го написах, но може би като вземем новите неща, ще намеря и по-удовлетворяващ начин за решение.

Отново благодаря!
Поздрави,
Илиян Павлов

0
j.petrov_90 avatar j.petrov_90 248 Точки

Хе-хе, много хитро си подходил като си сортирал стринговете - браво!

Надявам се виждаш градацията от предишното до сегашното си решение.
Разлика от земята до небето!
Като вземем другите структури от данни ще видиш как задачата би се решила по-лесно.

Функциите ти isItADuplicate и readInput са повече от чудесни.

Бързи козметични добавки:
std::vector<std::string> results;
results = sortPlayers(names, score);

Можеше да стане на 1 ред и да бъде константа:
const std::vector<std::string> results = sortPlayers(names, score);

Също така при range based for-loop 
//print
for (std::string player : results) {
  std::cout << player << std::endl;
}

Няма нужда да копираш стринга. Можеше player да бъде const reference

0
21/04/2021 11:33:40