Loading...
Smeshan avatar Smeshan 89 Точки

01. Sorting Players

Здравейте,

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

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

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

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

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

За жалост в миналите издания на С++ 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 89 Точки

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 373 Точки

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

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

Функциите ти 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
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.