Софтуерно Инженерство
Loading...
+ Нов въпрос
kaminka avatar kaminka 5 Точки

Разграничаване на string-ове от getline. Memory Management Homework

Здравейте,

Извинявам се предварително ако въпроса ми е прекалено елементарен, но наистина не мога да го направя това. А именно да отделя различните string-ове веднъж след като съм прочела някакъв текст от конзолата. Трябва да мина през всяка дума, за да променя или проверя нещо в упражнения 5,6 и 7. 

Знам че за getline може да се зададе опция да взема до определен символ. Но в случая това което ме обърква е, че не е един символа, който разделя думите. Може да е празно място, може да е тире, може да е запетя, може да е скоба и тн. 

Как се прави така че всички тези символи да бъдат отчетени като разграничения между думите?

Камелия

0
C++ Programming 16/03/2017 10:37:03
georgi.stef.georgiev avatar georgi.stef.georgiev 916 Точки
Best Answer

Здравей,

За тези три задачи не е нужно да третираш входа като отделни думи, които отделно трябва да обработваш. Можеш директно да работиш върху целия вход като един цял string (който идва от getline).

За 5-та задача - как би решила проблема, ако задачата беше просто за масив от числа, където трябва да изпечаташ всяко положително число, което е непосредствено след отрицателно число (или някакъв друг критерий за едно число последвано от друго число)? Как би я решила, ако вместо да го изпечатваш, трябваше да го промениш? Какво общо има "определен вид число последвано от определен вид друго число" с разпознаването на първата буква на дума? Edit: ако имаш нужда от още помощ тук, в демо 17 от лекцията има функция, която брои думи - как би я ползвала нея, за да смениш началото на думата да е главна буква, вместо да броиш?

За 6-та задача - тук изобщо не става въпрос за отделни думи, просто трябва да преброиш колко пъти някакъв текст се среща. Трябва да направиш find-а, който браузърите и текстовите редактори правят, когато натиснеш Ctrl-F. Виж примера, какво значение би имало за него дали има space-ове (или каквото и да е) между думите? Как можеш да търсиш нещо в string със C++?

За 7-ма задача - подобно на 6-та, но трябва да последваш намирането със заместване. Тоест по някакъв начин трябва да промениш стария стринг, така че да запази всички символи освен тези на позициите, на които заместваш. Също така трябва да внимаваш с дължините - ако заместващия текст е по-кратък, общата дължина на стринга ще намалее, и обратно.

Помисли върху тези неща и пробвай отново да намериш решение. Иначе със C++ няма лесен вграден начин да разделяш думи по множество разделители. Един вариант е да запишеш входа в един stringstream и след това да ходиш символ по символ, пазейки каквото си взела до момента в друг stringstream. В момента, в който срещнеш някой разделител (тоест ще проверяваш всеки символ поотделно), това което си запазила до момента като символи е дума - можеш да я запазиш някъде, можеш да я обработиш по някакъв желан начин и т.н. Но това не е нужно за решението на която и да е от тези задачи :)

Поздрави,

Жоро

0
16/03/2017 11:32:11
kaminka avatar kaminka 5 Точки

Благодаря ти за отговора! 

Имам още един въпрос за задача 5. Защо toupper не се задейства като е в функцията? Нещо не правя както трябва сигурно. Пробвах го в main и си работи, но в makeTitleCases не ми се получава:

#include<iostream>
#include <string>

using namespace std;

void makeTitleCase(string& text);

int main()
{
    cout << "Please enter a line of text:" << endl;

    string inputLine;
    getline(cin, inputLine);

    makeTitleCase(inputLine);

    cout << inputLine << endl;

    return 0;
}

void makeTitleCase(string& text)
{
    for(int i=0; i<text.length(); i++){
        if(text[i] == ' ' || text[i]== ','){
            toupper(text[i+1]);
        }
    }

    return;
}

0
georgi.stef.georgiev avatar georgi.stef.georgiev 916 Точки

Провери го как е дефиниран и описан тук: http://www.cplusplus.com/reference/cctype/toupper/

Забележи, че не приема референция към променлива, а взема стойност и връща стойност :)

Това означава, че ако имаш char letter = 'a'; toupper(letter) няма да направи нищо директно. Но ако имаш char letter = 'a'; char uppercaseLetter = toupper(a) вече е друго нещо. Също както abs(-5) няма да промени -5 на 5, а ще ти върне ново число, което е абсолютната стойност, така и toupper връща стойност вместо да променя това, което си му подала. http://www.cplusplus.com/ is your friend за всякакви такива неща

0
gydigydi avatar gydigydi 12 Точки

text[i+1]=toupper(text[i+1]);

Така ще работи обаче не работи за първата буква.

Освен интервал и ","  има още доста неща "  ' ? ....12345  и т.н.

Може да използваш isalpha().

0
16/03/2017 18:50:26