21
Prevo - denje programskih jezika - I. test - zadaci P ython 1. Napisati P ython skript koji kao prvi argument komandne linije prima putanju do fajla sa ekstenzijom .txt koji sadrˇ zi u sebi proizvoljan tekst sa nekakvim datumima. Kao drugi argument skript prima broj dana (pozitivan ili negativan) za koliko treba pomeriti sve datume unapred ili u nazad. Skript treba da u istom direktorijumu napravi fajl sa pomerenim datumima. Ekstenzija novog fajla je ista kao i ulaznog, a ime se dobija nadvezivanjem stringa new na staro ime fajla. Primer ulazne datoteke za prvi zadatak: U subotu 26.11.2011. u 17h, godine je kolokvijum iz PPJ-a. Rezultati se ocekuju najverovatnije sledeceg vikenda, tj 03.12.2011, ili 04.12.2011. Medjutim, u izuzetnim situacijama, rezultati mogu da zakasne jos nedelju danadodatno, pa je najkasniji rok 11.12.2011. Jednostavnosti radi pretpostavki da svaki mesec ima 31 dan.

Prevo -denje programskih jezika - I. test - zadaci P ython 1. Napisati

  • Upload
    lethuan

  • View
    235

  • Download
    3

Embed Size (px)

Citation preview

Prevo -denje programskih jezika - I. test - zadaciPython

1. Napisati Python skript koji kao prvi argument komandne linije prima putanju do fajla sa ekstenzijom .txt kojisadrzi u sebi proizvoljan tekst sa nekakvim datumima. Kao drugi argument skript prima broj dana (pozitivanili negativan) za koliko treba pomeriti sve datume unapred ili u nazad. Skript treba da u istom direktorijumunapravi fajl sa pomerenim datumima. Ekstenzija novog fajla je ista kao i ulaznog, a ime se dobija nadvezivanjemstringa new na staro ime fajla.

Primer ulazne datoteke za prvi zadatak:

U subotu 26.11.2011. u 17h, godine je

kolokvijum iz PPJ-a. Rezultati se ocekuju

najverovatnije sledeceg vikenda, tj

03.12.2011, ili 04.12.2011. Medjutim,

u izuzetnim situacijama, rezultati mogu da

zakasne jos nedelju danadodatno, pa je

najkasniji rok 11.12.2011. Jednostavnosti

radi pretpostavki da svaki mesec ima 31 dan.

1 #!/usr/bin/env python23 import os4 import re5 import sys67 # proveravano da li imamo dovoljno argumenata komandne linije8 if len(sys.argv) != 3:9 print "koriscenje: /proba.py FAJL BR_DANA"

10 exit()1112 # proveravano da li je prosledjen fajl txt datoteka13 if re.match(".*\. txt", sys.argv[1], re.I) == None:14 print "Datoteka mora biti txt datoteka"15 exit()1617 # procitamo sav sadrzaj fajla i smetamo u memoriju18 fajl = open(sys.argv[1], ’rb’)19 data = fajl.read()20 fajl.close()2122 # otvaramo izlazni fajl za upis cije ime23 # se dobija nadovezivanjem stringa new na staro ime fajla24 outfile = open(’new’+sys.argv[1],’wb’)2526 # pravimo pattern za datum27 pattern = re.compile(’(?P<DAY >([1 -2][0 -9])|([1 -9])|(3[0 -1])).(?P<MONTH >(1[0 -2])|([1 -9])).(?P<YEAR >[0 -9]{4})’)28 regex = ’(?P<DAY >([1 -2][0 -9])|([1 -9])|(3[0 -1])).(?P<MONTH >(1[0 -2])|([1 -9])).(?P<YEAR >[0 -9]{4}) ’293031 for m in re.finditer(regex , data):3233 dan = int(m.group(’DAY’))34 mesec = int(m.group(’MONTH’))35 godina = int(m.group(’YEAR’))363738 for i in range(0,abs(int(sys.argv [2]))):3940 if int(sys.argv [2]) > 0:41 dan = dan + 142 if dan >31:43 dan = 144 mesec = mesec + 145 if mesec >12:46 dan = 147 mesec = 148 godina = godina + 14950 if int(sys.argv [2]) < 0:51 dan = dan - 152 if dan < 1:53 dan = 3154 mesec = mesec - 155 if mesec < 1:56 dan = 3157 mesec = 1258 godina = godina - 15960 dan = str(dan)61 mesec = str(mesec)62 godina = str(godina)6364 regex1 = m.group(’DAY’)+"."+m.group(’MONTH ’)+"."+m.group(’YEAR’)6566 # stampanje pomerenih datuma u terminalu radi evidencije67 print("dd. mm. gggg.-> %s.%s.%s" % (dan , mesec , godina ))686970 # menjanje starog datuma novim71 data = re.sub(regex1 , dan+"."+mesec+"."+godina , data)7273 # upisujemo u nov fajl74 outfile.write(data)7576 # zatvaramo fajl77 outfile.close ()

2. Napisati Python skript koji kao prvi argument komandne linije prima putanju do fajla sa ekstenzijom .srt kojisadrzi u sebi prevod. Kao drugi argument skript prima broj miliekundi (pozitivan ili negativan) za koliko trebapomeriti sve prevode unapred ili u nazad. Skript treba da u istom direktorijumu napravi fajl sa pomerenimprevodima. Ekstenzija novog fajla je ista kao i ulaznog, a ime se dobija nadvezivanjem stringa new na staro imefajla.

Primer ulazne datoteke za prvi zadatak:

1

00:02:00,955 --> 00:02:04,157

Patrola javlja centrali: Sivi Aston Martin

2

00:02:04,194 --> 00:02:05,951

pracen crnim Alfa Romeom

vozi pravo prema kamenolomu.

3

00:02:05,962 --> 00:02:07,833

Cuje se pucana paljba.

1 #!/usr/bin/env python23 import os4 import re5 import sys67 # proveravano da li imamo dovoljno argumenata komandne linije8 if len(sys.argv) != 3:9 print "koriscenje: /proba.py FAJL BR_MILISEK"

10 exit()1112 # proveravano da li je prosledjen fajl txt datoteka13 if re.match(".*\. srt", sys.argv[1], re.I) == None:14 print "Datoteka mora biti srt datoteka"15 exit()1617 # procitamo sav sadrzaj fajla i smetamo u memoriju18 fajl = open(sys.argv[1], ’rb’)19 data = fajl.read()20 fajl.close()2122 # otvaramo izlazni fajl za upis cije ime23 # se dobija nadovezivanjem stringa new na staro ime fajla24 outfile = open(’new’+sys.argv[1],’wb’)2526 # pravimo pattern za datum27 pattern = re.compile(’(\d\d):(\d\d):(\d\d),(\d+)’)28 regex = ’(\d\d):(\d\d):(\d\d),(\d+)’2930 for m in re.finditer(regex , data):31 sat = int(m.group (1))32 minut = int(m.group (2))33 sek = int(m.group (3))34 milisek = int(m.group (4))3536 for i in range(0,abs(int(sys.argv [2]))):37 if int(sys.argv [2]) > 0:38 milisek = milisek + 139 if milisek > 999:40 milisek = 041 sek = sek + 142 if sek >59:43 minut = minut + 144 sek = 045 milisek = 046 if min >59:47 sat = sat + 148 minut = 049 sek = 050 milisek = 05152 if int(sys.argv [2]) < 0:53 milisek = milisek - 154 if milisek < 0:55 milisek = 99956 sek = sek - 157 if sek < 0:58 minut = minut - 159 sek = 5960 milisek = 99961 if min < 0:62 sat = sat - 163 minut = 5964 sek = 5965 milisek = 9996667 sat = str(sat)68 minut = str(minut)69 sek = str(sek)70 milisek = str(milisek)7172 if int(sat) < 10:73 sat = "0"+sat74 if int(minut) < 10:75 minut = "0"+minut76 if int(sek) < 10:77 sek = "0"+sek78 if int(milisek) < 100:79 milisek = "0"+milisek80 if int(milisek) < 10:81 milisek = "00"+milisek8283 regex1 = m.group (1)+"."+m.group (2)+"."+m.group (3)+"."+m.group (4)8485 # menjanje starog vremena novim86 data = re.sub(regex1 , (sat+":"+minut+":"+sek+","+milisek), data)8788 # upisujemo u nov fajl89 outfile.write(data)9091 # zatvaramo fajl92 outfile.close ()

3. Datoteka cija putanja se navodi kao argument komandne linije, sadrzi e-mailove koje je korisnik slao ali i onekoje je primio. E-mail adresa korisnika se zadaje kao drugi argument komandne linije. Mapisati python skriptkoji prikazuje e-mail adrese na koje je korisnik najcesce slao poruke ure -dene po broju poslatih poruka, kao i oneadrese sa kojih je dobio najvise poruka, tako -de sortirane. Datoteka sadrzi vise poruka u sledecem formatu:

Date: Mon, 5 Jul 1999 23:46:18 -0500

From: John Doe <[email protected]>

To: John Smith <[email protected]>, [email protected]

Message-Id: <[email protected]>

Subject: This is a subject header.

This is the message body. It is seperated from the headers by a blank

line. The message body can span multiple lines.

1 #!/usr/bin/env python23 import os4 import re5 import sys67 # proveravano da li imamo dovoljno argumenata komandne linije8 if len(sys.argv) != 3:9 print "koriscenje: /mejlovi.py FAJL MEJL_KORISNIKA"

10 exit()1112 # procitamo sav sadrzaj fajla i smetamo u memoriju13 fajl = open(sys.argv[1], ’rb’)14 data = fajl.read()15 fajl.close()161718 # pravimo pattern za datum1920 regex = ’From: \w+ \w+ <([\w\.-]+@[\w\. -]+\.\w{2,4})>\s’21 regex +=’To: \w+ \w+ <([\w\.-]+@[\w\. -]+\.\w{2,4})>’2223 print "e-mail adrese na koje je korisnik najcesce slao poruke uredene po broju poslatih poruka "2425 # lista u kojoj mestamo e-mail adrese koje je korisnik slao26 l = list()2728 # lista u kojoj mestamo e-mail adrese koje je korisnik primio29 l1 = list()3031 for m in re.finditer(regex , data):3233 mejl_korinika = str(m.group (1))34 if(mejl_korinika == sys.argv [2]):3536 mejl = str(m.group (2))37 l.append(mejl)3839 # dobijamo elemente liste bez duplikata40 l_items = set(l)4142 # za svaki element kreiramo torku sa brojem pojavljivanja za svaki element43 l_counts = [ (l.count(x), x) for x in set(l)]4445 # sortiramo elemente prema broju pojavljivanja u opadajucem poretku46 l_counts.sort(reverse=True)4748 # briemo broj pojavljivanja iz torke i ostavljamo samo element49 l_result = [ y for x,y in l_counts ]5051 # stampanje elemenata liste52 for element in l_result:53 print element545556 print "e-mail adrese sa kojih je korisnik dobio najvise poruka uredene po broju dobijenih poruka "5758 for m1 in re.finditer(regex , data):5960 mejl_korinika1 = str(m1.group (2))61 if(mejl_korinika1 == sys.argv [2]):6263 mejl1 = str(m1.group (1))64 l1.append(mejl1)6566 # dobijamo elemente liste bez duplikata67 l_items1 = set(l1)6869 # za svaki element kreiramo torku sa brojem pojavljivanja za svaki element70 l_counts1 = [ (l1.count(x1), x1) for x1 in set(l1)]7172 # sortiramo elemente prema broju pojavljivanja u opadajucem poretku73 l_counts1.sort(reverse=True)7475 # briemo broj pojavljivanja iz torke i ostavljamo samo element76 l_result1 = [ y1 for x1,y1 in l_counts1 ]7778 # stampanje elemenata liste79 for element1 in l_result1:80 print element1

4. Napisati python script koji kao argument komadne linije prima naziv fajla u kome je zadat konacni automat, uformatu koji je naveden u prilogu zadatka (linije koje pocinju znakom # su komentari, a od ostalih linija, prvapredstavlja azbuku, druga skup stanja, treca pocetno stanje automata, cetvrta skup zavrnih, a ostale prelazeautomata).Proveriti da li je automat ispravno zadat (pocetno stanje u skupu stanja, sva zavrsna stanja u skupustanja, svi prelazi definisati nad datim stanjima i azbukom), i proveriti da li je automat deterministicki. Akojeste ucitati rec sa standardnog ulaza i proveriti da li je automat prihvata.

Primer za prvi zadatak:

# ovo je neki komentar

# prva linija fajla sadrzi azbuku

a,b

#drugi linija sadrzi stanja automata

0, 1, 2

#treca linija sadrzi pocetno stanje

0

#cetvrta linija sadrzi zavrna stanja

1, 2

#ostale linije sadrze prelaze automata

0 a 1

0 b 2

1 b 2

2 b 2

1 #!/usr/bin/python2 try:3 f = open("ka.txt", "r")4 except (IOError ):5 print "Neuspesno otvaranje fajla ka.txt"6 exit()78 linije = f.readlines ()9

10 def nije_komentar(l):11 return l[0] != ’#’ and l!=’\n’1213 def strip(s):14 return s.strip()1516 linije = filter(nije_komentar , linije)1718 import re19 azbuka = re.split(",\s*", linije [0])20 azbuka = map(strip , azbuka)2122 stanja = re.split(",\s*", linije [1])23 stanja = map(int , stanja)2425 poceteno = int(linije [2]. strip ())2627 if poceteno not in stanja:28 print "Neispravno pocetno stanje"29 exit()3031 zavrsna_stanja = re.split(" ,\s*", linije [3])32 zavrsna_stanja = map(int , zavrsna_stanja)3334 linije = map(strip , linije)35 for stanje in zavrsna_stanja:36 if stanje not in stanja:37 print "Neispravno zavrsno stanje"38 exit()3940 prelazi = {}41 for i in range(4, len(linije )):42 stanje1 , slovo , stanje2 = re.split("\s+", linije[i])43 stanje1 , stanje2 = int(stanje1), int(stanje2)44 if slovo not in azbuka:45 print "Neispravno slovo %c" % slovo46 exit (1)47 if stanje1 not in stanja:48 print "Neispravno stanje %d" % stanje149 exit (1)50 if stanje2 not in stanja:51 print "Neispravno stanje %d" % stanje252 exit (1)53 if prelazi.has_key ((stanje1 , slovo)) and prelazi [(stanje1 , slovo)] != stanje2:54 print "Automat nije DKA jer iz stanja %d po slovu %c postoji vise prelaza" % (stanje1 , slovo)55 exit (1)56 prelazi [(stanje1 , slovo)] = stanje25758 import sys59 rec = sys.stdin.readline ()60 rec = rec.strip()6162 tekuce_stanje = poceteno63 for slovo in rec:64 if not prelazi.has_key (( tekuce_stanje , slovo )):65 print "Automat ne prihvata rec"66 exit()67 tekuce_stanje = prelazi [( tekuce_stanje , slovo)]6869 if tekuce_stanje in zavrsna_stanja:70 print "Automat prihvata rec"71 else:72 print "Automat ne prihvata rec"

5. Napisati python-skript koji stampa na standardni izlaz autora (−a), cenu (−c), izdavaca (−i) ili godinu izdanja(−g) knjige koja se navodi kao argument komandne linije, u zavinosti od prisutne opcije komandne linije (u slucajuda nema opcija, ispisati sve podatke o trazenoj knjizi). Informacije o knjigama se nalaze u fajlu knjige.xml kojiima sledeci format:

<?xml verion="1.0" encoding="utf-8" ?> Primer pozivanja:

<knjiga rbr="1">

<naslov> Yacc </naslov> $ ./knjiga -a Yacc

<autor> Filip Maric </autor> Filip Maric

<godina_izdanja> 2004 </godina_izdanja> $ ./knjiga -c "Python Standard Library"

<izdavac> Matematicki fakultet </izdavac> 50eur

<cena valuta="rsd"> 1000 </cena>

</knjiga>

<knjiga rbr="2">

<autor> Fredrih Lundh </autor>

<cena valuta="eur"> 50 </cena>

<izdavac> O’Reilly & Associates </izdavac>

<godina_izdanja>2001 </godina_izdanja>

<naslov> Python Standard Library </naslov>

</knjiga>

</lista_knjiga>

1 #!/usr/bin/env python23 import os4 import re5 import sys67 if len(sys.argv) < 1:8 print "Nedovoljno argumenata komandne linije"9

10 # procitamo sav sadrzaj fajla i smestamo ga u memoriju11 fajl = open(’knjige.xml’, ’rb’)12 data = fajl.read()13 fajl.close()141516 # liste u kojoj smestamo podatke o knjizi (indeksira se od nule)17 naslov = []18 autor = []19 godina = []20 izdavac = []21 cena = []2223 for m in re.finditer(’<naslov >\s*(\w+.*?)\s*</naslov >\s*’, data):24 naslov.append(m.group (1))2526 for m in re.finditer(’<autor >\s*(.+)\s*</autor >\s*’, data):27 autor.append(m.group (1))2829 for m in re.finditer(’<godina_izdanja >\s*(.+)\s*</godina_izdanja >\s*’, data):30 godina.append(m.group (1))3132 for m in re.finditer(’<izdavac >\s*(.+)\s*</izdavac >\s*’, data):33 izdavac.append(m.group (1))3435 for m in re.finditer(’<cena valuta ="(\w+)">\s*(\d+)\s*</cena >\s*’, data):36 cena.append(m.group (2)+m.group (1))3738 for m in re.finditer(’<knjiga rbr ="(\d+)">\s*’, data):39 br_knjiga = int(m.group (1))404142 for i in range(0, br_knjiga ):4344 if sys.argv [1]== ’-a’ and naslov[i] == sys.argv [2]:45 print autor[i]4647 elif sys.argv [1]==’-c’ and naslov[i] == sys.argv [2]:48 print cena[i]4950 elif sys.argv [1]==’-i’ and naslov[i] == sys.argv [2]:51 print izdavac[i]5253 elif sys.argv [1]==’-g’ and naslov[i] == sys.argv [2]:54 print godina[i]5556 elif naslov[i] == sys.argv [1]:57 print ("%s %s %s %s" % (str(autor[i]),str(cena[i]),str(izdavac[i]),str(godina[i])))

6. Napisati Python skript koji iz html fajla koji je zadat kao prvi argument komandne linije izdvaja sve linkove, ilisve slike, u zavisnosti da li je drugi argument komandne linije l ili s.

<html>

<body>

<h2>Norwegian Mountain Trip</h2>

<img border="0" src="/images/pulpit.jpg" width="304"/>

<h2>One more image</h2>

<img src="/images/image.jpg"/>

<a href="http://www.matf.bg.ac.rs/~mirko">Link</a>

<h2>Image as link</h2>

<a href="http://www.matf.bg.ac.rs/~mirko">

<img src="/images/image.jpg">

</a>

</body>

</html>

1 #!/usr/bin/env python23 import os4 import re5 import sys67 if len(sys.argv) != 3:8 print "Netacan broj argumenata komandne linije"9

10 if re.match(".*\. html",sys.argv[1], re.I) == None:11 print "Datoteka mora biti u html formatu"1213 # procitamo sav sadrzaj fajla i smestamo ga u memoriju14 fajl = open(sys.argv[1], ’rb’)15 data = fajl.read()16 fajl.close()1718 if sys.argv [2]== ’l’:19 for m in re.finditer(’http ://([a-zA-Z0 -9./~])+ ’, data):20 adresa = m.group (0)21 print("%s" %adresa)2223 if sys.argv [2]== ’s’:24 for m in re.finditer(’[a-zA-Z0 -9]+. jpg’,data):25 slika = m.group (0)26 print("%s" %slika)

7. Napisati Python skript koji iz tekstualnog fajla koji se zadaje kao argument komandne linije, izdvaja sve ispravnozapisane datume. Dan i mesec obavezno sadrze dve cifre, a godina cetiri. Jednostavnosti radi, pretpostaviti dasvaki mesec ima 31 dan. Separator ime -du dana i meseca, kao i meseca i godine, mora da bude isti, i jedan odsledecih ., - ili /.

Ovo je fajl u kome se nalazi neki tekst.

Tekst sadrzi datume u sebi: 10.02.2011

Ovo je jos jedan datum: 31-02-0000

a potom I jos jedan: 13/05/2111. U delu koji

nema validnih datuma:

01/13/2011 32/03/2001 11-11.2011

1 #!/usr/bin/env python23 import os4 import re5 import sys67 if len(sys.argv) != 2:8 print "Netacan broj argumenata komandne linije"9

10 if re.match(".*\. txt",sys.argv[1], re.I) == None:11 print "Datoteka mora biti u txt formatu"1213 # procitamo sav sadrzaj fajla i smestamo ga u memoriju14 fajl = open(sys.argv[1], ’rb’)15 data = fajl.read()16 fajl.close()171819 for m in re.finditer(’(([3][0 ,1]|[0 -2]\d) -([1][0 -2]|[0]\d)-(\d\d\d\d))|20 (([3][0 ,1]|[0 -2]\d)\.([1][0 -2]|[0]\d)\.(\d\d\d\d))|(([3][0 ,1]|[0 -2]\d)/([1][0 -2]|[0]\d)/(\d\d\d\d))’, data):21 datum = m.group (0)22 print("%s" %datum)

8. Napisati Python skript koji iz tekstualnog fajla koji se zadaje kao argument komandne linije, izdvaja sve ispravnozapisane IP-adrese.

Ovo je jos jedna adresa: 255.255.255.255

IP-adresa alasa je: 147.91.64.2

U delu koji sledi, nema validnih adresa:

256.211.1.2 0001.0.0.1 136.23.11.1234

1 #!/usr/bin/env python23 import os4 import re5 import sys67 if len(sys.argv) != 2:8 print "Netacan broj argumenata komandne linije"9

10 if re.match(".*\. txt",sys.argv[1], re.I) == None:11 print "Datoteka mora biti u txt formatu"1213 # procitamo sav sadrzaj fajla i smestamo ga u memoriju14 fajl = open(sys.argv[1], ’rb’)15 data = fajl.read()16 fajl.close()171819 for m in re.finditer(’\\b((2[0 -5]{2}|1[0 -9]{2}|[0 -9]{1 ,2})\.){3}(2[0 -5]{2}|1[0 -9]{2}|[0 -9]{1 ,2})\\b’, data):20 ipadresa = m.group (0)21 print("%s" %ipadresa)

Lex

1. Napisati program koriscenjem sistema Lex koji prebrojava koliko ima pretplatnika nekog mobilnog operat-era.Datoteka sadrzi izvesataj svih poslovnica. U njoj su popisani brojevi korisnika i broj potrosenih poruka ikolicina podataka u kB skinutih u proteklom mesecu. Program treba da ispise informacije o korisnicima za kojeimamo sve od navedenih podataka i nakon toga ukupan broj takvih korisnika. Podaci su razdvojeni belinama.Broj telefona pocinje sa 06x/, gde je x broj 0 do 6, ostatak broja je sestocifren ili sedmocifren, pri cemu suposlednje tri cifre odvojene od ostatka broja sa −. Broj poruka je najveise cetvorocifren broj bez vodecih nula, akolicina podataka je realan broj sa najvise dve decimalne cifre. Kolicina podataka je data u kilobajtima (kB iliKB).

Trg Nikole Pasica:

065/123-123 160 24.22 kB

060/2345-123 234 80.3 kB

Bulevar:

062/098-128 1000 0KB

063/3455-987 10 234.45KB

1 %option noyywrap23 %{4 int br_pretplatnika = 0;5 %}67 %%8 06[0 -6].[0 -9]{3 ,4} -[0 -9]{3}.([0 -9]{1 ,4}).[0 -9]{1 ,4}(\.[0 -9]{1 ,2})?.*( kB|KB) {9 fprintf(yyout ,"%s \n",yytext ); br_pretplatnika ++;

10 }1112 \n13 .14 %%1516 main( int argc , char *argv[] )17 {18 /* Prvi argument komandne linije , ako je naveden je ime datoteke odakle se cita ulaz */19 if ( argc > 1 )20 yyin = fopen( argv[1], "r" );21 else22 yyin = stdin;23 /* Drugi argument komandne linije , ako je naveden je ime datoteke u koju se pise izlaz */24 if ( argc > 2 )25 yyout = fopen( argv[2], "w" );26 else27 yyout = stdout;2829 yylex ();3031 fprintf(yyout ,"Ukupan broj pretplatnika: %d \n", br_pretplatnika );3233 }

Makefile:

1 PROG = kol2011.l2 CC = gcc3 CFALGS = -Wall -g45 izvrsni : lex.yy.c6 $(CC) $(CFALGS) -o $@ $<7 lex.yy.c : $(PROG)8 flex $<

2. Napisati program koriscenjem sistema Lex koji parsira datoteku koja je proledjena kao prvi argument komandnelinije u kojoj se nalaze informacije o tudentima. Za svakog studenta u datoteci se nalaze informacije o naloguna alasu, ime, prezime i trenutni prosek na studijama, raydvojeni belinama. Prebrojati koliko je studenata zakoje imamo sve od navedenih informacija.Informacije o studentima prikazati, i na kraju ispisati ukupan brojstudenata. Naloge imaju studenti koji su fakultet upisali najranije 2000. godine pa do danas. Fakultet ne upisujevise od 300 studenata godisnje. Vlastita imena studenata pocinju velikim slovom. Prosek ocena studenata jerealan broj sa 2 decimale od 6.00 do 10.00.

Primer ulazne datoteke za zadatak:

Studenti u grupi 3 za Programiranje 1:

mr10023 Ljuba Udovicic 6.23

mv06234 Marko Marinkovic 8.20

ml08207 Pera Peric 7.67

1 %option noyywrap23 %{4 int br_studenata = 0;5 %}67 %%8 m[ilrvn ][01][0 -9]{4}.[A-Z][a-z]+.[A-Z][a-z]+.1?[6 -9].[0 -9]{2} {9 fprintf(yyout ,"%s \n",yytext ); br_studenata ++; }

1011 \n12 .13 %%1415 main( int argc , char *argv[] )16 {17 /* Prvi argument komandne linije , ako je naveden je ime datoteke odakle se cita ulaz */18 if ( argc > 1 )19 yyin = fopen( argv[1], "r" );20 else21 yyin = stdin;22 /* Drugi argument komandne linije , ako je naveden je ime datoteke u koju se pise izlaz */23 if ( argc > 2 )24 yyout = fopen( argv[2], "w" );25 else26 yyout = stdout;2728 yylex ();2930 fprintf(yyout ,"Ukupan broj studenata: %d \n", br_studenata );3132 }

Makefile:

1 PROG = kol2011.l2 CC = gcc3 CFALGS = -Wall -g45 izvrsni : lex.yy.c6 $(CC) $(CFALGS) -o $@ $<7 lex.yy.c : $(PROG)8 flex $<

3. Napisati program u C-u, koristeci sistem flex, koji iz tekstualnog fajla koji se zadaje kao argument komandnelinije, izdvaja sve ispravno zapisane IP-adrese.

Ovo je jos jedna adresa: 255.255.255.255

IP-adresa alasa je: 147.91.64.2

U delu koji sledi, nema validnih adresa:

256.211.1.2 0001.0.0.1 136.23.11.1234

1 %option noyywrap23 %{45 %}67 %%8 " "(25[0 -5]|2[0 -4][0 -9]|[01]?[0 -9][0 -9]?)\.(25[0 -5]|2[0 -4][0 -9]|[01]?[0 -9][0 -9]?)\.9 (25[0 -5]|2[0 -4][0 -9]|[01]?[0 -9][0 -9]?)\.(25[0 -5]|2[0 -4][0 -9]|[01]?[0 -9][0 -9]?)" " { fprintf(yyout ,"%s \n",yytext ); }

10 \n11 .12 %%13 main( int argc , char *argv[] )14 {15 /* Prvi argument komandne linije , ako je naveden je ime datoteke odakle se cita ulaz */16 if ( argc > 1 )17 yyin = fopen( argv[1], "r" );18 else19 yyin = stdin;20 /* Drugi argument komandne linije , ako je naveden je ime datoteke u koju se pise izlaz */21 if ( argc > 2 )22 yyout = fopen( argv[2], "w" );23 else24 yyout = stdout;2526 yylex ();27 }

4. Napisati program u C-u, koristeci sistem flex, koji iz tekstualnog fajla koji se zadaje kao argument komandnelinije, izdvaja sve ispravno zapisane datume. Dan i mesec obavezno sadrze dve cifre, a godina cetiri. Jednos-tavnosti radi, pretpostaviti da svaki mesec ima 31 dan. Separator ime -du dana i meseca, kao i meseca i godine,mora da bude isti, i jedan od sledecih ., - ili /.

Ovo je fajl u kome se nalazi neki tekst.

Tekst sadrzi datume u sebi: 10.02.2011

Ovo je jos jedan datum: 31-02-0000

a potom I jos jedan: 13/05/2111. U delu koji

nema validnih datuma:

01/13/2011 32/03/2001 11-11.2011

1 %option noyywrap23 %{45 %}67 %%8 (([3][0 ,1]|[0 -2][0 -9])[ -]([1][0 -2]|[0][0 -9])[ -]([0 -9][0 -9][0 -9][0 -9]))|9 (([3][0 ,1]|[0 -2][0 -9])[.]([1][0 -2]|[0][0 -9])[.]([0 -9][0 -9][0 -9][0 -9]))|

10 (([3][0 ,1]|[0 -2][0 -9])[/]([1][0 -2]|[0][0 -9])[/]([0 -9][0 -9][0 -9][0 -9])) { fprintf(yyout ,"%s \n",yytext ); }1112 \n13 .14 %%1516 main( int argc , char *argv[] )17 {18 /* Prvi argument komandne linije , ako je naveden je ime datoteke odakle se cita ulaz */19 if ( argc > 1 )20 yyin = fopen( argv[1], "r" );21 else22 yyin = stdin;23 /* Drugi argument komandne linije , ako je naveden je ime datoteke u koju se pise izlaz */24 if ( argc > 2 )25 yyout = fopen( argv[2], "w" );26 else27 yyout = stdout;2829 yylex ();3031 }

5. Napisati program u C-u, koristeci sistem flex, koji iz html fajla koji je zadat kao prvi argument komandne linijeizdvaja sve linkove, ili sve slike, u zavisnosti da li je drugi argument komandne linije l ili s.

<html>

<body>

<h2>Norwegian Mountain Trip</h2>

<img border="0" src="/images/pulpit.jpg" width="304"/>

<h2>One more image</h2>

<img src="/images/image.jpg"/>

<a href="http://www.matf.bg.ac.rs/~mirko">Link</a>

<h2>Image as link</h2>

<a href="http://www.matf.bg.ac.rs/~mirko">

<img src="/images/image.jpg">

</a>

</body>

</html>

1 %option noyywrap23 %{45 %}67 %%8 http :[//]([a-zA-Z0 -9./~])+ { fprintf(yyout ,"%s \n",yytext ); }9 [a-zA-Z0 -9]+. jpg { fprintf(yyout ,"%s \n",yytext ); }

10 \n11 .12 %%1314 main( int argc , char *argv[] )15 {16 /* Prvi argument komandne linije , ako je naveden je ime datoteke odakle se cita ulaz */17 if ( argc > 1 )18 yyin = fopen( argv[1], "r" );19 else20 yyin = stdin;2122 yylex ();2324 }

1. Napisati python-skript koji kao prvi argument komandne linije prihvata ime LATEXfajla koji u sebi sadrzi tabelu sakonacnim rezultatima ispita iz PPJ. Na osnovu ovog fjla treba generisati .html fajl koji sadrzi tabelu sa ocenamasortiranim opadajuce. Tabela treba da ima kolone (Rbr, ImePrezime,Ocena).

.TEX file .HTML file

<html>

\begin{table}[ht] <body>

\caption{Rezultati iz PPJ} <table>

\begin{tabular}{c c c c c} <caption>Rezultati iz PPJ</caption>

Rbr & Ime & Prezime & Kol & & Ispit \\ <tr><th>Rbr<\th><th>ImePrezime<\th><th>Ocena</th></tr>

1 & Marko & Markovic & 30 & & 45 \\ <tr><th>1<\th><th>Janko Jankovic<\th><th>9</th></tr>

2 & Branko & Brankovic & 20 & & 25 \\ <tr><th>2<\th><th>Marko Markovic<\th><th>8</th></tr>

3 & Janko & Jankovic & 30 & & 51 \\ <tr><th>3<\th><th>Branko Brankovic<\th><th>5</th></tr>

\end{tabular} <\table>

\end{table} <\body>

<\html>

1 #!/usr/bin/python23 import os4 import sys5 import re67 # proveravano da li imamo dovoljno argumenata komandne linije8 if len(sys.argv) != 2:9 print "koriscenje: /zadatak.py FAJL.tex"

10 exit()1112 # proveravano da li je prosledjen tex fajl13 if re.match(".*\. tex", sys.argv[1], re.I) == None:14 print "Datoteka mora biti tex fajl"15 exit()1617 # procitamo sav sadrzaj fajla i smetamo u memoriju18 fajl = open(sys.argv[1], ’rb’)19 data = fajl.read()20 fajl.close()2122 mapa1 = {}2324 # otvaramo html fajl za pisanje25 outfile = open("index.html", "w")2627 outfile.write("<html >\n")28 outfile.write("<body >\n")2930 if(re.finditer("\begin{table}", data )):31 outfile.write("<table >\n")3233 if (re.finditer("\caption {[a-zA-Z ]+}", data )):34 for m in re.finditer(’\caption {([a-zA -Z ]+)}’, data):35 outfile.write("<caption >"+ m.group (1) +" </caption >\n")3637 if (re.finditer("([a-zA -Z]+)\s*[&]\s*([a-zA-Z]+)\s*[&]\s*([a-zA-Z]+)\s*[&]\s*([a-zA -Z]+)\s*[&]38 \s*([a-zA-Z]+)\s*\\\\", data )):39 for n1 in re.finditer("([a-zA -Z]+)\s*[&]\s*([a-zA-Z]+)\s*[&]\s*([a-zA-Z]+)\s*[&]\s*([a-zA -Z]+)\s*[&]40 \s*([a-zA-Z]+)\s*\\\\", data):41 outfile.write("<tr><th>"+n1.group (1)+" </th><th>"+n1.group (2)+" "+n1.group (3)+" </th><th>Ocena </th ></tr >\n")4243 for n2 in re.finditer("([a-zA -Z0 -9]+)\s*[&]\s*([a-zA -Z0 -9]+)\s*[&]\s*([a-zA -Z0 -9]+)\s*[&]\s*([0 -9]+)\s*[&]44 \s*([0 -9]+)\s*\\\\", data):45 ocena = int(n2.group (4))+ int(n2.group (5))46 if ocena < 51:47 ocena = 548 elif (50 < ocena < 61):49 ocena = 650 elif (60 < ocena < 71):51 ocena = 752 elif (70 < ocena < 81):53 ocena = 854 elif (80 < ocena < 91):55 ocena = 956 elif (90 < ocena < 101):57 ocena = 105859 mapa1[n2.group (2) + " " + n2.group (3)] = ocena6061 def poredi(x, y):62 return cmp(mapa1[x], mapa1[y])6364 # soritramo studente po broju poena65 keys = mapa1.keys()66 keys.sort(poredi , reverse=True)6768 i=069 for k in keys:70 i=i+171 outfile.write("<tr><th>"+str(i)+" </th><th>"+k+" </th><th>"+str(mapa1[k])+"</th ></tr >\n")7273 if(re.finditer("/end{table}", data )):74 outfile.write(" </table >\n")7576 outfile.write(" </body >\n")77 outfile.write(" </html >\n")7879 # zatvaramo fajl80 outfile.close ()

2. Datoteka sadrzi listing korisnika mobilne mreze u Srbiji u kom se nalazi broj kome je upucen poziv ili poruka ikoliko je B ili KB podataka skinuto sa mreze. Broj mobilnog telefona pocinje sa 06 i moze imati najvise 10 cifara.Programu se datoteka salje preko argumenata komandne linije. Program treba da ispise na ekran koliko minutarazgovora je potroseno, koliko je sms polato i kB podataka skinuto.

protok saobracaja za: Novebmar 2012 Poruka: 1 Razgovori: 49min 7 sec. Data: 24.175781kB

------------------------------------

063123000 12 min. 12 sec.

0651231234 3 min. 3 sec.

DATA 1204 B

060987654 SMS

0611234567 33 min.

062008765 52 sec.

DATA 23 kB

1 %option noyywrap23 %{4 #include <stdlib.h>5 int br_poruka = 0;6 int minuti = 0;7 int sek = 0;8 int kb = 0;9 %}

1011 %%12 06[0 -9]{1 ,10}" SMS" { br_poruka ++; }13 [0-9]+" min" { minuti = minuti + atoi(yytext ); }14 [0-9]+" sec" { sek = sek + atoi(yytext ); }15 [0-9]+" "(kb|Kb|KB|kB) { kb = kb + atoi(yytext ); }16 \n17 .18 %%1920 main( int argc , char *argv[] )21 {22 /* Prvi argument komandne linije , ako je naveden je ime datoteke odakle se cita ulaz */23 if ( argc > 1 )24 yyin = fopen( argv[1], "r" );25 else26 yyin = stdin;27 /* Drugi argument komandne linije , ako je naveden je ime datoteke u koju se pise izlaz */28 if ( argc > 2 )29 yyout = fopen( argv[2], "w" );30 else31 yyout = stdout;3233 yylex ();3435 if (sek >60)36 {37 minuti = minuti + sek / 60;38 sek = sek % 60;39 }4041 fprintf(yyout ,"Poruka: %d Razgovori: %d min %d sec Data: %d kB\n", br_poruka , minuti , sek , kb);42 }

Makefile:

1 PROG = zad.l2 CC = gcc3 CFALGS = -Wall -g45 izvrsni : lex.yy.c6 $(CC) $(CFALGS) -o $@ $<7 lex.yy.c : $(PROG)8 flex $<

1. Napisati C program, koji metodom rekurzivnog spusta proverava da li je ulaz ispravno zadat ( obratiti paznju natest primere). (7 poena)Na pocetku zadatka, u komentarima napisati dobijenu gramatiku, zajedno sa skupovima First, Follow, iSkupovima izbora. (3 poena)Napomena: Identifikatori koji predstavljaju skalare pocinju znakom $, a oni koji predstavljaju liste znakom @.Svako if ima svoje else. Kod naredbi foreach i if − else obavezne su zagrade oko naredbi u bloku, iako je ubloku jedna naredba. Svaka naredba se zavrsava znakom ;.

Primer1: Primer2: Primer3: Primer4:

__________________________________________________________________________________________________

$a = 3.5; if ($a < $b){ foreach $x (@lista){ $max = 0;

print $a; prvi "Prvi"; print $x; foreach $1 (@l1) {

$b = 4; } print "\n"; if ($i > $max) {

else { } $max = $i;

print "Drugi"; }

} else {

print $i;

print ", ";

}

}

/***************************FIRST FOLLOW IZBOR

Niz_naredbi -> Naredba; Niz_naredbi’ {foreach,if,print,$} {EOI,’}’} {foreach,if,print,$}Niz_naredbi’-> Naredba; Niz_naredbi’ {foreach,if,print,$} {EOI,’}’} {’;’}

| eps {EOI,’}’}

Naredba -> Foreach_naredba {foreach} {’;’} {foreach}| Print_naredba {print} {’;’} {print}| Naredba_dodele {$} {’;’} {$}| If_else_naredba {if} {’;’} {if}| eps {’;’}

Foreach_naredba -> ’foreach’ Prom ’(’ Lista ’)’ ’{’ Niz_naredbi ’}’ {foreach} {EOI,’}’,’;’} {foreach}If_else_naredba -> ’if’ Uslov ’{’ Niz_naredbi ’}’ else ’{’ Niz_naredbi ’}’ {if} {EOI,’}’,’;’} {if}Naredba_dodele -> Prom ’=’ P ’;’ {$} {EOI,’}’,’;’} {$}P -> broj {broj} {’;’} {broj}

| Prom {$} {’;’}Print_naredba -> ’print’ Print_naredba’ ’;’ {print} {EOI,’}’,’;’} {print}Print_naredba’-> Prom {$} {’;’} {$}

|"id" {"} {’;’} {"}

Uslov -> ’(’ Prom relop Prom ’)’ {’(’} {’{’} {’(’}Prom -> ’$’id {$} {’(’,’=’,EOI,’)’} {$}Lista -> ’@’id {@} {’)’} {@}

***************************/

1. Metodom rekurzivnog pusta, koriteci sistem lex, proveriti ispravnost XML datoteke koja se zadaje kao argumentkomandne linije. Datoteka sadrzi spisak filmova sa propratnim informacijama o nazivu filma, godini premijere,zanru, rejtingu na IMDB, imenu rezisera i listi glavnih glumaca. Obavezan je samo naziv i godina premijere ito su prva 2 podatka o filmu. Ostali podaci o filmu ne moraju strogo biti zadati u ovom redosledu, niti za svakifilm moraju postojati sve od naverenih informacija. Predpostaviti da nece biti vise od 3 navedena glumca. Akoje datoteka u ispravnom formatu na standardni izlaz ipisati sve informacije o svim filmovima sortirane po nazivufilma.

Primer :

<xml>

<movie>

<title> Iron Man </title>

<year> 2008 </year>

<director> Jon Favreau </director>

<rating> 7.9 </rating>

<actor> Robert Downey Junior </actor>

<actress> Gwyneth Paltrow </actress>

<actor> Terrence Howard </actor>

</movie>

</xml>

Gramatika:

First Follow

XML -> ’<xml>’ Niz_filmova ’</xml>’ {<xml>} {EOI}Niz_filmova -> Film Niz_filmova {<movie>} {<movie>}

| eps

Film -> ’<movie>’ Parametri ’</movie>’ {<movie>} {</xml>}

Parametri -> Obavezni_parametri {<title>} {</movie>, <director>, <rating>, <actor>, <actress>}| Director {<director>} {</movie>, <rating>, <actor>, <actress>}| Rating {<rating>} {</movie>, <director>, <actor>, <actress>}| Niz_glumaca {<actor>, <actress>} {</movie>, <director>, <rating>}| eps {</movie>}

Obavezni_parametri -> ’<title>’ id ’</title>’ ’<year>’ id ’</year>’ {<title>} {</movie>, <director>, <rating>, <actor>, <actress>}

Director -> ’<director>’ id ’</director>’ {<director>} {</movie>, <rating>, <actor>, <actress>}Rating -> ’<rating>’ id ’</rating>’ {<rating>} {</movie>, <director>, <actor>, <actress>}

Niz_glumaca -> Glumac Niz_glumaca {<actor>, <actress>} {</movie>, <director>, <rating>}| eps {</movie>}

Glumac -> ’<actor>’ id ’</actor>’ {<actor>} {<actor>, <actress>}| ’<actress>’ id ’</actress>’ {<actress>} {<actor>, <actress>}