Vežbe 15

Vežbe ćete raditi u grupama po 2-3 (svaki red je jedan tim). Na taj način moći ćete da se međusobno dopunjujete dok rešavate probleme. Rešenja pišite ispod svakog zadatka. Ideja prilikom izrade zadataka jeste da potražite najelegantnije rešenje ako možete. Naravno, koristite Help. Opišite postupak u radu. Posle sačuvajte to što ste radili na USB.

Zadatak br 1

Pretpostavimo da želite da proverite da li je neki broj validni broj kreditne kartice. Postoje određena pravila koja pomažu u tome. Kao prvo, American Express koristi 15-cifrene brojeve, MasterCard koristi 16-cifrene brojeve, dok Visa koristi 13- ili 16-cifrene brojeve.

Postoje i dodatna pravila. Naime, American Express brojevi svi počinju sa 34 ili 37; MasterCard brojevi počinju sa 51, 52, 53, 54, ili 55; dok Visa brojevi počinju sa 4.

Napišite funkciju amexQ koja daje True ukoliko su prethodni uslovi za American Express karticu ispunjeni i False u drugim slučajevima. Slično napravite funkcije masterQ i visaQ.

Zadatak br 2

Ono prethodno je jedan deo postupka prilikom validacije da li je neka kreditna kartica sintaktički ispravna. Pored ovog postoji još jedan uslov koji mora biti zadovoljen da bismo bili sigurni da je kartica sintaktički ispravna (to važi za sve tipove kartica). Naime to je takozvano Luhn-ovo pravilo. Naime,

Razbijte broj kreditne kartice na cifre. Razbijte cifre na dva skupa. Prvi skup su cifre koje počinju od druge cifre sa desne strane, i idemo unazad preskačući po jednu cifru. Nazovimo to skup A. Drugi skup su sve ostale cifre. Nazovimo to skup B. Onda, sve cifre iz skupa A pomnožite sa 2. Tako dobijene brojeve ponovo rastavite na cifre i saberite tako dobijene cifre. To će biti sumA. Toj sumi dodajte sumB koju dobijete kada sve cifre u skupu B saberete (bez ikakve transformacije). Ako je sumA + sumB deljiv sa 10, broj je validan u smislu Luhnovog pravila.

Evo primera. AmEx: 378282246310005. Skup A su podvučene cifre: 378282246310005, a skup B su ostale. Drugim rečima, dva skupa koja dalje moramo da obrađujemo su

A= {7, 2, 2, 4, 3, 0, 0},  B = {3, 8, 8, 2, 6, 1, 0, 5}

Posle množenja elemenata skupa A sa 2 dobijamo

{ 7•2,  2•2,  2•2, 4•2 , 3•2, 0•2, 0•2} = { 14,  4,  4, 8 , 6, 0, 0}

Ako to rastavimo na pojedinačne cifre dobijamo da samo prvi broj mora da se rastavlja, to jest  { 1, 4,  4,  4, 8 , 6, 0, 0}. Najzad, da bismo dobili sumA, samo saberemo sve te cifre

sumA= 1 + 4 + 4 + 4 + 8 + 6 + 0 + 0 = 27

Izračunajmo sada sumB. To je prosto suma brojeva koji se nalaze u B.

sumB = 3 + 8 + 8 + 2 + 6 + 1 + 0 + 5 = 33

Vidimo, dakle, da je sumA + sumB = 60 što je deljivo sa 10. Dakle, ovaj broj može biti validna kreditna kartica.

Napišite funkciju sumaLuhnQ[broj] koja daje True ukoliko je ovo pravilo zadovoljeno i False ukoliko nije. Input treba da budu pozitivni celi brojevi. Može biti korisno da ovu funkciju napišete posebno za uslov kada je broj cifara paran i posebno kada je broj cifara neparan (koristeći uslovne oblike). Proverite da li to radi kako treba da nekoj vašoj kreditnoj kartici i nekom drugom nasumičnom broju.

Zadatak br 3

Ukoliko ste uspeli da uradite i prvi i drugi zadatak, sada možete da napišete funkciju validnaKreditnaKarticaQ[broj] koja kao ulaz uzima broj moguće kreditne kartice a kao izlaz daje jednu od četiri stvari: “Ovo je validna American Express kartica” (ukoliko je i amexQ i sumaLuhnQ ispunjeno), “Ovo je validna Master kartica” (ukoliko je i masterQ i sumaLuhnQ ispunjeno), “Ovo je validna Visa kartica” (ukoliko je i visaQ i sumaLuhnQ ispunjeno), “Ovo nije validna kartica” (ukoliko nijedan od prethodnih slučajeva ne važi).