Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wszystkie kombinacje danej ilości liter w "słowie"

Ostatnio zmodyfikowano 2012-08-13 22:20
Autor Wiadomość
matka5432
Temat założony przez niniejszego użytkownika
» 2012-08-09 21:11:19
Dzisiaj napisalem krotki programik, ktory sprawdza wszystkie kombinacje "iles"-literowego slowa, ale zeby zmienic ta dlugosc, to musze pogrzebac chwilke w kodzie, czyli zagniezdzic, lub usunac jedna z petli.
A o to programik:

C/C++
#include <iostream>
using namespace std;
int main()
{
    string tablicay[ 23 ];
    tablicay[ 0 ] = "a";
    tablicay[ 1 ] = "b";
    tablicay[ 2 ] = "c";
    tablicay[ 3 ] = "d";
    tablicay[ 4 ] = "e";
    tablicay[ 5 ] = "f";
    tablicay[ 6 ] = "g";
    tablicay[ 7 ] = "h";
    tablicay[ 8 ] = "i";
    tablicay[ 9 ] = "j";
    tablicay[ 10 ] = "k";
    tablicay[ 11 ] = "l";
    tablicay[ 12 ] = "m";
    tablicay[ 13 ] = "n";
    tablicay[ 14 ] = "o";
    tablicay[ 15 ] = "p";
    tablicay[ 16 ] = "r";
    tablicay[ 17 ] = "s";
    tablicay[ 18 ] = "t";
    tablicay[ 19 ] = "u";
    tablicay[ 20 ] = "w";
    tablicay[ 21 ] = "y";
    tablicay[ 22 ] = "z";
    int b = 0;
    string tekst;
   
    for( int i = 0; i != 23; i++ )
    {
        for( int j = 0; j != 23; j++ )
        {
            for( int l = 0; l != 23; l++ )
            {
                for( int k = 0; k != 23; k++ )
                {
                    b++;
                    tekst = tablicay[ i ] + tablicay[ j ] + tablicay[ l ] + tablicay[ k ];
                    cout << b << " " << tekst << endl;
                }
            }
        }
    }
    return 0;
}
groszek podsunal mi pewien pomysl, a mianowicie mozna sprawdzic wszystkie kombinacje. Czyli bede chcial sprawdzic powiedzmy kombinacje slow 4-literowych, to program sprawdzi od 1 do 4-literowych. Mam zapisane 23 litery (inaczej mowiac uproszczone polskie litery), wiec efektem tego bedzie fakt, iz szukanie danej, lub danych kombinacji zajmie programowi niewiele wiecej niz 1/23 czasu, ktory musial by poswiecic na przeszukanie tylko 4-literowych.

Moze dalo by sie tez zrobic tak, ze jesli bede chcial wyszukac kombinacje 3-literowego slowa, to program uzyje komendy break w ostatniej petli?
P-62143
graszka
» 2012-08-10 10:36:38
Nie obraź się, ale ciut bez sensu jest sprawdzać wszystkie kombinacje, skoro można tylko np. 4 - literowe, tak jak zrobiłam to w poprzednim poście. A co do tego breaka w pętli to będziesz chciał później sprawdzać np. 4 - literowe, potem nawet 5 - literowe, i będziesz za każdym razem modyfikował i kompilował kod?
Zauważ co robisz w każdej pętli - zmieniasz w danej pozycji literkę na następną (i++, j++, itd.) i wywołujesz znowu pętlę która robi to samo i wywołuje następną pętlę... Tak, jest to rekurencja! Zmień tylko pętle na funkcję, która może sprawdzić "czy to już koniec" (w tym przypadku czy jest na ostatniej pozycji) i przestać się wywoływać. Jeśli to koniec: zmieniaj ostatnią pozycję i wypisuj tekst (to co u ciebie robi ostatnia pętla). Jeśli nie: zmieniaj bieżącą pozycję i wywołaj znowu tą funkcję, aby zmieniała następną pozycję (to co robią u ciebie 3 pierwsze pętle). Zaletą takiego podejścia jest to, że program sam zdecyduje, ile takich "pętli" zrobić na podstawie długości słowa, no i jest "elegancko" :D.
Wczytaj się w mój wcześniejszy kod, prześledź jego działanie - robi to co ci właśnie napisałam ;).
P-62160
matka5432
Temat założony przez niniejszego użytkownika
» 2012-08-10 14:18:26
Okej dzieki ;) Zrobie to co mowisz i zobacze czy mi sie uda. Nie jestem jeszce bardzo doswiadczony w C++, wiec musze na to poswiecic troche czasu, aby wszystko przeanalizowac i zrozumiec.
A co do tego pomyslu co mi "podsunales" to zupelnie przypadkiem, zobaczylem kilka slow, ktore mi sie akurat z tym skojarzyly. ;)
P-62170
matka5432
Temat założony przez niniejszego użytkownika
» 2012-08-11 19:44:04
Ehh nie bardzo to rozumiem, musialbym poczytac o ASCII, a poki co nie jest mi to az tak bardzo potrzebne. W koncu zrobilem tak, ze program sprawdza dlugosc frazy i wysyla "mnie" do odpowiedniego case'a ;)
Dzieki wam za wszystkie odpowiedzi, jesli bede robil cos podobnego to poczytam dokladnie o ASCII.
P-62261
Admixior
» 2012-08-12 01:22:37
//Przeczytaj uważnie bez kodu źródłowego.
//Jeśli nie zrozumiesz to napisz.
//else:Sam spróbuj napisać kod i jak ci w ogóle nie będzie wychodził to wtedy spójrz na kod
//jak napiszesz to sprawdź z kodem który jest niżej


Jeżeli chcielibyśmy policzyć ilość kombinacji gdyby mogły się powtarzać litery wystarczy zastosować wzór:
a - ilosc liter w alfabecie;
Dla założenie 4 liter długości słowa będzie to:
a*a*a*a
Dla 5:
a*a*a*a*a

Jeżeli chcemy obliczyć ilość liter niepowtarzających się wystarczy zastosować tę samą technikę, z uwzględnieniem że każde następna litera ma o jeden mniej "liter w alfabecie" niż poprzednia. Dlatego że już tamte litery zostały wykorzystane i nie można ich powtórzyć.
Dla 4:
a*(a-1)*(a-2)*(a-3)

Analogicznie do następnych.
Z czego wynika kod:
C/C++
#include <iostream>
using namespace std;

unsigned long int iloczyn_liczb_z_przedzialu( unsigned int start, unsigned int ilosc )
{
    int wynik = start;
    for( ilosc--, start--; ilosc; ilosc--, start-- ) wynik *= start;
   
    return wynik;
}
int main()
{
    unsigned int ilosc_liter, dlugosc;
    cout << "Podaj ilosc liter w alfabecie:";
    cin >> ilosc_liter;
    cout << "Podaj max dlugosc slowka:";
    cin >> dlugosc;
    cout << "Maksymalna liczba kombinacji z niepowtarzajacymi sie znakami to:"
    << iloczyn_liczb_z_przedzialu( ilosc_liter, dlugosc ) << endl;
    cin.get();
    cin.get();
    return 0;
}

PS. Jeśli ktoś zna jakiś skrócony wzór na obliczenie iloczynu liczb z przedziału (tylko bez silni) to byłbym wdzięczny za podanie
P-62295
Mrovqa
» 2012-08-12 21:20:56
Jeśli rozumiesz już wskaźniki to obczaj to:
C/C++
char input_string[] = "aaaaaaa",
* it = NULL;
/*...*/
for( it = input_string + 6; it !=( input_string - 1 ); it-- ) // powtarzaj dopóki nie przejdziemy całego stringa
{
    * it += 1; // zwiększ o jeden - czyli następny znak
    if( * it ==( 'z' + 1 ) ) { * it = 'A'; break; } // jeżeli zwiększony znak wyszedł nam poza zakres małych liter w tablicy ASCII - skacz do dużych i opuść pętle
    if( * it ==( 'Z' + 1 ) ) { * it = '0'; break; } // analogicznie do powyższego komentarza
    if( * it ==( '9' + 1 ) ) { * it = 'a'; continue; } // gdy to jest ostatni sprawdzany znak - ustaw na początek i wykonaj pętle jeszcze raz (zwróć uwagę na instrukcję krokową)
    break; // po prostu wyjdź z pętli (np. gdy mieliśmy 'b' i zwiększyliśmy do 'c')
}
Żeby nie dawać od razu gotowca, to rzuciłem Ci cały mój kod - jak widać, nie ma go dużo ;) Specjalnie dla Ciebie go okomentowałem ;) Pętelka powoduje 'zrobienie' następnej możliwej kombinacji dla stringa 7-dmio znakowego ze znakami (a-z,A-Z,0-9).

ASCII nie jest wcale trudne. Po prostu możesz na znakach operować tak jak na liczbach, pamiętając o ich ułożeniu w tablicy.
P-62367
matka5432
Temat założony przez niniejszego użytkownika
» 2012-08-12 23:23:01
Program mial odszyfrowywac tylko male litery, bez cyfr.
Ten program jest tylko podprogramem, Czyli wkleje go do kodu zrodlowego glownego programu.
Program glowny ma za zadanie odszyfrowac jakis szyfr monoalfabetyczny, szyfr ten nie bedzie raczej "kryl" cyfr w slowach.
Dziala on na takiej zasadzie, ze program losuje kombinacje, po czym sprawdza czy owa kombinacja znajduje sie w slowniku polskim, ktory posiada az 2,7 miliona polskich odmienionych slow, wiec nie moze byc zbyt wiele liter w alfabecie, ani za dlugich slow, poniewaz wyszukanie wszystkich nawet 4-literowych slow moglo by potrwac kilka dni, narazie zajmuje to okolo 30 sec.
Jesli mam zaszyfrowane slowo np. babcia - qmqpgm, to program zamienia wszystkie m na a, b, c itd potem p na a, b itd za kazdym razem sprawdzajac czy takowe slowo istnieje.

Dzieki za kod i link, myslalem ze ASCII jest o wiele bardziej skomplikowane ;D.
Zaraz zobacze na kod, pokombinuje trosze, i odpisze ;).
P-62372
Mrovqa
» 2012-08-13 14:47:54
@up wiem, że chcesz tylko małe litery... nie zauważyłeś tego
Żeby nie dawać od razu gotowca, to rzuciłem Ci cały mój kod
 ??
To forum nie jest po to by dawać gotowce, tylko po to, by się czegoś nauczyć. Dlatego zamiast usunąć dwie linijki i trzecią lekko zmodyfikować to wszystko okomentowałem. Mój kod bardzo łatwo i szybko jest przerobić na to, co potrzebujesz - zauważ pewną analogię i przeczytaj jeszcze raz komentarze.

PS na tablicę znaków ASCII nie bez powodu się mówi tablica znaków ;)
P-62391
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona