Funkcja DuzyLotek() najlepiej rozbić na kilka prostszych funkcji do napisania. Na początek zadeklarujmy zmienną stałą, globalną ILOSC:
Dzięki temu za każdym razem, gdy będziemy sprawdzać listę kuponu zamiast pisać 6 to wpiszemy zmienną. Jest to dobry nawyk, bo dzięki temu mamy pewność, ze wszędzie mamy tę sama wartość, a jeśli pomylimy się z wartością zmiennej to wystarczy zmienić to tylko w jednym miejscu zamiast szukać w kodzie, gdzie jeszcze trzeba zmienić.
Pierwsza funkcja, którą dopiszemy będzie sprawdzać czy na podanej liście nie znajduje się dana liczba.
Nie deklarujemy tu dodatkowej zmiennej, która sprawdza kolejne wartości na liście. Zmniejszamy podaną długość listy. Dzięki temu przeglądamy każdy element idąc od tyłu. Możemy to zrobić wiedząc, że lista ma minimalną długość 0 i nigdzie dalej nie wykorzystujemy podanej zmiennej.
Następna funkcja jest bardziej związana z tematem zadania. Napiszemy funkcję, która wylosuje nam 6 liczb.
(2.) Deklarujemy listę na której umieścimy wylosowane liczby. (3.) Zmienna liczba posłuży nam do zapamiętania wylosowanej liczby. (4.) Rozpoczynamy losowanie 6 liczb. (5.) Posłużymy się pętlą, aby wylosować liczbę. (7.) Losujemy liczbę, jeśli (8.) jest na liście to wracamy do (7.) co będzie wywoływać losowanie nowej liczby aż uzyskamy taką, której nie ma na liście. Na koniec iteracji z (4.) dopisujemy liczbę na i-te miejsce. (10.) Na sam koniec zwracamy listę wylosowanych liczb.
Mają dwie dodatkowe funkcje przechodzimy do pisania głównej:
(2.) wynik to nasza tablica, którą mamy zwrócić na sam koniec. W niej będziemy przechowywać ile za i-tym razem zostało trafionych liczb. (3.) Rozpoczynamy iterację dla każdego z k losowań. Na początek (4.) losujemy nowe liczby. (5.) Ustawiamy ilość trafionych liczb na zero, a (6. - 7.) potem sprawdzamy dla każdej liczby typowanej czy jest na liście wylosowanych. Korzystamy z tego, że wartość prawda to 1. Na koniec iteracji (8.) usuwamy wylosowaną listę liczb i (9.) kończymy iteracje. (10.) Na sam koniec zwracamy listę wyników.
Można tu szukać różnych rozwiązaniach. Jednak im prościej tym lepiej:
(2.) Zmienna mn będzie przechowywać informację czy jaki mamy typ macierzy, ponieważ z jednego typu uzyskujemy drugi mnożąc całą macierz przez -1. W ten sposób ograniczamy sprawdzenie tylko do pierwszego przypadku jeśli każdą sprawdzaną liczbę macierzy pomnożymy przez mn. (3., 4.) Sprawdzamy każdą liczbę macierzy i (5.) sprawdzamy czy ma odpowiednią wartość. Jeśli nie to (7.) zwracamy fałsz. (10.) Prawdę zwrócimy tylko, gdy nie zwrócimy fałszu czyli wszystkie liczby spełnią założenia.
Żeby sprawdzić, dlaczego kod działa warto sobie rozpatrzeć kolejne iteracje na poniższym przykładzie:
Struktura powinna wyglądać tak:
Kolejna funkcja stworzDzien():
Należy pamiętać o ->, ponieważ dzien jest wskażnikiem.
Ostatnia funkcja nie powinna być problematyczna, ale należy pamiętać, że najpierw musimy sprawdzić poprawność godziny i dopiero sprawność poprawność minut, ponieważ odwrotnie możemy odwołać się do elementu tablicy minut, który nie istnieje.
W moim rozwiązaniu wykorzystuje metodę kubełkową, ponieważ jest mało przypadków i łatwo opisać krok po kroku co się dzieje.
(2.) Na początek deklarujemy zmienną dl, która określa nam ile różnych elementów możemy mieć, czyli wszystkie od A do Z dodajemy jeden, bo od 1 do 2 jest nie 2 - 1, a (2 - 1) + 1 elementów. (3.) Zmienna i posłużymy nam do różnych celów w różnych częściach kodu. (5.) Inicjalizujemy listę, która posłuży nam do zliczania każdej litery i (6., 7.) ustawiamy wartość każdego elementu na 0. Następnie (9.) resetujemy wskaźnik i na 0 i (10.) przeglądamy cały napis. (11.) Zmieniamy wartość kubełka napis[i++] - 'A', ponieważ kubełek litery A ma indeks=0. Po zliczeniu wystąpień każdego znaku (12.) deklarujemy zmienną pozycja, która będzie wskazywała, który kubełek ma najmniej elementów. Potem (13.) sprawdzamy dla każdego kubełka czy nie jest pusty i czy ma mniej elementów niż dotąd kubełek znaleziony. Jeśli tak (14.) to go zapamiętujemy. Na sam koniec (16.) usuwamy listę zliczającą czyli nasze kubełki i zwracamy literę pamiętając, że indeks 0 ma A, 1 - B, 2 - C itd.
Na samo koniec zamieszczam funkcję main() z przygotowanymi testami. Dzięki temu łatwiej będzie sprawdzić swoje rozwiązanie modyfikując odpowiednie funkcje i wyświetlając rezultat.