Programski jeziki Od problema do programa Od problema do programa Problem Algoritem (postopek reševanja problema) Zapis v programskem jeziku uporaba ukazov, ki jih znamo izvesti Prevajanje v obliko, ki jo razume procesor (izvajalec ukazov) Izvajanje Ali rešitev ustreza problemu? Od problema do programa opredelitev problema določitev tega, kaj vemo - katere podatke poznamo, in tega, kaj želimo dobiti - rezultat; načrtovanje postopka rešitve - algoritem; zapis postopka rešitve v programskem jeziku; Prevajanje v obliko, ki jo razume procesor izvršitev programa na računalniku; preverjanje programa (preverjanje pravilnosti rešitve) 1
Zakaj programski jeziki? Oseba A govori LE jezik blable, oseba B pa LE jezik blublu. Kako naj se A sporazume z B? Lahko se A nauči jezika blublu in se potem pogovarjata v blublujščini. Procesor govori le strojni jezik: 0000110101 in ne kaže nobene želje, da bi se naučil naš jezik Torej se moramo mi naučiti strojni jezik Programiranje v strojnem jeziku: zapleteno, polno napak, specifično za vsak procesor Zapleten jezik: pogovor omogoči posebej izučen stokovnjak prevajalec Ta jezik blable prevede v jezik blublu Zakaj programski jeziki? Strokovnjakov, ki bi znali strojni jezik, je (razmeroma) malo, želja po ukazovanju procesorju (pogovarjanju z njim) (zelo) veliko Avtomatsko prevajanje prevajanje iz našega jezika v strojni jezik naj opravi program Kaj je naš jezik? Posebni programski jezik Govorjeni jeziki Zakaj programski jeziki? Zakaj pa bi potrebovali poseben programski jezik? Navodila napišimo v pogovornem jeziku program pa naj jih prevede v strojni jezik Sestaviti tak prevajalnik: Izjemno kompleksna (trenutno praktično nemogoča) naloga naravni jeziki so preveč ohlapni, da bi bilo avtomatsko prevajanje mogoče. Ste že videli dva slavista, ki bi se strinjala glede tega, kako kaj napisati? 2
Zakaj programski jeziki? Vse kar se dogaja v računalniku, opravi procesor tako, da bere in piše po pomnilniku ter izvaja preproste aritmetične operacije. Ustrezni ukazi: zbirna koda (angl. assembly code). Težavno pisanje pravilna uporaba pomnilniških lokacij, zapomniti kaj je shranjeno na posameznih lokacijah, Preveč elementarne opearcije http://haka.fmf.uni-lj.si/pra-racunalnistvo- 1/lekcija01/index.html Vmesni člen: višji programski jeziki Nam se je enostavneje izražati v njih (pisati programe zapise algoritmov) Dovolj natančni (stroga sintaksa), zato mogoče sestaviti avtomatske prevajalnike Programski jeziki Služijo za zapis algoritma Najrazličnejši Morajo omogočati avtomatsko pretvorbo v strojni jezik (jezik, ki ga razume procesor) Programski jeziki Ogromno jezikov: pascal, basic, cobol, Smalltalk, C#, ada,... Različne zvrsti Generacije jezikov Objektni (predmetni) jeziki, funkcijski jeziki,... Programski jezik Java Prevajalniki Avtomatska pretvorba iz zapisa v jezik procesorja Programi Podatki: izvorna koda Rezultati: prevedena koda Kot za pripravo besedil obstajajo različni urejevalniki, tudi tu obstajajo različni prevajalniki JAVAC, JBUILDER, VisualCafe, IBM Visual Age for Java,... Vsi zapis v programskem jeziku Java prevedejo v obliko, ki jo razume procesor (ni čisto res, a...) 3
Primer Preberi stranico kvadrata in ga nariši Algoritem: Preberi število in si ga zapomni kot celo število v spremenljivko a Nariši pravokotnik s stranicama a in a Včasih bo potrebno korake algoritma še razgraditi, če posameznega koraka ni moč neposredno zapisati v programskem jeziku JAVA: 1.korak: podatek preberemo kot niz Pretvorimo niz v število pascal: 2.korak Sam jezik ne pozna ukazov za risanje! Program v jeziku Java različica 1 import java.awt.*; import java.applet.*; import javax.swing.joptionpane; public class KvadratBeri extends Applet { /* Narisali bomo kvadrat s stranico a */ public void paint (Graphics g) { int a; // Stranica kvadrata String str; // stranica prebrana kot niz str = JOptionPane.showInputDialog("Vnesi stranico kvadrata"); // V str preberemo stranico kvadrata a = Integer.parseInt(str); // iz str naredimo celo število // in ga shranimo v a // Narisemo kvadrat g.drawrect(10, 10, a, a); Program v jeziku Java - različica 2 import java.awt.*; import javax.swing.*; class Kvadrat_Okno extends JFrame { /* Narisali bomo kvadrat s stranico a */ public void paint (Graphics g) { int a; // Stranica kvadrata String str; // stranica prebrana kot niz str = JOptionPane.showInputDialog("Vnesi stranico kvadrata"); // V str preberemo stranico kvadrata a = Integer.parseInt(str); // iz str naredimo celo število // in ga shranimo v a // Narisemo kvadrat g.translate(getinsets().left, getinsets().top); // da se "znebimo" zg. vrstice g.setcolor(color.black); // risemo s crno barvo g.drawrect(10, 10, a, a); public class KvadratOkno { public static void main(string[] s){ Kvadrat_Okno o = new Kvadrat_Okno(); o.resize(200, 200); // velikost okna o.show(); // prikaz 4
Kako? Priprava izvorne datoteke (source code) TextPad, NotePad KvadratBeri.java Prevajanje (compile) V DOS oknu se postavimo v imenik, kjer je datoteka KvadratBeri.java JAVAC KvadratBeri.java Izvedemo program Priprava ustrezne datoteke s HTML,kjer kličemo ta program(ček) APPLETVIEWER kvadrat.htm Narišimo trikotnik podatki: velikost trikotnika (število vrstic) rezultat: narisan polni trikotnik, sestavljen iz zvezdic (za n=3) * *** ***** Postopek izpišemo prvo vrstico, izpišemo drugo vrstico, izpisujemo i-to vrstico izpišemo ustrezno presledkov v 1. vrstici n - 1, v 2. vrstici n - 2, v i-ti vrstici n - i izpišemo ustrezno število * v 1. vrstici 1, v 2. vrstici 3, v 3. vrstici 5, v i-ti vrstici 2 * i - 1 5
Program v jeziku C /* trikot. c */ #include <stdio.h> int main(void) { int i, j, velikost; printf("\n\n Velikost trikotnika: "); scanf("%d",&velikost); printf("\n\n\n"); for (i = 1; i <= velikost; i = i + 1) { /* izpis i - te vrstice */ for (j = 1; j <= velikost - i; j = j + 1) printf(" "); /* presledki */ for (j = 1; j <= 2 * i - 1; j = j + 1) printf("*"); /* zvezdice */ printf("\n"); /* v novo vrsto */ return 0; Program v pascalu program trikot; var i, j, velikost: integer; begin writeln; writeln; write( Velikost trikotnika: ); read(velikost); writeln; writeln; writeln; for i := 1 to velikost do begin { izpis i - te vrstice for j := 1 to velikost i do write(" "); { presledki for j := 1 to 2 * i 1 do write("*"); { zvezdice writeln { v novo vrsto end end. Program v jeziku Java import javax.swing.*; public class Trikot { public static void main(string[] args) { int i, j, velikost; String vel_s; // Preberimo velikost vel_s = JOptionPane.showInputDialog("Velikost trikotnika:"); velikost = Integer.parseInt(vel_s); System.out.print("\n\n\n"); for (i = 1; i <= velikost; i = i + 1) { // izpis i-te vrstice for (j = 1; j <= velikost - i; j = j + 1) System.out.print(" "); /* presledki */ for (j = 1; j <= 2 * i - 1; j = j + 1) System.out.print("*"); /* zvezdice */ System.out.println(""); /* v novo vrsto */ 6
Od problema do programa Problem Ideja Rešitev Od problema do programa Problem Ideja == algoritem Rešitev == program v programskem jeziku Kaj je algoritem? Algoritem je postopek, ki nam korak za korakom pove, kako rešiti dani problem Za dani problem v splošnem obstaja veliko algoritmov, ki določijo postopek, s katerim rešimo problem Npr. obstaja veliko algoritmov za izračun produkta dveh števil: Tabela poštevanke (primerno le za majhna števila) Pisno množenje Množenje z uporabo logaritmov. Uporaba računala. Uporaba postopkov vgrajenih v računalnik. Leibnitzov "računalnik"... 7
Kaj je algoritem navodilo, kako opraviti določen postopek KAJ storiti, KAKO to storiti Končno zaporedje ukazov, ki, če jih ubogamo, opravijo neko nalogo Značilnosti algoritma ima podatke vrne rezultat (število, risba na zaslonu, izdelan izdelek,...) je natančno določen se vedno konča mogoče gajeopraviti Značilnosti algoritma Algoritem moramo izraziti z jezikom, ki ga izvajalec "razume" (A postopek ni odvisen od izbora konkretnega jezika.) Postavljeni problem mora biti rešljiv torej tak, da se ga da rešiti na način korak za korakom. (npr. sestavi postopek, ki bo povedal, kateri je najlepši človek med navzočimi) 8
Značilnosti algoritma Algoritem je postopek, ki ga izvajamo korak za korakom in s katerim rešimo dani problem. Algoritem izvede izvajalec (ki je bodisi človek, stroj, elektronska naprava). Algoritem mora biti izražen v korakih, ki jih je izvajalec sposoben izvesti. Algoritem se mora končati. Primer 1: razpoloviti ravno palico (1) Splošneje: Poiskati srednjo točko daljice AB. Algoritem: Srednjo točko daljice AB poiščeš takole: 1. Nariši dva sekajoča se kroga z enakim polmerom. Prvi naj ima središče v točki A in drugi v točki B. 2. Naj bosta C in D točki, kjer se kroga sekata. 3. Nariši ravno črto skozi C in D. 4. Naj bo E točka, kjer CD seka AB. 5. Končaj z odgovorom E. Algoritem lahko izvede človek, če ima na voljo ustrezna orodja za risanje (npr. šestilo, ravnilo in pisalo). Primer 1 (2) 1. Nariši dva sekajoča se kroga z enakim polmerom. Prvi naj ima središče v točki A in drugi v točki B. 2. Naj bosta C in D točki, kjer se kroga sekata. 3. Nariši ravno črto skozi C in D. 4. Naj bo E točka, kjer CD seka AB. 5. Končaj z odgovorom E. A C E D B 9
Primer 2: NSD (1) Največji skupni delitelj dveh pozitivnih celih števil je največje celo število, ki deli obe števili, npr. NSD 77 in 21 je 7. Evklidov algoritm za izračun NSD: Da izračunaš NSD pozitivnih števil m in n: 1. Naj bo p enak m in q enak n. 2. Dokler q ne deli točno (brez ostanka) p, ponavljaj: 2.1. Naj bo p enak q in q enak ostanku pri deljenju p s q (p modulo q). 3. Končaj z odgovorom q. Algoritem lahko izvede vsak, ki pozna osnovne operacije deljenja. Primer 2 (2) Implementacija v pascalu: function nsd (m, n: integer): integer; var p, r, q: integer; begin p := m; q := n; while (p mod q <> 0) do begin r := p mod q; p := q; q := r end; nsd := q end; razume ga "izvajalec, ki razume pascal" npr."pascalski stroj" Primer 2 (3) Naj bo p enak m in q enak n. Dokler q ne deli točno (brez ostanka) p, ponavljaj: Naj bo p enak q in q enak ostanku pri deljenju p s q (p modulo q). Končaj z odgovorom q. function nsd (m, n: integer): integer; var p, r, q: integer; begin p := m; q := n; while (p mod q <> 0) do begin r := p mod q; p := q; q := r end; nsd := q end; Dva zapisa istega algoritma 10
Primer 2 (5) Obstaja seveda tudi drugačen algoritem: npr: Naj bo p manjše od obeh števil m in n Dokler p ne deli m in p Zmanjšaj p za 1 Končaj z odgovorom p Vprašanja Kako zasnovati algoritem metode, strategije Kako preveriti algoritem dokaz pravilnosti Kako analizirati algoritem prostorska in časovna zahtevnost Kako izraziti algoritem enoličnost, komu je namenjen, kaj so osnovna navodila, komentarji Učenje programskih jezikov Učenje izražanja določenega algoritma Zasnova algoritma: enostavna, enostavni problemi,... Učenje zapisovanja algoritma v dan jezik 11
Jezik Sintaksa Kako je sestavljen jezik stavek, imeti napak polno. Naravni jeziki: dokaj ohlapna sintaksa, z leti spreminjajoča se Semantika Kaj sintaktično pravilen stavek pomeni Sintaktično pravilni stavki lahko povejo nesmisel. Vsota števil 2 in 3 je 7. Danes je zelo vroče vreme. Konj ima zeleno nabrušen rep. Sintaksa Pravila, kako mora biti sestavljen program stroga pravila omogočajo avtomatično prevajanje prevajalnik odkrije sintaktične napake Napake v sintaksi: javi prevajalnik zgled Semantika Sintaktično pravilen, a drugače napačen program public class Narobe_semantika { // Sintaktično pravilen, a semantično napačen program public static void main(string[] g){ System.out.println("Vsota stevil 2 + 3 = " + 2 * 3); public class Narobe_semantika2 { // Sintaktično pravilen, a semantično napačen program public static void main(string[] g) { System.out.println("Vsota stevil 2 + 3 = " + 2 + 3); 12
Semantika Napake v semantiki: razumevanje problema Tehnike priprave programov Strukturirano programiranje Problem razgrajujemo na zaključene podprobleme, ki jih razgrajujemo naprej Ekstremno programiranje Najprej pripravimo testne primere in pričakovane odgovore... Preverjanje, preverjanje, preverjanje Ne moremo preveriti, ali program dela prav, lahko pa ugotovimo, da ne dela prav 13