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

[c/c++] Najczesciej losowana dziesiatke w Multi lotku

13 Lut 2011 22:36 2178 11
  • Poziom 9  
    Witajcie,
    Potrzebuje pomocy w napisaniu programu - program wczytuje z pliku losowania Multi Lotka, musi oddzielic wyyniki z kazdej linii od daty i nr losowania(problem nr 1) oraz wyliczyc kombinacje wszystkich 10-tek w ramach kazdego losowania, porownac ja z innymi zapisanymi 10-tkami z reszty losowan (problem nr 2) i na koniec wyswietlic statystyke dla powiedzmy dziesieciu 10-tek (ta liczba nie jest zadana, moze wynosic np 3 lub 5 lub byc definiowana przez usera)
    Program ma dzialac, nie musi byc pisany czystym jezykiem C lub C++.

    Format kazdej linii:
    nr_losowania.<spacja>dzien.miesiac.rok<spacja>wynik_1,wynik_2, ... wynik_20

    Problem 1:
    Moj program "wie" juz kiedy we wczytanej linii zaczynaja sie wyniki - znajduje druga spacje.. i tu moj problem polega na skopiowaniu ze stringu "wers" do stringu "wyniki" samych wynikow, czyli znakow od drugiej spacji do konca stringu "wers"

    Problem 2:
    Wyliczenie wszystkich kombinacji - wiem w zasadzie z czego mam skorzystac ( wszystkie mozliwe kombinacje bez powtorzen 10 elementow w 20 elementowym zbiorze) i ten problem pozostaje na razie "nie ruszony" ze wzgledu na problem nr 1.

    Porownianie kazdej 10 chcialbym zrobic w tablicy struktur - tz kazda 10 zapisujemy w tablicy wynikow (1 element struktury) i jesli juz wystepuje zwiekszamy licznik o 1 (drugi element struktury) lub dodajemy jako nowy element na koncu, pozniej sortowanie i wyswietlanie

    Potrzebuje pomocy - a nie napisania programu za mnie

    Kod ktory juz mam:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    Poziom 12  
    Skoro używasz ifstream to użyj oferowanych przez niego dobrodziejstw:)
    Między innymi operatora >>. Dzięki niemu możesz dostać już sformatowane dane z pliku, np inty.
    Co do problemu 1 to poczytaj o metodach jakie udostępnia ci string. Jest ich naprawdę sporo. Znajdziesz między innymi kopiowanie, szukanie znaków itp. O wiele ułatwi ci to pracę.
  • Poziom 9  
    Ok - problem nr 1 rozwiazany ;)

    Natomiast szukam rozwiazania problemu nr 2 - czyli wygenerowania wszystkich kombinacji dziesiatek wsrod 20stu wylosowanych liczb. Udalo mi sie znalezc kod, ktory generuje i-ta kombinacje, natomiast ja potrzebuje wszystkie...
  • Pomocny post
    Poziom 12  
    Polecam książkę "Kombinatoryka dla programistów" autor : W. Lipski
    Jest tam gotowy algorytm.
    Chociaż google też powinno pomóc
  • Poziom 9  
    Dzieki wielkie - poszukam ksiazki i dam znac czy udalo sie napisac program do konca ;) Ale mysle, ze jesli jest tam chociaz schemat dzialania takiego algorytmu to jestem w przyslowiowym "domu" ;)
    Wystarczy dopisac wektor struktur, ktory przechowa wszystkie "dziesiatki" wraz z informacja o powtorzeniach, posortowac wektor i po problemie nr 2 ;)

    Edit:
    Ma ktos moze wydanie 3 ksiazki "Kombinatoryka dla programistow"? Lub sam dodatek z kodami w c++?
    Bo niestety, ale Pascala nie znam ani troche... :/
  • Poziom 9  
    Przepraszam za post pod postem - ale ten wnosi cos nowego do tematu ;)


    Udalo mi sie znalezc kod w C++ dla tego algorytmu, ale zglupialem calkowicie... bo kod dziala... ale nie do konca.
    Dziala tylko dla ciagu o wyrazach rosnacych o 1, dla wyrazow rozniacych sie o inna wartosc od sasiednich algorytm nie dziala poprawnie :(

    kod samego sposobu generowania kombinacji(program liczy dodatkowo rowniez ilosc kombiancji):
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Kod wyzej liczy kombinacje dla ciagu {1,2,3...20}, gdy jdnak zmienimy liczby np na {1,3,5,7...39}(tab[i]=(2*i+1)) i wszelkie ograniczenia liczbowe typu najwieksza wartosc, program nie dziala poprawnie.
    Wiem, ze problem lezy w tej linii:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    bo zamiast odwolywac sie do nastepnych elementow tablicy, liczy je "na sucho" dodajac jedynki.

    Niestety nie jestem w stanie sobie poradzic z tym problemem sam,mimo wielu prob rozgryzienia tego :/
  • Poziom 12  
    Musisz zmienić 2 linijki :
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    i
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Linijka z if-em: do tablicy wstawiaj liczby już posortowane rosnąco, wtedy to porównanie robisz z największą liczbą ze zbioru liczb wejściowych
    Przypisanie: tu powinno wystarczyć po prostu tab[i]=tab[p]
  • Poziom 9  
    o warunku "if" wiedzialem od poczatku - dane w tablicy wynikow sa posortowane rosnaco z automatu - wiec ten klopot (posortowanie rosnaco wynikow) mam z glowy ;)

    Natomiast samo przypisanie nie dziala w taki sposob, jaki podales - probowalem juz tego sam ;)
  • Poziom 32  
    Nie, nie, nie, nie, nie, tylko nie "pętla if", to nie jest pętla!
  • Pomocny post
    Poziom 12  
    To zamiast bawić się w poprawę algorytmu, przyjmij, że liczby z tej tablicy to indeksy skąd masz brać prawdziwe liczby które trzymasz w oddzielnej tablicy. Zmiana kodu będzie polegała na zmianie wypisywania, i tylko tyle.