{ "metadata": { "language": "ruby", "name": "", "signature": "sha256:77df7d0dfe4a62ce177c94ab963849765855f29c6c8d1f73a913a993a4471026" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "P\u0119tle" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "loop" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`loop` to p\u0119tla niesko\u0144czona. Nale\u017cy jej u\u017cywa\u0107 ostro\u017cnie:\n", "```ruby\n", "loop do\n", " puts \"P\u0119tla niesko\u0144czona\"\n", " sleep(1)\n", "end\n", "```\n", "(Mo\u017cesz j\u0105 przerwa\u0107 klikaj\u0105c na czarny kwadrat powy\u017cej.)" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Zwykle jest wykorzystywana w po\u0142\u0105czeniu z poleceniem `break`, kt\u00f3re powoduje jej przerwanie:\n", "```ruby\n", "loop_count = 0\n", "loop do\n", " loop_count += 1\n", " puts \"P\u0119tla sko\u0144czona #{loop_count}\"\n", " break if loop_count >= 10\n", "end\n", "```" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 5 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "while, until" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Je\u015bli jednak isnieje tylko jeden warunek opuszczenia p\u0119tli, zwykle korzystamy z p\u0119tli `while` lub `until`.\n", "Pierwsza z nich wykonuje si\u0119, tak d\u0142ugo jak warunek jest spe\u0142niony, np.\n", "```ruby\n", "counter = 1\n", "while(counter < 10) do\n", " puts \"P\u0119tla until #{counter}\"\n", " counter += 1\n", "end\n", "```" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "P\u0119tla `until` wykonuje si\u0119 za\u015b do momentu, w kt\u00f3rym warunek zostanie spe\u0142niony:\n", "```ruby\n", "counter = 1\n", "until(counter > 10) do\n", " puts \"P\u0119tla until #{counter}\"\n", " counter += 1\n", "end\n", "```" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Mo\u017cna jej u\u017cy\u0107, np. do wy\u015bwietlenia zawarto\u015bci pliku:\n", "```ruby\n", "file = File.open(\"data/books.csv\")\n", "until(file.eof?) do\n", " puts file.readline.chomp\n", "end\n", "```" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 16 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "for" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "W Ruby nie ma klasycznej p\u0119tli `for` znanej z j\u0119zyka C, tzn. `for(i = 0; i < 10; i++)`. Istnieje jednak p\u0119tla `for`, kt\u00f3ra s\u0142u\u017cy do iterowania po strukturach sekwencyjnych, np. tablicach:\n", "```ruby\n", "letters = [\"a\",\"b\",\"c\"]\n", "for letter in letters do\n", " puts letter\n", "end\n", "```" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Mo\u017cna jej r\u00f3wnie\u017c u\u017cy\u0107 do innych struktur, np. tablic asocjacyjnych:\n", "```ruby\n", "letters = {1 => \"a\", 2 => \"b\", 3 => \"c\"}\n", "for index,letter in letters do\n", " puts \"#{index}. #{letter}\"\n", "end\n", "```" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 21 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "times, upto, downto, step" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Chocia\u017c w Ruby nie ma klasycznej p\u0119tli `for` to istniej\u0105 inne konstrukcje, pozwalaj\u0105ce na wykonanie p\u0119tli okre\u015blon\u0105 ilo\u015b\u0107 razy.\n", "Pierwsz\u0105 z nich jest `times` - jej semantyka jest bardzo prosta. Poniewa\u017c wywo\u0142ywana jest dla liczb naturalnych, kod wykonuje si\u0119 tyle razy, ile wynosi warto\u015b\u0107 danej liczby:\n", "```ruby\n", "3.times do\n", " puts \"Witaj EPI!\"\n", "end\n", "```" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 23 }, { "cell_type": "markdown", "metadata": {}, "source": [ "`upto` i `downto` maj\u0105 podobne zastosowanie. `upto` pozwala na okre\u015blenie dolnego i g\u00f3rnego zakresu:\n", "```ruby\n", "10.upto(20) do |index|\n", " puts \"Indeks wynosi #{index}\"\n", "end\n", "```" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 25 }, { "cell_type": "markdown", "metadata": {}, "source": [ "`downto` r\u00f3wnie\u017c pozwala na okre\u015blenie zakresu, ale wykonywana jest od warto\u015bci najwi\u0119kszej, do najmniejszej:\n", "```ruby\n", "20.downto(10) do |index|\n", " puts \"Indeks wynosi #{index}\"\n", "end\n", "```" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 27 }, { "cell_type": "markdown", "metadata": {}, "source": [ "`step` pozwala na swobodne okre\u015blenie kroku:\n", "```ruby\n", "10.step(20,2) do |index|\n", " puts \"Indeks wynosi #{index}\"\n", "end\n", "```" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 29 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Zadanie 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Wiedz\u0105c, \u017ce w w 2016 roku pierwsza niedziela wypada 3 stycznia, okre\u015bl numery pozosta\u0142ych dni, w kt\u00f3re wypada niedziela. Nie chodzio daty, tylko numery dni w roku (3, 10, itd.)" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Metody iteracyjne" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Metody iteracyjne pozwalaj\u0105 wykonywa\u0107 operacje na elementach kontener\u00f3w. S\u0105 one odpowiednikami p\u0119tli w innych j\u0119zykach programowania. Pozwalaj\u0105 jedak bardziej bezpo\u015brednio wyrazi\u0107 jaka jest intencja tw\u00f3rcy algorytmu.\n", "\n", "Najcz\u0119\u015bciej u\u017cywan\u0105\u00a0metod\u0105 iteracyjn\u0105 jest `each`, kt\u00f3ra wywo\u0142uje blok kodu dla ka\u017cdego elementu tablicy\n", "```ruby\n", "[1,2,3,4].each do |element|\n", " puts element ** 2\n", "end\n", "```" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dzi\u0119ki metodzie `each` mo\u017cemy uzyska\u0107 ten sam efekt jaki daje metoda `upto`, je\u015bli wywo\u0142amy j\u0105 na zakresie:\n", "```ruby\n", "1.upto(10){|i| puts \"upto: #{i}\" }\n", "(1..10).each{|i| puts \"each: #{i}\" }\n", "```" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 7 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ruby definiuje jednak znacznie wi\u0119cej przydatnych metod tego rodzaju. Cz\u0119sto u\u017cywan\u0105 jest `select`, kt\u00f3ra wybiera z tablicy tylko \n", "te elementy, dla kt\u00f3rych blok kodu zwr\u00f3ci\u0142 warto\u015b\u0107 `true`\n", "```ruby\n", "[1,2,3,4,5,6].select{|e| e % 2 == 0 }\n", "[\"Ala\", \"Anna\", \"Agata\", \"Barbara\"].select{|imie| imie =~ /^A/ }\n", "```" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Metoda ta ma komplementarn\u0105\u00a0wobec niej metod\u0119 `reject`\n", "```ruby\n", "[1,2,3,4,5,6].reject{|e| e % 2 == 0 }\n", "[\"Ala\", \"Anna\", \"Agata\", \"Barbara\"].reject{|imie| imie =~ /^A/ }\n", "```" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bardzo cz\u0119sto wykorzystywan\u0105 metod\u0105 jest r\u00f3wnie\u017c `map`\n", "```ruby\n", "[1,2,3,4,5].map{|e| e * 2 }\n", "[\"Ala\", \"Anna\", \"Agata\"].map{|e| e.upcase }\n", "```" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nieco rzadziej wykorzystywan\u0105 metod\u0105 jest `inject`, kt\u00f3ra poza tym, \u017ce przechodzi przez wszystkie elementy, przekazuje do bloku\n", "wynik eweluacji wcze\u015bniejszego wyra\u017cenia. Pozwala to w bardzo prosty spos\u00f3b np. oblicy\u0107 sum\u0119 element\u00f3w tablic\n", "```ruby\n", "[1,2,3,4].inject(0){|suma,element| suma + element }\n", "```" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Oczywi\u015bcie metoda ta nie dzia\u0142a wy\u0142\u0105cznie na liczbach. Mo\u017cna np. skonkatenowa\u0107 jaki\u015b napis\n", "```ruby\n", "[\"Ala\", \"Anna\", \"Agata\"].inject(\"\"){|wynik,imie| wynik + \" #{imie.upcase}\" }\n", "```" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 16 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Na koniec warto wspomnie\u0107 o dw\u00f3ch metodach s\u0142u\u017c\u0105cych do sortowania: `sort` oraz `sort_by`. Wywo\u0142anie tej pierwszej \n", "bez bloku kodu spowoduje posortowanie element\u00f3w w naturany spos\u00f3b\n", "```ruby\n", "[3,1,7,6,2].sort\n", "```" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Mo\u017cemy jednak zdefiniowa\u0107 sw\u00f3j w\u0142asny spos\u00f3b sortowania. Konieczne jest wtedy przekazanie bloku kodu, kt\u00f3ry akceptuje dwa\n", "argumentu podlegaj\u0105ce por\u00f3wnaniu, np.\n", "```ruby\n", "[\"A\",\"ca\u0142ego\",\"ma\u0142e\",\"Ala\",\"Be\"].sort{|a,b| a.size <=> b.size }\n", "```" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Warto por\u00f3wna\u0107 wynik tej metody z metod\u0105 `sort` bez bloku:\n", "```ruby\n", "[\"A\",\"ca\u0142ego\",\"ma\u0142e\",\"Ala\",\"Be\"].sort\n", "```" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Metoda `sort_by` pozwala natomiast posortowa\u0107 elementy wzgl\u0119dem wybranej w\u0142asno\u015bci. Sortowanie wzgl\u0119dem d\u0142ugo\u015bci \u0142a\u0144cuch\u00f3w mo\u017cna\n", "zrealizowa\u0107 nast\u0119puj\u0105co:\n", "```ruby\n", "[\"A\",\"ca\u0142ego\",\"ma\u0142e\",\"Ala\",\"Be\"].sort_by{|a| a.size }\n", "```" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Zadanie 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Napisz program, kt\u00f3ry oblicza sum\u0119 cyfr zadanej liczby. " ] }, { "cell_type": "code", "collapsed": false, "input": [ "liczba = 1456323465\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 18 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Zadanie 3*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Napisz program, kt\u00f3ry w\u015br\u00f3d liczb od 0 do 100 znajduje wszystkie liczby kt\u00f3re s\u0105 podzielne przez 2, ale nie s\u0105 podzielne przez 4 i kt\u00f3rych suma cyfr jest podzielna przez 7." ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 15 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Zadanie 4*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Za\u0142\u00f3\u017cmy, \u017ce w turnieju szachowym jest 6 zawodnik\u00f3w: Anna, Beata, Andrzej, Wojtek, Jan i Klaudia. Napisz kod, kt\u00f3ry znajdzie wszystkie mo\u017cliwe mecze rozgrywane przez zawodnik\u00f3w. Mecze rozgrywane pomi\u0119dzy tymi samymi zawodnikami nie mog\u0105 si\u0119 powtarza\u0107 (kolejno\u015b\u0107 zawodnik\u00f3w nie ma znaczenia)." ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 6 } ], "metadata": {} } ] }