Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

visual studio 2008 i słownik np. T9

romantv 31 Sie 2010 15:54 1753 6
  • #1 31 Sie 2010 15:54
    romantv
    Poziom 17  

    Witam
    Napisałem program który komunikuje się z uC, omunikacja działa poprawnie.

    Potrzebuję do programu podłączyć słownik polski może np.T9.
    Chodzi mi o to jak piszę txt klikając klawisze to w polu Label wyświetla mi się proponowany wyraz ze słownika, podobnie jak w tel.

    Nie mam pojęcia jak to zrobić i skąd można pobrać taki słownik.
    Dziękuję za pomoc.

    0 6
  • #2 01 Wrz 2010 22:48
    mungo
    Poziom 18  

    Ciekawe jak by to wyszło czasowo, optymalizacyjnie, ale np jakbyś słownik miał zapisany w osobnym *.txt (ifstreamem da się sczytać ciąg znaków do białego znaku czyli spacja, tab itp) czytasz pierwszy ciąg dajesz go np do tablicy i po kolej porównujesz litery z odpowiednich miejsc/indeksów.

    taki ogolny zarys:
    np chcesz napisać "ala"

    pobierasz z klawiatury "a"
    dajesz to do tab1
    do
    {
    sczytujesz wyraz ze słownika do tab2
    porównujesz pierwsze miejsce tab1 i tab2 // if((a==tab2[0])||(b==tab2[0])||(c==tab2[0]))
    pasują zachowujesz gdzieś ten wyraz
    }while ( sprawdzi wszystkie wyrazy ze slownika)

    pobierasz z klawiatury "l"
    do
    {
    sczytujesz wyraz zachowany
    porownujesz drugie miejsce ... itd

    Ciekawa sprawa jak będę miał trochę czasu spróbuje sobie to napisać ciekawe jak będzie działać!? Jak coś to daj znać to podeśle Ci to co mi wyjdzie...

    0
  • Pomocny post
    #3 01 Wrz 2010 23:24
    marcinj12
    Poziom 40  

    Słownik możesz pobrać np. stąd lub, większy, stąd. Nie jest to T9, ale słownik polskich wyrazów. Sądzę że jak pogooglasz to znajdziesz coś co Cię zainteresuje.

    Skoro robisz to w visual studio, to może wystarczy coś takiego (C#):

    Code:

    //ładowanie listy autokompletacji dla textboxa
    AutoCompleteStringCollection lista = new AutoCompleteStringCollection();
    lista.Add("ala");
    lista.Add("alabaster");
    lista.Add("alkowa");
    lista.Add("baba");
    lista.Add("baca");

    textBox1.AutoCompleteCustomSource = lista;

    a w textboxie ustaw: AutoCompletationSource: CustomSource, oraz AutoCompletMode: Append
    Sam jestem ciekaw jak z prędkością tego rozwiązania...

    @mungo: Obawiam się że Twoje rozwiązanie jest wysoce nieefektywne... Po pierwsze: dlaczego pętla while() ma za każdym razem sprawdzać wszystkie wyrazy ze słownika (przynajmniej tak wynika z kodu...)? Przecież tablicę można posortować i przerywać odczyt kiedy wyjdzie się poza wybraną literę...
    Po drugie: jeśli już, to lepiej użyj DataTable i polecenia .Select() do wybierania danych zaczynających się od wpisanego ciągu znaków...

    PS. Wydaje mi się że idea słownika T9 była inna - żeby na klawiaturze telefonu, gdzie na jeden klawisz przypadają 3 lub 4 litery, można było podpowiadać wyrazy po jednokrotnym wciśnięciu klawisza. Na klawiaturze komputera gdzie jeden klawisz = jedna litera, ten problem nie występuje...

    0
  • #4 02 Wrz 2010 10:37
    mungo
    Poziom 18  

    Też właśnie zastanawiałem się nad efektywnością tego sposobu ale to było pierwsze co mi przyszło do głowy...
    Nie wykorzystałem sortowania bo założyłem że słownik będzie w osobnym *.txt (np takie słowniki jak do programów do "łamania haseł") w którym wyrazy niekoniecznie będą alfabetycznie poukładane a też nie sczytuje całego słownika do tablicy żeby zaoszczędzić czas (pobiera wyraz sprawdza vs pobiera->"tablicuje"->sortuje->sprawdza)

    @marcinj12:dlaczego pętla while() ma za każdym razem sprawdzać wszystkie wyrazy ze słownika

    ze słownika sprawdza tylko za pierwszym razem(pierwszą literą) dalej to co pasuje "odkłada" w inne miejsce i dalsze wyszukiwania są robione w tym "odłożonym" zbiorze...

    Musze poszukać coś o DataTable bo nie wiem o co chodzi??

    0
  • #6 02 Wrz 2010 11:33
    marcinj12
    Poziom 40  

    Odpowiadając na pytania Kolegi mungo:

    mungo napisał:
    @marcinj12:dlaczego pętla while() ma za każdym razem sprawdzać wszystkie wyrazy ze słownika

    Sam napisałeś: "while ( sprawdzi wszystkie wyrazy ze slownika)", jakoś nie doczytałem że potem działa na już pobranej tablicy... :)
    mungo napisał:
    wyrazy niekoniecznie będą alfabetycznie poukładane a też nie sczytuje całego słownika do tablicy żeby zaoszczędzić czas

    Oszczędność czasu jest pozorna.
    Zgoda, że wczytanie całości trochę zajmuje, jednak, jeśli już, bardziej optymalnie byłoby wczytać cały plik do pamięci i na niej działać (czas operacji na danych umieszczonych w pamięci jest znacznie szybszy niż odczyt tych danych z dysku). Jednorazowy koszt wczytania i posortowania całości będzie większy, jednak wczytałbyś plik tylko raz, przy uruchomieniu programu, posortował (np. Array.Sort(...)), też czasochłonne za to jednorazowe, a potem wielokrotnie operował na posortowanych danych w pamięci.
    mungo napisał:

    to co pasuje "odkłada" w inne miejsce i dalsze wyszukiwania są robione w tym "odłożonym" zbiorze

    tak też myślałem, jednak wtedy za często powielasz dane w pamięci: raz - masz "całą" tablicę: słownik-źródło, dwa: po wpisaniu np. litery 'a' -> tworzysz drugą, zawierającą multum wyrazów na literą 'a'. Potem wpisujesz 'l' i musisz utworzyć 3 tablicę (po drugiej się poruszasz, zapisujesz do 3). Potem przepisać 3 do 2 etc... A tak naprawdę użytkownikowi i tak wyświetlasz tylko jeden wyraz ;P
    mungo napisał:
    DataTable bo nie wiem o co chodzi

    Jeżeli masz dane w tabeli DataTable dt, to możesz łatwo je filtrować poleceniem:
    dt.Select("wyraz = 'a%'"); -> w rezultacie dostajesz zestaw wierszy zaczynający się na lite 'a'.

    0
  • #7 02 Wrz 2010 13:24
    mungo
    Poziom 18  

    marcinj12 napisał:

    Sam napisałeś: "while ( sprawdzi wszystkie wyrazy ze slownika)", jakoś nie doczytałem że potem działa na już pobranej tablicy... Smile

    Przepraszam mój błąd.

    I masz racje co do tego sortowania, sortowanie na początku może zaoszczędzić sporo czasu jeśli chodzi o więcej niż jeden wyraz...

    0