Binder1 PDF
Binder1 PDF
Binder1 PDF
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 na-
soka za pi{uvawe aplikacii pod Windows operativni sistemi
(na primer Visual C), zaedno so negovata vrzanost za operativ-
nite 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.
main ( n, v ) {
deklaracii
prosti podatoci strukturni podatoci poka`uva~i objekti
izvr{ni naredbi
decimalni indeksni
} celobrojni tekstualni
znakovni slogovi
datoteki
Primer:
int n; float x, y; char t[4];
⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
printf ("%2d %7.4f %7.4e%s", n, x, y, t);
a1 a2 a3 . . . an-1 an
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]);
}
vo memorijata }e imame:
l c c - w i n 3 2 \0
108 99 99 45 119 105 110 51 50 0
int main() {
char prv[15], vtor[15], *z1, *z2; Zbor 1: Pero
printf("Zbor 1: "); scanf("%s", prv); Zbor 2: Petre
printf("Zbor 2: "); scanf("%s", vtor); Zborovite se razlikuvaat (simbolite r i t).
z1 = prv; z2 = vtor;
for(; *z1==*z2; z1++, z2++)
if(*z1=='\0') { printf("Zborovite se isti.\n"); exit(1); }
printf("Zborovite se razlikuvaat (simbolite %c i %c).\n", *z1, *z2);
}
Po~etok Kraj
Tekovna pozicijata
Rabotata so datoteki e edna od najva`nite mo`nosti vgradena vo pro-
gramskite 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; na primer: FILE *pod, *ff;
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);
#include <stdio.h>
int main(int argc, char *argv[]) {
int c, count=0;
FILE *infile;
if (argc < 2) {
printf("Koristi: ime <datoteka >\n"); exit(1);
}
if ((infile = fopen(argv[1],"r"))==NULL) {
printf("Ja nema datotekata %s !\n",argv[1]); exit(1);
} Ako programata se narekuva
c = fgetc(infile); pr2.c, a izvr{nata programa
while (c != EOF) { pr2.exe, toga{:
count++;
c = fgetc(infile); C:\LCPP\KIP\LCC> pr2 pr2.c
} Brojot na simboli e 492.
printf("Brojot na simboli e %d.\n",count); go dava brojot na simboli vo
} na{ata programa.
4/9/2013 D. ^akmakov KIP - 6 7
Primeri (3)
Primer 2. Da se pronajde zborot so najgolema dol`ina vo tekstot
zapi{an vo datotekata pismo.txt.
#include <stdio.h>
#include <string.h>
int main() {
FILE *txt; int l, ml; char s, zbor[20], mzbor[20];
If ( (txt = fopen("pismo.txt","r+")) == NULL)
{ printf("Ne moze da se otvori datotekata PISMO.TXT !\n");
exit(); }
l = ml = 0;
s = getc(txt); // ili fscanf(txt, "%c", &s);
while ( !feof(txt) ) {
if (s==' ' || s==',' || s=='.' || s==';' || s=='!' || s=='?' || s==':' || s=='\n') {
zbor[l] = '\0'; // simbol za kraj na zbor
if (ml < l) { ml = l; strcpy(mzbor, zbor); }
printf("%d ", l); l = 0;
} else { zbor[l] = s; l++; }
s = getc(txt);
}
fprintf(txt, "Najdolgiot zbor e '%s' so %d simboli.", mzbor, ml);
}
4/9/2013 D. ^akmakov KIP - 6 8
Primeri (3)
pismo.txt
Hi Younes,
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
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)
};
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 !!! "); mat.dat
exit (1); }
4
fscanf (mat, "%d", &n);
for (i=1; i<=n; i++) 1. 2.1 0.5 6.44
for (j=1; j<=n; j++) scanf(mat, "%f", &a[i][j]); 2.0 4.90 3.1 -12.80
sg = ss = sddr = 0; 3.3 -6.2 10.0 5
for (i=1; i<=n; i++) { sg = sg + a[i][i]; .20 2.2 20.5 8.80
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]; Sumite se:
printf ("Sumite se:\nsg = %12.2f\nss = %12.2f sg = 24.70
\nsddtr = %12.2f\", sg, ss, sddtr); ss = 3.45
} sddtr = 33.7
4/9/2013 D. ^akmakov KIP - 6 15
Primeri (2)
Primer 2. Dadena e matrica A(m×n). Da se sostavi nova matrica B(m×n)
dobiena taka {to od sekoja kolona na matricata A se odzeme najmaliot
element vo kolonata.
#include <stdio.h>
int main () {
FILE *mm; int m, n, i, j; float a[100][100], b[100][100], min;
if ((mat = fopen("mat.dat", "r")) == NULL) { mat.dat
printf ("Ne moze da se otvori datotekata mat.dat !!!\n");
exit (1); }
34
fscanf (mm, "%d%d", &m, &n); 1. 2.1 0.5 6.44
for (i=1; i<=m; i++) 2.0 4.90 3.1 -12.80
for (j=1; j<=n; j++) scanf(mm, "%f", &a[i][j]); 3.3 -6.2 10.0 5
for (i=1; i<=n; i++) {
min = a[1][i]; 0.00 8.30 0.00 19.24
for (j=1; j<=m; j++) if (a[j][i] < min) min = a[j][i]; 1.00 11.10 2.60 0.00
for (j=1; j<=m; j++) b[j][i] = a[j][i] - min; 2.30 0.00 9.50 17.80
}
for (i=1; i<=m; i++) {
for (j=1; j<=n; j++) fprintf(mm, "%6.2f", a[i][j]); printf("\n");
}
}
4/9/2013 D. ^akmakov KIP - 6 16
Primeri (3)
Primer 3. Vo dadena matrica A(m×n) da se zameni sekoj element so sumata
na negovite dijagonalni sosedi (ako gi ima).
mat.dat
#include <stdio.h> 34
int main () {
FILE *mat; int m, n, i, j; float a[100][100] ; 1. 2.1 0.5 6.4
if ((mat = fopen("mat.dat", "r")) == NULL) { 2.0 4.90 3.1 2.80
printf ("Ne moze da se otvori datotekata mat.dat !!!\n"); 1.0 -6.2 10.0 5
exit (1); }
Novata matrica e:
fscanf (mat, "%d%d", &m, &n);
for (i=1; i<=m; i++) 1.00 2.10 0.50 6.40
for (j=1; j<=n; j++) scanf(mat, "%f", &a[i][j]); 2.00 12.50 7.30 2.80
for (i=2; i<=m-1; i++) 1.00 -6.20 10.00 5.00
for (j=2; j<=n-1; j++)
a[i][j] = a[i-1][j-1] + a[i-1][j+1] + a[i+1][j-1] + a[i+1][j+1];
fprintf (mat, "Novata matrica e:\n");
for (i=1; i<=m; i++) {
for (j=1; j<=n; j++) fprintf(mat, "%6.2f", a[i][j]); printf("\n");
}
#include <stdio.h>
int main () { mat.dat
FILE *mm; int m, n, i, j, k; float a[100][100], x[8000], min;
34
if ((mat = fopen("mat.dat", "r")) == NULL) {
printf ("Ne moze da se otvori datotekata mat.dat !!!\n"); 1. 2.1 0.5 6.44
exit (1); } 2.0 4.90 3.1 -12.80
fscanf (mm, "%d%d", &m, &n); 3.3 -6.2 10.0 5
for (i=1; i<=m; i++)
for (j=1; j<=n; j++) scanf(mm, "%f", &a[i][j]);
a[0][n] = -99999999999999.; k = 0; 0.50 2.00 3.10 -12.
for (i=1; i<=m; i++) 80 -6.20 5.00
for (j=1; j<=n; j++) if (j == 1) {
if (a[i][j] < a[i-1][n]) x[++k] = a[i][j];
} else if (a[i][j] < a[i][j-1]) x[++k] = a[i][j];
for (i=1; i<=k; i++) printf("%8.2f ", x[i]);
}
4/9/2013 D. ^akmakov KIP - 6 18
Potprogrami i funkcii (1)
t ip ime( a1 , a 2 ,, a n )
t ip ime( t ip1 a1, t ip2 a2 , , t ipn a n ) { deklaracii na a1 , a 2 ,, a n
{
izvr{ni naredbi ili
izvr{ni naredbi
}
}
Zna~i, deklariraweto na promenlivite {to se prenesuvaat vo, ili od fun-
kcijata 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.
int x , y , z;
f 1() {
float a , b, x;
oblast na va`nost
na a, b, x
}
char a , u; oblast na va`nost
f 2() { na x, y, z
oblast na va`nost
} na a, u
main() {
}
Rekurzija:
main() {
int nzd(int n, int m) { int a, b;
if (m != 0) return nzd(m, n−(n/m)*m); printf("Prv broj: "); scanf("%d", &a);
else return n; printf("Vtor broj: "); scanf("%d", &b);
} printf("NZD = %d", nzd(a,b));
}
float sum(int n) {
int i, znak = -1; float s = 0., f = 2.;
for (i = 1; i <= n; i++) {
f = f*(i+2);
znak = -znak;
s = s + znak*(3*i+1)/f;
}
return s;
}
int main () {
int n; float suma;
printf ("Kolku clena: "); scanf("%d", &n);
printf ("Sumata e %15.7f", sum(n));
}
#include <math.h>
int main () {
int n; float x[1000], y[1000], agol, an, bn;
printf ("Dimenzija na vektorite: "); scanf("%d", &n);
printf ("Koordinati na prviot vektor:\n"); for (i=1; i<=n; i++) scanf("%f", &x[i]);
printf ("Koordinati na vtoriot vektor:\n"); for (i=1; i<=n; i++) scanf("%f", &y[i]);
agol = acos( skp(n, x, y)/sqrt(skp(n, x, x)*skp(n, y, y)) );
printf ("Agolot megu vektorite e %8.2f stepeni.", agol*PI/180.);
}
#include <stdio.h> y
#define D 100 P P=−B+A...
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; 0 1 2 3 4 5 6 7 x
}
main () {
FILE *pol; pol.dat
int i;
float x[D], y[D]; 0. 0.
if ((pol=fopen("pol.dat","r")) == NULL) { 0. 1.
printf("Nemoze da se otvori datotekata POL.DAT\n"); 1. 2.
exit(1);
} 1. 1.
for (i = 0; !feof(pol); i++) fscanf(pol, "%f%f", &x[i], &y[i]); 1. 0.
printf("Plostina =%8.2f", ppol(x, y, i−1)); Plostina = 1.25
}
4/9/2013 D. ^akmakov KIP - 6 29
Primeri (6)
Primer 6. Programa {to presmetuva pribli`na vrednost na opredelen
integral (plo{tina) po metodot Monte Karlo.
#include <stdio.h> y
#include <math.h>
#include <stdlib.h> 1
float f(float x) {
return x*x; 2
} x
float g(float x) {
3
return x*x*x; x
}
main() {
float a, b, c, d, xarg, yarg, vred;
long i, n; 0 1 x
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*(b−a)*(d−c)/n);
}
4/9/2013 D. ^akmakov KIP - 6 30
Koristewe slogovi (1)
• Kako i vo drugite programski jazici, slogovite vo C se komplek-
sen tip na podatoci sostaveni od pove}e razli~ni prosti ili
kompleksni tipovi na podatoci.
Na primer, slog datum sostaven od promenlivite den, mesec i
godina mo`e da se deklarira na sledniov na~in:
...
Ufrluvawe
ili bri{ewe
Stek
Dno
1 1%10 = 1
n = 13806
13 13 13%10 = 3
138 138 138 138%10 = 8
1380 1380 1380 1380 1380%10 = 0
13806 13806 13806 13806 13806 13806%10 = 6
prv povik vtor povik tret povik ~etvrti povik petti povik
long f(int n) {
if (n >= 2) return n*f(n-1); [to bi se slu~ilo ako ako go
else return 1; ispu{time else blokot vo
} naredbata if?
int main() {
int k;
printf("Broj: "); scanf("%d", &k);
printf("Fak = %ld\n", f(k));
}
1 0 0 0 0 0 1
po~etna
lokacija 1 1 0 1 1 0 1
1 0 0 0 1 0 1
celna
1 0 1 0 0 1 1
lokacija
1 0 0 1 0 1 1
1 1 1 1 1