abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 20:55 | IT novinky

    IKEA ve Spojeném království hledá zaměstnance do své nové pobočky. Do pobočky v počítačové hře Roblox. Nástupní mzda je 13,15 liber na hodinu.

    Ladislav Hagara | Komentářů: 0
    dnes 10:44 | Zajímavý článek

    Alyssa Rosenzweig se v příspěvku na svém blogu Vulkan 1.3 na M1 za 1 měsíc rozepsala o novém Vulkan 1.3 ovladači Honeykrisp pro Apple M1 splňujícím specifikaci Khronosu. Vychází z ovladače NVK pro GPU od Nvidie. V plánu je dále rozchodit DXVK a vkd3d-proton a tím pádem Direct3D, aby na Apple M1 s Asahi Linuxem běžely hry pro Microsoft Windows.

    Ladislav Hagara | Komentářů: 8
    dnes 01:00 | Nová verze

    Byla vydána (𝕏) květnová aktualizace aneb nová verze 1.90 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a animovanými gify v poznámkách k vydání. Ve verzi 1.90 vyjde také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.

    Ladislav Hagara | Komentářů: 0
    dnes 00:44 | Nová verze

    Byla vydána (Mastodon, 𝕏) nová verze 2024.2 linuxové distribuce navržené pro digitální forenzní analýzu a penetrační testování Kali Linux (Wikipedie). Přehled novinek se seznamem nových nástrojů v oficiálním oznámení.

    Ladislav Hagara | Komentářů: 0
    včera 16:44 | IT novinky

    Počítačová hra Tetris slaví 40 let. Alexej Pažitnov dokončil první hratelnou verzi 6. června 1984. Mezitím vznikla celá řada variant. Například Peklo nebo Nebe. Loni měl premiéru film Tetris.

    Ladislav Hagara | Komentářů: 10
    včera 10:44 | Nová verze

    MicroPython (Wikipedie), tj. implementace Pythonu 3 optimalizovaná pro jednočipové počítače, byl vydán ve verzi 1.23.0. V přehledu novinek je vypíchnuta podpora dynamických USB zařízení nebo nové moduly openamp, tls a vfs.

    Ladislav Hagara | Komentářů: 0
    včera 10:22 | Nová verze

    Canonical vydal Ubuntu Core 24. Představení na YouTube. Nová verze Ubuntu Core vychází z Ubuntu 24.04 LTS a podporována bude 12 let. Ubuntu Core je určeno pro IoT (internet věcí) a vestavěné systémy.

    Ladislav Hagara | Komentářů: 2
    včera 01:00 | Nová verze Ladislav Hagara | Komentářů: 0
    4.6. 19:55 | IT novinky

    Intel na veletrhu Computex 2024 představil (YouTube) mimo jiné procesory Lunar Lake a Xeon 6.

    Ladislav Hagara | Komentářů: 0
    4.6. 13:44 | IT novinky

    Na blogu Raspberry Pi byl představen Raspberry Pi AI Kit určený vlastníkům Raspberry Pi 5, kteří na něm chtějí experimentovat se světem neuronových sítí, umělé inteligence a strojového učení. Jedná se o spolupráci se společností Hailo. Cena AI Kitu je 70 dolarů.

    Ladislav Hagara | Komentářů: 0
    Rozcestník

    Programování v Ruby - Výpočet čisté mzdy

    16.6.2013 08:39 | Přečteno: 1421× | Ostatní | poslední úprava: 17.6.2013 13:51

    Zjednodušený program na výpočet čisté mzdy je rozdělen do tří souborů, a to hlavni.rb, konstanty.rb a metody.rb


    # soubor konstanty.rb

    SAZBA_ZDRAVOTNI_ZAMESTNAVATEL = 9.0
    SAZBA_SOCIALNI_ZAMESTNAVATEL = 25.0
    SAZBA_ZDRAVOTNI_ZAMESTNANEC = 4.5
    SAZBA_SOCIALNI_ZAMESTNANEC = 6.5

    SAZBA_DANE_Z_PRIJMU = 15.0

    POPLATNIK = 2070
    DRZITEL_ZTP = 1345
    STUDENT = 335
    DITE = 1117

    STR1 = 'Podepsal jste prohlaseni? A/N'
    STR2 = 'Jste drzitelem ZTP? A/N'
    STR3 = 'Studujete? A/N'
    STR4 = 'Kolik mate deti?'



    # soubor metody.rb

    def procenta_a_zaokrouhleni(x,y)
      x *= y / 100
      x = '%.2f' % x
      return x.to_f.ceil
    end

    def zaokrouhlit_stovky(x)
      x = x.to_f / 100
      return x.ceil * 100
    end

    def test_vstupu_cisel(a)
      abort "Chybny vstup" if a !~ /[0-9]+/
    end

    def test_vstupu_an(a)
      abort "Chybny vstup" if a !~ /a|n/i
    end



    # soubor hlavni.rb

    require '/home/nagyova/mzda/konstanty.rb'
    require '/home/nagyova/mzda/metody.rb'

    puts
    puts 'VYPOCET CISTE MZDY'
    puts
    print 'Mesicni mzda: '

    hruba_mzda = gets
    test_vstupu_cisel(hruba_mzda)
    hruba_mzda = hruba_mzda.to_i

    puts STR1
    odpoved = gets
    test_vstupu_an(odpoved)

    if odpoved =~ /a/i
      sleva_na_dani = POPLATNIK

      puts STR2
      odpoved = gets
      test_vstupu_an(odpoved)

      if odpoved =~ /a/i
       sleva_na_dani += DRZITEL_ZTP
      end

      puts STR3
      odpoved = gets
      test_vstupu_an(odpoved)

      if odpoved =~ /a/i
       sleva_na_dani += STUDENT
      end

      puts STR4
      sleva_na_deti = gets
      test_vstupu_cisel(sleva_na_deti)
      sleva_na_deti = sleva_na_deti.to_i

      if sleva_na_deti > 0
       sleva_na_deti *= DITE
      end
    else
      sleva_na_dani = 0
      sleva_na_deti = 0
    end

    zdravotni_zamestnavatel = procenta_a_zaokrouhleni(hruba_mzda, SAZBA_ZDRAVOTNI_ZAMESTNAVATEL)
    socialni_zamestnavatel = procenta_a_zaokrouhleni(hruba_mzda, SAZBA_SOCIALNI_ZAMESTNAVATEL)
    zdravotni_zamestnanec = procenta_a_zaokrouhleni(hruba_mzda, SAZBA_ZDRAVOTNI_ZAMESTNANEC)
    socialni_zamestnanec = procenta_a_zaokrouhleni(hruba_mzda, SAZBA_SOCIALNI_ZAMESTNANEC)

    super_hruba_mzda = hruba_mzda + zdravotni_zamestnavatel + socialni_zamestnavatel
    super_hruba_mzda = zaokrouhlit_stovky(super_hruba_mzda)

    zaloha_na_dan = procenta_a_zaokrouhleni(super_hruba_mzda, SAZBA_DANE_Z_PRIJMU)
    zaloha_na_dan = zaloha_na_dan - sleva_na_dani

    if zaloha_na_dan < 0
      zaloha_na_dan = 0
    end

    cista_mzda = hruba_mzda - zdravotni_zamestnanec - socialni_zamestnanec - zaloha_na_dan + sleva_na_deti

    odvody_statu = zdravotni_zamestnavatel + socialni_zamestnavatel + zdravotni_zamestnanec + socialni_zamestnanec + zaloha_na_dan - sleva_na_deti

    2.times {puts}
    43.times {print '*'}
    puts

    puts '*%-30s*%10d*' % ['Zdravotni zamestnavatel', zdravotni_zamestnavatel]
    puts '*%-30s*%10d*' % ['Socialni zamestnavatel', socialni_zamestnavatel]

    43.times {print '*'}
    puts

    puts '*%-30s*%10d*' % ['Zdravotni zamestnanec', zdravotni_zamestnanec]
    puts '*%-30s*%10d*' % ['Socialni zamestnanec', socialni_zamestnanec]
    puts '*%-30s*%10d*' % ['Sleva na dani', sleva_na_dani]
    puts '*%-30s*%10d*' % ['Zaloha na dan', zaloha_na_dan]
    puts '*%-30s*%10d*' % ['Zvyhodneni na deti', sleva_na_deti]
    puts '*%-30s*%10d*' % ['Cista mzda', cista_mzda]

    43.times {print '*'}
    puts

    puts '*%-30s*%10d*' % ['Odvody statu celkem', odvody_statu]

    43.times {print '*'}
    puts


    Konstanty v Ruby začínají velkým písmenem, ale pro větší přehlednost se obvykle píšou všemi velkými písmeny. Rovněž je možné dále měnit jejich hodnoty, ale v takovém případě nás upozorní iterpret na to, že konstanta byla změněna.

    V metodě procenta_a_zaokrouhleni příkaz x *= y / 100 (zkrácený tvar pro x = x * y / 100) spočte procenta a x = '%.2f' % x je zaokrouhlí na dvě desetinná místa. Metoda to_f převede řetězec na desetinné číslo a ceil ho zaokrouhlí na celý integer nahoru.

    1.1.ceil     # se rovna 2

    Ve vlastních metodách na kontrolu vstupu metoda abort ukončí program a vypíše chybovou hlášku, pokud řetězec neodpovídá regulérnímu výrazu (regexp). Regulérní výrazy jsou v Ruby ohraničeny lomítky / a pro rovnost vzoru regulérního výrazu s řetězcem se používá operátor =~ a pro nerovnost !~.

    /[0-9]+/ vzor pro jedno a více čísel od nuly do devíti, bez + bychom měli vzor jen pro jedno číslo.

    /a|n/i vzor pro znaky a nebo n, svislice představuje or, a i na konci znamená case insensitive a brání rozlišováním mezi malými a velkými písmeny.

    Pozor! Mám špatně napsané regulérní výrazy, nyní jako mzda projde i "abc1", výrazy je třeba ohraničit symboly ^ a $

    V metodách a celém programu jsou též použity podmínky if, máme na výběr několik způsobů, jak je napsat.

    if x < 10
      x+=1
    end

    if x < 10 then
      x+=1
    end

    if x < 10 then x+=1 end

    anebo

    x+=1 if x < 10

    if
    je samozřejmě možné rozšířit o else

    if x < 10
      puts 'x je mensi nez 10'
    else
      puts 'x neni mensi nez 10'
    end

    Mezi další podmínky, které v Ruby můžeme použít, patří elsif, unless, case a operátor ?:.

    V hlavním souboru příkaz require připojí soubory s konstantami a metodami, k jejich nalezení používáme absolutní adresu, a pokud budete chtít, aby vám program fungoval, budete ji muset změnit dle toho, kam soubor umístíte.

    Pokud bychom napsali pouze require 'konstanty', program by tento soubor hledal na adresách, které jsou uloženy v globální proměnné $LOAD_PATH, zkráceně $:, k zjištění, které adresy proměnná obsahuje, zadáme do terminálu ruby -e 'puts $:' anebo v interaktivním interpretu irb napíšeme puts $:. Aby program fungoval jen s require 'konstanty', musíme přidat novou adresu do proměnné $LOAD_PATH.

    3.times {print 'Ruby! '} # Ruby! Ruby! Ruby!

    puts '*%-30s*%10d*' % ['Zdravotni zamestnavatel', zdravotni_zamestnavatel]

    %-30s
    třicetiznakový řetězec zarovnaný doleva

    K spuštění program přejdeme v příkazové řádce do složky, kam jsme umístili všechny soubory, a zadáme příkaz ruby hlavni.rb

    Na úpravu programu můžeme použít nějaké vývojové prostředí, třeba Geany. A za domácí úkol můžete program rozšířit o daňový bonus :-)

    S programováním teprve začínám, takže kdybyste věděli, jak něco vyřešit lépe a více Ruby-like, klidně napište do diskuze.        

    Hodnocení: 100 %

            špatnédobré        

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    16.6.2013 09:12 JS
    Rozbalit Rozbalit vše Re: Programování v Ruby - Výpočet čisté mzdy
    S programováním teprve začínám
    No, muj kod taky neni dokonaly, ale je to trochu videt. :-) Zkusim par konstruktivnich poznamek, snad te to neodradi:

    - Davat do ruznych souboru ma smysl veci, co spolu nesouvisi, nebo se naopak pouzivaji z vice modulu. Pri velikosti tveho programku by asi davalo lepsi smysl dat to vsechno do jednoho.

    - Melo by smysl napsat si funkce pro samotny vypocet, a oddelit je od vstupu a vystupu.

    - Asi by bylo logictejsi mit funkce pro vstup a zaroven jeho validaci nez jen jeho validaci. Ditto pro vystup - bylo by logictejsi mit funkci pro vystup zaokrouhlene hodnoty nez samotne zaokrouhleni.
    16.6.2013 11:11 ZAH | skóre: 43 | blog: ZAH
    Rozbalit Rozbalit vše Re: Programování v Ruby - Výpočet čisté mzdy
    Nevím co vlastně je účelem ukazky programu. Jestli je ukázat Ruby tak trochu promiň,jestli je to jednoduchý program na výpočet mezd, tak bych měl několik věcných připomínek.

    Definice konstant bez platnosti, je minimálně kontraproduktivní. program počítá správně v prosinci, nemusí to však platit v lednu. Update programu (modulu konstant ) není to správné ořechové protože funkce výpočtu daně pro určitý a pod. můžeš potřebovat i v dalších letech.

    V programu máš i věcné chyby odvody zaměstnavatele se nezaokrouhlují u pracovníků, ale v součtu. Do daně, ale vstupují zaokrouhlené . Co když sleva na daní je větší než daň. Chybně daň ze základu do 100 Kč. Atd.

    Pozor na zaokrouhlení. Čeští zákonodárci si libují v nesmyslu, nepoužívat běžné zaokrouhlení, nýbrž ho definovat v zákonech, systémem co kus to originál.

    Jinak pro předvedení Ruby, bych se přiklonil k názoru definuvat vstupní funkce s validací.

    Jen doufám, že jsem ti nezkazil chuť programovat. Jen se ještě nějakou dobu vyhýbej mzdám, je to vyšší dívčí výjimek a nesmyslů, v nichž se nevyznají ani autoři, ani kníže pekel Lucifer.
    16.6.2013 12:13 sad
    Rozbalit Rozbalit vše Re: Programování v Ruby - Výpočet čisté mzdy
    Nebojte, tohle určitě není základ pro nový svobodný účetní software. Je to přesně tak, jak píšete na začátku, jen jsem chtěl ukázat něco z Ruby.

    Větší sleva na dani než je daň, je ošetřena tímto: if zaloha_na_dan < 0 then zaloha_na_dan = 0 end

    Ale máte pravdu, že jsem zapomněl, na základ daně pokud je do 100 Kč, přitom jsem to měl vyřešené, když jsem trochu laboroval s daňovým bonusem na dítě, ale potom jsem program předělával a na toto jsem zapomněl.
    Josef Kufner avatar 16.6.2013 12:05 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: Programování v Ruby - Výpočet čisté mzdy
    Zrovna tohle je jeden z ukázkových příkladů, kde se hodí využít objektově orientovaného programování. Vyrob si interface, který definuje API výpočetního algoritmu, pak vytvoř třídu, která bude podle data platnosti předávat výpočet té správné implementaci. Vstup a výstup bude mimo tyto třídy a jediné co zavoláš, je ta "rozdělovací" třída. Když pak za pár měsíců přijde změna ve výpočtu, vyrobíš další implementaci, doplníš konfiguraci rozdělovací třídy a máš hotovo.
    Hello world ! Segmentation fault (core dumped)
    David Watzke avatar 16.6.2013 12:09 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Programování v Ruby - Výpočet čisté mzdy
    require '/home/nagyova/mzda/konstanty.rb'
    Vážně? :-D
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    16.6.2013 12:17 sad
    Rozbalit Rozbalit vše Re: Programování v Ruby - Výpočet čisté mzdy
    To víš, tahle baba vleze všude.
    16.6.2013 13:20 xxar3s
    Rozbalit Rozbalit vše Re: Programování v Ruby - Výpočet čisté mzdy
    a dá s v ruby vyhodnocovať podmienka ako výraz?

    príklad:
    MALE = 0
    FEMALE = 1
    
    puts "Pohlavie: %s" % if gender == MALE then "mužské" else "ženské" end
    Bystroushaak avatar 16.6.2013 13:35 Bystroushaak | skóre: 36 | blog: Bystroushaakův blog | Praha
    Rozbalit Rozbalit vše Re: Programování v Ruby - Výpočet čisté mzdy
    Co to prostě zkusit?
    16.6.2013 13:44 xxar3s
    Rozbalit Rozbalit vše Re: Programování v Ruby - Výpočet čisté mzdy

    Dik funguje...

    Len mi to vyhodilo: "Pohlavie: mu??sk??"

    Ruby nepodporuje unicode?

    17.6.2013 12:01 nyan
    Rozbalit Rozbalit vše Re: Programování v Ruby - Výpočet čisté mzdy
    Ruby nepodporuje unicode?
    Zalezi na verzi ruby a tom, co myslite slovem "podporuje" ;-)
    pavlix avatar 16.6.2013 22:00 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: Programování v Ruby - Výpočet čisté mzdy
    Na jednu stranu, sociální a zdravotní se takhle počítat nedá, výpočet je špatný, na druhou stranu, všechny ty jednoduché věci se ve výpočtu řeší na první pohled docela složitě.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    17.6.2013 12:11 Michal Karas | skóre: 45 | blog: /dev/random
    Rozbalit Rozbalit vše Re: Programování v Ruby - Výpočet čisté mzdy
    Ahoj, pár poznámek:

    Absolutní cesty jsou opravdu zlo, toto fakt nepoužívat. Běžný idiom je require File.join(File.dirname(__FILE__), 'konstanty.rb'), od Ruby 1.9 je navíc k dispozici require_relative. Ruby 2.0 přidává i __dir__ (podobně jako již zavedené __FILE__ a __LINE__) vhodné pro takové ty File.open a YAML.load.

    --
    43.times {print '*'}
    puts
    Určitě než volat print v cyklu bych raději použil puts '*'*43

    --
    ...
    
    puts STR2
    odpoved = gets
    test_vstupu_an(odpoved)
    
    if odpoved =~ /a/i
      sleva_na_dani += DRZITEL_ZTP
    end
    
    ...
    Není mi úplně jasné, proč používáš ty konstanty STR1 až STR4. Stejně tam máš v kódu napevno zadrátované to, čeho se která týká (sleva_na_dani). Nevím jestli nečekáš, že ty otázky se budou nějak výrazně často měnit a proto je chceš mít někde bokem, ale IMHO to nestojí za to snížení čitelnosti hlavni.rb.

    --

    Jak už bylo řečeno výše, tak to rozdělení do souborů není úplně ideální. Hlavně je ale Ruby objektivně orientovaný jazyk a tak je škoda to úplně ignorovat. :-) Začal bych nějak takto:
    class PlatovaKalkulacka
      SAZBA_ZDRAVOTNI_ZAMESTNAVATEL = 9.0
      SAZBA_SOCIALNI_ZAMESTNAVATEL = 25.0
      SAZBA_ZDRAVOTNI_ZAMESTNANEC = 4.5
      SAZBA_SOCIALNI_ZAMESTNANEC = 6.5
    
      SAZBA_DANE_Z_PRIJMU = 15.0
    
      POPLATNIK = 2070
      DRZITEL_ZTP = 1345
      STUDENT = 335
      DITE = 1117
    
      attr_reader :hruba_mzda, :podepsane_prohlaseni, :ztp, :student, :pocet_deti
    
      def initialize(opts={})
        @hruba_mzda = opts[:hruba_mzda]
        @podepsane_prohlaseni = opts[:podepsane_prohlaseni] || false
        @ztp = opts[:ztp] || false
        @student = opts[:student] || false
        @pocet_deti = opts[:pocet_deti] || 0
      end
    
      def sleva_na_dani
        return 0 unless podepsane_prohlaseni
    
        val = POPLATNIK
        val += DRZITEL_ZTP if ztp
        val += STUDENT if student
        val
      end
      
      def super_hruba_mzda
        hruba_mzda + zdravotni_zamestnavatel + socialni_zamestnavatel
      end
    
      ...
    end
    
    Nemáš potom ty konstanty a metody v globálním namespace, ale hezky u třídy, které se to týká. Navíc máš pak metody jako PlatebniKalkulacka#super_hruba_mzda, ve kterých je jen samotný výpočet dané hodnoty, nemáš to smíchané s kódem pro vstup/výstup.

    Se soubory jako metody.rb bych byl opatrný. Mám zkušenost, že takový soubor rychle bobtná (vyvojáři projektu si tam přihodí nějakou funkci, kterou zrovna rychle potřebují), dochází k duplikaci kódu a víceméně všechny ostatní součásti aplikace na tom závisí. Odstraňovat je to potom peklo, to se už raději v začátku snaž mít objektový návrh a ty metody si dávat rovnou tam, kam patří.
    17.6.2013 12:38 Michal Karas | skóre: 45 | blog: /dev/random
    Rozbalit Rozbalit vše Re: Programování v Ruby - Výpočet čisté mzdy
    Jo a ještě pozor na ty regulární výrazy, tak jak to máš teď (bez ^ a $) ti to schroustá i to, co požadovaný formát obsahuje jen jako substring. Třeba "bla" máš jako kladnou odpověď na otázku typu A/N. Nebo "number88" ti projde validací, ale String#to_i ti z toho udělá 0.
    17.6.2013 13:23 sad
    Rozbalit Rozbalit vše Re: Programování v Ruby - Výpočet čisté mzdy
    Díky za velice konstruktivní kritiku a vidím, že na těch základech ještě budu muset hodně zapracovat. Hlavně si mě překvapil s těmi regulérními výrazy, fakt tam projde mzda třeba jako "aaaaaaaa1.", to je v pytli :)
    18.6.2013 14:27 trekker.dk | skóre: 72
    Rozbalit Rozbalit vše Re: Programování v Ruby - Výpočet čisté mzdy
    Jenom abych malinko doplnil to o těch regulárech. Na vstupy získané pomocí gets jsou znaky ^ a $ asi v pohodě, ale jinak doporučuju zkusit tohle:
    # encoding: utf-8
    
    a = "vstup\n123"
    abort "chybný vstup" if a !~ /^[0-9]+$/
    
    puts a.to_i()
    ^ a $ označují začátek a konec řádku, ale ne začátek a konec řetězce. Pokud chceš kontrolu toho, že řetězec opravdu obsahuje jenom čísla, je potřeba /\A[0-9]+\Z/.
    Quando omni flunkus moritati
    14.4.2015 21:52 Hovlo
    Rozbalit Rozbalit vše Re: Programování v Ruby - Výpočet čisté mzdy
    Já jsem líný na takové programování, hodím tam tabulku a je vyřešeno:-) tady jsou důkazy http://www.mzdy-vypocet.cz
    25.9.2015 07:54 Program588
    Rozbalit Rozbalit vše Re: Programování v Ruby - Výpočet čisté mzdy
    To bude zlozite. Radeji spravim prehladni tabulku pro vypocet mzdy .

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.