Swift #4: Funkcje, czyli jak wygrać w lotto

Nauka programownia

Opublikowany: Oct 29, 2018

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.


  1. … w zasadzie ogólny bilans zysków i strat wskazywał raczej straty.
  2. 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.
  3. Ponieważ funkcja jest utożasamiana z czynnością, to dobrze ją nazywać używając czasowników.


dr Błażej Zyglarski

Autoryzowany Trener Apple (Swift), praktyk z wieloletnim doświadczeniem

Od lat pasjonat technologii mobilnych. Autor dziesiątek aplikacji dla systemów iOS, tvOS i watchOS. Wykładowca na Wydziale Matematyki i Informatyki Uniwersytetu Mikołaja Kopernika w Toruniu. Praktykujący deweloper iOS. Współzałożyciel Asuri Solutions.



Image
Felieton
Zarabianie Schrodingera
Sep 03, 2019
Image
Felieton
Rozliczanie aplikacji sprzedanych w AppStore
Jun 10, 2019
Image
Felieton
Cały internet na płycie CD
Apr 01, 2019
Image
Nauka programownia
Swift: O co chodzi z tymi kolejkami?
Feb 17, 2019
Image
Felieton
Tim Cook docenił wzrost sprzedaży w Polsce
Feb 04, 2019

Nasze szkolenia

Image
Image
Programowanie aplikacji iOS w Swift 5
Dwudniowe szkolenie od podstaw
Toruń - 2020-03-14
dr Błażej Zyglarski
Image
Image
Objective-C dla programistów Swift
Jednodniowe szkolenie dla programistów Swift
Warszawa - 2020-01-11
dr Błażej Zyglarski
Image
Image
Programowanie Gier 2D na iOS
Trzydniowe szkolenie ze SpriteKit i GameplayKit dla programistów Swift
Toruń - 2020-03-27
dr Błażej Zyglarski