Professional Documents
Culture Documents
P2 3 6 Uvod U C PDF
P2 3 6 Uvod U C PDF
P2 3 6 Uvod U C PDF
• Rešenje:
P2: Treća nedelja /* pozdrav.c - Ispisivanje pozdrava */
Uvod u programski jezik C uključivanje funkcije za ispis
#include <stdio.h>
©Programiranje 2 – 2009 ETF Beograd 1/76 ©Programiranje 2 – 2009 ETF Beograd 2/76
©Programiranje 2 – 2009 ETF Beograd 3/76 ©Programiranje 2 – 2009 ETF Beograd 4/76
Zadatak 1 – Promenljive Zadatak 1 – Ispis (nekompletan)
• Deklaracije promenljivih • Funkcija printf (print formatted)
– dozvoljene samo na početku bloka printf(format,izraz,...,izraz);
– identifikatori mogu počinjati malim slovom, velikim slovom ili znakom _,
a mogu sadržati pored navedenih znakova i cifre • Štampa znakovni niz prema zadatom formatu
– poželjno je da ime odslikava upotrebu promenljive – format se zadaje unutar znakova " ", a precizan opis,
– navodi se najpre tip, a zatim imena promenljivih, odvojena zarezom za ispis pojedinačnog izraza, počinje znakom %
int suma; • Podrazumevani format je doslovno prenošenje
float x,y; navedenih znakova
– Jezik C pravi razliku između malih i velikih slova (eng. case-sensitive ), – printf("Zdravo!"); ispisuje Zdravo! na ekranu
za razliku od jezika Pascal!
• Specijalni simboli:
• Često korišćeni prosti tipovi – \n novi red
– char, int, long – celobrojni tipovi podataka – \t tabulacija (ostavljanje više praznina radi poravnavanja)
– float, double – realni tipovi podataka, jednostruke i dvostruke – \\ znak \
preciznosti u skladu sa ANSI/IEEE 754 standardom za realnu aritmetiku
– \" znak "
– ne postoji logički tip,
– %% znak %
celobrojna vrednost 0 predstavlja logičku neistinu,
a sve ostale vrednosti istinu
©Programiranje 2 – 2009 ETF Beograd 5/76 ©Programiranje 2 – 2009 ETF Beograd 6/76
©Programiranje 2 – 2009 ETF Beograd 9/76 ©Programiranje 2 – 2009 ETF Beograd 10/76
©Programiranje 2 – 2009 ETF Beograd 15/76 ©Programiranje 2 – 2009 ETF Beograd 16/76
Operatori – redosled računanja i Operatori – redosled računanja i
bočni efekti (2) bočni efekti (3) PRIMER
Izraz Objašnjenje Bočni efekti u 8 različitih izraza, za različite prevodioce.
Inicijalna vrednost promenljive j je 5.
a=b*c + b++ u=b*c, v=b, b=b+1, a=u+v
izraz VS 6.0 VS.NET TC 2.0 GNU ARM C
2003 GCC
v=b, b=b+1, u=b*c, a=u+v
1. j * j++ 25 25 30 25 30
a=b*c + b=d/e u=b*c, v=b=d/e, a=u+v 2. j++ * j 25 25 30 25 30
3. ++j * j 36 36 36 36 36
v=b=d/e, u=b*c, a=u+v
4. j * ++j 36 36 36 36 36
a[i] = ++i Indeksiranje je bin.op. 5. (j=3)*(j++) 9 9 9 9 9
6. (j=3)*(++j) 16 16 12 12 12
u=i, ++i, v=i, a[u]=v
7. (j++)*(j=3) 9 9 15 9 15
©Programiranje 2 – 2009 ETF Beograd 17/76 ©Programiranje 2 – 2009 ETF Beograd ? 18/76
((j+1)==m)!=(y*2); j=j+1
©Programiranje 2 – 2009 ETF Beograd 19/76 ©Programiranje 2 – 2009 ETF Beograd 20/76
Zadatak 4 – Površina trougla (1.4) Zadatak 4
• Sastaviti na jeziku C program za izračunavanje površine • Rešenje
trougla u ravni ako su zadate koordinate temena. Potrebne
#include <stdio.h>
podatke čitati sa glavnog ulaza računara, a rezultat prikazati #include <math.h>
na glavnom izlazu.
void main () {
• Važe sledeće formule:
double xA, yA, xB, yB, xC, yC, a, b, c, s, P;
A( x A , y A ), B( xB , y B ), C ( xC , yC )
/* Temena trougla: */
a = ( xB − xC ) + ( y B − yC )
2 2
s = (a + b + c ) / 2 printf ("Koordinate temena trougla\n");
printf ("- prvo teme? ");
scanf ("%lf%lf", &xA, &yA);
b = ( xC − x A ) 2 + ( yC − y A ) 2 P = s ( s − a )( s − b)( s − c) printf ("- drugo teme? ");
scanf ("%lf%lf", &xB, &yB);
c = ( x A − xB ) 2 + ( y A − y B ) 2 printf ("- trece teme? ");
scanf ("%lf%lf", &xC, &yC);
©Programiranje 2 – 2009 ETF Beograd 21/76 ©Programiranje 2 – 2009 ETF Beograd 22/76
©Programiranje 2 – 2009 ETF Beograd 23/76 ©Programiranje 2 – 2009 ETF Beograd 24/76
Zadatak 5 Zadatak 5
• Rešenje
if (D != 0) {
#include <stdio.h>
x = Dx / D;
void main () { y = Dy / D;
double a1, b1, c1, a2, b2, c2, D, Dx, Dy, x, y; printf ("x= %10.2f\n", x);
printf ("y= %10.2f\n", y);
printf ("Koeficijenti prve jednacine? ");
scanf ("%lf%lf%lf", &a1, &b1, &c1); } else
printf ("Koeficijenti druge jednacine? "); if (Dx==0 && Dy==0)
scanf ("%lf%lf%lf", &a2, &b2, &c2); printf ("Sistem je neodredjen.\n");
else
D = a1 * b2 - a2 * b1; printf ("Sistem je protivrecan.\n");
Dx = c1 * b2 - c2 * b1;
Dy = a1 * c2 - a2 * c1; }
©Programiranje 2 – 2009 ETF Beograd 25/76 ©Programiranje 2 – 2009 ETF Beograd 26/76
for( a; b; c ) d;
n
a)s = 1 + 2 + 3 + ... + n = ∑ i
FALSE
b
i =1
n n i
Polja a, b, c i d su opciona.
c ) s = 1!+2!+3!+... + n!= ∑ i!=∑∏ j Ako se ne zada b podrazumeva se TRUE
i =1 i =1 j =1 da je uslov uvek ispunjen.
d
Beskonačan ciklus:
for( ; ; ) { ... } c
©Programiranje 2 – 2009 ETF Beograd 27/76 ©Programiranje 2 – 2009 ETF Beograd 28/76
Zadatak 6 Primer
• Rešenje a) • Sastaviti program na programskom jeziku C za
#include <stdio.h>
ispisivanje tablice ASCII kodova za sve štampajuće
void main () {
int n, s, i; znake.
printf ("n? "); scanf ("%d", &n);
for (s=0, i=1; i<=n; s+=i++); Rešenje:
}
printf ("s= %d\n", s);
• ASCII kod sa brojem 32 je blanko simbol ili razmak.
Prva 32 ASCII koda (od 0 do 31) i svi ASCII kodovi
• Rešenje c)
#include <stdio.h> veći ili jednaki 127 predstavljaju specijalne simbole
void main () { koji se koriste u različite svrhe i najčešće nemaju
int n, i; long s, f; neko jasno slovno značenje.
printf ("n? "); scanf ("%d", &n)
for (s=0, f=i=1; i<=n; i++) { • ASCII kodovi između 32 i 126 su štampajući znaci
f *= i; i ima ih ukupno 95.
s += f;
• Znaci se prikazuju po kolonama. U jednoj koloni se
}
printf ("s= %ld\n", s); prikazuje po 19 znakova, a u jednom redu se prikazuje
} po 5 znakova (5x19=95).
©Programiranje 2 – 2009 ETF Beograd 29/76 ©Programiranje 2 – 2009 ETF Beograd 30/76
©Programiranje 2 – 2009 ETF Beograd 33/76 ©Programiranje 2 – 2009 ETF Beograd 34/76
©Programiranje 2 – 2009 ETF Beograd 37/76 ©Programiranje 2 – 2009 ETF Beograd 38/76
©Programiranje 2 – 2009 ETF Beograd 41/76 ©Programiranje 2 – 2009 ETF Beograd 42/76
d continue 0 / 0
• odnosi se na najbližu Tačan odgovor: N
obuhvatajuću kontrolnu continue 1 x+=1; x+=2; 3
strukturu 2 x+=2; 5
c 3 / 5
4 x+=3; 8
©Programiranje 2 – 2009 ETF Beograd 45/76 ©Programiranje 2 – 2009 ETF Beograd 46/76
©Programiranje 2 – 2009 ETF Beograd 47/76 ©Programiranje 2 – 2009 ETF Beograd 48/76
Zadatak 10 Zadatak 11 – nizovi (3.3)
• Sastaviti na jeziku C program koji pročita dva vektora
/* Obrazovanje datuma za sledeci dan: */ zadate dužine sa realnim komponentama, izračuna njihov
if (dan < d) dan++; skalarni proizvod i ispisuje dobijeni rezultat. Prethodne
else { radnje ponavlja sve dok se za dužinu vektora ne pročita
dan = 1; nedozvoljena vrednost.
if (mes < 12) mes++;
else { mes = 1; god++; } • Skalarni proizvod:
}
printf ("Sutra= %2.2d. %2.2d. %d.\n\n",dan,mes,god);
n −1
s = ∑ aibi
}
}
i =0
©Programiranje 2 – 2009 ETF Beograd 49/76 ©Programiranje 2 – 2009 ETF Beograd 50/76
Zadatak 11 Pretprocesor
• Rešenje: • Pretprocesor
#include <stdio.h> – vrši analizu izvornog koda programa pre prevodioca i sprovodi
#define DIM 50 odgovarajuće tekstualne zamene
void main () {
– svaku sekvencu koja odgovara postojećoj definiciji zamenjuje
double a[DIM], b[DIM], skal_pro; desnom stranom definicije
int i, n;
– najčešće je pretprocesor deo prevodioca
while (1) {
printf ("\nDuzina vektora (najvise %d)? ", DIM); • Pretprocesorska direktiva #include
scanf ("%d", &n); – prepisuje (uključuje) sadržaj zaglavlja koje je navedeno između
if (n <= 0 || n > DIM) break; znakova < > ili " " u izvorni kod
printf ("Komponente vektora A? "); – ukoliko je ime zaglavlja navedeno unutar " ", pretprocesor će ga najpre
for (i=0; i<n; scanf ("%lf", &a[i++])); tražiti u direktorijumu gde se nalazi izvorni kod programa, a zatim u
printf ("Komponente vektora B? "); sistemskim direktorijumima
for (i=0; i<n; scanf ("%lf", &b[i++])); – ako je zaglavlje navedeno unutar < >, pretprocesor će ga tražiti samo u
for (skal_pro=i=0; i<n; i++) sistemskim direktorijumima
skal_pro += a[i] * b[i];
• Pretprocesorska direktiva #define
printf ("Skalarni proizvod A*B= %10.3f\n", skal_pro);
}
– najčešće služi za definisanje simboličke konstante
} – može da se parametrizuje
– razne druge primene (uslovno prevođenje, ... )
©Programiranje 2 – 2009 ETF Beograd 51/76 ©Programiranje 2 – 2009 ETF Beograd 52/76
Pretprocesor Zadatak 12 – rand i sort (3.11)
• Primeri • Sastaviti program na programskim jeziku C koji
– #define BROJ_MESECI 12
srednja_temp /= BROJ_MESECI; _ srednja_temp /= 12;
formira slučajan celobrojni niz sastavljen od
– #define EVER ;; jednocifrenih brojeva i izvrši uređivanje niza po
for(EVER) _ beskonačan ciklus neopadajućem redosledu vrednosti brojeva.
– #define FOREVER for(;;)
FOREVER { ... } _ beskonačan ciklus
Postupak ponavljati sve dok se za dužinu niza
• Oprez !! ne unese nedozvoljena vrednost.
– #define KVARDAT(x) (x)*(x)
int n = 5;
printf("%d", KVADRAT(n++)); • Rešenje prikazuje:
– korišćenje funkcije rand() za dobijanje slučajnog broja
posle pretprocesora se zapravo dobija
printf("%d", (n++)*(n++)); _ ispisaće 30 a ne 25! – algoritam za uređivanje po metodi izbora (selection sort)
Zadatak 12 Zadatak 12
• Rešenje: printf("\nPocetni niz:\n\n");
#include <stdio.h> for (i = 0; i < n; i++)
#include <stdlib.h> printf("%d%c", a[i],
#define DIM 50 (i % 30 == 29 || i == n-1) ? '\n' : ' '
);
©Programiranje 2 – 2009 ETF Beograd 55/76 ©Programiranje 2 – 2009 ETF Beograd 56/76
Uređivanje metodom izbora –
rand() selection sort min
• Funkcija koja generiše pseudoslučajan ceo broj u
13 10 4 6 8 9 7 2 1 5
opsegu od 0 do RAND_MAX
i j
• Nalazi se u standardnom zaglavlju <stdlib.h>
– RAND_MAX je konstanta iz standardnog zaglavlja <stdlib.h>
1 10 4 6 8 9 7 2 13 5
– #define RAND_MAX 0x7FFF
• rand() generator relativno loših karakteristika i min
©Programiranje 2 – 2009 ETF Beograd 57/76 ©Programiranje 2 – 2009 ETF Beograd 58/76
float temperature[BROJ_MESECI];
float srednja_temp=0, razlika, najmanja_razlika;
while (1) {
printf("Temperatura za mesec %2d: ",mesec);
scanf("%f",&temperature[mesec - 1]);
srednja_temp+=temperature[mesec - 1];
if (mesec==DEC) break;
mesec++;
}
©Programiranje 2 – 2009 ETF Beograd 59/76 ©Programiranje 2 – 2009 ETF Beograd 60/76
Zadatak 13 Zadatak 14 – bitski operatori
• Šta ispisuje sledeći program na programskom
srednja_temp /= BROJ_MESECI; jeziku C?
najblizi = JAN;
najmanja_razlika = fabs(srednja_temp – temperature[0]); #include <stdio.h>
for( mesec = FEB; mesec <= DEC; mesec++ ) { void main() {
razlika = fabs(srednja_temp – temperature[mesec]); int a=55, b=27;
if( razlika < najmanja_razlika ) { if (a & 0xfa)
najblizi = mesec; if (b | 037)
najmanja_razlika = razlika;
a=6,b=4;
}
else
}
a=7,b=2;
else
printf("Mesec: %d, razlika %f\n",najblizi,
a=5,b=3;
najmanja_razlika);
printf("%d", a+b);
}
printf("%d", a-b);
}
©Programiranje 2 – 2009 ETF Beograd 61/76 ©Programiranje 2 – 2009 ETF Beograd 62/76
©Programiranje 2 – 2009 ETF Beograd 65/76 ©Programiranje 2 – 2009 ETF Beograd 66/76
©Programiranje 2 – 2009 ETF Beograd 67/76 ©Programiranje 2 – 2009 ETF Beograd 68/76
Zadatak 16 Zadatak 17 – izbacivanje elementa (3.7)
• Rešenje: • Sastaviti na jeziku C program za izostavljanje svih
#include <stdio.h> elemenata zadatog niza brojeva koji imaju neku
#define NMAX 100
zadatu vrednost. Program treba da čita i obrađuje
void main () { niz sve dok za dužinu niza ne pročita nedozvoljenu
double a[NMAX], min; vrednost.
int n, i;
while (1) {
printf ("n? "); scanf ("%d", &n);
if (n<=0 || n>NMAX) break;
printf ("A? ");
for (i=0; i<n;i++) scanf ("%lf", &a[i]);
min = a[0];
for (i=1; i<n; i++) if (a[i] < min) min = a[i];
printf ("min= %.2f\n\n", min);
}
}
©Programiranje 2 – 2009 ETF Beograd 69/76 ©Programiranje 2 – 2009 ETF Beograd 70/76
©Programiranje 2 – 2009 ETF Beograd 71/76 ©Programiranje 2 – 2009 ETF Beograd 72/76
Zadatak 18 Zadatak 19 (C35)
• Rešenje: • Koja od datih konstrukcija na programskom
#include <stdio.h>
jeziku C predstavlja ekvivalent iskaza na
#define N 50
proramskom jeziku Pascal:
void main () {
int i, n, b, a[N+1]; if a > b then begin a:=1; b:=1 end
while (1) {
printf ("n? "); scanf("%d", &n); A) if (a>b) { a=1; b=1; }
if (n<=0 || n>N) break; B) if (a>b) a=1, b=1;
printf ("A? "); for (i=0; i<n; scanf ("%d", &a[i++]));
printf ("b? "); scanf ("%d", &b); C) if (a>b) a=1; b=1;
for (i=n-1; i>=0 && a[i]>b; i--) a[i+1] = a[i];
a[i+1] = b;
n++; A: tačno, potpuno odgovara segmentu
printf ("A= "); for (i=0; i<n; printf ("%d ", a[i++]));
B: uslovno tačno, krajnji rezultat je isti
printf ("\n\n");
} C: netačno, b uvek dobija vrednost 1
}
©Programiranje 2 – 2009 ETF Beograd 73/76 ©Programiranje 2 – 2009 ETF Beograd 74/76
III x=i=0;
while (i<=n)
{ i++; ++x; y=x>n;}
printf(“%ld %ld”,x,y);