Binder 1
Binder 1
Binder 1
Programirawe
vo C
Op{to za C
Programskiot jazik C e razvien nekade kon krajot na 60-tite od
strana na Denis Ri~i, so ideja da se kreira programski jazik
pogoden za pi{uvawe operativni sistemi (UNIX).
Modernite tipovi podatoci, kontrolni srukturi, golemiot broj
operatori, odli~nata "ekonomija" na izrazite go pravat C
moderen programski jazik za op{ta namena {to kreira mnogu
efikasen izvr{en kod.
Negovite ro{iruvawa vo objektnoorientirana nasoka (C++) i nasoka za pi{uvawe aplikacii pod Windows operativni sistemi
(na primer Visual C), zaedno so negovata vrzanost za operativnite sistemi go pravat najmnogu koristen jazik na dene{ninata.
Vo dene{no vreme, najgolemiot del od sistemskiot softer
prakti~no sekoga{ se pi{uva vo C ili C++, taka {to sekoj {to
saka profesionalno da se zanimava so programirawe
ednostavno mora da go poznava.
4/9/2013
D. ^akmakov
KIP - 6
Op{to za C
C has been widely criticized, and many people are quick to show its problems
and drawbacks. But as languages come and go, C stands untouched. So, if you
write software that is going to stay for some time, do not learn "the language
of the day"; learn C.
Many people feel that C lacks the simplicity of Java, or the sophistication of
C++ with its templates and other goodies. True. C is a simple language,
without any frills. But it is precisely this lack of features that makes C adapted
as a first time introduction into a complex high-level language that allows you
fine control over what your program is doing without any hidden features.
As languages come and go, C remains. It was at the heart of the UNIX
operating system development in the seventies, it was at the heart of the
microcomputer revolution in the eighties, and as C++, Delphi, Java, and
many others came and faded, C remained, true to its own nature.
Objective C generates C, as does Eiffel and several other object-oriented
languages. Even C++ started as a pre-processor for the C compiler.
4/9/2013
D. ^akmakov
KIP - 6
Struktura na programata
tipovi na podatoci
main ( n, v ) {
deklaracii
prosti podatoci
strukturni podatoci
decimalni
celobrojni
znakovni
indeksni
tekstualni
slogovi
datoteki
poka`uva~i
objekti
izvr{ni naredbi
Tip
celobrojni
decimalni
znakoven
konstanti
4/9/2013
Deklaracija
int a,vred;
float x, y, a, pom;
char a, b, rez;
#define ime vrednost
D. ^akmakov
Konstanti
2, 67822
2.44, .710, 0.613299, 5.2e+10
'a', '$', '?'
#define gravitacija 9.81
KIP - 6
Naredba za vlez
scanf (format, v , v , Op{to
...,v );
za C
1
kade {to format e tekstualna konstanta, a v1, v2, ..., vn se poka`uva~i kon
promenlivite vo koi se ~itaat podatoci vneseni od tastaturata
Primer:
int n; float x; char t1[2], t2[8];
4/9/2013
Vrednost na promenlivite
x=4.56 t1="AX" t2="22" n=3
x=1.232 t1="P" t2="H" n=11230
x=3.44 t1="+1" t2="11" n=0
x=11.0 t1="33" t2="pril" n=0
x=4.14 t1='aa' t2='3' n=7
D. ^akmakov
KIP - 6
Naredba za izlez
printf (format, p1, p2, ..., pn);
kade {to format e tekstualna konstanta na formatot, a p1, p2, ..., pn se
podatocite (promenlivi ili izrazi) {to se pe~atat
Primer:
int n; float x, y; char t[4];
4/9/2013
D. ^akmakov
Oblik na pe~ateweto
#2##4.5000#1.2000E+00X#
122#-12.0100#2.2500E-011#
#0##4.0000#1.2000E+01aaa
444##0.0000#1.0000E05#3
#1#21230.1406#2.1232E+03abba
KIP - 6
Primeri (1)
Primer 1. Za daden decimalen broj da se otpe~ati negoviot cel i
decimalen del.
int main () {
float a, ad; int ac;
scanf("%f", &a);
ac = a;
ad = a ac;
printf ("Celiot del e %d, a decimalniot del e %12.4f\n",ac, ad);
}
Primer 2. Daden e trocifren broj n. Da se sostavi algoritam {to }e go
pronao|a brojot m ~ii{to cifri se vo obraten redosled od cifrite na
brojot n.
int main () {
int n, m, c1, c2, c3;
scanf("%f", &n);
c1 = a/100; c2 = (a c1*100)/10; c3 = a c1*100 c2*10;
m = c3*100 + c2*10 +c1;
printf ("Brojot so obratni cifri e %d\n", m);
}
4/9/2013
D. ^akmakov
KIP - 6
Naredbi za granawa
if ( uslov) naredba;
if ( uslov) naredba1
else naredba2 ;
if ( uslov) {
naredbi;
}
if ( uslov) {
naredbi1;
}
else {
naredbi2 ;
}
if ( uslov1 ) {
naredbi1
} else if ( uslov2 ) {
naredbi2
} else if ( uslov3 ) {
naredbi3
..........
} else {
naredbi
}
switch ( izraz ) {
case vrednost i1: naredbi1;
case vrednost i2 : naredbi2 ;
}
4/9/2013
..........
case vrednost in : naredbin ;
default naredbin+1;
D. ^akmakov
KIP - 6
Primeri
(2)
D. ^akmakov
KIP - 6
10
Primeri
(3)
Naredbi za povtoruvawa
while ( uslov) naredba; Naredbata ili naredbite vo
while ( uslov) {
naredbi;
}
D. ^akmakov
KIP - 6
12
Primeri
(1)
D. ^akmakov
KIP - 6
13
Primeri
(2)
D. ^akmakov
KIP - 6
14
Primeri
(3)
Primer 13. Da se najdat site broevi me|u m i n delivi so sumata na svoite cifri.
int main () {
int m, n, s, i, br;
printf ("Vnesi 2 celi broja (m,n):\n");
scanf("%d%d", &m, &n);
for (i=m; i<=n; i++) {
s = 0; br = i;
while (br > 0) { s = s + br%10; br = br/10; )
if (i%s == 0) printf ("%d ", i);
}
}
Primer 14. Da se najde prviot prost broj pogolem od n.
int main () {
int n, i, j, bdel;
printf ("Vnesi cel broj: ");
scanf("%d", &n);
for (i=n+1; ; i++) {
for (j=2; i%j !=0 && j<=i/2; j++);
if (j > i/2) { printf ("Prviot prost broj pogolem od %d e %d.\n", n, i); exit(1); }
}
}
4/9/2013
D. ^akmakov
KIP - 6
15
Primeri (4)
Primer 15. Da se sostavi tabela za pretvorawe na miqi vo kilometri i
obratno.
kilometri
milji
int main () {
---------------------------------1.0000
0.6214
float km, ml, maxkm;
1.6093
1.0000
printf ("Do koj kilometar: ");
2.0000
1.2428
3.0000
1.8641
scanf("%f", &maxkm);
3.2187
2.0000
printf (" Kilometri
Milji\n");
printf ("-----------------------------------\n");
km = ml = 1;
while (km <= maxkm) {
if (km < ml*1.6903) {
printf ("%12.4f%12.4f\n", km, km/1.6093);
km++;
}
else {
printf ("%12.4f%12.4f\n", ml*1.6093, ml); ml++;
}
}
}
4/9/2013
D. ^akmakov
KIP - 6
16
Koristewe indeksirani
promenlivi
Nizite se memoriraat vo sosedni memoriski lokacii. Za razlika od drugi
programaki jazici, vo C nizite zapo~ nuvaat so indeks 0. Na primer, na elementite na nizata vr[100] }e i se obra}ame so vr[0], vr[1], vr[2], , vr[99].
a2
l1=l0+d
l0
. . .
a3
an-1
an
ln=l1+nd
l2=l1+2d
d = 4 bajti (int);
Za tekst:
4/9/2013
t1[0]
t1[1]
t1[2]
t1[3]
t1[4]
t1[5]
t1[6]
t1[7]
t1[8]
t1[0]
\0
D. ^akmakov
KIP - 6
17
Primeri
(1)
D. ^akmakov
KIP - 6
18
Primeri
(2)
Primer 17. Da se ufrli elementot y na k-to mesto vo nizata x1, x2, , xn.
int main () {
int n, k, i; float x[1000], y;
printf ("Kolku elementi ima nizata: "); scanf("%d", &n);
printf ("Vnesi gi elementite na nizta:\n");
for (i=1; i<=n; i++) scanf("%f", &x[i]);
printf ("Vnesi go elementot i mestoto na koe se ufrla:\n"); scanf("%f%d", &y, &k);
for (i=n; i>=n; i--) x[i+1] = x[i]; x[k] = y;
D. ^akmakov
KIP - 6
19
Primeri
(3)
D. ^akmakov
KIP - 6
20
Primeri
(4)
Primeri
(5)
Primer 22. Da se sostavi niza b1, b2, , bk od onie elementi na nizata a1, a2,
, an. koi{to zadovoluvaat daden uslov.
int main () {
int n, i, k; float a[1000], b[1000];
printf ("Kolku elementi ima nizata: "); scanf("%d", &n);
printf ("Vnesi gi elementite na nizta:\n");
for (i=1; i<=n; i++) scanf("%f", &a[i]);
k = 0;
for (i=1; i<=n-1; i++)
if (a[i] go zadovoluva uslovot da odi vo nizata b) {
k++;
b[k] = a[i];
}
for (i=1; i<=k; i++) printf ("%f ", b[i]);
}
4/9/2013
D. ^akmakov
KIP - 6
22
Primeri
(6)
D. ^akmakov
KIP - 6
23
Deklariraweto
pp = &x;
Unarniot
4/9/2013
D. ^akmakov
KIP - 6
24
Unarniot
Se
4/9/2013
D. ^akmakov
KIP - 6
25
Primer (1)
#include <stdio.h>
int main() {
Brojot 99 so vrednost 99 ima adresa 1245032
int broj, *br;
br = &broj;
*br = 99;
printf("Brojot %d so vrednost %d ima adresa %d", broj, *br, br);
}
4/9/2013
D. ^akmakov
KIP - 6
26
vo memorijata }e imame:
l
108
99
99
45
\0
51
50
4/9/2013
D. ^akmakov
KIP - 6
27
D. ^akmakov
KIP - 6
28
VI
Programirawe
vo C (II)
...
EOF
Kraj
Po~etok
Tekovna pozicijata
Rabotata so datoteki e edna od najva`nite mo`nosti vgradena vo programskite jazici. Vo programite datotekata se razgleduva kako niza
logi~ki zapisi so po~etok i kraj (EOF = "end of file") pri {to sekoga{
postoi edna tekovna pozicija od koja se ~ita ili vo koja se zapi{uva
sledniot logi~ki zapis.
Vo programata se deklarira poka`uva~ kon datotekata:
FILE *ime;
i taa se otvora:
ime = fopen ("fizi~ko ime na datekata", "vid na otvorawe");
na primer:
Ime na disk
Se otvora za
pod = fopen ("Podatoci.txt", "r+");
~itawe i dodavawe
if (pod == NULL) printf ("Ne moze da se otvori datotekata Podatoci.dat !!!\n);
4/9/2013
D. ^akmakov
KIP - 6
Rabota so datoteki
(2)
Po otvoraweto, poka`uva~ot kon datotekata se postavuva na po~etniot bajt. ^itaweto podatok vo promenlivata x se pravi so
char x;
...
fgetc(ime, x);
ili
fscanf(ime, "%c", &x);,
Pove}e podatoci odedna{ mo`e da se v~itaat so:
fscanf(ime, "%c%c%...%c", &x1, &x2, ..., &xn);
Za proverka dali sme stignale do krajot na datotekata, operaciite na
~itawe se sporeduvaat so EOF pri {to vrednosta e true ako sme na
krajot na datotekata. Slednava programska {ema ~ita simbol po
simbol od datotekata ime i go obrabotuva (~esto koristena {ema).
while ((x = fgetc(ime)) != EOF) {
obraboti go x;
ili
}
4/9/2013
D. ^akmakov
Rabota so datoteki
(3)
4/9/2013
D. ^akmakov
KIP - 6
Rabota so datoteki
(4)
Osnovni naredbi:
Zna~ewe
Funkcija
fgetc(f, ...), getc(f), fscanf(f, ...),
fgets(..., f), fputc(f, ...), putc(, f),
fprintf(f, ...), fputs(..., f)
fopen("ime", "vid"), fclose(f)
feof(f), ferror(f)
fseek(f, n, pos)
ftell(f)
~itawe i pi{uvawe
otvorawe (r - ~itawe, w - pi{uvawe, + dodavawe pri {to e mo`na i kombinacija
na ovie simboli) i zatvorawe na datoteka
proverka za kraj i gre{ka
pozicionirawe na n-ti bajt
tekovna pozicija
D. ^akmakov
KIP - 6
Primeri
(1)
D. ^akmakov
KIP - 6
Primeri
(2)
D. ^akmakov
KIP - 6
Primeri
(3)
D. ^akmakov
KIP - 6
Primeri
(3)
pismo.txt
Hi Younes,
I make preparations for my stay in Oxford, (about 40 days), so I will not be
in Skopje until 1st September. I know that you also use August for your vacation
(in Maroco?). Could you inform me about our paper submited to the Revue
d'intelligence artificielle. Do we have any response? I am still waiting response
from the second paper submited to the journal of PAA in UK.
Regards from: Dusan
Najdolgiot zbor e 'd'intelligence' so 14 simboli.
Na ekranot }e se otpe~ati:
2 6 0 0 1 4 12 3 2 4 2 6 0 6 2 5 0 2 1 4 3 2 2 6 5 3 9 0 1 4 4 3 4 3 6 3 4 8 0
3 6 1 0 5 3 6 2 5 3 5 8 2 3 5 0 14 12 0 2 2 4 3 8 0 1 2 5 7 8 0 4 3 6 5 8 2 3
72322007405
4/9/2013
D. ^akmakov
KIP - 6
Primeri
(4)
D. ^akmakov
KIP - 6
10
Primeri
(4)
!
"
#
%
'
(
)
*
+
,
.
/
0
1
2
3
4
5
6
:
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
4/9/2013
32)
33)
34)
35)
37)
39)
40)
41)
42)
43)
44)
46)
47)
48)
49)
50)
51)
52)
53)
54)
58)
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
68
3
12
2
7
2
18
18
1
6
9
3
2
3
2
2
1
1
3
2
1
;
<
=
>
D
E
F
I
J
L
N
O
T
U
[
\
]
a
b
c
d
( 59)
( 60)
( 61)
( 62)
( 68)
( 69)
( 70)
( 73)
( 74)
( 76)
( 78)
( 79)
( 84)
( 85)
( 91)
( 92)
( 93)
( 97)
( 98)
( 99)
( 100)
D. ^akmakov
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
17
3
11
3
1
2
6
1
1
3
1
1
1
1
5
3
5
13
3
29
7
KIP - 6
e
f
g
h
i
k
l
m
n
o
p
q
r
s
t
u
v
w
x
{
}
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
(
101)
102)
103)
104)
105)
107)
108)
109)
110)
111)
112)
113)
114)
115)
116)
117)
118)
119)
120)
123)
125)
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
31
14
3
4
35
3
6
8
38
18
5
4
13
12
27
16
2
1
1
3
3
11
Primeri
(5)
4/9/2013
D. ^akmakov
KIP - 6
12
Primeri
(5)
d1.txt
Dear Prof. Bennani
I arrive in Paris at 01 June and from 02 June (Friday) I will be accommodated in
Cite Universitaire (Fondation Abreu de Grancher). In this moment I do not know the
phone number of my room, but you can obtain the phone number from reception
(tel: 01 44 16 82 93).
It would be nice if you inform me (by phone because I will not have access to
Internet) when is most appropriate time for you to meet me at LIPN. For me, every
day from 05 June (Monday) is ok.
Best Regards: Dusan
Po izvr{uvaweto na programata za Zbor: phone i Zamena: tel. se dobiva d2.txt:
d2.txt
Dear Prof. Bennani
I arrive in Paris at 01 June and from 02 June (Friday) I will be accommodated in
Cite Universitaire (Fondation Abreu de Grancher). In this moment I do not know the
tel. number of my room, but you can obtain the tel. number from reception (tel: 01
44 16 82 93).
It would be nice if you inform me (by tel. because I will not have access to
Internet) when is most appropriate time for you to meet me at LIPN. For me, every
day from 05 June (Monday) is ok.
Best Regards: Dusan
4/9/2013
D. ^akmakov
KIP - 6
13
Koristewe indeksirani
promenlivi od povisok red
a11
a1,2 a1,n
,
a
a
a
2,2
2,n
2,1
Primer na inicijalizacija:
int denm[2][13] = {
(0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31),
(0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
};
4/9/2013
D. ^akmakov
KIP - 6
14
Primeri
(1)
Primer 1. Da se najdat sumite na elementite po glavnata i sporednata dijagonala kako i vo dolniot desen triagolnik na kvadratna matrica A(nn).
int main () {
FILE *mat; int n, i, j; float a[100][100], sg, ss, sddtr;
if ((mat = fopen("mat.dat", "r")) == NULL) {
printf ("Ne moze da se otvori datotekata mat.dat !!! ");
exit (1); }
fscanf (mat, "%d", &n);
for (i=1; i<=n; i++)
for (j=1; j<=n; j++) scanf(mat, "%f", &a[i][j]);
sg = ss = sddr = 0;
for (i=1; i<=n; i++) { sg = sg + a[i][i];
ss = ss + a[n-i+1][i]; }
for (i=1; i<=n; i++)
for (j=1; j<=n; j++) if (i < j) sddr = sddr + a[i][j];
printf ("Sumite se:\nsg = %12.2f\nss = %12.2f
\nsddtr = %12.2f\", sg, ss, sddtr);
}
4/9/2013
D. ^akmakov
KIP - 6
mat.dat
4
1.
2.1
0.5
6.44
2.0 4.90 3.1 -12.80
3.3 -6.2 10.0 5
.20 2.2
20.5 8.80
Sumite se:
sg =
24.70
ss =
3.45
sddtr =
33.7
15
Primeri
(2)
D. ^akmakov
KIP - 6
16
Primeri
(3)
4/9/2013
D. ^akmakov
KIP - 6
17
Primeri
(4)
D. ^akmakov
KIP - 6
18
izvr{ni naredbi
ili
izvr{ni naredbi
}
Zna~i, deklariraweto na promenlivite {to se prenesuvaat vo, ili od funkcijata mo`e da bide napraveno direktno vo listata na podatoci ili pred
po~etokot na teloto na funkcijata. Funkcijata ne smee da ima naredba od
oblik ime = ..., a vrednostite {to funkcijata gi vra}a ednostavno se
stavaat vo naredbata return.
Tipot tip na funkcijata e vidot na vrednosta {to funkcijata go vra}a vo
funkcijata od koja e povikana. Ako funkcijata ne vra}a vrednost, za tipot
se stava void. Povikuvaweto na funkcijata se pravi so ednostavno naveduvawe na nejzinoto ime i vrednosti na nejzinite argumenti v1, v2, ..., vn
rez = ime (v1, v2, ..., vn);
kade {to sekoe vi mo`e da bide konstanta, promenliva, izraz ili funkcija.
4/9/2013
D. ^akmakov
KIP - 6
19
D. ^akmakov
KIP - 6
20
Potprogrami i funkcii
(3)
Prenosot na vrednostite v1, v2, ..., vn vo argumentite a1, a2, ..., an e normalno "po
vrednost" ("by value"). Toa zna~i deka funkcijata pravi svoja privatna
privremena kopija na vrednostite na argumentite.
Na primer za promena na vrednosti na dve promenlivi naivno e:
D. ^akmakov
KIP - 6
21
Potprogrami i funkcii
(4)
}
char a , u;
f 2() {
}
main() {
oblast na va`nost
na a, b, x
oblast na va`nost
na x, y, z
oblast na va`nost
na a, u
D. ^akmakov
KIP - 6
22
Potprogrami i funkcii
(5)
}
void fun2() {
rez fun1(11
, ,6.95)
ili
void fun2() {
double fun1(int, int, double );
rez fun1(11
, ,6.95)
}
double fun1( int x , int y , double z ) {
Rekurzija:
int nzd(int n, int m) {
if (m != 0) return nzd(m, n(n/m)*m);
else return n;
}
4/9/2013
D. ^akmakov
main() {
int a, b;
printf("Prv broj: "); scanf("%d", &a);
printf("Vtor broj: "); scanf("%d", &b);
printf("NZD = %d", nzd(a,b));
}
KIP - 6
23
Primeri
(1)
D. ^akmakov
KIP - 6
24
Primeri
(2)
#include <math.h>
float f(float x) {
return x*sin(x)-1;
}
float pold (float a, float b, float eps) {
float xsr;
while (b-a > eps) {
xsr = (a + b)/2.;
y
if (f(a)*f(xsr) <= 0) b = xsr;
else a = xsr;
}
return (a + b)/2.;
0
}
| xn |
ba
= eps
2n
f(x)
x1
x3 x4 x2
int main () {
float a, b, gr;
printf ("Vnesi go intervalot na resenieto i tocnosta:\n"); scanf("%f%f%f", &a, %b, %gr);
printf ("Resenieto e %12.7f\n", pold(a, b, gr));
}
4/9/2013
D. ^akmakov
KIP - 6
25
Primeri
(3)
D. ^akmakov
KIP - 6
26
Primeri
(4)
D. ^akmakov
KIP - 6
27
return na nizi
float *niz(int n, float x[]) {
int i;
for (i=1; i<=n; i++) x[i] += 1;
return x;
}
int main() {
int n,i; float a[5], *b;
a[1]=a[2]=a[3]=a[4]=1;
b=niz(4,a);
for (i=1; i<=4; i++) printf("%f ", *(a+i));
for (i=1; i<=4; i++) printf("%f ", *(b+i));
}
float *niz(int n, float *x) {
int i;
for (i=1; i<=n; i++) x[i] += 1;
return x;
}
4/9/2013
D. ^akmakov
int main() {
int n,i; float a[5], *b;
a[1]=a[2]=a[3]=a[4]=1;
b=niz(4,&a[0]);
for (i=1; i<=4; i++) printf("%f ", a[i]);
for (i=1; i<=4; i++) printf("%f ", b[i]);
}
KIP - 6
28
Primeri
(5)
Primer 5. Da se sostavi funkcija za presmetka na plo{tina na proizvolen poligon zadaden so koordinatite na svoite temiwa.
#include <stdio.h>
y
#define D 100
float ppol(float *px, float *py, int n) { 3
int i;
float pp = 0;
2
px[n] = px[0]; py[n] = py[0];
A
B
for (i = 0; i < n; i++)
1
pp = pp + (px[i+1] px[i])
*0.5*(py[i+1] + py[i]);
return pp;
1
0
2
3
}
main () {
FILE *pol;
int i;
float x[D], y[D];
if ((pol=fopen("pol.dat","r")) == NULL) {
printf("Nemoze da se otvori datotekata POL.DAT\n");
exit(1);
}
for (i = 0; !feof(pol); i++) fscanf(pol, "%f%f", &x[i], &y[i]);
printf("Plostina =%8.2f", ppol(x, y, i1));
}
4/9/2013
D. ^akmakov
KIP - 6
P=B+A...
pol.dat
0. 0.
0. 1.
1. 2.
1. 1.
1. 0.
Plostina =
1.25
29
Primeri
(6)
#include <stdio.h>
y
#include <math.h>
#include <stdlib.h>
1
float f(float x) {
return x*x;
2
}
x
float g(float x) {
return x*x*x;
}
main() {
float a, b, c, d, xarg, yarg, vred;
0
1
long i, n;
printf("Vnesi granici po x-oska: "); scanf("%f %f", &a, &b);
printf("Vnesi granici po y-oska: "); scanf("%f %f", &c, &d);
printf("Kolku simulacii: "); scanf("%ld", &n);
vred = 0;
for (i = 1; i <= n; i++) {
xarg = a + (b a) * rand()/32767; // rand() generira slucaen cel broj od
yarg = c + (d c) * rand()/32767; // [1,32767], a nam ni treba realen od [0,1]
if (yarg <= f(xarg) && yarg >= g(xarg)) vred++;
}
printf("Vrednosta na integralot e: %f", vred*(ba)*(dc)/n);
}
4/9/2013
D. ^akmakov
KIP - 6
30
So
4/9/2013
D. ^akmakov
KIP - 6
31
struct coord {
int x;
int y;
int z;
};
struct coord toc1, toc2;
struct MailMessage {
int ID;
int day; int month;
float time;
char *Sender;
char *Subject;
char *Text;
char *Attachements;
} Mailb;
4/9/2013
struct toc {
int xc;
int yc;
} ots[2];
Mailb.day = denes.den;
Mailb.month = denes.mesec;
ots[1].xc = toc1.x; ots[1].yc = toc1.y
ots[2].xc = toc1.y; ots[2].yc = toc1.z
D. ^akmakov
KIP - 6
32
Koristewe slogovi
(3)
4/9/2013
ili
kip.predmet.ocena
D. ^akmakov
KIP - 6
33
Koristewe slogovi
(4)
4/9/2013
D. ^akmakov
KIP - 6
34
Primeri
(1)
#include <stdio.h>
struct slog {
char PreIme[30]; char Pred[30];
struct {
int den, mes, god;
} Data;
int Oce;
};
char dime[15]; int n = 0; float procena = 0; // ime na datotekata; brojac na slogovi; i pros. ocena;
void polni(FILE *dpol) { // funkcija za polnenje na datotekata
struct slog Vlez; char tipka[1];
do {
printf("\nPrezime i ime: ");
scanf("%30s", Vlez.PreIme);
printf("\nPredmet: ");
scanf("%30s", Vlez.Pred);
printf("Data - den: ");
scanf("%d", &Vlez.Data.den);
printf("Data - mes: ");
scanf("%d", &Vlez.Data.mes);
printf("Data - god: ");
scanf("%d", &Vlez.Data.god);
printf("Ocena: ");
scanf("%d", &Vlez.Oce);
if (Vlez.Data.den > 31 || Vlez.Data.mes > 12 || Vlez.Data.god > 2004 || Vlez.Oce > 10) {
printf("Pogresen podatok. Slogot ne e vnesen vo datotekata !\n");
continue;
}
fprintf(dpol, "%s %s %d %d %d %d\n", Vlez.PreIme, Vlez.Pred,
Vlez.Data.den, Vlez.Data.mes, Vlez.Data.god, Vlez.Oce);
printf("Vnesuvate uste? (Y/N) "); scanf("%1s", &tipka);
} while (strcmp(tipka, "N") != 0 && strcmp(tipka, "n") != 0);
}
4/9/2013
D. ^akmakov
KIP - 6
35
Primeri
(1)
V
Programirawe
vo C (III)
Rekurzija
4/9/2013
D. ^akmakov
KIP - 6
Stekovi (1)
Vrv
Vlez vo
stekot
Stek
Ufrluvawe
ili bri{ewe
...
Dno
D. ^akmakov
KIP - 6
Stekovi (2)
4/9/2013
D. ^akmakov
KIP - 6
Op{t rekurziven
algoritam so eden
rekurziven povik
4/9/2013
D. ^akmakov
KIP - 6
4/9/2013
D. ^akmakov
KIP - 6
Primeri (1)
Primer 1. Rekurzivna programa {to izdvojuva cifri od cel broj.
void cifri(int n) {
if (n >= 10) cifri(n/10);
printf (%d , n%10);
}
int main() {
int n;
printf(Cel broj: "); scanf("%d", &n);
cifri(n);
}
1%10 = 1
13
13
13%10 = 3
138
138
138
138%10 = 8
1380
1380
1380
1380
1380%10 = 0
13806
13806
13806
13806
13806
prv povik
vtor povik
n = 13806
4/9/2013
13806%10 = 6
D. ^akmakov
KIP - 6
Primeri (2)
Primer 2. Rekurzivna programa {to presmetuva n! za cel broj n.
Rekurzivna definicija: f(0) = 1; f(k) = k*f(k-1)
long f(int n) {
if (n >= 2) return n*f(n-1);
else return 1;
}
int main() {
int k;
printf("Broj: "); scanf("%d", &k);
printf("Fak = %ld\n", f(k));
}
4/9/2013
D. ^akmakov
KIP - 6
Primeri (3)
Primer 3. Rekurzivna programa za nao|awe NZD za dva celi broja i glavna
programa {to so pomo{ na potprogramata nao|a NZD za k
broevi.
Rekurzivna definicija: f(n, 0) = n; f(n, m) = f(m, n%m)
int nzd(int n, int m) {
if (m != 0) return nzd(m, n%m);
else return n;
}
int main() {
int i, y, k, x[100];
printf(Kolku broevi: "); scanf("%d", &k);
printf("Vnesi gi broevite:\n");
for (i=1; i<=k; i++) scanf("%d", &x[i]);
y = x[1];
for (i=2; i<=k; i++) y = nzd(y, x[i]);
printf("NZD = %d", y);
}
4/9/2013
D. ^akmakov
16
28
28 0
28
16
16 0
16
12
12 0
12
40
0=0
return 4
KIP - 6
Primeri (4)
Primer 4. Rekurzivna programa za broevite na Fibona~i.
long fib(int n) {
if (n >= 2) return fib(n-1) + fib(n-2);
else return n;
}
main() {
int k;
printf(Koj broj na Fibonaci: ");
scanf("%d", &k);
printf(%d-tiot broj na Fibonaci e %ld", k, fib(k));
}
5
4
3
2
1
2
1
1
0
0
4/9/2013
D. ^akmakov
KIP - 6
n povikuvawa na fib()
0
1
1
1
2
3
3
5
4
9
5
15
6
25
7
41
8
67
9
109
10
177
10
Primeri (5)
Primer 5. Rekurzivna programa za presmetka na sumi.
float x[1000];
float sum(int d, int g) {
int sred;
if (d > g) return 0;
else if (d == g) return x[d];
else sred = (d + g)/2;
return sum(d, sred) + sum(sred + 1, g);
}
Kolku elementi: 10
Od koj do koj indeks ja sakas sumata:
39
Sumata e 84.000000
int main() {
int i, k, poc, kraj;
printf("Kolku elementi: "); scanf("%d", &k);
for(i=0; i<=k; i++) x[i] = 2*i;
printf("Od koj do koj indeks ja sakas sumata:\n"); scanf("%d%d",&poc, &kraj);
if (poc>=0 && kraj<=k) printf("Sumata e %f\n", sum(poc,kraj));
else printf("Pogresen opseg!\n");
}
4/9/2013
D. ^akmakov
KIP - 6
11
Primeri (6)
Primer 6. Rekurzivna programa za problemot na Hanojskite stolp~iwa.
Imame 3 stolba A, B i C, pri {to na stolbot A ima n prsteni so razli~na golemina (radius) naredeni eden nad drug od najgolemiot do najmaliot. Problemot e da se prefrlat prstenite na stolbot C, koristej}i go
stolbot B, pri {to e dozvoleno stavawe samo pomal prsten vrz
pogolem.
void prem(int n, char s1, char s2, char s3) {
if (n > 0) {
prem(n-1, s1, s3, s2);
printf(Od stolb: %c, na stolb: %c\n,s1 s3);
prem(n-1, s2, s1, s3);
}
}
A
n-1
n
4/9/2013
D. ^akmakov
int main() {
int k;
printf(Kolku prsteni: ");
scanf("%d", &k);
prem(k,A,B,C);
}
Kolku prsteni: 3
Od stolb: A na stolb: C
Od stolb: A na stolb: B
Od stolb: C na stolb: B
Od stolb: A na stolb: C
Od stolb: B na stolb: A
Od stolb: B na stolb: C
Od stolb: A na stolb: C
KIP - 6
12
Primeri* (7)
Primer 7. Rekurzivna programa za binarno barawe element vo niza.
int count = 0;
int bs(int y, int d, int g, int x[], int *poz) {
int sred;
count++;
Koj element baras: 122
if (g < d) return 1;
Elementot 122 e najden na 61-ta pozicija.
sred = (d + g)/2;
Imavme 17 povika do bs().
if (y == x[sred]) { *poz = sred; return 0; }
else if (y < x[sred]) return bs(y, d, sred-1, x, poz);
else return bs(y, sred+1, g, x, poz);
Koj element baras: 13
}
Elementot 13 ne e vo nizata!
int main() {
Imavme 18 povika do bs().
int i, poz, y, x[SIZE], status;
for (i=0; i<1000; i++) x[i] = 2*i;
printf("\nKoj element baras: "); scanf("%d", &y);
status = bs(y, 0, SIZE-1, x, &poz);
if (status == 0) printf("Elementot %d najden na %d-tata pozicija \n", y, poz);
else printf("Elementot %d ne e vo nizata!\n\n", y);
printf("Imavme %d povika do bs().\n\n", count);
}
4/9/2013
D. ^akmakov
KIP - 6
13
Primeri* (8)
Primer 7. Rekurzivna programa za najkus pat vo lavirint.
po~etna
lokacija
celna
lokacija
4/9/2013
D. ^akmakov
KIP - 6
14
Primeri* (8)
Primer 7. Rekurzivna programa za najkus pat vo lavirint.
5
int l[100][100], p, q, lpat, mlpat;
0 0 0 0 1
void pat(int i, int j) {
if (i==p && j==q) { if (lpat<mlpat) mlpat = lpat; }
1 1 0 0 1
else if (l[i][j]==0) {
0 0 0 1 0
lpat ++; l[i][j] = 9; // Patekata se polni so 9-ki
0 0 1 1 0
pat(i+1, j); pat(i-1, j); pat(i, j+1); pat(i, j-1);
1 0 0 0 0
lpat--; l[i][j] = 0; // Patekata se vraca na pocetno
3 1
}
Ima pateka so dolzina 6.
}
int main() {
FILE *lav; int i, j, n;
if ((lav=fopen("l.txt","r+"))==NULL) { printf("Ja nema datotekata l.txt !!!\n"); exit(1); }
fscanf(lav,"%d",&n); for(i=1; i<=n; i++) for(j=1; j<=n; j++) fscanf(lav,"%d", &l[i][j]);
fscanf(lav,"%d %d", &p, &q);
for (i=1; i<=n; i++) {
l[i][0] = 1; l[i][n+1] = 1; l[0][i] = 1; l[n+1][i] = 1; // Ramka od 1-ci okolu lavirintot
}
lpat = 0; mlpat = n*n +1; pat(1,1); // Ja povikuvame rekurzivnata funkcija pat()
if (mlpat==n*n +1) printf("\nNema pateka od (1,1) do (%d,%d).\n",p,q);
else printf("\nIma pateka so dolzina %d.\n", mlpat);
}
4/9/2013
D. ^akmakov
KIP - 6
15
Soveti za programirawe
Minimalno vreme na izvr{uvawe
Razbirlivost i ~itlivost
Koristewe na minimalen memoriski prostor
Minimalno vreme na preveduvawe
(1)
najva`no
pomalku
va`no
D. ^akmakov
KIP - 6
16
Soveti za programirawe
(2)
int i;
podobro e
int i;
i = i + 1.0
i=i+1
Koristi pobrzi aritmeti~ki izrazi
y = pow(x,2);
podobro e
y = x*x;
a = 2.0*b
podobro e
a = b + b;
s = v/100;
podobro e
s = v*0.01;
Koga e mo`no koristi konstanti vo izrazite
Fragment od programa
a = a*(3.14/180) *4. b
.
.
.
b = c*(3.14/180)*4. z
4/9/2013
Podobro re{enie
x = (3.14/180.)*4.
.
.
.
a = a*x b
b = c*x z
D. ^akmakov
Najdobro re{enie
#define x = (3.14/180.)*4.
.
.
.
a = a*x b
b = c*x z
KIP - 6
17
Soveti za programirawe
(3)
x = log(y*z);
x = y*y*y;
a = min(x,y,3.0)-5;
b = min(x,y,3.0);
podobro e
am = min(x,y,3.0);
a = am - 5;
b = am + 4;
Koga e mo`no kombiniraj gi naredbite za povtoruvawe
for (i=1; i<=n; i++) sx = sx + x[i]; podobro e for (i=1; i<=n; i++) { sx = sx + x[i];
for (i=1; i<=n; i++) sy = sy + y[i];
sy = sy + y[i]; }
Izbegnuvaj gi kratkite povtoruva~ki konstrukcii
x[1] = y[1]*z[1];
for (i=1; i<=3; i++) x[i] = y[i]*z[i]; podobro e x[2] = y[2]*z[2];
x[3] = y[3]*z[3];
Koristi minimalen broj operacii vo povtoruva~kite konstrukcii
sum = 0.
for (i=1; i<=n; i++)
podobro e
sum = sum + v*v + a[i];
4/9/2013
D. ^akmakov
sum = 0.
for (i=1; i<=n; i++)
sum = sum + v*v + a[i];
sum = sum + n*v*v;
KIP - 6
18
Soveti za programirawe
Koristi efikasni
(4)
if naredbi
if (n < 100 || m > 50) ; (vtoriot uslov ne se proveruva ako prviot e to~en)
Slednata if naredba e efikasna ako {ansite n da bide pomal od 100 se pomali od
{ansite m da bide pogolem od 50:
if (n < 100 && m > 50) ; (vtoriot uslov ne se proveruva ako prviot e neto~en)
podobro e
D. ^akmakov
19