Programski jezici i strukture podataka UVOD
Izvođači nastave Srđan Popov (JUG 215) Petar Marić (JUG 105) Milena Počuča (JUG 215) Milica Milutinović (JUG 215) Termini konsultacija naknadno
Cilj vežbi Sticanje osnovnih znanja o: Strukturnom programiranju C programskom jeziku strukturama podataka
Literatura za vežbe Rešeni zadaci iz programskog jezika C, Laslo Kraus Programski jezik C rešenja zadataka, drugo izdanje, Clovis L. Tondo i Scott E. Gimpel Potpuni vodič za programski jezik C, Augie Hansen Uvod u korišćenje Linux operativnog sistema, prvo poglavlje praktikuma računarskih vežbi za predmet Arhitektura računara, Žarko Živanov, Ivan Nejgebauer, Lazar Stričević, Miroslav Hajduković Thinking in C: Foundations for Java & C++, Chuck Allison i B. Eckel C programming A Modern Approach, K. N. King
Informacije i nastavni materijali Sajt katedre: http://www.acs.uns.ac.rs/ Instalacije Ubuntu-a: /mnt/nastavni_materijali/opsti_materijali/install/
Platforma za održavanje nastave PC kompatibilni računar Operativni sistem: Ubuntu distribucija GNU/Linux-a (lokalizovana distribucija se može preuzeti na jednom CD-u ili flešu kod laboranta A2-0) Operativni sistem: Windows + VirtualBox (MS Virtual PC) + Ubuntu Operativni sistem: Windows + CodeBlocks Kompajler: gcc Dibager: ddd Editor: gedit ili po izboru CodeBlocks integrisano okruženje
Upoznavanje sa sistemom Obratiti pažnju na: Osnovni meni Link na nastavne materijale Link na home direktorijum
Rad sa Terminal-om
Rad sa Editor-om
Rad sa fajl sistemom
Tema 1 Rešavanje problema, Osnovni tipovi
Rešavanje problema Razumevanje problema Izgradnja modela Formulisanje algoritma Provera ispravnosti Realizacija algoritma (pisanje programa) Testiranje programa Sastavljanje dokumentacije
BDA Formalan način zapisivanja algoritma Start ulaz/izlaz Stop s (а+b+c)/2 a>0 da potprogram ne
Zadatak 1 Izračunati površinu trougla upotrebom Heronovog obrasca. a = 2 cm b = 4 cm c = 5 cm
Rešavanje problema - Razumevanje Terminologija! Šta je Heronov obrazac? Šta je dato? a,b,c Šta se traži? - P Dopuštene metode. math.h (sqrt) Podaci? - a = 2 cm, b = 4 cm, c = 5 cm
Rešavanje problema - Izgradnja modela s=(a+b+c)/2 P=sqrt( s*(s-a)*(s-b)*(s-c))
Rešavanje problema - Formulisanje algoritma Start a=? b=? c=? 1. Uneti ulazne podatke a, b, c s=(a+b+c)/2 2. Izračunati poluobim s P=sqrt( s*(s-a)*(s-b)*(s-c) P ) 3. Preko Heronovog obrasca izračunati površinu trougla 4.Ispisati ovako izračunatu površinu Stop
Rešavanje problema - Realizacija algoritma (pisanje programa) #include <stdio.h> #include <math.h> int main() { float a=2.0; float b=4.0; float c=5.0; float s,p; s=(a+b+c)/2; P=sqrt( s*(s-a)*(s-b)*(s-c)); printf("p = %f\n",p); } return 0;
Kompajliranje i pokretanje programa Iz fajl menadžera ili terminala kreirati folder mkdir v01 Sa cd preći u folder u kome želite da sačuvate ko cd v01 U folderu kreirati novi.c fajl i u njemu sačuvati kod gedit zadatak1.c & Kompajliramo sa: gcc -o zad zadatak1.c lm Pokretanje programa./zad
Šta su varijable? Imenovani prostor u memoriji računara, koji je namenjen čuvanju vrednosti određenog tipa (celobrojne, realne, karakteri, itd). Sadrže podatke koje koristi vaš program Koriste se za čuvanje podataka koji se koriste u toku izvršavanja programa
Deklarisanje varijabli u C-u Pre korišćenja varijabla mora biti deklarisana. Deklaracija se vrši navođenjem tipa i naziva varijable. Opciono, mogu se pomoću kvalifikatora dodatno specificirati karakteristike varijable. VAŽNO: Kada se izvrši deklaracija varijable, njena vrednost je nedefinisana.
Primer deklaracije varijabli int i; char c; float f1, f2; float f1=7.0, f2 = 5.2; unsigned int ui = 0; (u poslednja dva slučaja izvršena je i inicijalizacija na početnu vrednost)
Principi imenovanja varijabli Za nazive varijabli se mogu koristiti slova, brojevi i _ CSE_5a vrlo_dugo_ime_promenljive (nepraktično) brojac (opisno ime vrlo praktično, kod čitljiviji) Prvi karakter u nazivu promenljive ne sme biti cifra 5a_CSE nije validan naziv promenljive! C pravi razliku između malih i velih slova Naziv nije ista promenljiva kao i naziv
Tipovi podataka u C-u char jednobajtni znakovni tip. short int (ili samo short) celobrojni tip, obično dužine 2 bajta (ređe korišćen tip). int - celobrojni tip obično dužine 4 bajta. long int (ili samo long) celobrojni tip, dužina 4 ili 8 bajta (ređe korišćen tip). float realna vrednost jednostruke preciznosti obično 4 bajta. double realna vrednost dvostruke preciznosti obično 8 bajta. long double - realna vrednost dvostruke preciznosti obično 8 bajta (ređe korišćen tip). Signed nasuprot unsigned tipova
Tipovi podataka u C-u Ispred tipova podataka mogu se pojaviti modifikatori ispred int : short, long, unsigned (signed) ispred char : unsigned (signed) ispred double : long Tip Dužina Opseg ---------------+-----------+------------------------------------------ unsigned char 8 bitova 0 do 255 char 8 bitova -128 do 127 enum 16 bitova -32,768 do 32,767 unsigned int 16 bitova 0 do 65,535 short int 16 bitova -32,768 do 32,767 int 16 bitova -32,768 do 32,767 unsigned long 32 bitova 0 do 4,294,967,295 long 32 bitova -2,147,483,648 do 2,147,483,647 float 32 bitova 3.4 * (10**-38) do 3.4 * (10**+38) double 64 bitova 1.7 * (10**-308) do 1.7 * (10**+308) long double 80 bitova 3.4 * (10**-4932) do 1.1 * (10**+4932)
Primer 1 Napisati program koji primenom operatora sizeof određuje veličinu memorije u bajtovima koja je potrebna za smeštanje podataka tipa: char, int, float, double. Rešenje: #include <stdio.h> int main() { printf("velicina memorije (izrazena u bajtovima) iznosi:"); printf("\n-za char \t %lu", sizeof(char)); printf("\n-za int \t %lu", sizeof(int)); printf("\n-za float \t %lu", sizeof(float)); printf("\n-za double \t %lu", sizeof(double)); return 0; }
printf i scanf Formatirani ulaz-izlaz printf ispisuje na standardni izlazni uređaj stdout (ekran). Može prihvatiti varijable i ispisati njihovu vrednost u odgovarajućem formatu. scanf učitava vrednost sa standardnog ulaznog uređaja stdin(tastatura) i učitanu vrednost dodeljuje varijabli.
Primer 2 /* Učitava se temperatura u celzijusima i konvertuje u Kelvine*/ #include <stdio.h> int main( ) { double celzijusi, kelvini; printf( Unesite temperaturu u celzijusima: "); scanf("%lf",&celzijusi); kelvini = celzijusi +273.15; printf( %lf stepeni celzijusa je %lf stepeni kelvina\n", celzijusi, kelvini); } return 0;
printf može prikazati vrednost varijable printf ("z=%d\n", z ); Format string ("... ") Sekvenca %d je specijalna sekvenca (format specifikator) i ona se ne štampa na izlaznom uređaju! %d saopštava printf-u da na zadatom mestu ispiše vrednost celobrojne promenljive koja sledi iza format stringa. Format specifikator: %[indikator][širina][.preciznost][f N h l L]tip
printf može prikazati vrednost varijable printf ("z=%d\n", z ); Format string ("... ") Sekvenca %d je specijalna sekvenca (format specifikator) i ona se ne štampa na izlaznom uređaju! %d saopštava printf-u da na zadatom mestu ispiše vrednost celobrojne promenljive koja sledi iza format stringa. Format specifikator: %[indikator][širina][.preciznost][f N h l L]tip
printf indikator i širina Definiše kako se štampa vrednost [indikator] Šta znači -----------+-------------------------------------------------------- - Left-justifies the result, pads on the right with blanks. If not given, right-justifies result, pads on left with zeros or blanks. + Signed conversion results always begin with a plus (+) or minus (-) sign. Definiše broj cifara [širina] Kako utiče na preciznost ---------+-------------------------------------------------------- n Štampa zadati broj cifara. 0n Štampa zadati broj cifara. Ako broj nema toliko cifara, sa leve se popunjava nulama.
Definiše broj decimala printf - preciznost [.prec] Kako utiče na preciznost ---------+----------------------------------------------------- (none) Preciznost se postavlja na default: = 6 za e, E, f tipove = Sve važne cifre za g, G tipove = Štampa do kraja stringa (prvi null karakter) = Ne utiče na c tip.n n decimala se štampa. Ako ima više od n decimala, rezultat će biti ili odsečen ili zaokružen. Ako je string u pitanju, štampa n slova.
printf - modifikator Definiše kraći ili duži tip podatka Modifikator tip argumenta arg se interpretira kao... -----------+---------------+----------------------------- h d i o u x X short int l d i o u x X long int e E f g G double L e E f g G long double
printf tip Tip Očekivan ulaz Format rezultat ------------------------------------------------------------------------------ Brojevi ------------------------------------------------------------------------------ d Integer Signed decimal integer i Integer Signed decimal integer o Integer Unsigned octal integer u Integer Unsigned decimal integer x Integer Unsigned hexadecimal int (with a, b, c, d, e, f) X Integer Unsigned hexadecimal int (with A, B, C, D, E, F) f Floating point Signed value oblika [-]dddd.dddd. e Floating point Signed value oblika [-]d.dddd or e[+/-]ddd g Floating point Kraći zapis od %f i %e E Floating point Isto kao e; samo ima E za eksponent G Floating point Isto kao e; samo ima E za eksponent ako je e format ------------------------------------------------------------------------------ Karakteri --------------------------------------------------------------------------- c Character Jedno slovo s String Štampa string do kraja ili do zadatog broja slova % Ništa Štampa znak % --------------------------------------------------------------------------
printf - primeri printf("celobrojni: %d\n", c); --> celobrojni: 356 printf("celobrojni: %6d\n", c); --> celobrojni: 356 printf("celobrojni: %-6d\n", c); --> celobrojni: 356 printf("celobrojni: %+6d\n", c); --> celobrojni: +356 printf("celobrojni: %+6d\n", -c); --> celobrojni: -356 printf("razlomljeni: %f\n", 3.141); --> razlomljeni: 3.141000 printf("razlomljeni: %6.2f\n", 3.141); --> razlomljeni: 3.14 printf("razlomljeni: %e\n", 3.141); --> razlomljeni: 3.141000e+00 printf("razlomljeni: %6.2e\n", 3.141); --> razlomljeni: 3.14e+00 printf("razlomljeni: %g\n", 3.141); --> razlomljeni: 3.141
scanf("%f", &var); Format string ("...") scanf učitava vrednosti Čeka dok korisnik ne unese realnu vrednost, i učitanu vrednost smešta u varijablu pod nazivom var. & je unarni operator koji vraća adresu promenljive
Zadatak 2 Izračunati površinu trougla upotrebom Heronovog obrasca, vrednosti stranica uneti sa tastature. Na izlazu štampati vrednost površine trougla na dve decimale.
Zadatak 3 Napisati program kojim se vrši prevođenje količine tečnosti iz galona u litre, ako je 1 galon 4.54 litra. Količina tečnosti u galovnima se unosi sa tastature.
Zadatak 4 Jedan radnik određeni posao uradi za M dana, a drugi radnik isti posao uradi za N dana. Napisati program kojim se određuje za koliko dana bi taj posa bio završen ako bi radili zajedno. Vrednosti M i N se unose sa tastature.