Здравей отново, и благодаря за условието!
Условната конструкция в началото на първия цикъл for
:
if(s[i]<48 || s[i]>57)
{
s.erase(i,1);
}
изтрива символа с индекс i
от стринга s
, в случай че той е различен от цифра (в това множество влиза и десетичната точка). След тази операция на позиция i
в стринга ще бъде символът, който непосредствено е следвал току що изтрития символ. Ако този символ е буква, ще се изпълни else
-клаузата на следващия if
, след което цикълът ще увеличи с 1 индекса i
, и като следствие от това тази буква няма да бъде изтрита на следващата итерация на цикъла, тъй като на тази итерация индексът ще сочи една позиция след нея. Така при входен стринг:
AeK78cvR0m1kk.7b7c89pMpp04p
ще получим резултат:
e78v01k7789Mp04.00
Проблем имаме също и с втората условна конструкция:
if(s[i] == '.')
{
toch = true;
k=i+3;
}
else
{
toch = false;
}
която би запомнила позицията на последната, вместо първата, неизтрита десетична точка от стринга, както и би задала стойност false
на променливата toch
, ако последният разгледан символ от стринга е различен от десетична точка.
За да отстраним тези проблеми, бихме могли да пренапишем първия цикъл във вида:
for(long long i = 0; i < s.size(); i++)
{
if (!toch && s[i] == '.')
{
toch = true;
k = i + 3;
}
else if (s[i] < 48 || s[i] > 57)
{
s.erase(i,1);
i--;
}
}
Тъй като вторият цикъл for
има същия проблем - пропуска всеки втори символ вследствие на триенето - бихме могли да махнем увеличаването на брояча на всяка стъпка:
for (long long i = k; i < s.size(); )
{
s.erase(i,1);
}
или, което би било по-ефективно, да заменим цикъла с
if (k < s.size()) {
s.erase(k, s.size() - k);
}
За да обхванем и случаите, в които s
съдържа десетична точка, но броят на цифрите след нея е по-малък от 2, можем да изведем крайния резултат (след като всички ненужни символи са били отстранени) с преобразуване на s
към тип double
и форматиране:
cout << fixed << setprecision(2) << stod(s) << endl;
Надявам, че горните забележки биха били от полза.
Поздрави,
Иван
P. S. По принцип, изтриването на елементи от някакъв контейнер (напр. стринг), докато итерираме по него, създава предпоставки за допускане на грешки. Друг подход за решаването на задачата би могъл да бъде с едно обхождане на изходния стринг, s
, да копираме всички символи, които ни интересуват (цифри и точката с най-малък индекс, ако такава има) в помощен стринг, да кажем t
, след което да отпечатаме необходимите символи от t
.