Zvyčajným problémom ktorý adept programovania rieši na prvej strane kurzu je vypísanie frázy "Hello World!" na obrazovku. Niečo to robí ale neviem si predstaviť zaujímavý problém ktorý by riešilo iba vypisovanie textu na obrazovku.
Pre rýdzo nepraktický exkurz do sveta programovacích jazykov som si preto vybral úlohu o máličko obšírnejšiu a tou je zjednodušený výpočet čistej mzdy. Tj zadáme hrubú mzdu a program nám vypíše odvody zamestnanca , daň a čistú mzdu. Nič svetoborné pretože sa k tomu používajú len tie najzákladnejšie príkazy. Je to niečo na čo by sme použili online kalkulačku a hĺbavejší tabuľku v Exceli. V časoch dávno minulých aj súčasných si takýto výpočet môžeme hrdo naprogramovať.
Náš program očakáva hodnotu hrubej mzdy a vypíše postupne jednotlivé sumy odvodov , daň a čistú mzdu.
Na prvý príklad sa vyberieme do počítačového praveku k PMD-85 a jeho zabudovanému Basicu s ktorým sa moja generácia stretla v časoch dávnej mladosti.
Na 8 bitový BASIC zo ZX Spectra či jeho Skalického klonu si ako tak spomínam akurát niektoré veci sú na PMD verzii odlišné.
Takže bez ladu a skladu skúsime niečo zosmoliť bez veľkého premýšľania.

Jediný problém je, že v rámci odvodov to tvrdošijne v ráta zlú hodnotu pre nemocenské čo je 1.4 percenta hádže výsledok 10 pre hrubú mzdu 1000.
A tu sa objavila prvá záludnosť. Prvotne som chcel premenné pomenovať len jedným znakom, ale napadlo ma že to môže byť aspoň aká taká skratka pre jej význam. tj NEM ako nemocenské a SNEM ako suma nemocenské.
Akurát to dáva pre vstup 1000 nejaké podivné hodnoty.

Hodnota 10 je veľmi divná až pokým som si nespomenul čo som čítal v nejakej príručke PMD basicu, a to, že premenné síce môžu byť označené viacerými znakmi ale interne sa nie všetky aj použijú na rozlíšenie. Tu vraj systém rozlišuje iba 2 prvé znaky v mene premennej. Teda NEM a NEZ sú vlastne jedna a tá istá premenná ktorej sme v riadku 30 priradili hodnotu 1.4 ale v riadku 50 sme to prepísali na 1.
Teda SNEM=HRM/100*NEM je vlastne 1000/100*1 a nie x1.4.
Trochu vyčistený a upravený program zatiaľ na výpis sumy odvodov by vyzeral asi takto.

Teraz sa zahráme na daňovú reformu a zjednodušíme si vec tak, že nezdaniteľná časť bude fixná 375.95 eura mesačne a daň bude 19% zo základu dane.
Do programu pridáme zrátanie základu dane ( hrubá mzda - odvody - nezdaniteľná suma ) potom vyrátame a odrátame daň a odvody od hrubej mzdy.

A test dopadol takto.

Znovu je tam nejaká chyba lebo nesedia sumy odvodov spolu a jeden vypis je tam 2x. Zrejme sa znovu bijú dve mená premenných - SNEM a SNEZ .
Tak pri opravách sa vyrobil iný problém a celý čas je to o zlom zvolení mien premenných. Asi fakt je nevyhnutné používať len dvojznakové mená aby sa to neplietlo.

Nasledovnému výsledku sa už hádam dá aj veriť.

Takže sme sa dopustili barbarstva, a to v tom že názvy premenných nie sú zrozumiteľne zapísané a už moc nikto nespomenie ktorá je ktorá, hádam ak podľa hodnoty. Čistejšie by bolo ich označiť len jedným či dvomi písmenami a ich význam popísať v komentári REM. Ani príkaz LET na PMD nie je na priradenie hodnoty povinný.
Používanie dlhých slov ako mien premennej je síce lákavé ale veľmi ľahko sa stane že sa prvé dva znaky zopakujú a v ich finálnych názvoch už pôvodný zámer autora nikto nenájde. Zišlo by sa aj oddeliť výpočty od zobrazenia výsledkov.
Dajú sa síce robiť elegantnejšie konštrukcie ale koncept jazyka Basic sa považuje dnes za celkom prekonaný aj keď existujú verzie ktoré sa na pôvodné 8 bitové už takmer nepodobajú.
Presuňme sa o pár desaťročí do súčasnosti k populárnemu jazyku Python. Tento sa vraj rozšíril ako jazyk ktorý sa učí na stredných či vysokých školách dnes.
Tam by človek predpokladal že minimálne tie znaky nebude hľadať po klávesnici ako v prípade toho PMD emulátora.
Ale aj tu sa nejaká divná chyba pritrafila.

Chyba hlási problém ale netuším prečo vznikol aj keď tak trochu mám tušenie že som na niečo v rýchlosti zabudol.
Delím vraj typ reťazec celočíselnou hodnotou. Nejde mi do hlavy prečo dynamický typ nezvolí automaticky integer keď za hrubú mzdu zadám číslo 1000. Pravdepodobne preto lebo príkaz input to vyžaduje aj keď zrejme test v interaktívnom móde to hneď neodhalil.
C:\>cistamzda01.py
Zadaj hrubu mzdu: 100
Traceback (most recent call last):
File "C:\cistamzda01.py", line 12, in <module>
snemocenske=hrmzda/100*nemocenske
TypeError: unsupported operand type(s) for /: 'str' and 'int'
Stačilo doplniť príkaz INPUT typom premennej float a test vyzerá OK. Zrejme ani NBU sa nad testami viac nezamýšla. Program dáva uveriteľné hodnoty, ktože by sa nad tým trápil. Veď aj PMD nech mu je digitálna zem ľahká, to dalo na 772.891 a tuto nám pribudlo jedno desatinné miesto, toľko prínos za 40 rokov pokroku v IT. Suma ozaj sedí pre rok 2021 dáva internet 772.89 . V roku 2022 sa zmenili odpočítateľné položky tak sme zarobili naviac asi neuveriteľné jedno euro.
Takto to má byť správne aby program priradil zadanému údaju správny typ.
hrmzda = float (input ("Zadaj hrubu mzdu: "))
A teraz to pekne ráta ako má.
C:\>cistamzda01.py
Zadaj hrubu mzdu: 1000
Hruba mzda je 1000.0
Nemocenske je 14.0
Starobne je 40.0
Invalidne je 30.0
Poistenie v nezamestnantosti 10.0
Zdravotne poistenie je 40.0
Odvody spolu su: 134.0
Dan je: 93.1095
Cista mzda je: 772.8905
Poďme teraz k menej známym jazykom. Ekonomické počty boli a ešte vraj aj sú doménou programov napísaných v jazyku COBOL ktorý vznikol presne na tento účel.
Dnes zrejme Basic a Python pozná kdekto ale taký COBOL to už je čosi iné. Nuž hádam sa v tom podivnom systéme za hodinku dve dá zbúchať čosi čo bude aj fungovať. Zopár povzbudivých slov na úvod:
„The use of COBOL cripples the mind; its teaching should, therefore, be regarded as a criminal offence.“
E. W, Dijkstra
Takto, jendoduché to nie je, ale to skôr kôli tomu že je to dosť odlišné. Basic či Python predsa len dodržiavajú nejakú známejšiu formu ale COBOL je dosť špecifický zápisom programu. Samozrejme na rozdiel od predošlých je COBOL z trochu inej vetvy ale skôr je iný v tom že má pomerne prísnu štruktúru a definície typov, čo zase má napr aj Pascal. COBOL je orientovaný na financie a je to starý jazyk tak si svoju odlišnosť vychutnáva.
Príklad využíva len základné funkcie, tj ako načítať a zobraziť hodnoty a základné matematické operácie. Ale aj tak keď to človek vidí prvý krát, je to trochu nezvyklé.
Program použil pre číselné hodnoty formát 4 číslice a 2 desatinné miesta takže nám vyšlo 772.90 .
C:\Users\ML\bin\cistamzda2.exe
ZADAJ HRUBU MZDU
1000
Hruba mzda:1000
Nemocneske poistenie:0014.00
Zdravotne poistenie0040.00
Starobne poistenie0040.00
Invalidne poistenie:0030.00
Poistenie v nezamestnanosti:0010.00
VASA DAN JE 0093.10
ODVODY SPOLU SU 0134.00
CIASTKOVY ZAKLAD0866.00
ZAKLAD DANE 0490.05
VASA CISTA MZDA JE 0772.90
Process finished with exit code 0

Zdrojový text v Open Cobol vyzerá takto. Je to môj prvý COBOL program v živote a trvalo to cca 3 hodiny zistiť ako sa to v ňom robí.
******************************************************************
* Author:MATUS LAZUR
* Date: APRIL 2022
* Purpose: TEST BLOG
* Tectonics: cobc
******************************************************************
IDENTIFICATION DIVISION.
PROGRAM-ID. MZDA.
DATA DIVISION.
FILE SECTION.
WORKING-STORAGE SECTION.
01 NEMOCENSKE PIC 9(4)V9(2) VALUE 1.4.
01 STAROBNE PIC 9(4)V9(2) VALUE 4.
01 ZDRAVOTNE PIC 9(4)V9(2) VALUE 4.
01 INVALIDNE PIC 9(4)V9(2) VALUE 3.
01 NEZAMESTNAN PIC 9(4)V9(2) VALUE 1.
01 HRUBA-MZDA PIC 9(4).
01 SNEMOCENSKE PIC 9(4)V9(2).
01 SSTAROBNE PIC 9(4)V9(2).
01 SINVALIDNE PIC 9(4)V9(2).
01 SZDRAVOTNE PIC 9(4)V9(2).
01 SNEZAMESTNAN PIC 9(4)V9(2).
01 ZCIA PIC 9(4)V9(2).
01 ODVODY PIC 9(4)v9(2).
01 ZDANE PIC 9(4)V9(2).
01 DAN PIC 9(4)V9(2).
01 CISTA-MZDA PIC 9(4)V9(2).
01 NEZDANITELNA-SUMA PIC 9(4)V9(2) VALUE 375.95.
PROCEDURE DIVISION.
MAIN-PROCEDURE.
DISPLAY "ZADAJ HRUBU MZDU".
ACCEPT HRUBA-MZDA.
COMPUTE SNEMOCENSKE = HRUBA-MZDA/100*NEMOCENSKE.
COMPUTE SSTAROBNE = HRUBA-MZDA/100*STAROBNE.
COMPUTE SINVALIDNE = HRUBA-MZDA/100*INVALIDNE.
COMPUTE SZDRAVOTNE = HRUBA-MZDA/100*ZDRAVOTNE.
COMPUTE SNEZAMESTNAN = HRUBA-MZDA/100*NEZAMESTNAN.
DISPLAY "Hruba mzda:",HRUBA-MZDA.
DISPLAY "Nemocneske poistenie:",SNEMOCENSKE.
DISPLAY "Zdravotne poistenie", SZDRAVOTNE.
DISPLAY "Starobne poistenie", SSTAROBNE.
DISPLAY "Invalidne poistenie:", SINVALIDNE.
DISPLAY "Poistenie v nezamestnanosti:", SNEZAMESTNAN.
COMPUTE ODVODY = SSTAROBNE+SNEMOCENSKE+SZDRAVOTNE+SINVALIDNE
+SNEZAMESTNAN.
SUBTRACT ODVODY FROM HRUBA-MZDA GIVING ZCIA.
SUBTRACT NEZDANITELNA-SUMA FROM ZCIA GIVING ZDANE.
COMPUTE DAN = ZDANE/100*19.
COMPUTE CISTA-MZDA = HRUBA-MZDA - ODVODY - DAN.
DISPLAY "VASA DAN JE ", DAN.
DISPLAY "ODVODY SPOLU SU ", ODVODY.
DISPLAY "CIASTKOVY ZAKLAD", ZCIA.
DISPLAY "ZAKLAD DANE ", ZDANE.
DISPLAY "VASA CISTA MZDA JE ",CISTA-MZDA.
STOP RUN.
END PROGRAM MZDA.
Zaujímavý problém bol výpočet hodnoty ODVODY. Stále to ukazovalo chybu a problém bol že zápis šiel mimo povolenej šírky riadku a doriešilo to zalomenie.
To bude isto podobne ako pri ešte staršom Fortrane pamiatka na čas terminálov a diernych štítkov.
Samozrejme že netuším ako by sa taký jednoduchý program dal v COBOLe napísať efektívnejšie. Príde mi to trochu ukecané ale skôr je to kôli dlhému definovaniu premenných ktoré v BASICu a Pythone nie je povinné.
Nuž síce neviem poriadne programovať v nijakom jazyku, ale koľko je začiatočníkov napr. v COBOLe? To je ako vedieť povedať "Ako vám u nás chutilo?" po Swahilsky. A to sa počíta :-)