430 likes | 665 Views
PROGRAMIRANJE - ZAKAJ IN VSAJ KAJ. Podrobneje: glej Programiranje_zakaj_in_kaj.pdf. Zakaj neki programirati?. Danes je učenje programiranja povsem odveč in potrata časa. Za vse, kar želimo narediti z računalnikom, so na voljo ustrezna orodja. Znanje programiranja je odveč.
E N D
PROGRAMIRANJE - ZAKAJ IN VSAJ KAJ Podrobneje: glej Programiranje_zakaj_in_kaj.pdf
Zakaj neki programirati? • Danes je učenje programiranja povsem odveč in potrata časa. • Za vse, kar želimo narediti z računalnikom, so na voljo ustrezna orodja. • Znanje programiranja je odveč. • Programiranje je potrebno le kot zelo specialistično znanje skupinice strokovnjakov, ki pišejo programe, ki jih potem običajni uporabniki uporabljamo.
Zakaj vseeno učenje programiranja • privajanje na algoritmični način razmišljanja. • nujna sestavina sodobne funkcionalne pismenosti. • z učenjem programiranja najlažje osvojimo ta način razmišljanja • omogoča nam branje navodil, postopkov (pogosto so v obliki "kvazi" programov, diagramov poteka) • za umno naročanje programske opreme • da znaš pravilno predstaviti problem, ki ga potem sprogramira nekdo drug. • "napredni uporabnik" se slej kot prej sreča s programiranjem • Makro ukazi v uporabniških orodjih • Administracija – delo z več uporabniki • dinamične spletne strani • popravljanje "tujih" programov • … • Več jezikov znaš, več veljaš • Zakaj med "tujimi" jeziki ne bi bil tudi kak programski jezik? • Če bi se tolikokrat "pogovarjali" s Kitajcem, kot se z računalnikom, se ne bi naučili nekega skupnega jezika, ki bi ga "obvladala" oba?
Izbira programskega jezika • Za cilje prejšnje prosojnice • Precej nepomembna • Stvar osebnega okusa, okolja, dostopnosti, mode, ... • Za "pravo" programiranje • Okolje • Razvojna orodja • Vrsta problema • Skupni gradniki, enostaven prehod iz enega v drugi jezik
Osnovni gradniki • Konstante • števila, nizi, logične vrednosti • Spremenljivke • Prireditev, izrazi • Branje in izpisovanje • Vejitev – pogojni stavek • Zanke • Funkcije, metode, podprogrami, ... • Objekti in objektno programiranje • Sestavljene podatkovne strukture
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)
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. • Torej A govori blablajščino. Njegov govor prevajalec prevede v blublujščino. S tem oseba B razume, kaj je povedala oseba A. • Mi napišemo program v "našem" jeziku. Prevajalec ta naš jezik predeve v strojni jezik, ki ga procesor izvede.
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?
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 operacije • 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 ...)
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, včasih pa to sploh ne bo mogoče • 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 } }
Kako? • PRVI PROGRAM • 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 • Odpremo datoteko kvadrat.htm v brskalniku, ki "pozna Javo". • DRUGI PROGRAM • Priprava izvorne datoteke (source code) • TextPad, NotePad, ... – KvadratOkno.java • Prevajanje (compile) • V DOS oknu se postavimo v imenik, kjer je datoteka KvadratOkno.java • JAVAC KvadratOkno.java • Izvedemo program • JAVA KvadratOkno
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
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 */ } } }
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 jepostopek, 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. • ...
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 ga je opraviti
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)
Značilnosti algoritma • Algoritemje postopek, ki ga izvajamo korak za korakom in s katerim rešimo daniproblem. • Algoritem izvedeizvajalec (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: • 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. • Naj bosta C in D točki, kjer se kroga sekata. • Nariši ravno črto skozi C in D. • Naj bo E točka, kjer CD seka AB. • Končaj z odgovorom E. • Algoritem lahko izvede človek, če ima na voljo ustrezna orodja za risanje (npr. šestilo, ravnilo in pisalo).
A A A A D E C B B B B Primer 1 (2) • 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. • Naj bosta C in D točki, kjer se kroga sekata. • Nariši ravno črto skozi C in D. • Naj bo E točka, kjer CD seka AB. • Končaj z odgovorom E.
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 minn: 1. Naj bopenakmin qenakn.2. Dokler qne deli točno (brez ostanka)p, ponavljaj: 2.1. Naj bopenakqinqenakostanku 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: functionnsd (m, n: integer): integer; var p, r, q: integer; begin p := m; q := n;while (p mod q <> 0) dobegin r := p mod q; p := q; q := rend;nsd := q end; • razume ga "izvajalec, ki razume pascal" – npr."pascalski stroj"
Naj bopenakmin qenakn. Dokler qne deli točno (brez ostanka)p, ponavljaj:Naj bopenakqinqenakostanku pri deljenju p s q(p modulo q). Končaj z odgovorom q. functionnsd (m, n: integer): integer; var p, r, q: integer; begin p := m; q := n;while (p mod q <> 0) dobegin r := p mod q; p := q; q := rend; nsd := q end; Primer 2 (3) Dva zapisa istega algoritma
Primer 2 (4) • 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 algoritemdokaz pravilnosti • Kako analizirati algoritemprostorska 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 • "Skriti namen" učenja progr. jezika v šoli • Navajanje na algoritmični način razmišljanja
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 class Narobe_semantika { // Sintaktično pravilen, a semantično napačen program public static void Main(string[] g){ System.Console.WriteLine("Vsota stevil 2 + 3 = " + 2 * 3); } } class Narobe_semantika2 { // Sintaktično pravilen, a semantično napačen program public static void Main(string[] g) { System.Console.WriteLine("Vsota stevil 2 + 3 = " + 2 + 3); } }
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