Loading...
Jovanna avatar Jovanna 186 Точки

C++ Advanced Task 05_04 - Split and Join

Здравейте,

доста се поизмъчих със задачите, не мога да разбера защо в Join.h  и  в Split.h не ми разпознава класа Song от main() файла.

Също, прочетох в нета че темплейтите не работят с ретърн-стойности, незнам дали е вярно това, тази задача доста ме затрудни като опитвам да я реша с темплейти, изобщо дали вярно съм подходила, може ли малко помощ? Ето кода: https://pastebin.com/ZJmZbPcG

Благодаря!

Тагове:
0
C++ Programming
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

Здравей,

Няма как да ти разпознае Song, защото Split.h и Join.h се include-ват преди декларацията на Song в main файла, а както говорихме в лекцията, include-овете просто вмъкват кода на съответния файл на мястото на include-а. Тоест в получаващият се expanded source кодът ти от Split и Join се намира преди кода на Song и съответно Song не е видим за тях.

Това е нарочно - идеята на задачата е да имплементирате Split и Join логиката без да можете директно да използвате Song - защото така си правите кода зависим от Song, и ако някой после иска да направи split за Company примерно, ще трябва да ви пренаписва кода. Цялата идея на template-ите е че не се интересувате от типа, а от операциите, които типа поддържа. Ако ще дефинираме темплейти, които предефинираме за специфични типове, защо изобщо са ни темплейтите?

Темплейтнатия код разчита, че типовете поддържат определени операции. Каква операция поддържа Song, дефинирана в main файла? Как можеш да я ползваш тази операция в твоя код, за да имплементираш join? В твоя код виждам, че вече си го направила донякъде - само че си пренаписала нещо, което вече го има написано, вместо да го ползваш директно.

И не, не е вярно, че темплейтите не работят с return стойности, както видяхме в calcPercentage, което връщаше int, double или Fraction в зависимост от типа на параметрите. Както и във факта, че vector класа има at() метод, който връща const референция към обект от типа на вектора.

Поздрави,

Жоро

1
Jovanna avatar Jovanna 186 Точки

Защо в Judge дава компилационна грешка, като  кодът тръгна с тестовете от условието и верен резултат (и на VS, и на Code::Blocks)?

Въпреки това, че тръгва във VS, защо ми дава съобшения за split  и  join, че са  undefined?

if (type == 'i') {
        std::vector<int> numbers = split<int>(line, separator);   //split  is undefined
        joined = join(numbers, joinStr);      //join   is undefined
    }

аналогично и на другите 2 места oт main()

Какво пропускам?

Ето кода на другите 2 файла: https://pastebin.com/GbFmQi8D

Поздрави!

0
08/10/2018 23:33:02
Jovanna avatar Jovanna 186 Точки

Не разбирам, къде бъркам компилационно, работи си програмата, но VS подчертава join и split (предходния коментар),  въпреки това тръгва?? Judge не я приема извъобще. Моля хеелп...

0
Todir avatar Todir 24 Точки

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

Аз обаче не ползвам този regex а сплитвам с getline. Компилатора на джъдж е неизвестна версия на GCC и ако по-старичка може и да няма regex. https://stackoverflow.com/questions/4716680/c0x-regex-in-gcc

Пробвай да сплитваш с getline

https://en.cppreference.com/w/cpp/string/basic_string/getline

Много кофти, че не изписва компилационната грешка.

1
09/10/2018 13:04:20
Jovanna avatar Jovanna 186 Точки

Много благодаря! Мина със 100!! :-)

Заместих с find&replace от string, би ли споделил как става с getline() ?

ето:

void ReplaceCharSeparatorByEmptySpace(std::string&line, char separator) {
    std::string findString{ std::string(1, separator) };
    std::string replaceString = " ";
    int lengthOfFindString = findString.size();
    size_t foundIndex = line.find(findString);   
    while (foundIndex != std::string::npos) {
        line.replace(foundIndex, lengthOfFindString, replaceString);
        foundIndex = line.find(findString, foundIndex + 1 + (lengthOfFindString));
    }
}

Поздрави!

0
Todir avatar Todir 24 Точки

Ами входния стринг се слага в istringstream и след това този стриим се подава на getline а за трети параметър се подава сепаратора.

getline(input stream, output string, delimiter)

и това в while цикъл в който друг istringstream вади каквото има в output string-a и го слага в променлива от тип Т която се слага във вектора.

Същото като когато ползваме

while(std::getline(std::cin, inputString) ) да четеме от конзолата ред по ред докато подаваме нещо, но се слага още един параметър да каже какво приемаме за край на реда.

Аз така го направих, но може да има и по-добър начин.

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