Przenoszenie znaków bez powtórzeń z jednej tablicy do nowej

0

Witam, mam problem odnośnie przenoszenia znaków z jednej tablicy, w której występują te same wielokrotnie do nowej tablicy, w której mamy te same znaki, tyle że, każdy ma występować w niej tylko raz, oto kod jaki udało mi się na ten moment utworzyć, a problem polega na tym, że nie wiem jak ustalić rozmiar tablicy znaków, w której będą przechowywane znaki, wszystko ok, gdy wielkość tablicy określę w kodzie programu, druga sprawa co to za znaki, które wyskakują(załącznik)?

#include <iostream>


using namespace std;

void wytnij(char tab1[], char tab2[],int & rozm)
{
     tab1[0]=tab2[0];
     bool x;
     int k=1;//licznik nowej nowej tablicy
     for(int i=1; i<rozm;i++)//i to licznik starej tablicy
     {x=0;
         for(int j=0;j<k;j++)
         {if(tab1[i]==tab2[j])
                 x=1;}//jezeli x != 0 to ma nic nie robic, a jeżeli =0 to przypisuje nie powtarzającą się liczbę ze starej tablicy
          if(x==0)
         {tab2[k]=tab1[i];}
             k++;}
}
int main()
{
    int rozm;
    cin>>rozm;
    char orginal[rozm];
    cin.getline(orginal,rozm);
    char kopia[rozm];
    wytnij(orginal, kopia, rozm);

    for (int z =0; z < rozm; z++)
    {
        cout << kopia[z];
        }
        cout << endl;

    system("PAUSE");
    return 0;
}
1

Nie tworzy się tak tablic.Od tego służy coś co się nazywa vector.

0
  1. Dlaczego nikt nie odpowiada w moim wątku?
  2. Ponadto tak jak pisał @SnaaPP C++ nie ma VLA, rozmiary tablic muszą być znane w czasie kompilacji
1

Czy to muszą być tablice w takiej formie?

Jeśli nie std::string też jest tablicą znaków (w nim zapisujesz tekst do analizy).
W kontenerze std::set<> zapisujesz wszystkie znaki po kolei ze stringa, a set sam odrzuci duplikaty.

0

Wyjściowa tablica może mieć max. 256 znaków. Czyli masz górne ograniczenie. Do tego - spróbuj wymyślić, jak zmodyfikować Twoją funkcję wytnij tak, aby działała w czasie O(n), a nie O(n^2).

0

Czyli muszę zgłębić bardziej c++ myślałem, że ze zwykłymi podstawami przejdzie kod, zagłębie sie w tym dziś bardziej, ogólnie to tylko część programu, który chciałem stworzyc, a miał polegać na tym, aby w podanym wyrazie/zdaniu liczył liczbę liter i wyswietlil bez powtórzeń każda literę występującą i ile razy jest użyta w wyrażeniu, dałoby radę napisać ten kod, ale nie zahaczając o struktury? sorki nie zauważyłem, że zdublowałem, miałem chwilowe problemy z internetem

0

Jeśli dodatkowo program ma liczyć ilość wystąpień danej liczby, wygodne będzie użycie std::map<char, int>,
lub jeśli zależy ci na szybkości wykonania użyj statycznej tablicy, np. int characters[255] gdzie indeks odpowiada kodowi ASCII
danego znaku i inkrementujesz wartość pod określonym indeksem (kodem). Tablicę inicjalizujesz zerami, a na koniec wypisuje te znaki,
których wartości są różne od zera.

0

Według Twoich kryteriów to najprościej:

  1. Stworzyć tablicę intów o rozmiarze odpowiadającym ilości liter w alfabecie (jeśli cyfry mają być liczone to dolicz cyfry). Jeśli uwzględniasz wielkość liter również musisz się zastanowić przy tworzeniu tej tablicy. {czyli masz już zdefinowany rozmiar tablicy nic tylko tworzyć}
  2. Tablica będzie indeksowana od 0 .. n - 1 znaków, czyli dajmy np w indeksie '0' masz liczbę wystąpień litery 'A', w indeksie 1 masz ... litery 'B' itd.
  3. Iterujesz wyraz / zdanie po literce, zamieniasz ją na kod ASCII (czyli np 65 dla A) i odejmujesz pewną stałą, czyli jeśli uwzględniasz wielkie i małe litery (bez cyfr) to odejmujesz 65. Powstał Ci indeks w tablicy, który należy zinkrementować (bo wystąpiła literka). Czyli coś takiego:
    wystapienia[obecnyKodASCII - STALA], gdzie stała to 65(patrz wyżej), obecnyKodASCII chyba wiadomo.
  4. Gdy iteracja dobiegła końca masz już wszystkie litery policzone. Teraz musisz zrobić selekcję jeśli chcesz (np pokazać tylko te litery, które mają więcej niż 0 wystąpień)
    Jak pokazać te litery ? Analogicznie do obecnej wartości indeksu tablicy, po której iterujesz dodać STALA, zamienic na ascii i gotowe ;]
0

Ok, dziękuję za pomoc, a mógłby jeszcze ktoś powiedzieć czemu z tego kodu w ogóle nie wymienia pierwszej litery jeżeli określiłem, że pierwszy element tablicy źródłowej jest taki sam jak nowej tablicy? i co oznaczają te dziwne znaki przedstawione na screen'ie?

0
#include <iostream>


using namespace std;

void wytnij(char tab1[], char tab2[])
{
     tab1[0]=tab2[0];
     bool x;
     int k=1;//licznik nowej nowej tablicy
     for(int i=1; i<20;i++)//i to licznik starej tablicy
     {x=0;
         for(int j=0;j<k;j++)
         {if(tab1[i]==tab2[j])
                 x=1;}//jezeli x != 0 to ma nic nie robic, a jeżeli =0 to przypisuje nie powtarzającą się liczbę ze starej tablicy
          if(x==0)
         {tab2[k]=tab1[i];}
             k++;}
}
int main()
{
    cout<<"podaj ciag znakow :"<<endl;
    char orginal[20];
    cin.getline(orginal,20);
    char kopia[20];
    wytnij(orginal, kopia);
    cout<<"wystepujace litery to:"<<endl;
    for (int z =0; z < 20; z++)
    {
        cout << kopia[z];
        }
        cout << endl;

    system("PAUSE");
    return 0;
} 

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