Mój Tata od 30 lat gra regularnie w Looto. Niestety bez sukcesów. Do tej pory nie udało mu się wygrać więcej niż kilkadziesiąt złotych[1]. A i te szczęśliwe dni można policzyć na palcach rąk. Tymczasem wybór liczb jest czasochłonny. Zakładając, że w ciągu 30 lat musiał wymyślić 30x56x2 = 3360 zestawów 6 liczb, a każda z tych czynności trwała 30 sekund, stracił na to ponad 28 godzin.
Celem, który osiągniemy w tej części kursu będzie napisanie w języku Swift programu, który wylosuje liczby i pozwoli zaoszczędzić mojemu Tacie kolejne cenne chwile.
Jak wygląda taki program?
Programista tworzy program z instrukcji – napisów. Spróbujm napisać więc ciąg instrukcji, który pozwoli wylosować sześć liczb.
var max = 49
for i in 1 ... 6 {
var liczba = Int(arc4random()) % max + 1
print (liczba)
}
W pętli for, która wykonała się 6 razy wylosowaliśmy liczbę, która jest z zakresu 1 do 49 [2]
Powyższy kod nie będzie działał dobrze, bo w losowaniu liczby mogą się powtórzyć. Spróbujemy rozwiązać ten problem.
var wylosowane = [Int]()
Na początek stworzyliśmy pustą tablicę, do której będziemy dodawać wylosowane liczby. Losować będziemy w pętli while, która wykonywać się będzie dopóty, dopóki w tablicy wylosowane nie będzie sześciu liczb.
var n = 6
while wylosowane.count<n{
var liczba:Int?
repeat{
liczba = Int(arc4random()) % max + 1
}while wylosowane.contains(liczba!)
wylosowane.append(liczba!)
}
Losowanie wewnątrz niej będzie przebiegało tak długo, aż wylosowana zostanie liczba, której jeszcze nie ma w tej tablic, co sprawdzone zostanie przez warunek wylosowane.contains(liczba!).
for liczba in wylosowane{
print (liczba)
}
Wystarczy więc teraz wypisać liczby z tablicy. Cały kod będzie wyglądał dość prosto. Jeśli jednak chcemy powtórzyć procedurę dla kilku różnych gier, w których losujemy różne ilości liczb z różnych zakresów, będziemy musieli go skopiować i tylko nieznacznie zmodyfikować. Rozwiązaniem jest użycie funkcji.
Funkcja jest to wydzielony fragment kodu, który na podstawie przekazanych parametrów wykonuje jakieś obliczenie.
Funkcja w programowaniu jest bardzo podobna do tej z matematyki. Przypomnijmy sobie przykład funkcji liniowej.
f(x)=2x+3
Korzystając z niej wiemy, że f(1) = 5, a f(2) = 7.
Funkcja matematyczna miałą nazwę f i parametr x. Obliczała zaś wartość na podstawie tego parametru. Podobnie w programowaniu funkcja będzie musiała mieć nazwę, parametry oraz kod, który wykona to obliczenie. W naszym przypadku funkcja ma losować nam zestaw n liczb z zakresu 1 do max. Podobnie jak w przypadku matematycznym najpierw funkcję zdefiniowaliśmy (czyli napisaliśmy jej wzór), a potem mogliśmy jej użyć, tak samo musimy zrobić w przypadku języka programowania.
Nazwijmy ją losuj[3]
Definicja funkcji składa się z nagłówka
**func losuj(n:Int,max:Int){}**
zawierającego słowo kluczowe func
**func** losuj(n:Int,max:Int){}
nazwę
func losuj(n:Int,max:Int){}
listę argumentów, na której rozdzielone przecinkami widnieją kolejne zmienne wraz z określonymi ich typami
func losuj(n:Int,max:Int){}
oraz zawartego między nawiasami {} kodu funkcji.
Ponieważ argumenty funkcji określają nam zarówno wartość max jak i b, jej kod może wyglądać następująco.
func losuj(n:Int,max:Int){
var wylosowane = [Int]()
while wylosowane.count<n{
var liczba:Int?
repeat{ liczba = Int(arc4random()) % max + 1
}while wylosowane.contains(liczba!)
wylosowane.append(liczba!)
}
for liczba in wylosowane{
print (liczba)
}
}
W dalszej częsci programu wystarczy już tylko wywołać tą funkcję
Funkcje w Swift wywoływane są z uwzględnieniem etykiet argumentów, które domyślnie odpowiadają nazwom tych argumentów. Wygląda to więc tak
losuj(n:6, max:49)
Wynikiem takiego wywołania będzie wypisanie 6 liczb. A 33600 zestawów? Nic prostszego.
for _ in 1...33600 {
losuj(n:6, max:49)
}
Więcej o funkcjach w kolejnych częściach kursu.
- … w zasadzie ogólny bilans zysków i strat wskazywał raczej straty.
- arc4random() losuje liczbę całkowitą, a % max oblicza resztę z dzielenia przez max. Reszta z dzielenia może mieć wartość od 0 do max -1, więc należy do niej dodać 1.
- Ponieważ funkcja jest utożasamiana z czynnością, to dobrze ją nazywać używając czasowników.