SPOJ skracanie identyfikatorów

1

Witam.
Od pewnego czasu rozwiązuję zadania na Spoju. Ostatnio robiłem to: http://pl.spoj.com/problems/WI_IDEN/.
Program ma za zadanie skrócić podany tekst do podanej długości zgodnie z pewnymi zasadami. Niestety kod nie działa gdy należy zmienić samogłoskę i.Zamiast ALMKTPS zwraca ALMKTIP. Szukałem błędu ale nie mogłem go znaleźć.
Będę wdzięczny za każdą podpowiedź lub krytykę kodu.

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;
int n;
int dlugosc=0;
int k=0;
bool czyZmienic=false;
string tekst;
void wprowadz()
{
    cin>>n;
    cin>>tekst;
}
void sprawdzDlugosc()
{
    if(tekst.length()<=n)
    {
        cout<<tekst;
        exit(0);    //wylacza program gdy tekst ma odpowiednia dlugosc
    }

}
void usunZnak(int j)
{
    tekst.erase(j,1);
    sprawdzDlugosc();
}
void zmien()
{
    sprawdzDlugosc();
    for(int i=tekst.length();i>0;i--)
    {
        if(tekst[i]=='$'||tekst[i]=='_')
        {
            usunZnak(i);
        }
    }
    for(int i=tekst.length();i>0;i--)
    {
        if(tekst[i]>='0'&&tekst[i]<='9')
        {
            usunZnak(i);
        }
    }
    for(int j=0;j<tekst.length();j++)
    {
        if(tekst[j]=='a'||tekst[j]=='e'||tekst[j]=='i'||tekst[j]=='o'||tekst[j]=='u'||tekst[j]=='y'||tekst[j]=='A'||tekst[j]=='E'||tekst[j]=='I'||tekst[j]=='O'||tekst[j]=='U'||tekst[j]=='Y')
        {
            if(czyZmienic)
            {
               usunZnak(j);
            }
            czyZmienic=true;
        }
    }
    for(int i=tekst.length()-1;i>0;i--)
    {
        usunZnak(i);
    }


}
void wypisz()
{
    cout<<tekst;
}
int main()
{
    wprowadz();
    zmien();
}
1

Nie, nie, nie.
Ten podział na funkcje nie ma sensu, wyrzuć ten kod i napisz od nowa.
Unikaj także zmiennych globalnych.

1

czy na pewno indeks ostatniego znaku zmiennej tekst to tekst.length()?

0

Zdanie jest tak napisane, że bierzesz treść zdania i wklejasz go do kodu, a następnie krok po kroku tekst języka naturalnego zamieniasz na kod danego języka.
Na serio polecam tą metodę, a okaże się, że zadanie jest banalnie proste.

Przydatna wskazówka:
Dla każdego kroku, napisz sobie osobną funkcję, która będzie wykrywać czy dany znak należy odrzucić.
Jeśli tak to zrobisz, to okaże się, że każdy krok wygląd tak samo a różni się jedynie wywołaniem właśnie tej funkcji (predykatu).

0

Hehe, mój wykładowca stworzył te zadanie lol xD

0

Błąd znalazłem. Funkcja .erase () usuwa znak i przez to jak sa dwie samogłoski to ta druga jest pomijana. Kod za radą pierwszej osoby trochę zmienię.
Dzięki za odpowiedzi!

1 użytkowników online, w tym zalogowanych: 0, gości: 1