Loading...
Hyulia avatar Hyulia 2 Точки

Problem 3- Title Case

Здравейте, търся малко помощ за 3-та задача от лекцията Strings & Streams. Това е кодът, който съм написала досега, но в джъдж ми дава 83/100 и не се сещам какво пропускам. Благодаря предварително!

https://pastebin.com/58d065Sj

Тагове:
0
C++ Fundamentals
galin_kostadinov avatar galin_kostadinov 166 Точки

Привет!

Пробвай следния тест (.a.), трябва да ти върне (.A.), както и с другите препинателни знаци...

Може да се използва в решението:

!isalpha(text[i - 1]) -> 
text[i] = toupper(text[i]);

Поздрави! :)

0
NinessonC avatar NinessonC 4 Точки

Здравейте, за да не започвам друга тема пиша тук. На мен също ми дава 83/100, но аз ползвам доста по-проста логика. Когато срещнеш интервал, следващия чар го направи главен. Добавих също за запетайка и точка. Уж не харесва Zero Test 1, а при мен на конзолата минава. Ето и скрийншот от входа и джъджа: https://imgur.com/a/EgcdUd0

#include <iostream>
#include <string>
#include <locale>

using namespace std;

int main() {
	string sentence;
	getline(cin, sentence);
	sentence[0] = toupper(sentence[0]);
	
	for (size_t i = 0; i < sentence.length(); i++)
	{
		if (sentence[i] == ' ' || sentence[i] == ',' || sentence[i] == '.')
		{
			sentence[i + 1] = toupper(sentence[i + 1]);
		}
	}

	cout << sentence << endl;

	return 0;
}

 

0
dmartinov avatar dmartinov 37 Точки

Аз дълго дълбах на тая задача също. На judge му писна от моите грешни submition-и, които все гърмяха на тест 1. Та, хубаво си задал след кои символи да прави главна буква, НО какво става, ако символа е различен, или пък са два последователни? ;) Пробвай текста от условието на задачата "we will--rock you" 

Освен това не може да изброиш всички символи от ASCII таблицата. То ще стане 300 реда код само, за да провери символите :D

Ta, накратко казано, моя жокер е  - if(!isalpha(word[g]) && isalpha(word[g+1]))  и ако това условие е изпълнено, направи го главна буква :)

0
08/10/2019 17:51:43
NinessonC avatar NinessonC 4 Точки

Изобщо не помислих, какво ще се случи, ако има например две тирета :D Реално, като добавих тире в проверката даде 100/100, но това е да излъжа джъджа, а иначе решението не струва изобщо и сега ще седна да го поправя! Много ти благодаря за подсказката, не знаех, че има функция като isalpha, супер полезна е за задачата

0
dmartinov avatar dmartinov 37 Точки

Недей да си мислиш, че ако не ползваш хипер-мега-ултра яката функция кода ти не става за нищо. Един код е готин преди всичко когато е форматиран така, че да бъде достатъчно четим независимо дали е пълен с мега яките функции или е с по-проста логика. Да, функциите ти спестяват много писане, излишни проверки, променливи и куп други тем подобни. Но ако кодът ти е правилен, работи и е форматиран така, че всеки след теб който го ползва да го разбере, значи няма такова нещо като "не струва". Може би да е знак за програмист с по-малко опит, но не и за такъв който не знае какво прави и пише купища garbage :)

0
spasimira25 avatar spasimira25 25 Точки

100/100

#include <iostream>
#include <string>
using namespace std;
int main() {

    string sentence;
    getline(cin, sentence);
    for (int i = 1; i<sentence.length() ; ++i){
        if ((!isalpha(sentence[i]))){ sentence[i+1] = toupper(sentence[i+1]);}
        }
    sentence[0]=toupper(sentence[0]);
    cout << sentence << endl;
}


Преди да разбера, че има isAlpha и isDigit използвах:

if ((sentence[i] < 65 || sentence[i]>90) && (sentence[i] < 97 || sentence[i]>122)){
            sentence[i+1] = toupper(sentence[i+1]);
        }

По същество е същото, просто проверява дали не е буква. И ако не е - прави главна следващата. toupper не обръща внимание на специалните знаци и не ги променя, както и главните букви. Та няма от какво да се притеснявам, че ще обърка тире и ще го направи главно :)

0
dmartinov avatar dmartinov 37 Точки

Главно тире :D Това ми хареса.

Иначе един съвет - направи си константа, която да държи size-a на sentence-a и я позлвай нея в цикъла.

Вместо for(int i = 0; i < sentence.size(); ++i)  го направи така:

const int sentenceSize = sentence.size();

for(int i = 0; i < sentenceSize; ++i)

Просто е по-бързо иначе при всяко завъртане на цикъла ще правиш проверка на size-a, което е безмислено и бави изпълнението му.

0
MartinBG avatar MartinBG 4803 Точки

@dmartinov

Това не е много добър съвет защото:

- Повече код -> повече възможности за грешки както при писането, така и при четенето

- Микрооптимизация -> прави се само когато скороста на приложението е неприемлива и е доказано, че този код наистина бави

- Компилаторът може и ще направи подобни оптимизации навсякъде, където това е безопасно

0
20/10/2019 21:23:37
dmartinov avatar dmartinov 37 Точки

И съм съгласен и не :)

Първо - трябва да се учим да мислим и в тази насока. Далеч по-удобно е да го направим на този етап отколкото когато утвърдим стила си на писане и после да де налага да се учим на нови навици.

Второ - декларирането на една константна не е кой знае какво писане. Не бива да ни е страх да пишем по-практичен код, просто защото можем да сбъркаме :)

Трето - не бива да разчитаме само на компилатора. Той е там да ни помогне, но не и да пише вместо нас. Хубаво е да знаем кое в кода ни как работи и как би могло да се модифицира

0
kolioi avatar kolioi 641 Точки

Колегата MartinBG е прав - спокойно може да използваш for(int i=0; i<sentence.size(); ++i) Компилатора ще го оптимизира и кода няма да е по-бавен. От друга страна, ако създадеш още една променлива (константа) тя продължава да съществува до края на скоупа в който е дефинирана (това може да бъде цялата функция или дори цялата програма) а това е потенциален източник на грешки. Ако след това промениш размера на контейнера и трябва да го обходиш отново, ще ти трябва още една променлива :)

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