Problem 3- Title Case
Здравейте, търся малко помощ за 3-та задача от лекцията Strings & Streams. Това е кодът, който съм написала досега, но в джъдж ми дава 83/100 и не се сещам какво пропускам. Благодаря предварително!
https://pastebin.com/58d065Sj
Здравейте, търся малко помощ за 3-та задача от лекцията Strings & Streams. Това е кодът, който съм написала досега, но в джъдж ми дава 83/100 и не се сещам какво пропускам. Благодаря предварително!
https://pastebin.com/58d065Sj
Привет!
Пробвай следния тест (.a.), трябва да ти върне (.A.), както и с другите препинателни знаци...
Може да се използва в решението:
!isalpha(text[i - 1]) ->
text[i] = toupper(text[i]);
Поздрави! :)
Здравейте, за да не започвам друга тема пиша тук. На мен също ми дава 83/100, но аз ползвам доста по-проста логика. Когато срещнеш интервал, следващия чар го направи главен. Добавих също за запетайка и точка. Уж не харесва Zero Test 1, а при мен на конзолата минава. Ето и скрийншот от входа и джъджа: https://imgur.com/a/EgcdUd0
Аз дълго дълбах на тая задача също. На judge му писна от моите грешни submition-и, които все гърмяха на тест 1. Та, хубаво си задал след кои символи да прави главна буква, НО какво става, ако символа е различен, или пък са два последователни? ;) Пробвай текста от условието на задачата "we will--rock you"
Освен това не може да изброиш всички символи от ASCII таблицата. То ще стане 300 реда код само, за да провери символите :D
Ta, накратко казано, моя жокер е - if(!isalpha(word[g]) && isalpha(word[g+1])) и ако това условие е изпълнено, направи го главна буква :)
Изобщо не помислих, какво ще се случи, ако има например две тирета :D Реално, като добавих тире в проверката даде 100/100, но това е да излъжа джъджа, а иначе решението не струва изобщо и сега ще седна да го поправя! Много ти благодаря за подсказката, не знаех, че има функция като isalpha, супер полезна е за задачата
Недей да си мислиш, че ако не ползваш хипер-мега-ултра яката функция кода ти не става за нищо. Един код е готин преди всичко когато е форматиран така, че да бъде достатъчно четим независимо дали е пълен с мега яките функции или е с по-проста логика. Да, функциите ти спестяват много писане, излишни проверки, променливи и куп други тем подобни. Но ако кодът ти е правилен, работи и е форматиран така, че всеки след теб който го ползва да го разбере, значи няма такова нещо като "не струва". Може би да е знак за програмист с по-малко опит, но не и за такъв който не знае какво прави и пише купища garbage :)
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 не обръща внимание на специалните знаци и не ги променя, както и главните букви. Та няма от какво да се притеснявам, че ще обърка тире и ще го направи главно :)
Главно тире :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, което е безмислено и бави изпълнението му.
@dmartinov
Това не е много добър съвет защото:
- Повече код -> повече възможности за грешки както при писането, така и при четенето
- Микрооптимизация -> прави се само когато скороста на приложението е неприемлива и е доказано, че този код наистина бави
- Компилаторът може и ще направи подобни оптимизации навсякъде, където това е безопасно
И съм съгласен и не :)
Първо - трябва да се учим да мислим и в тази насока. Далеч по-удобно е да го направим на този етап отколкото когато утвърдим стила си на писане и после да де налага да се учим на нови навици.
Второ - декларирането на една константна не е кой знае какво писане. Не бива да ни е страх да пишем по-практичен код, просто защото можем да сбъркаме :)
Трето - не бива да разчитаме само на компилатора. Той е там да ни помогне, но не и да пише вместо нас. Хубаво е да знаем кое в кода ни как работи и как би могло да се модифицира
Колегата MartinBG е прав - спокойно може да използваш for(int i=0; i<sentence.size(); ++i) Компилатора ще го оптимизира и кода няма да е по-бавен. От друга страна, ако създадеш още една променлива (константа) тя продължава да съществува до края на скоупа в който е дефинирана (това може да бъде цялата функция или дори цялата програма) а това е потенциален източник на грешки. Ако след това промениш размера на контейнера и трябва да го обходиш отново, ще ти трябва още една променлива :)