задача Format Lines от 15 юли 18г.
Искам да питам как да печатам на нов ред със ostringstream.
Въвеждам текст и после, той трябва да се форматира. Но аз питам как да го отпечатам на отделни редове, защото на мен ми го отпечатва на един ред и ми слива думи. Ето и кода който съм написала до момента. Как да преброя всички думи, не само тези в първият ред.
https://pastebin.com/Csewb1tx
това е входа, с който тествам:
every word in this text is
too wide
to
fit in the line width
###
1
https://pastebin.com/2sapBxuA
Да, ето това getline(std::cin, line).good() - по-точно ..good() това метод ли е към getline() и за какво се използва?
Това е конкатенация на ред + "интервал" , предполагам - text += line + " "; към текста.
Тук тази проверка с if , защо два пъти (currentLength > 0) и на втората проверка currentLength = 0; това не ми е ясно.
while (iss >> word) {
if (word.length() + currentLength < maxLength) { това е дължината на думите + " " и след всяка дума слагаме интервал, а да след това проверяваме за следваща дума,
if (currentLength > 0) { но защо в else проверката пак if (currentLength > 0)
out << " ";
++currentLength;
}
} else {
if (currentLength > 0) {
out << std::endl;
currentLength = 0;
}
}
out << word;
currentLength += word.length();
}
Ами доста, трудна задача. Благодаря!
good е метод на стриймовете (getline връща istream, в случая това е std::cin), който проверява състоянието на стрийма и връща false, ако някой от битовете му за грешки е вдигнат.
В повечето случаи тази проверка може да бъде пропусната (тогава ще бъде проверявано директно състоянието на стрийма), но тук съм я сложил за да е по-ясно какво всъщност се проверява в while:
Да, text += line + " "; е конкатенация на стрингове.
Ето една идея по-опростено откъм логика решение за тази част (ъпдейтнал съм и кода от линка по-горе):
Това, което се случва за всяка дума е да я добавим към стрийма и да увеличим дължината на текущия ред с дължината на думата.
Разликата е в това какво ще сложим преди нея, ако вече има нещо на текущия ред (currentLength > 0), като имаме два варианта:
- дължината на новата дума + дължината на текущия ред е по-малка от макс. допустимата дължина - в този случай добавяме интервал, който да раздели предходната и новата дума и увеличаваме текущата дължина с 1 (заради интервала).
- дължината на думата + дължината на текущия ред е по-голяма или равна от макс. допустимата дължина - тогава добавяме нов ред (т.е. думата ще бъде отпечатана на нов ред) и нулираме текущата дължина (този нов ред е празен към момента).
Мисля, че трябва да презапиша вектора в размер с дължината на вектора с pair после да трия и отначало да сравнявам
следващите 3 елемента и т.н.. Още ще мисля.
Обърната е логиката в проверката.
Замени редове 34-50 с този код и ще имаш коректен изход от програмата:
Имай предвид, че алгоритъмът, който използваш е много неефективен (при 100 отсечки и 1000 точки ще направиш 100 * 1000 = 100 000 проверки) и ще фейлне в Judge на 7/10 теста.
Ако искаш отвори нова тема за тази задача, защото е една от малкото по-алгоритмични задачи в този курс.
Да, ще напиша само, че утре. Бгодаря! Мислех си ако направя вместо вектор опашка и при сравнението да трия всяко начало, нали така става при queue FIFO няма ли да работи кода?