Professional Documents
Culture Documents
Програмирање је вештина у којој програмер у програмском језику прави (ствара, пише, креира)
програм извршив на рачунару, за задовољење потреба корисника. Програмирање је претежно
концептуална вештина.
Виши програмски језик (по структурураним типовима података и управљачким структурама), али са
особинама машински зависних програмских језика (по манипулацији битовима, коришћењу
процесорских регистара, приступу подацима помоћу адресе и хардверски оријентисаним операторима)
Императивни језик
Модуларни језик
Блок-структурни језик
Необјектни језик
Скуп знакова (character set) – мала и велика слова енглеске абецеде (a – z, A – Z), десет декадних
цифара (0 - 9), двадесет девет знаковa интерпункције: ! " # % & ' * ( ) + - / : ; ^ < > ~ , ? = [ ] _ { . \ | }
Диграфи:
Триграфи:
Диграф Еквивалент Триграф Еквивалент
<: [ ??( [
:> ] ??) ]
<% { ??< {
%> } ??> }
%: # ??= #
%:%: ## ??/ \
??! |
??' ^
??- ~
Лексички симбол = лексема = токен (token) – недељиви низ знакова, најмања програмска семантичка
јединица. Лексеме се деле на: идентификаторе, константе, резервисане речи, операторе и сепараторе
Бели знакови (white spaces) – размак, хоризонтална табулација, вертикална табулација, нови ред, нова
страна
Коментари (comments) –
Вишередни или блок коментар: /* */
Једноредни коментар: //
Идентификатори могу да се састоје од слова, цифара и доње црте (_). Први знак не сме да буде цифра
Прави се разлика између великих и малих слова: procenat ≠ Procenat ≠ PROCENAT
Идентификатор може бити произвољне дужине, али се најмање првих 31 знакова користи за
идентификацију
Функција (function) – основни градивни елемент програмског језика Ц; састоји се из секвенце исказа;
унутар функције се наредбе (тј. извршни искази) могу груписати у блокове (blocks)
Две врсте функција:
Начин укључивања *.h датотеке у изворни код остварује се употребом директиве #include
Укључивање *.h датотеке из системског
includе-директоријума:
#include <stdio.h>
Укључивање *.h датотеке из текућег директоријума:
#include "P02_krug.h"
Изворна датотека на језику Ц, заједно са свим датотекама заглавља које садржи, сачињава јединицу за
превођење (translation unit). Преводилац (compiler) преводи њен садржај секвенцијално, разлажући
изворни код на лексеме (токене)
Област важења (scope) идентификатора – део јединице за превођење у којем идентификатор има
значење. Другим речима, то је онај део програма у којем је идентификатор доступан („видљив“)
Врсту области важења увек одређује место на којем се идентификатор декларише.
Напомена: Изузетак су лабеле, јер је њихова област важења увек функција
Типови података у ПЈ Ц
Логички аспект: Формално, тип података је алгебарска структура и одређује се као:
(непразан) скуп вредности /домен/,
(непразан) скуп операција над датим скупом вредности /интерфејс/ и
(могуће празан) скуп константи.
ТИП ПОДАТАКА = СВ + СО + СК
Физички аспект: Maтеријално, тип података је одређен меморијском репрезентацијом:
величином меморије неопходном за меморисање вредности типа, исказана у By
начин кодирања вредности типа
На пример, скуп целих означених бројева int (синоними: signed, signed int) има:
Домен: [-2.147.483.648, 2.147.483.647]
Операторe: +, -, /, %, * итд.
Константе: INT_MIN и INT_MAX
Величину: 4 By
Типови података у ПЈ Ц
У ПЈ Ц, појам објекат означава место у меморији чији садржај може да представља вредност.
Објекти који имају имена називају се променљиве (variables)
Објекти који имају имена и додељену вредност која се не може мењати називају се константе
(constants)
Тип објекта одређује колико простора објекат заузима у меморији и како се кодирају његове могуће
вредности.
На пример, исти низ битова може представљати потпуно различите целе бројеве, зависно од тога да ли
се тумачи као означена (signed) или неозначена (unsigned) вредност
ПЈ Ц познаје само нумеричке типове података
Константе (у limits.h):
SHRT_MAX, INT_MAX, LONG_MAX, LLONG_MAX
Константе:
CHAR_MAX, SCHAR_MAX, UCHAR_MAX
CHAR_MIN, SCHAR_MIN
sizeof(unsigned char) = sizeof(char)
= sizeof(signed char)
Константе:
LLONG_MAX, ULLONG_MAX
LLONG_MIN
sizeof(unsigned long long) = sizeof(signed long long)
Три врсте:
float _Complex
double _Complex
long double _Complex
Пример:
#include <complex.h>
double complex cmpx = 2.1 + 3.2 * I;
Набројиви тип или енумерација (enumeration, enumerated type) je целобројни тип који програмер сам
дефинише у програму:
Врло посебан тип. Зашто? Зато што нема познатих вредности тог типа. Зато се не може
декларисати променљива или констатна овога типа
Где се може користити тип void:
1)У декларацији функција:
void * podatak;
void *malloc(size_t size);
void free(void *ptr);
Литерали
Литерал је лексема која означава непроменљиву вредност. Та вредност може бити број, знак или ниска
(низ знакова, знаковни низ). Тип литерала одређен је његовом вредношћу и начином записа
Разликују се:
Целобројни литерали:
Декадни,
Октални и
Хексадекадни.
Реални литерали:
Декадни и
Хексадекадни
Знаковни литерали:
ANSI (једнобајтни),
Вишебајтни и
Управљачки знаци
Ниске (стринг) литерали (литерали типа знаковних низова)
Целобројни литерали
Реални литерали
Знаковни литерали
Знаковни литерали се састоје од једног или више знакова под једноструким наводницима. На пример:
's', 'ASA', '9', '*', '=====', …
Изузетак у начину приказивању су знакови:
Апостроф '\'' је '
Обрнута коса црта '\\' је \
Управљачки знак за нови ред '\n' је нови ред
По величини, тј. по броју бајтова, постоје:
ANSI (једнобајтни) знакови и
Вишебајтни знакови
Знаковни литерали
Ниске (стрингови) литерали или литерали типа знаковних низова су низови знакова под наводницима.
На пример: "Volim programiranje!\n"
Вишередни текст:
#include <stdio.h>
#define PI 3.1415926536
void IzracunajPovrsinu(void);
void IzracunajObim(void);
void PrikazZaglavlja(void);
void PrikazRezultata(void);
int main(void)
{
printf(">>> P02_05_krug.c <<<\n\n");
IzracunajPovrsinu();
IzracunajObim();
PrikazZaglavlja();
PrikazRezultata();
return 0;
}//////////////////////////////////////////////////////////
double PovKruga(double pp) {
double pov;
pov = pp * pp * PI;
return pov;
}
void IzracunajPovrsinu(void) {
int i;
for (i = 0; i<=4; i = i+1)
pv[i] = PovKruga(pp[i]);
}
//////////////////////////////////////////////////////////
void IzracunajObim(void) {
for (int i = 0; i<=4; i++)
ob[i] = ObKruga(pp[i]);
}
//////////////////////////////////////////////////////////
void PrikazZaglavlja(void) {
printf(" POVRSINE I OBIMI KRUGOVA\n\n");
printf(" Poluprecnik Povrsina Obim\n"
"===================================\n");
}
void PrikazRezultata(void) {
for (int i = 0; i<=4; i++)
printf("%12.1lf %12.3lf %8.3lf\n", pp[i], pv[i], ob[i]);
}
/*
** PROJEKAT : Osnove programiranja u programskom jeziku C
** DATOTEKA : P02_04_krug.c
** OPIS : Napisati program u programskom jeziku C koji na standardnom izlaznom uredjaju
** prikazuje površine i obime krugova ciji su poluprecnici zadati (11.1, 12.2, 13.3, 14.4, 15.5)
** upotrebom funkcija, funkcijskih prototipova i pomocnih funkcija za izracunavanje povrsine i obima.
** DATUM : 26.02.2016.
** AUTOR : S.D.L.
** PROMENE :
** xx.xx.xxxx. - <opis promene> (<programer>)
**
** Copyright (C) FON-LSI, 2016.
*/
#include <stdio.h>
#define PI 3.1415926536
double pp1 = 11.1, pp2 = 12.2, pp3 = 13.3, pp4 = 14.4, pp5 = 15.5;
double pv1, pv2, pv3, pv4, pv5,
ob1, ob2, ob3, ob4, ob5;
void IzracunajPovrsinu(void);
void IzracunajObim(void);
void PrikazZaglavlja(void);
void PrikazRezultata(void);
int main(void)
{
printf(">>> P02_04_krug.c <<<\n\n");
IzracunajPovrsinu();
IzracunajObim();
PrikazZaglavlja();
PrikazRezultata();
return 0;
}
//////////////////////////////////////////////////////////
double PovKruga(double pp) {
double pov;
pov = pp * pp * PI;
return pov;
}
void IzracunajPovrsinu(void) {
pv1 = PovKruga(pp1);
pv2 = PovKruga(pp2);
pv3 = PovKruga(pp3);
pv4 = PovKruga(pp4);
pv5 = PovKruga(pp5);
}
//////////////////////////////////////////////////////////
void PrikazZaglavlja(void) {
printf(" POVRSINE I OBIMI KRUGOVA\n\n");
printf(" Poluprecnik Povrsina Obim\n"
"===================================\n");
}
void PrikazRezultata(void) {
printf("%12.1lf %12.3lf %8.3lf\n", pp1, pv1, ob1);
printf("%12.1lf %12.3lf %8.3lf\n", pp2, pv2, ob2);
printf("%12.1lf %12.3lf %8.3lf\n", pp3, pv3, ob3);
printf("%12.1lf %12.3lf %8.3lf\n", pp4, pv4, ob4);
printf("%12.1lf %12.3lf %8.3lf\n", pp5, pv5, ob5);
}
Ако је наредба позив функције, а резултат функције није потребан, онда се он (резултат) може експлицитно одбацити на
следећи начин:
char ime[31];
(void) strcpy(ime, "Pavle");
Наредба се може састојати само од тачке-зареза; тада се она назива празна наредба (null statement). Hа пример, тело for-
циклуса може да буде празна наредба:
Блок
Сложена наредба (compound statement) или блок (block) представља низ који се састоји од више наредби и/или
декларација који су смештени између великих (витичастих) заграда, тако да чине једну наредбу:
Избор: IF наредба
switch ( <izraz> ) {
case <konstantna_vrednost_1>:
<naredba_1>
break;
case <konstantna_vrednost_2>:
<naredba_2>
break;
...
[ default:
<naredba_n> ]
}
Семантика: Израз <izraz> је целобројног типа и израчунава се једном. Затим се добијена вредност израза проверава са
константним вредностима у лабелама case. Ако се вредност израза подудара са неким од константних вредности лабела,
ток програма се премешта на наредбу која следи иза лабеле case. Уколико се не подудара ни са једним од наведених
константних вредности, програм наставља да се извршава од лабеле default (уколико постоји).
Наредба понављања (iteration statement) омогућава вишестуко извршавање наредбе. Hаредба може бити проста или
сложена
У ПЈ Ц постоје три наредбе понављања:
while наредба
for наредба и
do-while наредба
Пример: Сумирати првих десет природних бројева.
int suma = 0, i = 1;
while (i <= 10)
{
suma = suma + i;
i = i + 1;
}
Постављање почетних вредности
Услов циклуса: контролна променљива Обрада података
Модификација контролне променљиве
Почетак и крај тела циклуса
Показивач и показано
int i = 22, j;
int * pok;
pok = &i;
j = *pok;
*pok = 33;
pok – показивач
*pok – показано, оно на шта показује показивач
& – оператор референцирања
* – оператор дереференцирања
Дефинисање низова
Низ (array) је колекција података; садржи податке истога типа који се чувају у суседним меморијским локацијама. Ти
подаци се називају елементи низа.
Капацитет (димензија) низа = максималан број елемената које низ може да садржи
Елементи низа могу бити било ког типа, сем непотпуног типа.
for (int * pok = niz, i = 0; pok < (niz + DIM); ++pok, ++i)
*pok = 2 * i + 10;
niz + i ::= адресa елемента са индексом i (тј. &niz[i])
*(niz + i) ::= вредност елемента са индексом i (тј. niz[i])
Ниске
Ниска = низ знакова = знаковни низ = стринг (string)
Ниска је:
непрекидна секвенца знакова која се завршава NULL знаком
ИЛИ
низ чији су елементи типа char и последњи елемент има вредност ‘\0‘
NULL знак = ‘\0‘
Дужина ниске = број знакова, не рачунајући завршни NULL знак
Ниска не постоји као посебан тип у Ц-у, па је зато ниједан оператор не прихвата као операнд
Када се као аргумент функције појави име низа, преводилац га имплицитно конвертује у показивач на
први елемент низа. То значи да је параметар ф-је увек показивач на исити тип, као и тип елемента низа
На пример:
void prikazi(int niz[ ], int brElem);
биће конвертовано у:
void prikazi(int * niz, int brElem);
Савет: предност дефинисања параметара помоћу средњих заграда (тј. оператора адресирања) је у томе
што је тако очигледно да ф-ја аргументе третира као показиваче на низ, а не само на појединачну
променљиву која је типа елемента низа (int у примеру). Постоје и друге предности.
Низ низова
Вишедимензиони низ (multidimensional array) је низ чији су елементи такође низови.
Приликом декларисања вишедимензионог низа, сваки пар средњих заграда означава једну димензију
низа.
Декларисање вишедимензионих низова
Низ 3DNiz састоји се од три елемента; сваки од њих је 2Д низ који се састоји од 10 1Д низова са по пет
целобројних вредности.
У низу 3DNiz има 3 х 10 х 5 = 150 елемената. Први елемент је 3DNiz[0][0][0], а последњи елемент је
3DNiz[2][9][4].
Пошто се свим елементима без иницијализатора додељује подразумевана вредност нула, наредна
иницијализација има исти ефекат као и претходна:
Матрице
Дводимензиони низ се назива матрица (matrix). Често се користи. Елементи матрице распоређени су у
редове (rows) и колоне (columns). На пример, матрица од три реда и пет колона:
int matrica[3][5];
Три елемента matrica[0], matrica[1] и matrica[2] су редови матрице matrica. Сваки ред представља низ
од пет елемената типа int.
Вредности наведени у примеру могу се доделити елементима матрице применом угнежђеног циклуса.
Индекс у првом циклусу означава ред матрице, а у другом циклусу колону матрице:
for (int red = 0; red < 3; ++red)
for (int kol = 0; kol < 5; ++ kol)
matrica[red][kol] = red + kol + 10;
Три елемента matrica[0], matrica[1] и matrica[2] се смештају на суседним меморијским локацијама.
Табеларна форма матрице се пресликава у линеарни меморијски простор. Пошто се развој обавља по
редовима, у мемориј ће се распоред елемената обавити на следећи начин: слика
*Развој по редовима значи да се прво смештају елементи првог реда (тј. првог низа), па потом другог
реда (тј. другог низа) и на крају трећег реда матрице (тј. трећег низa)
Низ низова
Приликом декларисања вишедимензионог низа, сваки пар средњих заграда означава једну димензију
низа.
Низ 3DNiz састоји се од три елемента; сваки од њих је 2Д низ који се састоји од 10 1Д низова са по
пет целобројних вредности.
У низу 3DNiz има 3 х 10 х 5 = 150 елемената. Први елемент је 3DNiz[0][0][0], а последњи елемент је
3DNiz[2][9][4].
Пошто се свим елементима без иницијализатора додељује подразумевана вредност нула, наредна
иницијализација има исти ефекат као и претходна: int n3d [ ][2][3] = { { { 1 }, { 4 } }, { { 7, 8 } } };
Овакав начин иницијализације има смисла када треба иницијализовати само неколико елемената
матрице вредностима другачијим од нуле.
Матрице
Дводимензиони низ се назива матрица (matrix). Често се користи. Елементи матрице распоређени су у
редове (rows) и колоне (columns). На пример, матрица од три реда и пет колона: int matrica[3][5];
Три елемента matrica[0], matrica[1] и matrica[2] су редови матрице matrica. Сваки ред представља низ
од пет елемената типа int.
Вредности наведени у примеру могу се доделити елементима матрице применом угнежђеног циклуса.
Индекс у првом циклусу означава ред матрице, а у другом циклусу колону матрице:
for (int red = 0; red < 3; ++red)
for (int kol = 0; kol < 5; ++ kol)
matrica[red][kol] = red + kol + 10;
Табеларна форма матрице се пресликава у линеарни меморијски простор. Пошто се развој обавља по
редовима, у мемориј ће се распоред елемената обавити на следећи начин:
OPIS : Obrazovana je grupa od pet studenata koji polazu tri predmeta u tekucem
** ispitnom roku. Na kraju ispitnog roka svi studenti su polozili sva tri ispita.
** Implementirati:
** 1) f-ju za unos ocena;
** 2) f-ju za prikaz ocena:
** a) prikaz po studentima
** b) prikaz po predmetima
** c) tabelaran prikaz
** 3) f-ju koja odredjuje prosecnu ocenu svih studenata
** (prolaz kroz matricu element po element)
** 4) f-ju koja odredjuje prosek za svakog studenta pojedinacno
** (prolaz kroz matricu po redovima /vrstama/)
** 5) f-ju koja odredjuje prosek za svaki predmet pojedinacno
** (prolaz kroz matricu po kolonama)
** Ocene su date u matrici: ocene[5][3]
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define STUD 5
#define PRED 3
#define AND &&
#define OR ||
// Tipovi podataka
typedef unsigned short int USHORT;
typedef int OCENE[STUD][PRED];
typedef float PR_OC_PO_STUD[STUD];
typedef float PR_OC_PO_PRED[PRED];
// Prototipovi f-ja
void UnesiOcene(OCENE);
bool OcenaIzvanOpsega(int);
void PrikaziOcenePoStudentima(OCENE);
void PrikaziOcenePoPredmetima(OCENE);
void PrikaziOceneTabelarno(OCENE);
float ProsecnaOcenaSvihStudenata(OCENE);
void ProsecnaOcenaPoStudentu(OCENE, PR_OC_PO_STUD);
void ProsecnaOcenaPoPredmetu(OCENE, PR_OC_PO_PRED);
void PrikaziProsecnaOcenaSvihStudenata(float);
void PrikaziProsecnaOcenaPoStudentu(PR_OC_PO_STUD);
void PrikaziProsecnaOcenaPoPredmetu(PR_OC_PO_STUD);
int main(void){
OCENE ocene;
UnesiOcene(ocene);
PrikaziOcenePoStudentima(ocene);
PrikaziOcenePoPredmetima(ocene);
PrikaziOceneTabelarno(ocene);
PR_OC_PO_STUD pr_oc_po_st;
ProsecnaOcenaPoStudentu(ocene, pr_oc_po_st);
PrikaziProsecnaOcenaPoStudentu(pr_oc_po_st);
PR_OC_PO_PRED pr_oc_po_pr;
ProsecnaOcenaPoPredmetu(ocene, pr_oc_po_pr);
PrikaziProsecnaOcenaPoPredmetu(pr_oc_po_pr);
return EXIT_SUCCESS;
}
int main(void){
int x = 10;
int * p = NULL;
p = &x;
*p = 20;
x = 30;
//====================================================================
x = 10;
p = NULL;
printf("Adresa promenljive x je: &x = %p \n", &x);
printf("Vrednost promenljive x je ceo broj: x = %d \n\n", x);
p = &x;
printf("Naredba: p = &x; \n");
printf("Posledica: *p = x; \n\n");
printf("Vrednost promenljive na koju pokazuje p (to jest: *p) je vrednost promenljive x:\n");
printf("\t*p = x <=> %d = %d\n\n", *p, x);
*p = 20;
printf("Naredba: *p = 20; \n");
printf("Nova vrednost promenljive x je: %d \n", x);
printf("Nova vrednost promenljive *p je: %d \n", *p);
x = 30;
printf("Naredba: x = 30; \n");
printf("Nova vrednost promenljive x je: %d \n", x);
printf("Nova vrednost promenljive *p je: %d \n", *p);
return 0;
/*
** DATOTEKA : P4_pokazivaci_2.c
** OPIS : Napisati program u programskom jeziku C koji
** prikazuje pravljenje i uništavanje dinamickih
** promenljivih upotrebom pokazivaca.
** DATUM : 24.03.2015.
**
** Copyright (C) FON-LSI, 2015.
*/
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *p1, *p2;
p1 = malloc(sizeof(int));
*p1 = 10;
p2 = p1;
*p2 = *p2 + 5;
*p1 = *p1 + 2;
p2 = NULL;
free(p1);
return 0;
}
/*
** DATOTEKA : P5_pokazivaci_3.c
** OPIS : Napisati program u programskom jeziku C koji
** prikazuje upotrebu pokazivaca na funkcije.
** DATUM : 24.03.2015.
**
** Copyright (C) FON-LSI, 2015.
*/
#include <stdio.h>
int main(void){
int rezultat, // podatak
*pok = &rezultat; // pokazivač na podatak
OPERACIJA pf; // pokazivač na funkciju
// Prethodna deklaracija može da se zapiše i ovako:
// int (* pf)();
// Ili preciznije:
// int (* pf)(int, int);
pf = saberi;
rezultat = (*pf)(11, 7);
printf("\nZbir = %d", rezultat);
pf = pomnozi;
*pok = (*pf)(11, 7);
printf("\nProizvod = %d\n", *pok); // pristup pokazanoj promenljivi = vrednost promenljive
pf = saberi;
rezultat = operacija("saberi()", pf, 11, 7);
printf("\nZbir = %d\n\n", rezultat);
return 0;
}
/*
========================
CONSOLE PROGRAM OUTPUT:
========================
Funkcija: saberi()
Zbir = 18
Funkcija: pomnozi()
Proizvod = 77
OPERACIJA: saberi()
Funkcija: saberi()
Zbir = 18
*/