znaki w tablicy-klasy

0

Mam do napisania program, który będzie zawierał klasę, a w klasie metody takie jak:

  1. wypisz tekst(wypisze tekst, który wcześniej użytkownik wprowadził do tablicy),
  2. usuń powtarzające się znaki (usunie z tablicy znaki, które się powtarzają-np przy słowie tartak da wynik tark)
  3. wypisz tyle znaków od lewej ile chce użytkownik(np przy słowie tartak i liczbie znaków 3 da wynik tar)...
#include <cstdlib>
#include <iostream>

using namespace std;
class napis
{
    public:
        char tekst[20];
        void wypisz();
        void usunPow();//zlikwiduje powtórzenia znaków
        void lewe(int);//zostawić z napisu podaną ilość znaków .lewe(5)=kompu
};
int main(int argc, char *argv[])
{
    int ile;
    napis wyraz;
    cout<<"Napisz wyraz max 20-literowy: "<<endl;
    wyraz.wypisz();
    wyraz.usunPow();
    cout<<"Ile liter ma byc wyswietlonych: "<<endl;
    cin>>ile;
    wyraz.lewe(ile);
    system("PAUSE");
    return EXIT_SUCCESS;
}
void napis::wypisz()
{
    for(int i=0; i<20; i++)
        tekst[i]=' ';
    cin.getline(tekst,21);
    cout<<tekst<<endl;
}
void napis::usunPow()
{
    cout<<"Tekst bez powtorzen to: "<<endl;
    for(int i=0; i<19; i++)
    {
        for(int j=i+1; j<20; j++)
            if(tekst[j]==tekst[i])
            {
                for(int z=j;z<20; z++)
                    tekst[z]=tekst[z+1];
            };
        cout<<tekst[i];
    };
    cout<<endl;
};
void napis::lewe(int ile)
{
    int dlugosc = strlen(tekst);
    for(int i=0; i<ile && i < dlugosc; i++)
        cout<<tekst[i]<<",";
    cout<<endl;
};   

Moje pytanie to czy ma ktoś pomysł na napisanie tej drugiej funkcji i co jest nie tak w tym kodzie...?
Z góry pozdrawiam i dziękuję za jakąkolwiek pomoc

0

co do drugiej funkcji, to rozwiązanie może nie optymalne, ale działa:

voidusunPow(){
   int tab[256];
   for(int i=0; i<256; i++)tab[i]=0;
   for(int i=0; i<20; i++){
      if(tab[tekst[i]])tekst[i]='\0';
      else tab[tekst[i]]=1;
   }
}

oczywiście można ograniczyć pierwszą pętle tylko do liter, czy cyfr, zależy co użytkownik może wpisać, ale to co napisałem to do ogólnego przypadku pasuje.
//aha, teraz patrze na twój kod:D pousuwaj średniki za klamrami gdzie nie trzeba

0

Ale po co dodatkowa tablica? Ta funkcja Twoja zwraca same 0 lub 1...a mi chodzi o to że jak wpiszę np kamilkamilkamilkamil to ma wyświetlić kamil
jeżeli wpiszę kammmiiiiill to też ma mi wyświetlić kamil...

0
  1. Ze tak zapytam: A kto ci broni uzywac algorytmow z STL ??
  2. W tym przypadku pomoze ci funkcja unique http://cplusplus.com/reference/algorithm/unique/
  3. Zapamietaj ze funkcje maja robic to co powinny(usuwac duplikaty) a nie to czego nie powinny(wyswietlac wynik).
  4. Hermetyzacja - dane prywatne, metody publiczne! http://pl.wikipedia.org/wiki/Hermetyzacja
  5. system("PAUSE") - ile razy wspominalem o przenosnosci kodu??
  6. Dlaczego metoda wypisz pobiera dane jak jej nazwa wskazuje na ich wyswietlanie ?? Byc moze potrzebujesz dodatkowej metody pobierz/wczytaj/get_text/get itp. ?? Albo lepiej uzyc konstruktora ??
0
  1. Nie wiem o co chodzi...:/
  2. Nie bardzo umiem angielski...
  3. Zapamiętam na przyszłość
  4. To nie ja ustalałem co ma być prywatne a co publiczne tylko Pani prowadząca zajęcia...
  5. Jestem od niedawna na tym forum...
  6. Najpierw program musi mi działać poprawnie a potem go poprawie pod tym względem...
0

a testowałeś funkcję którą ci napisałem? bo chyba nie... a skoro mówisz że ona "zwraca" cokolwiek, to wygląda na to że jej nawet nie czytałeś

0

Sorki małe przejęzyczenie się w pisaniu:P
Nie chodziło mi o to że zwraca ...
Nie rozumiem tego fragmentu:
voidusunPow()//chyba powinno to wyglądać tak: void napis::usunPow()
{
int tab[256];
for(int i=0; i<256; i++)tab[i]=0;
for(int i=0; i<20; i++){
if(tab[tekst[i]])tekst[i]='\0';//jaki tutaj jest warunek? if(tab[tekst[i]])?
else tab[tekst[i]]=1;
}
}

0

Rzeczywiście działa tylko teraz trzeba ładnie przesunąć elementy w tablicy...

Możesz wyjaśnić ten fragment kodu po kolei?

0

no tak, nie zrobiłem spacji między void i nazwą funkcji, i napisałem to jako zwykłą funkcję a nie metodę klasy, ale myślałem ze się domyślisz

0

Tak domyśliłem się i przepraszam za wcześniejszy post...zaoszczędziłbym wielu ludziom czasu...Mam tylko prośbę czy mógłbyś to jakoś mi po ludzku wytłumaczyć w jaki sposób funkcja usuwa powtarzające się znaki? Dlaczego np deklarujesz dodatkową tablicę itp?

0

dodatkowa tablica to odpowiednik tablicy ascii(stąd 256 znaków). Na początku każdemu rekordowi przypisuję 0.
Kolejna pętla to przejście przez wszystkie znaki tekstu.
Jeśli tab[tekst[i]](czyli tablica tab o indeksie numeru ascii danego znaku) jest różna od 0, to znaczy że znak juz wystąpił, i zapisujemy "nicość" w jego miejscu. W przeciwnym wypadku zapisujemy w tablicy "1", co będzie oznaczało że taki znak właśnie się pojawił

0

Nie czaje...:/Mógłbyś podać jakiś przykład?
A w tym warunku if nie trzeba dodać jeszcze !=0?

0

nie trzeba nic dodawać.
A przykład? nie wiem jak mam ci to wytłumaczyć na przykładzie.

0

a ja ci to zakoduje tak, żebyś nie wiedział co i jak :P.

#include <algorithm>

char *b,*e;
b=tekst;
e=strlen(tekst)+1;
for(;*b;++b) {
    std::remove(b+1,e,*b);
}

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