Loading...

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

BobyTopalova avatar BobyTopalova 26 Точки

задача 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

Тагове:
0
C++ Fundamentals 18/01/2019 13:52:39
MartinBG avatar MartinBG 4803 Точки
Best Answer

Най-лесно би било, ако прочетеш всички редове наведнъж и ги слееш в един стринг, като добавяш " " между редовете (за да не се сливат последната и първата дума на съседни редове), а после подадеш този стринг на std::istringstream, който да използваш за извличането на думите.

Самото отпечатване на резултата може да става директно към std::cout или към междинен std::оstringstream, чието съдържание да отпечаташ на конзолата накрая. Вторият вариант ще е по-бърз при голямо количество входни данни, тъй като печатането на конзолата е бавна операция.

И при двата варианта за нов ред може да използваш std::endl (най-добре) или '\n' (по-бърз, но не толкова гъвкав вариант).

 

 

Има пропуски в логиката на решението, което си постнала.

Ето едно примерно решение - питай, ако има нещо неясно в него.

0
29/12/2018 18:19:10
BobyTopalova avatar BobyTopalova 26 Точки

Да, ето това     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();
  }

Ами доста, трудна задача. Благодаря!

0
MartinBG avatar MartinBG 4803 Точки

good е метод на стриймовете (getline връща istream, в случая това е std::cin), който проверява състоянието на стрийма и връща false, ако някой от битовете му за грешки е вдигнат.

В повечето случаи тази проверка може да бъде пропусната (тогава ще бъде проверявано директно състоянието на стрийма), но тук съм я сложил за да е по-ясно какво всъщност се проверява в while:

while (getline(std::cin, line).good() && line.find("###") == std::string::npos) {...}

// Practically the same effect in most situations:

while (getline(std::cin, line) && line.find("###") == std::string::npos) {...}

 

 

Да, text += line + " "; е конкатенация на стрингове.

 

Ето една идея по-опростено откъм логика решение за тази част (ъпдейтнал съм и кода от линка по-горе):

  while (iss >> word) {
    if (currentLength > 0) {
      if (word.length() + currentLength < maxLength) {
        out << " ";
        ++currentLength;
      } else {
        out << std::endl;
        currentLength = 0;
      }
    }
 
    out << word;
    currentLength += word.length();
  }

 

Това, което се случва за всяка дума е да я добавим към стрийма и да увеличим дължината на текущия ред с дължината на думата.

Разликата е в това какво ще сложим преди нея, ако вече има нещо на текущия ред (currentLength > 0), като имаме два варианта:

- дължината на новата дума + дължината на текущия ред е по-малка от макс. допустимата дължина - в този случай добавяме интервал, който да раздели предходната и новата дума и увеличаваме текущата дължина с 1 (заради интервала).

- дължината на думата + дължината на текущия ред е по-голяма или равна от макс. допустимата дължина - тогава добавяме нов ред (т.е. думата ще бъде отпечатана на нов ред) и нулираме текущата дължина (този нов ред е празен към момента).

0
29/12/2018 19:19:41
BobyTopalova avatar BobyTopalova 26 Точки

Мисля, че трябва да презапиша вектора в размер с дължината на вектора с pair после да трия и отначало да сравнявам

следващите 3 елемента и т.н.. Още ще мисля.

0
MartinBG avatar MartinBG 4803 Точки

Обърната е логиката в проверката.

Замени редове 34-50 с този код и ще имаш коректен изход от програмата:

  for (int d : dots) {
    bool isIn = false;
    for (auto const& it : ranges) {
      if (it.first <= d && it.second >= d) {
        isIn = true;
        break;
      }
    }
    cout << (isIn ? "in" : "out") << endl;
  }

 

Имай предвид, че алгоритъмът, който използваш е много неефективен (при 100 отсечки и 1000 точки ще направиш 100 * 1000 = 100 000 проверки) и ще фейлне в Judge на 7/10 теста.

 

Ако искаш отвори нова тема за тази задача, защото е една от малкото по-алгоритмични задачи в този курс.

0
BobyTopalova avatar BobyTopalova 26 Точки

Да, ще напиша само, че утре. Бгодаря! Мислех си ако направя вместо вектор опашка и при сравнението да трия всяко начало, нали така става при queue FIFO няма ли да работи кода?

0
BobyTopalova avatar BobyTopalova 26 Точки

 


 



 

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