Увод у програмирање
Увод у програмирање
програмски језик C
Електротехнички факултет у Источном
Сарајеву
2
Професор
Професор
Doc.dr Slobodan Obradović, dipl.inž.el.
E-mail: sobradovic@vets.edu.yu
3
Испит
Испит
• (А или Б) и Ц
___________________________
• А) 3 Колоквијума
– обавезна сва три колоквијума
– за сваки колоквијум (51% минимум)
• Б) Интегрални испит
• Ц) Усмени испит
4
Литература
Литература
• Ласло Краус, “Програмски језик С
С са решеним
задацима”, Академска мисао, Београд, 2004.
• Додатна литература
5
Садржај курса из језика С
Садржај курса из језика С
• Дефинисање података
• Оператори
• Наредбе
• Низови
• Показивачи
• Знакови
• Функције
• Претпроцесорске наредбе
• Структуре
• Рад са датотекама
• Повезане листе
6
Историја
Историја
• Програмски језик C је први пут развијен
почетком 1970-тих (Bell Labs, USA)
• Намена: основа за развој оперативног
система UNIX.
• Други виши програмски језици тог
времена (COBOL, FORTRAN, PL/I,
ALGOL...) су били превише спори.
• Као основа за програмски језик C су
послужила два виша програмскa језика:
ALGOL и BCPL.
7
Историја
Историја
• 1960: ALGOL (ALGOrithmic Language)
• 1967: BCPL (Basic Combined Programming
Language)
• 1970: B programming language (без типова)
• 1972: C: BCPL + B (уведени типови)
• 1978: Kernighan + Ritchie стандард за C
• 1989: ANSI стандард за C
8
Предности С језика
Предности С језика
• Опште намене, од ОС до специфичних
проблема
• Врло ефикасни компајлери за вели број
процесора и оперативних система
• Преносивост компајлера
• Моћни оператори
• Мали скуп наредби и богате библиотеке
• Језик средњег нивоа, дакле може
ефикасно да приступи и хардверу
9
Решавање задатака
Решавање задатака
• Анализа задатка, деф. проблема, подела на
делове и одређивање коначног циља
• Разрада алгоритма, тј. Решавање задатка
• Кодирање програма и превођење на
машински језик
• Тестирање и отклањање грешака
• Израда коначне документације
• Употреба и одржавање програма
10
Писање програма
Писање програма
• Скуп наредби (instructions, statements) се
назива кôд (Code ) или
изворни кôд (Source code).
• Фајл који садржи кôд се назива Source file.
• У C програмском језику се низ наредби
групише у целине које се називају
функције (function)
• Сваки програм мора да садржи бар једну
функцију i to funkciju main( )
11
Како изгледа програм у језику
Како изгледа програм у језику C
C
#include <stdio.h>
main()
{
printf(“Primjer”);
}
}
Сваки програм мора
да има main
функцију
main()
заглавље
функције
printf(“Primer”);
тело функције
(блок наредби)
{
Почетак блока
}
Крај блока
;
граничник
исказа, наредби
#include <stdio.h>
Претпроцесорска
директива
12
Фазе обраде програма
Фазе обраде програма
1. Писање програма (Editing)
2. Предобрада (Preprocessing)
3. Превођење (Compilation)
4. Повезивање (Linking)
5. Има још једна фаза код модерних
програмских језика а то је пуњење (Loading)
6. Извршавање (Executing)
13
1. Предобрада
1. Предобрада #
# (
(Preprocessing
Preprocessing)
)
• Обавља се програмом који се назива preprocessor.
• Модификује изворни кôд (у RAM-у) у складу сa
наредбама за предобраду (preprocessor directives).
Ове наредбе ближе дефинишу начин превођења.
• Приликом предобраде се занемарују коментари
(comments) и празан простор (white space) из кôда.
• Кôд, који је програмер написао и претходно снимио
на диск, НЕ МЕЊА се у процесу предобраде!
14
Претпроцесорка директива
Претпроцесорка директива
#include <stdio.h>
main()
{
printf(“Primer”);
}
#include <stdio.h> Претпроцесорска директива
Обрађује се пре превођења програма
Обавезно почиње са #
#include – најчешће коришћена директива
Укључује у програм садржај датотеке која се
наводи као параметар
#include <ime>
или
#include ”ime”
Стандардне библиотеке
<stdio.h> функције за стандардни улаз/излаз
<math.h> библиотека математичких функција
...
#define – често коришћена директива
Дефинише симболичке константе i макрое
#define IME vrednost
#define PI 3.14159
#define EPS 0.0001
15
Претпроцесорка директива
Претпроцесорка директива
• Директиве служе за повезивање програма са
стандардним библиотекама, сваки програм
захтева бар једну stdio.h
– Екстензија .h је од речи header, заглавље
– Корисник може да прави сопствене библиотеке
• Служе за дефинисање симболичких константи,
сва константа има засебну директиву
• Свака директива почиње са #
• Иза ових редова нема ;
16
Претпроцесорка директива
Претпроцесорка директива
Пример
Пример:
:
#include <stdio.h>
#include <stdio.h>
#define PI 3.14159
#define PI 3.14159
#define EPS 1e-6
#define EPS 1e-6
#define MAXINT 32767
#define MAXINT 32767
#define K_OCT 071
#define K_OCT 071
#define K_HEX 0x41
#define K_HEX 0x41
main()
()
{
{
printf( ”
printf( ”%d
%d”
”,
, MAXINT
MAXINT );
);
printf(
printf( ”
”%8.5f
%8.5fn”
n”,
, PI );
PI );
printf(
printf( ”
”%
%10
10.
.8
8f
fn”
n”,
, EPS );
EPS );
printf(
printf( ”
”%
%d %d”
d %d”,
,K_OCT, K_HEX );
K_OCT, K_HEX );
}
}
#include <stdio.h>
Претпроцесорска директива
укључује стандардне
функције за улаз/излаз
података
#define PI 3.14159
Претп. директива деф.
симболичку константу PI
#define EPS 1e-6
Претпроц. директива деф.
симболичку константу EPS
= 0.000001
#define MAXINT 32767
Претпроцесорска директива
деф. целобројну константу
MAXINT = 32767
#define K_OCT 071
Дефинише окталну константу
K_OCT = 071
Октална константа започиње са 0
071 = 7*8 + 1*1 = 56 + 1 = 57 dec
#define K_HEX 0x41
Деф. Хексадецималну константу
K_HEX = 0x41
Хексадецимална конст. почиње са 0x
0x41 = 4*16 + 1*1 = 64 + 1 = 65 dec
printf( ”%d”, MAXINT );
printf( ”%8.5fn”, PI );
printf( ”%10.8fn”, EPS );
printf( ”%d %d”,K_OCT, K_HEX );
Главни програм (функција main)
Исписује вредност дефинисаних
константи на екрану
За иепис на екран користи се
стандардна функција printf()
17
Претпроцесорка директива
Претпроцесорка директива
Пример:
#include <stdio.h>
#define PI 3.14159
#define EPS 1e-6
#define MAXINT 32767
#define K_OCT 071
#define K_HEX 0x41
main()
{
printf( ”%d”, MAXINT );
printf( ”%8.5fn”, PI );
printf( ”%10.8fn”, EPS );
printf( ”%d %d”,K_OCT, K_HEX );
}
printf( ”%d”, MAXINT );
32767_
printf( ”%8.5fn”, PI );
_3.14159
printf( ”
printf( ”%d
%d”
”,
, MAXINT
MAXINT );
);
0.00000100
printf( ”%10.8fn”, EPS );
printf(
printf( ”
”%8.5f
%8.5fn”
n”,
, PI );
PI );
printf( ”%d %d”,K_OCT, K_HEX );
57_65_
printf(
printf( ”
”%
%10
10.
.8
8f
fn”
n”,
, EPS );
EPS );
printf(
printf( ”
”%
%d %d”
d %d”,
,K_OCT, K_HEX );
K_OCT, K_HEX );
18
2. Превођење (
2. Превођење (Compilation
Compilation)
)
• Програм којим се обавља превођење назива се
преводилац (compiler)
• Изворни кôд, претходно подвргнут предобради,
преводи се у објектни кôд (object code).
• Проверава се синтакса
грешке (errors) и
упозорења (warnings)
• Снима објектни кôд на диск (нови фајл).
• Ако се приликом превођења констатује грешка,
НЕ ГЕНЕРИШЕ се објектни кôд.
19
3. Повезивање (
3. Повезивање (Linking
Linking)
)
• Уколико је кôд писан у више фајлова постоји
више фајлова са објектним кодом.
• Објектни фајлови се повезују у једну целину
како би се формирао извршни фајл
(executable file, са екстензијом .еxe).
• Други објектни фајлови могу да настану
позивањем готових функција из тзв.
библиотека (Libraries, Run-Time Library) или
објектних фајлова које је креирао програмер.
• Уколико се приликом линковања констатује
грешка неће се формирати извршни фајл!
20
Како до извршног програма?
Како до извршног програма?
Повезивање
Програм за унос
и обраду текста
filename1.c
filename2.c
...
filenameN.c
Предобрада
Предобрада
Предобрада
Предобрада
filename1.obj
...
filenameN.obj
filename2.obj
Објектни фајлови
Фајл након предобраде,
памти се у RAM-у
Превођење
Превођење
Превођење
Превођење
filename1.obj
filename1.obj
...
filenameN.obj
project_filename.prj
Извршни програм
.exe
21
Отклањање грешака
Отклањање грешака
• deBUGing
• bug - computer bugs - debug
22
Врсте грешака
Врсте грешака
• Синтаксне грешке (syntax errors)
• Грешке при извршавању (run time error)
• Грешке намере (semantic error)
23
Синтаксне грешке
Синтаксне грешке
• Неправилно раздвајање инструкција
• Неправилно отварање-затварање коментара
• Коришћење апострофа, наводника, ... Унутар
стринга
• Неправилна употреба зареза или размака
• Позивање функције или променљиве пре него
што је дефинисана
• Употреба функције као инструкције (увек мора
бити на десној страни) и погрешна имена
24
Грешке при извршавању
Грешке при извршавању
• Неправилна употреба контролних
структура
• Погрешан унос података
• Типски конфликти
25
Грешке намере
Грешке намере
• Погрешан математички модел
• Погрешан алгоритам
• Употреба глобалних променљивих
• Недостају ознаке за поч. и крај блока
• Употреба погрешних услова лог. Фја.
• Појава бесконачне петље
• Занемаривање грешака заокругљивања
26
Формат
Формат C
C програма - стил
програма - стил
#include <stdio.h>
/* C program koji ispisuje: "Zdravo!" */
int main( )
{
printf("Zdravo!n");
return 0;
}
#include <stdio.h>/* C program koji
ispisuje: "Zdravo!" */int main ()
{printf("Zdravo!n");return 0;}
27
Формат
Формат C
C програма - стил
програма - стил
#include<stdio.h>
/* C program koji
ispisuje:
"Zdravo!" */
int
main
(
)
{
printf(
"Zdravo!n"
)
;
return
0
;
}
28
Формат
Формат C
C програма
програма
• Најпрегледније, најразумљивије
• Најлакше за тестирање
• Најпогодније за “дораду”
• Правила
#include
<stdio.h >
printf("Ovo je veoma, veoma,
veoma, veoma,duga linija.");
29
Улога заграда и неких граничника
Улога заграда и неких граничника
• () у именима функција, за смештање
аргумената
• {}, означи почетак и крај тела функције,
да издвоји блокове инструкција и
ограничи област важења података
• ; означава крај једног израза или наредбе
• С језик може у једном реду имати јако
дуге и угњеждене изразе (више наредби)
30
Граматика језика
Граматика језика
• Азбука - скуп дозвољених знакова,
симбола
• Лексика – исправно писање недељивих
целина
• Синтакса – исправно писање решеница
• Семантика – смисао
31
Елементи језика
Елементи језика C
C
• Скуп знакова
• Велика и мала слова енглеског алфабета
Aa Bb Cc Dd Ee Ff Gg Hh Ii Jj Kk Ll Mm
Nn Oo Pp Qq Rr Ss Tt Uu Vv Ww Xx Yy Zz
• Децималне цифре
0 1 2 3 4 5 6 7 8 9
• Знаци:
: _ ! ? . , : ; ‘ = + -
/ * # % &  | ( ) [ ]
{ } < >
32
Лексички симболи - токени
Лексички симболи - токени
• Идентификати
• Службене, резервисане речи (пишу се
малим словима енглеске азбуке!)
• Константе
• Оператори
• Сепаратори (граничници)
• Знаковни низови
33
Идентификатори
Идентификатори
• Служе за означавање елемената програма
(података, симболичких константи, нових
типова података, функција ...)
и представљају називе објеката језика
Правила
1.Могу да се састоје од:
– Слова (малих и великих)
– Цифара
– Знака подвучено ( _ )
34
Идентификатори
Идентификатори
2. Први знак у имену мора да буде слово.
Може да буде и знак подвучено али...
3. Дужина имена идентификатора да не буде већа од
31 карактера
Пример:
JednaPromenljivaKojaImaKarakteraJakoPuno = 1
JednaPromenljivaKojaImaKarakteraSamoJedanVise = 3
4. C разликује мала и велика слова (Rezultat и rezultat)
Case Sensitive
5. Имена идентификатора не могу да буду из скупа
службених речи.
35
исправни идентификатори
исправни идентификатори
suma NovoIme
c5_4 novo_ime
JEDAN_BROJ Broj_studenata
TX_protocol Broj_Studenata
TRUE _split_name
UporediRezultat_sabiranja
dugoimesamnogokaraktera
36
неисправни идентификатори
неисправни идентификатори
70fс почиње бројем
x-name знак - није дозвољен
ime sa razmakom размак није дозвољен
int резервисана реч
axx& знак & није дозвољен
Površina*kruga знак * није дозвољен
jedan,dva знак , није дозвољен
37
Службене речи
Службене речи (32)
(32)
auto double int struct
break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof volatile
do if static while
38
Подела података
Подела података
• Скаларни (знаковни, целобројни, реални)
• Нескаларни (структуре података)
39
Логички подаци
C не располаже логичким типом података
у неким програмским језицима то су
LOGICAL или BOOLEAN
Нису имплементиране ни логичке константе
TRUE (istina) i FALSE (laž)
Било који података се може посматрати као
логички
ISTINA ... podatak <> 0
LAŽ ... podatak = 0
Уобичајено је да се користе целобројни подаци
Резултат логичких операција је:
rezultat=1 -> ISTINA (tačno)
rezultat=0 -> LAŽ (netačno)
40
Подаци, Променљиве и типови података
Подаци, Променљиве и типови података
• Подаци су предмет обраде у програмима.
• Сваки податак има одређене особине, а
скуп свих особина једног податка
одређује тип податка.
• Тип податка је одређен:
– скупом могућих вредности које податак
може да узме и
– скупом могућих операција које је могуће
извести над податком.
41
Подаци
Подаци
• Подаци у програму могу да се представе
помоћу:
– вредности или
– идентификатора.
c=a+5
• Подаци педставњени преко вредности се
називају константе
• Подаци педстављени преко
идентификатора се називају променљиве
42
Подаци – симболичке константе
Подаци – симболичке константе
• Посебан случај непроменљивих података
представљају симболичке константе.
#define PI=3.14;
#define MIN_RASTOJANJE=2;
#define Broj_Semestara=8;
43
Имена, идентификатори променљивих
Променљиве (варијабле)
Променљива је симболичко име за неку меморијску локацију
Свака променљива мора имати неко јединствено име!?
име се формира од слова, цифара и знака _
први знак не може бити цифра
максимално 31 знак
разликују се мала и велика слова: име Slovo различито од slovo
МЕМОРИЈА
МЕМОРИЈА
broj
BROJ
podatak_1
Broj-1
123A
44
Променљиве
Променљиве
СВАКА ПРОМЕНЉИВА МОРА БИТИ ТАЧНО ОДРЕЂЕНОГ ТИПА
Тип променљиве не може се мењати током извршења програма
променљива може бити неког
-скаларног - описана једним бројем, или
-нескаларног типа - састоји се од више делова од којих је сваки и
засебан и део податка
Може да се мења вредност (садржај меморијске локације)
зато се и зове променљива (varijabla)
MEMORIJA
int
char
A
x
Z
G
a ABC
2.35
13
13
6
-
6
5
7
ABC
2.35
D
45
Типови променљивих података
Типови променљивих података
• Тип неког податка одређује :
– Меморијски простор који података заузима
– Скуп вредности који тај податак може да има
– Скуп операција дефинисаних над њим.
• Програмски језик C
C познаје само
нумеричке типове података
– целобројни нумерички типови
– реални нумерички типови.
46
Целобројни типови података
Целобројни типови података
• Име типа:
–int
–short int
–long int
• Опсег вредности: цели бројеви (унутар
датог опсега)
– Пример: 5, -35, 401
• Операције: аритметичке (сабирање,
одузимање, множење, …), друге
47
Целобројни типови података
Целобројни типови података
• сваки од ових типова може бити
неозначен (само позитивне вредности)
–unsigned int
–unsigned short int
–unsigned long int
48
Пример опсега вредности
Пример опсега вредности
Тип Бајтова Бита Mин вред. Maкс вред.
short int 2 16 -32768 32767
int 4(2) 32 -2147483648 2147483647
long int 4 32 -2147483648 2147483647
не заборавите signed unsigned
49
Зашто постоје ограничења
Зашто постоје ограничења
• Са одређеним бројем бита, могуће је
дефинисати одређени скуп вредности
• 16 бита, 65 536 могућих вредности
– 32768 негативних вредности
– 1 нула
– 32767 позитивних вредности
• Прекорачење (Overflow):
– покушај да се променљивој додели сувише
велика вредности (40 000 у short int)
50
Целобројни типови података
Целобројни типови података
Тип char
• Мали означени целобројни податак
• величине 8 бита (1 бајт).
• Намењен за манипулацију карактерима, али
може послужити и за рад са малим бројевима
са вредностима у распону од од 128 до 128.
• unsigned char може имати вредности од 0
до 255.
( ASCII табела има 256 знакова).
51
Реални типови података
Реални типови података
• Име типа:
–float (4 bajta)
–double (8 bajtova)
–long double (10 bajtova)
• Могуће вредности: реални бројеви,
5.0, -3.5, 4.01
• Операције: аритметичке (сабирање,
одузимање, множење, …), друге
52
Реални типови података
Реални типови података
float: 4 бајта, 32 бита
double: 8 bајтова, 64 бита
long double: 10 бајтова, 80 бита
• Представљање:
– mEe
– m магнитуда, мантиса (одређени број бита),
децимални број и Е ознака за степеновање
са основом
– е експонент, цео број са знаком
53
Нумеричке константе
Нумеричке константе
• Целобројне
• Реалне
54
Целобројне нум. константе
Целобројне нум. константе
• Могу бити написане у
– децималном,
– хексадецималном (основе 16) и
– окталном (основе 8) бројевном систему.
974 Декадна константа типа int
0x2fc хексадецимална константа типа int
974l декадна константа типа long int
01234L октална константа типа long int
55
Целобројне нум. константе
Целобројне нум. константе
• 0xffff негативна вредност-хексадец.
• 0xffffuпозитивна вредност-хексадец.
• 0723 негативна вредност-октална
• 0723u позитивна вредност-октална
56
Реалне нум. константе
Реалне нум. константе
• Могу бити написане у само у децималном
бројевном систему.
2.54Е-34 представља вредност 2.54 10-34
1.23 3е5
125. 2.1Е-45
.456 22.3F
Подразумевани тип је double
Додавањем суфикса F или f постаје float
57
Дефинисање података
Дефинисање података
• Сваки податак (променљива) мора да се
дефинише пре употребе!
• Општи облик наредбе је
tip_podatka ime_podatka;
или
tip_podatka ime_podatka = početna_vrednost;
tip_podatka ime_podatka[= početna_vrednost];
58
Дефиниција променљиве
Дефиниција променљиве
Преводиоцу (компајлеру) се мора указати на то
да ће се у програму користити нека
променљива, како би он могао да резервише
потребан простор у меморији
Општи облик дефиниције променљиве:
tip imepromjenljive [=vrednost]
Почетна вредност
Не мора се додељивати!!
[ ] ове заграде се користе да би се нагласило да
нешто није обавезно
[=vrednost]
На пример.
int i,j,n=10;
float a, e=2.71;
char znak=’+’,c;
59
Дефинисање података
Дефинисање података
short int broj1;
short int broj2=34,d, gr=5;
char slovo;
float a=5.43;
float b=12.65;
int visina=34/2;
float povrsina=a*b;
60
Иницијализација
Иницијализација
• је додељивање почетне вредности (initial value)
променљивој
• Промељива се не мора иницијализовати
(вредност је у том случају случајна)
tip_podatka ime_podatka [=početna_vrednost],
...,ime_podatka [= početna_vrednost];
Пример:
int broj=2, prisutni=0, godina=2004, br_sati;
61
Дефинисање непроменљивих података
Дефинисање непроменљивих података
• Непроменљиви подаци су именовани подаци
чија се вредност не мења.
• Дефинишу се на сличан начин с тим да:
– дефинисање почиње са кључном речи const
– мора бити додељена почетна вредност
• Општи облик дефинисања непроменљивих
података
const tip_podatka ime_podatka =
početna_vrednost;
62
Дефинисање непроменљивих података
Дефинисање непроменљивих података
const double e=2.71828182845905;
const int br_radnih_dana=26;
const float radijus=14;
const float cena=14.2, porez=0.22;
/* i porez je konstanta*/
const float obim=2*radijus*3.14;
63
Читање и писање података
Читање и писање података
• Сви подаци који се уносе са тастатуре се
прихватају као знакови (character).
• Улазна конверзија се у програмском језику C
обавља преко уграђене функције scanf()
• Приликом исписа података на монитор
потребно је да се обави излазна конверзија,
• Ова конверзија се обавља применом
уграђене функције printf()
64
Читање и писање података
Читање и писање података
• Информације о функцијама scanf() и
printf() налазе се у фајлу stdio.h.
• Име stdio потиче од standard input output a
екстензија .h од header (заглавље).
#include <stdio.h>
#include "c:nekoime.h"
65
printf
Стандардна функција за излаз (испис) на екран
printf( ”konverzioni string” , lista_argumenata )
”konverzioni string”
Kontrolni (konverzioni) niz određuje način na koji se
vrši ispis
Štampa se sve što se nađe unutar ” ” sve dok se ne
dođe do znaka %
Kad se dođe do znaka % gleda se sljedeći znak (grupa
znakova) koji se naziva konverzioni karakter
Konverzioni karakter definiše kako će se ispisati
odgovarajući podatak iz liste argumenata
Mora biti onoliko znakova % u cijelom stringu koliko
ima i argumenata u listi
lista_argumenata
Određuje šta treba da se
ispiše (koji podaci treba da se
ispišu)
Argumenti se odvajaju
zapetama
Argumenti mogu da budu
promjenljive, konstante,
izrazi
66
Писање података
Писање података
printf("Ovo je jednostavna poruka")
• Резултат: Ovo je jednostavna poruka
printf(format,izraz,...,izraz)
• izraz може да представља име променљиве,
вредност константе или аритметички израз
format има облик:
”%[Sirina][.Prec]Tip_kon”
67
”
”%
%[
[Sirina
Sirina][.Prec]
][.Prec]Tip
Tip_
_kon
kon”
”
Tip_kon Тип Излазни формат
--------------------------------------------------------------------------------
i int децимални цео број
d int децимални цео број
u int неозначени дец. цео број
o int неозначени октални број
x int неозначени хексадецимални „abcdef”
X int неозначени хексадецимални, „ABCDEF”
c int карактер дефинисан једним бајтом (ASCII)
e float реални број једноструке тачносити, експ облик
f float реални број једноструке тачносити стд. облика
g float реални број једноструке тачносити облика f ,e
у зависности од тога који је погоднији за приказ
68
Писање података
Писање података
• printf("%c ", ’A’);
резултат је: А
• printf("%c %d", ’A’, 35);
резултат је: А 35 размак између %c и %d
• printf("%c%d", ’A’, 35);
резултат је: А35 oвде нема размака.
• printf("%c %d %f", ’A’, 35, 4.5);
резултат је: А 35 4.500000
• printf("%c %d %е", ’A’, 35, 42.123);
резултат је: А 35 4.212300е+001
69
Пример исписа по разним форматима
Пример:
#include <stdio.h>
main()
{
int var=65;
printf( ”Znakovi:n”);
printf( ”%2cn”, ’A’);
printf( ”%4cn%6cn”, var, ’B’);
printf( ”%8cn”, var+1);
printf( ”%3dn”, ’A’);
printf( ”%03d”, ’A’);
}
}
MЕМОРИЈА
0100 0001
int var=65;
Znakovi:
int var=65;
printf( ”Znakovi:n”);
printf( ”Znakovi:n”);
printf( ”%2cn”, ’A’);
.A
printf( ”%2cn”, ’A’);
printf( ”%4cn%6cn”, var, ’B’);
...A
.....B
printf( ”%4cn%6cn”, var, ’B’);
printf( ”%8cn”, var+1);
.......B
printf( ”%8cn”, var+1);
printf( ”%3dn”, ’A’);
.65
printf( ”%3dn”, ’A’);
printf( ”%03d”, ’A’);
065
printf( ”%03d”, ’A’);
70
Променљиве и меморија
Пример:
#include <stdio.h>
main()
{
int i=9,j;
float a,b;
j=i/2;
a=i/2.0;
b=a*2.0/j;
printf( ”i=%dn”, i );
printf( ”j=%dn”, j );
printf( ”a=%6.2fn”, a );
printf( ”b=%6.2fn”, b );
}
MEMOРИJA
j
j
a
a
b
b
i
i
int i=9,j;
int i=9,j;
int i=9,j;
float a,b;
float a,b;
float a,b;
j=i/2;
0000 1001
0000 1001
0000 0000
0000 0000
9
0000 0100
0000 0100
0000 0000
0000 0000
4
1001 0000
1001 0000
0100 0000
0100 0000
0000 0000
0000 0000
0000 0000
0000 0000
4.5
j=i/2;
a=i/2.0;
a=i/2.0;
a=i/2.0;
b=a*2.0/j;
0001 0000
0001 0000
0100 0000
0100 0000
0000 0000
0000 0000
0000 0000
0000 0000
2.25
71
”
”%[
%[Sirina
Sirina][
][.Prec
.Prec]
]Tip
Tip_
_kon
kon”
”
• .Prec представља прецизност исписа
значај само за реалне бројеве: ( e, f, g)
• одређује број цифара које ће бити исписане
након децималне тачке.
• Подразумевана вредност је 6.
• Уколико је наведена прецизност мања од броја
децимала: исписује се онолико цифара колико
прецизност дефинише а последња цифра се
заокржује.
• За тип конверзије g: одређује укупан број
цифара који ће се исписати (целобројни
+децимални део). Нема заокруживања.
72
”
”%[
%[Sirina
Sirina][
][.Prec
.Prec]
]Tip
Tip_
_kon
kon”
”
• printf("%е", 42.126);
резултат је: 4.212600е+001
Подразумевана вредност је 6 децимала
• printf("%.4е" 42.126);
резултат је: 4.2126е+001
Исписује онолико децимала колико је наведено
• printf("%.3е", 42.126);
резултат је: 4.213е+001
Заокруживање последње децимале
73
”
”%[
%[Sirina
Sirina][
][.Prec
.Prec]
]Tip
Tip_
_kon
kon”
”
• printf("%f", 42.126);
резултат је: 42.126000
Подразумевана вредност је 6 децимала
• printf("%.7f", 42.12345679);
резултат је: 42.1234568
Заокруживање
• printf("%.2f", 42.126);
резултат је: 42.13
Заокруживање
74
”
”%[
%[Sirina
Sirina][
][.Prec
.Prec]
]Tip
Tip_
_kon
kon”
”
• printf("%g", 42.126);
резултат је: 42.126
• printf("%.7g", 42.12345678);
резултат је: 42.123467 одсецање
• printf("%.2g", 42.126);
резултат је: 42
• printf("%.2g", 142.126);
резултат је: 1.4е+002
75
”
”%[
%[Sirina
Sirina][.Prec]
][.Prec]Tip
Tip_
_kon
kon”
”
• Sirina Одређује минимални број карактера
који се резервише за испис неког броја. То је
позитивна вредност. Уколико је за испис
потребно мање карактера од броја који је
одређен параметром Sirina, испис се
допуњава бленковима (размацима) и поравнава
се у десно.
• Уколико се испред параметра Sirina наведе
0 бленкови се, уколико постоје, замењују
нулама.
76
”
”%[
%[Sirina
Sirina][.Prec]
][.Prec]Tip
Tip_
_kon
kon”
”
• printf(″%5c%4d″, ’A’, 35);
резултат је: А 35 /* четири бленка
испред А и два бленка испред 35
• printf(″%04d″, 35);
• резултат је: 0035 /* нуле замењују празна
места
• printf("%07.3f", 42.123); /*042.123*/
укупно 7 цифара од тога три цифре након
децим. тачке и једна за децим. тачку */
77
Додатно форматирање
Додатно форматирање
escape sequence
a – bell  -- backslash
b – backspace ? – question mark
f – formfeed ’ – single quote
n – new line ” – quote mark
r – CR o# – # in octal
t – horiz. tab x# – # in hex
v – vertical tab
78
printf("%cnt%dn%fn", 'A',35, 42.126);
резултат је:
А
35 /* t je znak tab, 35 je pomeren u desno*/
42.126000
79
Променљиве и излаз
Пример:
#include <stdio.h>
main()
{
int i=9,j;
float a,b;
j=i/2;
a=i/2.0;
b=a*2.0/j;
printf( ”i=%dn”, i );
printf( ”j=%dn”, j );
printf( ”a=%6.2fn”, a );
printf( ”b=%6.2fn”, b );
}
MEMORIJA
j
a
b
i
0000 1001
0000 0000
9
0000 0100
0000 0000
4
1001 0000
0100 0000
0000 0000
0000 0000
4.5
0001 0000
0100 0000
0000 0000
0000 0000
2.25
b=a*2.0/j;
printf( ”i=%dn”, i );
i=9
printf( ”i=%dn”, i );
printf( ”j=%dn”, j );
j=4
printf( ”j=%dn”, j );
printf( ”a=%6.2fn”, a );
a= 4.50
printf( ”a=%6.2fn”, a );
printf( ”b=%6.2fn”, b );
b= 2.25
80
Читање података-стандардни улаз
Читање података-стандардни улаз
• Општи облик наредбе је следећи:
scanf(format,&podatak,...,&podatak)
• Oператор & испред имена променљиве означава
да се функцији scanf() додељује меморијска
адреса променљиве (податка) на коју се уписује
резултат конверзије.
• format има исти облик као и код функције
printf().
81
Стандардни улаз података
Стандардни улаз података
Пример:
#include <stdio.h>
main()
{
int broj;
/*printf( ”Unesite ceо broj:n” );*/
scanf( ”%d”, &broj );
printf( ”Uneli ste %dn”, broj );
}
}
MEMOРИЈA
broj
broj
_
6
00
0000
00 0110
0110
0000 0
0000 000
000
0
Uneli ste 6
82
Стандардни улаз података
Стандардни улаз података
Primjer:
#include <stdio.h>
main()
{
int broj;
printf( ”Unesite cео broj:n” );
scanf( ”%d”, &broj );
printf( ”Uneli ste %dn”, broj );
}
}
MEMOРИJA
broj
broj
Unesite cео broj:
6
00
0000
00 0110
0110
0000 0
0000 000
000
0
Uneli ste 6
Пре сваке наредбе за унос
пошаљите поруку на екран!!
83
пример 1
пример 1
#include <stdio.h>
main()
{
char cVar;
int dVar;
float fVar;
scanf("%c %d %f", &cVar,&dVar, &fVar);
printf("n%c n%d n%fn",cVar, dVar,
fVar);
}
84
унете вредности
излазне вредности
пример 1
пример 1
85
пример 2
пример 2
#include <stdio.h>
main()
{
int x;
char c;
float y;
scanf("%d %c %f", &x, &c, &y);
printf("n%d n%c n%fn",x, c, y);
scanf("%d", &x);
printf("Da li sam cekao za drugi 
unos?n");
printf("n%dn",x);
}
86
пример 2
пример 2
87
Оператори
Оператори
• Радње које се извршавају над операндима
и које дају одређени резултат.
– Аритметички оператори
– Оператор доделе вредности
– Релацијски оператори
– Логички оператори
– Оператори по битовима
– Величина податка
– Условни израз
88
Аритметички оператори
Аритметички оператори
 Бинарни оператори
 Име Oператор Пример
 Сабирање + num1 + num2
 Одузимање - initial - spent
 Множење * kolicna * 6
 Дељење / suma /kolicina
 Модуо % m % n
89
Дељење
Дељење
• Ако су оба операнда при дељењу типа int
онда ће и резултат бити типа int.
17 / 5 = 3
4 / 3 = 1
35 / 9 = 3
#include <stdio.h>
main()
{
int x=5, y=2, а;
float z;
а=x/y; /* a=2 */
z=x/y; /* z = 2.5 */
}
90
Дељење
Дељење
• Aко је бар један операнд типа float
резултат ће бити типа float.
• Примери: 17.0/ 5 = 3.4
 4/ 3.2 = 1.25
 35.2/9.1 = 3.86813
• Објашњење? Целобројни (int) операнд се
привремено конвертује у реалну вредност
(float), па се онда обави дељење.
91
Дељење нулом
Дељење нулом
• Дељење нулом није математички
дефинисано.
• Ако у току извршавања програма дође до
дељења нулом то ће проузроковати
прекид извшења програма fatal error.
92
Модуо - Остатак при дељењу
Модуо - Остатак при дељењу
• Израрз m % n даје целобројни остатак
дељења m са n.
• Оба операнда МОРАЈУ бити целобројна
• Примери : 17 % 5 = 2
 6 % 3 = 0
 9 % 2 = 1
 5 % 8 = 5
 a % b = a – (a/b)*b
93
Модуо - Остатак при дељењу
Модуо - Остатак при дељењу
Primjer:
#include <stdio.h>
main()
{
int sek;
printf( ”Unesite vreme u sekundama: ” );
scanf( ”%d”, &sek ); /* ovde se ucitava podatak */
printf( ”To je: %02d:%02d:%02dn”, sek/3600,sek%3600/60,sek
%60 );
}
}
Unesite vreme u sekundama: 4000
To je: 01:06:40
Пример употребе % оператора
94
Аритметички оператори
Аритметички оператори
• Унарни оператори: +, -
Представљају предзнак операнда
• Унарни оператори: ++, −−

Оператор ++ увећава вредност операнда за 1
(increment).

Оператор −− умањује вредност операнда за 1
(decrement).
95
Унарни оператори: ++, −−
Унарни оператори: ++, −−
а++; /* одговара наредби а = а+1; */
++а; /* одговара наредби а = а+1; */
а--; /* одговара наредби а = а-1; */
--а; /* одговара наредби а = а-1; */
96
Унарни оператори: ++, −−
Унарни оператори: ++, −−
int broj_a, broj_b, broj_c, broj_d;
broj_a = 3;
broj_b = 6;
broj_c = broj_b++; /* broj_c je jednak 6 a
nakon toga se povećava b na 7*/
broj_c = ++broj_a; /* prvo se broj_a
poveća na 4 a potom je broj_c jednak 4*/
broj_d= broj_b; /* broj_d je jednak 7*/
97
Оператор доделе вредности
Оператор доделе вредности
operator
= += - = *= /= %=
Општи облик
ime_promenljive [operator]= izraz
98
Оператор доделе вредности
Оператор доделе вредности
Пример:
#include <stdio.h>
main()
{
int a,b,c;
a=b=c=10;
printf( ”%d %d %dn”, a,b,c );
a = (b=10) + (c=20);
printf( ”%d %d %dn”, a,b,c );
}
MEMOРИJA
a
a
0000 1010
0000 1010
0000 0000
0000 0000
b
b
0000 1010
0000 1010
0000 0000
0000 0000
c
c
0000 1010
0000 1010
0000 0000
0000 0000
10 10 10
0001 0100
0001 0100
0000 0000
0000 0000
0001 1110
0001 1110
0000 0000
0000 0000
30 10 20
99
Оператор доделе, пример
Оператор доделе, пример
broj_a=3;
broj_c= broj_b;
a=а+1;
a += b; /* isto je sto i a=a+b; */
a -= b; /* isto je sto i a=a-b; */
a *= b; /* isto je sto i a=a*b; */
a /= b; /* isto je sto i a=a/b; */
a %= b; /* isto je sto i a=a%b; */
a=b=c=27;
b += c+2; /* isto je sto i b=b+(c+2); */
d *= e-5; /* isto je sto i d=d*(e-5); */
100
Релацијски оператори
Релацијски оператори
> веће од a > b
< мање од a < b
>= веће и једнако a >= b
<= мање и једнако a <= b
== једнако a == b
!= није једнако a != b
• Резултати поређења су целобројног типа
(int) и могу имати вредност:
– 1 ако релација важи или
– 0 уколико релација не важи.
101
Релацијски оператори, пример
Релацијски оператори, пример
3.1 != -3.1 /* rezultat 1 */
5.2 >= 6 /* rezultat 0 */
7<= 7 /* rezultat 1 */
0.5 == 4.2 /* rezultat 0 */
a != 5 /* rezultat zavisi
od
vrednosti promenljive a */
102
Логички оператори
Логички оператори
! негација
&& логичко И
|| логичко ИЛИ
103
Логички оператори, пример
Логички оператори, пример
• да ли се вредност променљиве налази између 10 и
100
(10<а) && (а<100)
/* Ako je a>10 i a<100 vrednost izraza
je 1, u suprotnom 0*/
• да ли је апс. вредност променљиве већа од 15
• (а <-15) || (а>15)
/* ako je a<-15 ili a>15 vrednost
izraza je
1, u suprotnom 0 */
104
Оператори по битовима
Оператори по битовима
~ комплемент
<< логичко попмерање у лево
>> логичко померање у десно
& логичко И на битском нивоу
| логичко ИЛИ на битском нивоу
^ ексклузивно или (exor)
105
Оператори по битовима, пример
Оператори по битовима, пример
• 0x1234 & 0x5678 (4660 & 22136)
0001 0010 0011 0100
& 0101 0110 0111 1000
= 0001 0010 0011 0000=0x1230(4656)
• 0x1234 | 0x5678
0001 0010 0011 0100
| 0101 0110 0111 1000
= 0101 0110 0111 1100 =0x567c
106
Оператори по битовима, пример
Оператори по битовима, пример
• 0x1234 ^ 0x5678
0001 0010 0011 0100
^ 0101 0110 0111 1000
= 0100 0100 0100 1100 =0x444c
• ~0x1234
~0001 0010 0011 0100
= 1110 1101 1100 1011 =0xedcb
• 0x0001<<5
0000 0000 0000 0001 <<5 =
0000 0000 0010 0000
107
Оператори над битовима, пример
Оператори над битовима, пример
& - битско AND
Пример:
#include <stdio.h>
main()
{
char c=’9’;
short cifra;
cifra = c & 0x0F;
printf( ”%dn”, cifra );
}
MEMOРИJA
c
c
00
0011
11 10
1001
01
cifra
cifra
c
c
00
0011
11 10
1001
01
00
0000
00 1
1001
001
0x0F
0x0F
00
0000
00 1
1111
111
&
&
00
0000
00 1
1001
001
9
108
Оператори над битовима, пример
Оператори над битовима, пример
| - битско OR
Пример:
#include <stdio.h>
main()
{
short cifra=9;
char c;
c = cifra | 0x30;
printf( ”%cn”, c );
}
MEMORIJA
cifra
cifra
00
0000
00 10
1001
01
c
c
cifra
cifra
00
0000
00 10
1001
01
00
0011
11 1
1001
001
0x30
0x30
00
0011
11 0000
0000
|
|
00
0011
11 1
1001
001
9
109
Оператори над битовима
Оператори над битовима
~ - битско NOT
Пример:
#include <stdio.h>
main()
{
short x=1,y;
y = ~x;
printf( ”%dn”, y );
}
MEMOРИJA
x
x
00
0000
00 0
00
001
01
y
y
x
x
00
0000
00 0
00
001
01
1111
1111 1110
1110
~
~
1111
1111 1110
1110
-2
110
Оператори над битовима
Оператори над битовима
^ - XOR (EX ILI)
Пример:
#include <stdio.h>
main()
{
short x=0x73,y;
y = x^0x32;
printf( ”%cn”, y );
}
MEMORIJA
x
x
0
0111
111 0011
0011
y
y
x
x
0
0111
111 0011
0011
0
0100
100 0001
0001
0x32
0x32
00
0011
11 0010
0010
^
^
0
0100
100 0001
0001
A
111
Оператори померања
Оператори померања
<< - померање лево
Пример:
#include <stdio.h>
main()
{
short x=3,y;
y = x<<1;
printf( ”%dn”, y );
}
MEMOРИJA
x
x
00
0000
00 0
00
011
11
y
y
x
x
00
0000
00 0
00
011
11
0
0000
000 0
011
110
0
<<
<<1
1
0000
0000 0110
0110
6
112
Оператори померања
Оператори померања
<< - померање лево
Пример:
#include <stdio.h>
main()
{
short x=3,y;
y = x<<4;
printf( ”%dn”, y );
}
MEMOРИJA
x
x
00
0000
00 0
00
011
11
y
y
x
x
00
0000
00 0
00
011
11
0
0011
011 0
0000
000
<<
<<4
4
0011 0000
0011 0000
48
113
Оператори померања
Оператори померања
>> - померање десно
Пример:
#include <stdio.h>
main()
{
short x=12,y;
y = x>>1;
printf( ”%dn”, y );
}
MEMOРИJA
x
x
00
0000
00 1100
1100
y
y
x
x
00
0000
00 1100
1100
0
0000
000 0
011
110
0
>>
>>1
1
0000
0000 0110
0110
6
114
Оператори померања
Оператори померања
>> - померање десно
Пример:
#include <stdio.h>
main()
{
short x=-4,y;
y = x>>2;
printf( ”%dn”, y );
}
MEMOРИJA
x
x
1111
1111 11
110
00
0
y
y
x
x
1111
1111 11
110
00
0
11
1111 1111
11 1111
>>
>>2
2
1111
1111 1111
1111
-1
115
Величина податка
Величина податка
• Bеличина меморијске локације коју
заузима неки податак се може израчунати
употребом оператора sizeof.
• Примери:
sizeof( short int);
sizeof( long int);
sizeof( broj_a);
sizeof( broj_a*broj_b-3);
116
Условни оператор
Условни оператор
uslov ? izraz1 : izraz2
c= (a>b) ? a : b;
c=(x<=y && y>=z) ? y : (x+z)/2
117
Условни оператор
Условни оператор
Условни оператор
Условни оператор (?:)
(?:)
Општи облик
Општи облик:
:
uslov ? izraz1 : izraz2
uslov ? izraz1 : izraz2
ISTINA LAŽ
uslov
izraz1 izraz2
нпр.
y = 5;
x = (y>0) ? 100 : 200;
----------
x  100
нпр.
y = -2;
x = (y>0) ? 100 : 200;
----------
x  200
118
Конверзија типа
Конверзија типа
• Бинарни оператори захтевају да два оператора
имају исти тип.
• Када то није испуњено долази до аутоматске
конверије типова.
5+6.0 /* isto sto i 5.0+6.0*/
5/4+3 /* rezultat 4*/
3.0*5/4 /* (3.0*5)/4=(3.0*5.0)/4
15.0/4 =15.0/4.0=3.75
*/
119
Конверзија типа
Конверзија типа
• Експлицитном наредба за промену типа
применом тзв. cast-оператора.
• Његов општи облик је:
(novi_tip) izraz
int a;
(char)a;
float x;
double y;
y=sin((double)x);
120
Редослед извршавања оператора
Редослед извршавања оператора
• Редослед извршавања оператора је
унапред дефинисан одговарајућим
приоритетом .
• Заграде ( ) имају највиши приоритет.
121
Приоритет оператора
Приоритет оператора
Приоритет и асоцијативност оператора
Приоритет и асоцијативност оператора
Приоритет
Приоритет оператори
оператори Асоцијативност
Асоцијативност
највиши
највиши
најнижи
најнижи
(
( )
) { } -> .
{ } -> . 

! ~ ++ -- + - * & (tip)
! ~ ++ -- + - * & (tip) 

( ) { } -> . 

* / %
* / % 

! ~ ++ -- + - * & (tip) 

+ -
+ - 

* / % 

<< >>
<< >> 

+
+ - 

< <= > >=
< <= > >= 

<< >> 

== != & ^ | && ||
== != & ^ | && || 

< <= > >= 

?:
?: 

== != & ^ | && || 

= += -= *= /= %= &= ^= |=
= += -= *= /= %= &= ^= |= 

?: 

,
, 

= += -= *= /= %= &= ^= |= 

,
, 

122
Ас
Асоцијативност
оцијативност оператора
оператора
Асоцијативност оператора слева удесно ()
тзв. лева асоцијативност оператора
X op Y op Z  (X op Y)
op Z
Асоцијативност оператора здесна улево ()
тзв. десна асоцијативност оператора
X op Y op Z  X op (Y op
Z)
123
Хвала на пажњи
Питања?

Овај приручник намењен је студентима прве године

  • 1.
    Увод у програмирање Уводу програмирање програмски језик C Електротехнички факултет у Источном Сарајеву
  • 2.
    2 Професор Професор Doc.dr Slobodan Obradović,dipl.inž.el. E-mail: sobradovic@vets.edu.yu
  • 3.
    3 Испит Испит • (А илиБ) и Ц ___________________________ • А) 3 Колоквијума – обавезна сва три колоквијума – за сваки колоквијум (51% минимум) • Б) Интегрални испит • Ц) Усмени испит
  • 4.
    4 Литература Литература • Ласло Краус,“Програмски језик С С са решеним задацима”, Академска мисао, Београд, 2004. • Додатна литература
  • 5.
    5 Садржај курса изјезика С Садржај курса из језика С • Дефинисање података • Оператори • Наредбе • Низови • Показивачи • Знакови • Функције • Претпроцесорске наредбе • Структуре • Рад са датотекама • Повезане листе
  • 6.
    6 Историја Историја • Програмски језикC је први пут развијен почетком 1970-тих (Bell Labs, USA) • Намена: основа за развој оперативног система UNIX. • Други виши програмски језици тог времена (COBOL, FORTRAN, PL/I, ALGOL...) су били превише спори. • Као основа за програмски језик C су послужила два виша програмскa језика: ALGOL и BCPL.
  • 7.
    7 Историја Историја • 1960: ALGOL(ALGOrithmic Language) • 1967: BCPL (Basic Combined Programming Language) • 1970: B programming language (без типова) • 1972: C: BCPL + B (уведени типови) • 1978: Kernighan + Ritchie стандард за C • 1989: ANSI стандард за C
  • 8.
    8 Предности С језика ПредностиС језика • Опште намене, од ОС до специфичних проблема • Врло ефикасни компајлери за вели број процесора и оперативних система • Преносивост компајлера • Моћни оператори • Мали скуп наредби и богате библиотеке • Језик средњег нивоа, дакле може ефикасно да приступи и хардверу
  • 9.
    9 Решавање задатака Решавање задатака •Анализа задатка, деф. проблема, подела на делове и одређивање коначног циља • Разрада алгоритма, тј. Решавање задатка • Кодирање програма и превођење на машински језик • Тестирање и отклањање грешака • Израда коначне документације • Употреба и одржавање програма
  • 10.
    10 Писање програма Писање програма •Скуп наредби (instructions, statements) се назива кôд (Code ) или изворни кôд (Source code). • Фајл који садржи кôд се назива Source file. • У C програмском језику се низ наредби групише у целине које се називају функције (function) • Сваки програм мора да садржи бар једну функцију i to funkciju main( )
  • 11.
    11 Како изгледа програму језику Како изгледа програм у језику C C #include <stdio.h> main() { printf(“Primjer”); } } Сваки програм мора да има main функцију main() заглавље функције printf(“Primer”); тело функције (блок наредби) { Почетак блока } Крај блока ; граничник исказа, наредби #include <stdio.h> Претпроцесорска директива
  • 12.
    12 Фазе обраде програма Фазеобраде програма 1. Писање програма (Editing) 2. Предобрада (Preprocessing) 3. Превођење (Compilation) 4. Повезивање (Linking) 5. Има још једна фаза код модерних програмских језика а то је пуњење (Loading) 6. Извршавање (Executing)
  • 13.
    13 1. Предобрада 1. Предобрада# # ( (Preprocessing Preprocessing) ) • Обавља се програмом који се назива preprocessor. • Модификује изворни кôд (у RAM-у) у складу сa наредбама за предобраду (preprocessor directives). Ове наредбе ближе дефинишу начин превођења. • Приликом предобраде се занемарују коментари (comments) и празан простор (white space) из кôда. • Кôд, који је програмер написао и претходно снимио на диск, НЕ МЕЊА се у процесу предобраде!
  • 14.
    14 Претпроцесорка директива Претпроцесорка директива #include<stdio.h> main() { printf(“Primer”); } #include <stdio.h> Претпроцесорска директива Обрађује се пре превођења програма Обавезно почиње са # #include – најчешће коришћена директива Укључује у програм садржај датотеке која се наводи као параметар #include <ime> или #include ”ime” Стандардне библиотеке <stdio.h> функције за стандардни улаз/излаз <math.h> библиотека математичких функција ... #define – често коришћена директива Дефинише симболичке константе i макрое #define IME vrednost #define PI 3.14159 #define EPS 0.0001
  • 15.
    15 Претпроцесорка директива Претпроцесорка директива •Директиве служе за повезивање програма са стандардним библиотекама, сваки програм захтева бар једну stdio.h – Екстензија .h је од речи header, заглавље – Корисник може да прави сопствене библиотеке • Служе за дефинисање симболичких константи, сва константа има засебну директиву • Свака директива почиње са # • Иза ових редова нема ;
  • 16.
    16 Претпроцесорка директива Претпроцесорка директива Пример Пример: : #include<stdio.h> #include <stdio.h> #define PI 3.14159 #define PI 3.14159 #define EPS 1e-6 #define EPS 1e-6 #define MAXINT 32767 #define MAXINT 32767 #define K_OCT 071 #define K_OCT 071 #define K_HEX 0x41 #define K_HEX 0x41 main() () { { printf( ” printf( ”%d %d” ”, , MAXINT MAXINT ); ); printf( printf( ” ”%8.5f %8.5fn” n”, , PI ); PI ); printf( printf( ” ”% %10 10. .8 8f fn” n”, , EPS ); EPS ); printf( printf( ” ”% %d %d” d %d”, ,K_OCT, K_HEX ); K_OCT, K_HEX ); } } #include <stdio.h> Претпроцесорска директива укључује стандардне функције за улаз/излаз података #define PI 3.14159 Претп. директива деф. симболичку константу PI #define EPS 1e-6 Претпроц. директива деф. симболичку константу EPS = 0.000001 #define MAXINT 32767 Претпроцесорска директива деф. целобројну константу MAXINT = 32767 #define K_OCT 071 Дефинише окталну константу K_OCT = 071 Октална константа започиње са 0 071 = 7*8 + 1*1 = 56 + 1 = 57 dec #define K_HEX 0x41 Деф. Хексадецималну константу K_HEX = 0x41 Хексадецимална конст. почиње са 0x 0x41 = 4*16 + 1*1 = 64 + 1 = 65 dec printf( ”%d”, MAXINT ); printf( ”%8.5fn”, PI ); printf( ”%10.8fn”, EPS ); printf( ”%d %d”,K_OCT, K_HEX ); Главни програм (функција main) Исписује вредност дефинисаних константи на екрану За иепис на екран користи се стандардна функција printf()
  • 17.
    17 Претпроцесорка директива Претпроцесорка директива Пример: #include<stdio.h> #define PI 3.14159 #define EPS 1e-6 #define MAXINT 32767 #define K_OCT 071 #define K_HEX 0x41 main() { printf( ”%d”, MAXINT ); printf( ”%8.5fn”, PI ); printf( ”%10.8fn”, EPS ); printf( ”%d %d”,K_OCT, K_HEX ); } printf( ”%d”, MAXINT ); 32767_ printf( ”%8.5fn”, PI ); _3.14159 printf( ” printf( ”%d %d” ”, , MAXINT MAXINT ); ); 0.00000100 printf( ”%10.8fn”, EPS ); printf( printf( ” ”%8.5f %8.5fn” n”, , PI ); PI ); printf( ”%d %d”,K_OCT, K_HEX ); 57_65_ printf( printf( ” ”% %10 10. .8 8f fn” n”, , EPS ); EPS ); printf( printf( ” ”% %d %d” d %d”, ,K_OCT, K_HEX ); K_OCT, K_HEX );
  • 18.
    18 2. Превођење ( 2.Превођење (Compilation Compilation) ) • Програм којим се обавља превођење назива се преводилац (compiler) • Изворни кôд, претходно подвргнут предобради, преводи се у објектни кôд (object code). • Проверава се синтакса грешке (errors) и упозорења (warnings) • Снима објектни кôд на диск (нови фајл). • Ако се приликом превођења констатује грешка, НЕ ГЕНЕРИШЕ се објектни кôд.
  • 19.
    19 3. Повезивање ( 3.Повезивање (Linking Linking) ) • Уколико је кôд писан у више фајлова постоји више фајлова са објектним кодом. • Објектни фајлови се повезују у једну целину како би се формирао извршни фајл (executable file, са екстензијом .еxe). • Други објектни фајлови могу да настану позивањем готових функција из тзв. библиотека (Libraries, Run-Time Library) или објектних фајлова које је креирао програмер. • Уколико се приликом линковања констатује грешка неће се формирати извршни фајл!
  • 20.
    20 Како до извршногпрограма? Како до извршног програма? Повезивање Програм за унос и обраду текста filename1.c filename2.c ... filenameN.c Предобрада Предобрада Предобрада Предобрада filename1.obj ... filenameN.obj filename2.obj Објектни фајлови Фајл након предобраде, памти се у RAM-у Превођење Превођење Превођење Превођење filename1.obj filename1.obj ... filenameN.obj project_filename.prj Извршни програм .exe
  • 21.
  • 22.
    22 Врсте грешака Врсте грешака •Синтаксне грешке (syntax errors) • Грешке при извршавању (run time error) • Грешке намере (semantic error)
  • 23.
    23 Синтаксне грешке Синтаксне грешке •Неправилно раздвајање инструкција • Неправилно отварање-затварање коментара • Коришћење апострофа, наводника, ... Унутар стринга • Неправилна употреба зареза или размака • Позивање функције или променљиве пре него што је дефинисана • Употреба функције као инструкције (увек мора бити на десној страни) и погрешна имена
  • 24.
    24 Грешке при извршавању Грешкепри извршавању • Неправилна употреба контролних структура • Погрешан унос података • Типски конфликти
  • 25.
    25 Грешке намере Грешке намере •Погрешан математички модел • Погрешан алгоритам • Употреба глобалних променљивих • Недостају ознаке за поч. и крај блока • Употреба погрешних услова лог. Фја. • Појава бесконачне петље • Занемаривање грешака заокругљивања
  • 26.
    26 Формат Формат C C програма- стил програма - стил #include <stdio.h> /* C program koji ispisuje: "Zdravo!" */ int main( ) { printf("Zdravo!n"); return 0; } #include <stdio.h>/* C program koji ispisuje: "Zdravo!" */int main () {printf("Zdravo!n");return 0;}
  • 27.
    27 Формат Формат C C програма- стил програма - стил #include<stdio.h> /* C program koji ispisuje: "Zdravo!" */ int main ( ) { printf( "Zdravo!n" ) ; return 0 ; }
  • 28.
    28 Формат Формат C C програма програма •Најпрегледније, најразумљивије • Најлакше за тестирање • Најпогодније за “дораду” • Правила #include <stdio.h > printf("Ovo je veoma, veoma, veoma, veoma,duga linija.");
  • 29.
    29 Улога заграда инеких граничника Улога заграда и неких граничника • () у именима функција, за смештање аргумената • {}, означи почетак и крај тела функције, да издвоји блокове инструкција и ограничи област важења података • ; означава крај једног израза или наредбе • С језик може у једном реду имати јако дуге и угњеждене изразе (више наредби)
  • 30.
    30 Граматика језика Граматика језика •Азбука - скуп дозвољених знакова, симбола • Лексика – исправно писање недељивих целина • Синтакса – исправно писање решеница • Семантика – смисао
  • 31.
    31 Елементи језика Елементи језикаC C • Скуп знакова • Велика и мала слова енглеског алфабета Aa Bb Cc Dd Ee Ff Gg Hh Ii Jj Kk Ll Mm Nn Oo Pp Qq Rr Ss Tt Uu Vv Ww Xx Yy Zz • Децималне цифре 0 1 2 3 4 5 6 7 8 9 • Знаци: : _ ! ? . , : ; ‘ = + - / * # % & | ( ) [ ] { } < >
  • 32.
    32 Лексички симболи -токени Лексички симболи - токени • Идентификати • Службене, резервисане речи (пишу се малим словима енглеске азбуке!) • Константе • Оператори • Сепаратори (граничници) • Знаковни низови
  • 33.
    33 Идентификатори Идентификатори • Служе заозначавање елемената програма (података, симболичких константи, нових типова података, функција ...) и представљају називе објеката језика Правила 1.Могу да се састоје од: – Слова (малих и великих) – Цифара – Знака подвучено ( _ )
  • 34.
    34 Идентификатори Идентификатори 2. Први знаку имену мора да буде слово. Може да буде и знак подвучено али... 3. Дужина имена идентификатора да не буде већа од 31 карактера Пример: JednaPromenljivaKojaImaKarakteraJakoPuno = 1 JednaPromenljivaKojaImaKarakteraSamoJedanVise = 3 4. C разликује мала и велика слова (Rezultat и rezultat) Case Sensitive 5. Имена идентификатора не могу да буду из скупа службених речи.
  • 35.
    35 исправни идентификатори исправни идентификатори sumaNovoIme c5_4 novo_ime JEDAN_BROJ Broj_studenata TX_protocol Broj_Studenata TRUE _split_name UporediRezultat_sabiranja dugoimesamnogokaraktera
  • 36.
    36 неисправни идентификатори неисправни идентификатори 70fспочиње бројем x-name знак - није дозвољен ime sa razmakom размак није дозвољен int резервисана реч axx& знак & није дозвољен Površina*kruga знак * није дозвољен jedan,dva знак , није дозвољен
  • 37.
    37 Службене речи Службене речи(32) (32) auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static while
  • 38.
    38 Подела података Подела података •Скаларни (знаковни, целобројни, реални) • Нескаларни (структуре података)
  • 39.
    39 Логички подаци C нерасполаже логичким типом података у неким програмским језицима то су LOGICAL или BOOLEAN Нису имплементиране ни логичке константе TRUE (istina) i FALSE (laž) Било који података се може посматрати као логички ISTINA ... podatak <> 0 LAŽ ... podatak = 0 Уобичајено је да се користе целобројни подаци Резултат логичких операција је: rezultat=1 -> ISTINA (tačno) rezultat=0 -> LAŽ (netačno)
  • 40.
    40 Подаци, Променљиве итипови података Подаци, Променљиве и типови података • Подаци су предмет обраде у програмима. • Сваки податак има одређене особине, а скуп свих особина једног податка одређује тип податка. • Тип податка је одређен: – скупом могућих вредности које податак може да узме и – скупом могућих операција које је могуће извести над податком.
  • 41.
    41 Подаци Подаци • Подаци упрограму могу да се представе помоћу: – вредности или – идентификатора. c=a+5 • Подаци педставњени преко вредности се називају константе • Подаци педстављени преко идентификатора се називају променљиве
  • 42.
    42 Подаци – симболичкеконстанте Подаци – симболичке константе • Посебан случај непроменљивих података представљају симболичке константе. #define PI=3.14; #define MIN_RASTOJANJE=2; #define Broj_Semestara=8;
  • 43.
    43 Имена, идентификатори променљивих Променљиве(варијабле) Променљива је симболичко име за неку меморијску локацију Свака променљива мора имати неко јединствено име!? име се формира од слова, цифара и знака _ први знак не може бити цифра максимално 31 знак разликују се мала и велика слова: име Slovo различито од slovo МЕМОРИЈА МЕМОРИЈА broj BROJ podatak_1 Broj-1 123A
  • 44.
    44 Променљиве Променљиве СВАКА ПРОМЕНЉИВА МОРАБИТИ ТАЧНО ОДРЕЂЕНОГ ТИПА Тип променљиве не може се мењати током извршења програма променљива може бити неког -скаларног - описана једним бројем, или -нескаларног типа - састоји се од више делова од којих је сваки и засебан и део податка Може да се мења вредност (садржај меморијске локације) зато се и зове променљива (varijabla) MEMORIJA int char A x Z G a ABC 2.35 13 13 6 - 6 5 7 ABC 2.35 D
  • 45.
    45 Типови променљивих података Типовипроменљивих података • Тип неког податка одређује : – Меморијски простор који података заузима – Скуп вредности који тај податак може да има – Скуп операција дефинисаних над њим. • Програмски језик C C познаје само нумеричке типове података – целобројни нумерички типови – реални нумерички типови.
  • 46.
    46 Целобројни типови података Целобројнитипови података • Име типа: –int –short int –long int • Опсег вредности: цели бројеви (унутар датог опсега) – Пример: 5, -35, 401 • Операције: аритметичке (сабирање, одузимање, множење, …), друге
  • 47.
    47 Целобројни типови података Целобројнитипови података • сваки од ових типова може бити неозначен (само позитивне вредности) –unsigned int –unsigned short int –unsigned long int
  • 48.
    48 Пример опсега вредности Примеропсега вредности Тип Бајтова Бита Mин вред. Maкс вред. short int 2 16 -32768 32767 int 4(2) 32 -2147483648 2147483647 long int 4 32 -2147483648 2147483647 не заборавите signed unsigned
  • 49.
    49 Зашто постоје ограничења Заштопостоје ограничења • Са одређеним бројем бита, могуће је дефинисати одређени скуп вредности • 16 бита, 65 536 могућих вредности – 32768 негативних вредности – 1 нула – 32767 позитивних вредности • Прекорачење (Overflow): – покушај да се променљивој додели сувише велика вредности (40 000 у short int)
  • 50.
    50 Целобројни типови података Целобројнитипови података Тип char • Мали означени целобројни податак • величине 8 бита (1 бајт). • Намењен за манипулацију карактерима, али може послужити и за рад са малим бројевима са вредностима у распону од од 128 до 128. • unsigned char може имати вредности од 0 до 255. ( ASCII табела има 256 знакова).
  • 51.
    51 Реални типови података Реалнитипови података • Име типа: –float (4 bajta) –double (8 bajtova) –long double (10 bajtova) • Могуће вредности: реални бројеви, 5.0, -3.5, 4.01 • Операције: аритметичке (сабирање, одузимање, множење, …), друге
  • 52.
    52 Реални типови података Реалнитипови података float: 4 бајта, 32 бита double: 8 bајтова, 64 бита long double: 10 бајтова, 80 бита • Представљање: – mEe – m магнитуда, мантиса (одређени број бита), децимални број и Е ознака за степеновање са основом – е експонент, цео број са знаком
  • 53.
  • 54.
    54 Целобројне нум. константе Целобројненум. константе • Могу бити написане у – децималном, – хексадецималном (основе 16) и – окталном (основе 8) бројевном систему. 974 Декадна константа типа int 0x2fc хексадецимална константа типа int 974l декадна константа типа long int 01234L октална константа типа long int
  • 55.
    55 Целобројне нум. константе Целобројненум. константе • 0xffff негативна вредност-хексадец. • 0xffffuпозитивна вредност-хексадец. • 0723 негативна вредност-октална • 0723u позитивна вредност-октална
  • 56.
    56 Реалне нум. константе Реалненум. константе • Могу бити написане у само у децималном бројевном систему. 2.54Е-34 представља вредност 2.54 10-34 1.23 3е5 125. 2.1Е-45 .456 22.3F Подразумевани тип је double Додавањем суфикса F или f постаје float
  • 57.
    57 Дефинисање података Дефинисање података •Сваки податак (променљива) мора да се дефинише пре употребе! • Општи облик наредбе је tip_podatka ime_podatka; или tip_podatka ime_podatka = početna_vrednost; tip_podatka ime_podatka[= početna_vrednost];
  • 58.
    58 Дефиниција променљиве Дефиниција променљиве Преводиоцу(компајлеру) се мора указати на то да ће се у програму користити нека променљива, како би он могао да резервише потребан простор у меморији Општи облик дефиниције променљиве: tip imepromjenljive [=vrednost] Почетна вредност Не мора се додељивати!! [ ] ове заграде се користе да би се нагласило да нешто није обавезно [=vrednost] На пример. int i,j,n=10; float a, e=2.71; char znak=’+’,c;
  • 59.
    59 Дефинисање података Дефинисање података shortint broj1; short int broj2=34,d, gr=5; char slovo; float a=5.43; float b=12.65; int visina=34/2; float povrsina=a*b;
  • 60.
    60 Иницијализација Иницијализација • је додељивањепочетне вредности (initial value) променљивој • Промељива се не мора иницијализовати (вредност је у том случају случајна) tip_podatka ime_podatka [=početna_vrednost], ...,ime_podatka [= početna_vrednost]; Пример: int broj=2, prisutni=0, godina=2004, br_sati;
  • 61.
    61 Дефинисање непроменљивих података Дефинисањенепроменљивих података • Непроменљиви подаци су именовани подаци чија се вредност не мења. • Дефинишу се на сличан начин с тим да: – дефинисање почиње са кључном речи const – мора бити додељена почетна вредност • Општи облик дефинисања непроменљивих података const tip_podatka ime_podatka = početna_vrednost;
  • 62.
    62 Дефинисање непроменљивих података Дефинисањенепроменљивих података const double e=2.71828182845905; const int br_radnih_dana=26; const float radijus=14; const float cena=14.2, porez=0.22; /* i porez je konstanta*/ const float obim=2*radijus*3.14;
  • 63.
    63 Читање и писањеподатака Читање и писање података • Сви подаци који се уносе са тастатуре се прихватају као знакови (character). • Улазна конверзија се у програмском језику C обавља преко уграђене функције scanf() • Приликом исписа података на монитор потребно је да се обави излазна конверзија, • Ова конверзија се обавља применом уграђене функције printf()
  • 64.
    64 Читање и писањеподатака Читање и писање података • Информације о функцијама scanf() и printf() налазе се у фајлу stdio.h. • Име stdio потиче од standard input output a екстензија .h од header (заглавље). #include <stdio.h> #include "c:nekoime.h"
  • 65.
    65 printf Стандардна функција заизлаз (испис) на екран printf( ”konverzioni string” , lista_argumenata ) ”konverzioni string” Kontrolni (konverzioni) niz određuje način na koji se vrši ispis Štampa se sve što se nađe unutar ” ” sve dok se ne dođe do znaka % Kad se dođe do znaka % gleda se sljedeći znak (grupa znakova) koji se naziva konverzioni karakter Konverzioni karakter definiše kako će se ispisati odgovarajući podatak iz liste argumenata Mora biti onoliko znakova % u cijelom stringu koliko ima i argumenata u listi lista_argumenata Određuje šta treba da se ispiše (koji podaci treba da se ispišu) Argumenti se odvajaju zapetama Argumenti mogu da budu promjenljive, konstante, izrazi
  • 66.
    66 Писање података Писање података printf("Ovoje jednostavna poruka") • Резултат: Ovo je jednostavna poruka printf(format,izraz,...,izraz) • izraz може да представља име променљиве, вредност константе или аритметички израз format има облик: ”%[Sirina][.Prec]Tip_kon”
  • 67.
    67 ” ”% %[ [Sirina Sirina][.Prec] ][.Prec]Tip Tip_ _kon kon” ” Tip_kon Тип Излазниформат -------------------------------------------------------------------------------- i int децимални цео број d int децимални цео број u int неозначени дец. цео број o int неозначени октални број x int неозначени хексадецимални „abcdef” X int неозначени хексадецимални, „ABCDEF” c int карактер дефинисан једним бајтом (ASCII) e float реални број једноструке тачносити, експ облик f float реални број једноструке тачносити стд. облика g float реални број једноструке тачносити облика f ,e у зависности од тога који је погоднији за приказ
  • 68.
    68 Писање података Писање података •printf("%c ", ’A’); резултат је: А • printf("%c %d", ’A’, 35); резултат је: А 35 размак између %c и %d • printf("%c%d", ’A’, 35); резултат је: А35 oвде нема размака. • printf("%c %d %f", ’A’, 35, 4.5); резултат је: А 35 4.500000 • printf("%c %d %е", ’A’, 35, 42.123); резултат је: А 35 4.212300е+001
  • 69.
    69 Пример исписа поразним форматима Пример: #include <stdio.h> main() { int var=65; printf( ”Znakovi:n”); printf( ”%2cn”, ’A’); printf( ”%4cn%6cn”, var, ’B’); printf( ”%8cn”, var+1); printf( ”%3dn”, ’A’); printf( ”%03d”, ’A’); } } MЕМОРИЈА 0100 0001 int var=65; Znakovi: int var=65; printf( ”Znakovi:n”); printf( ”Znakovi:n”); printf( ”%2cn”, ’A’); .A printf( ”%2cn”, ’A’); printf( ”%4cn%6cn”, var, ’B’); ...A .....B printf( ”%4cn%6cn”, var, ’B’); printf( ”%8cn”, var+1); .......B printf( ”%8cn”, var+1); printf( ”%3dn”, ’A’); .65 printf( ”%3dn”, ’A’); printf( ”%03d”, ’A’); 065 printf( ”%03d”, ’A’);
  • 70.
    70 Променљиве и меморија Пример: #include<stdio.h> main() { int i=9,j; float a,b; j=i/2; a=i/2.0; b=a*2.0/j; printf( ”i=%dn”, i ); printf( ”j=%dn”, j ); printf( ”a=%6.2fn”, a ); printf( ”b=%6.2fn”, b ); } MEMOРИJA j j a a b b i i int i=9,j; int i=9,j; int i=9,j; float a,b; float a,b; float a,b; j=i/2; 0000 1001 0000 1001 0000 0000 0000 0000 9 0000 0100 0000 0100 0000 0000 0000 0000 4 1001 0000 1001 0000 0100 0000 0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 4.5 j=i/2; a=i/2.0; a=i/2.0; a=i/2.0; b=a*2.0/j; 0001 0000 0001 0000 0100 0000 0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 2.25
  • 71.
    71 ” ”%[ %[Sirina Sirina][ ][.Prec .Prec] ]Tip Tip_ _kon kon” ” • .Prec представљапрецизност исписа значај само за реалне бројеве: ( e, f, g) • одређује број цифара које ће бити исписане након децималне тачке. • Подразумевана вредност је 6. • Уколико је наведена прецизност мања од броја децимала: исписује се онолико цифара колико прецизност дефинише а последња цифра се заокржује. • За тип конверзије g: одређује укупан број цифара који ће се исписати (целобројни +децимални део). Нема заокруживања.
  • 72.
    72 ” ”%[ %[Sirina Sirina][ ][.Prec .Prec] ]Tip Tip_ _kon kon” ” • printf("%е", 42.126); резултатје: 4.212600е+001 Подразумевана вредност је 6 децимала • printf("%.4е" 42.126); резултат је: 4.2126е+001 Исписује онолико децимала колико је наведено • printf("%.3е", 42.126); резултат је: 4.213е+001 Заокруживање последње децимале
  • 73.
    73 ” ”%[ %[Sirina Sirina][ ][.Prec .Prec] ]Tip Tip_ _kon kon” ” • printf("%f", 42.126); резултатје: 42.126000 Подразумевана вредност је 6 децимала • printf("%.7f", 42.12345679); резултат је: 42.1234568 Заокруживање • printf("%.2f", 42.126); резултат је: 42.13 Заокруживање
  • 74.
    74 ” ”%[ %[Sirina Sirina][ ][.Prec .Prec] ]Tip Tip_ _kon kon” ” • printf("%g", 42.126); резултатје: 42.126 • printf("%.7g", 42.12345678); резултат је: 42.123467 одсецање • printf("%.2g", 42.126); резултат је: 42 • printf("%.2g", 142.126); резултат је: 1.4е+002
  • 75.
    75 ” ”%[ %[Sirina Sirina][.Prec] ][.Prec]Tip Tip_ _kon kon” ” • Sirina Одређујеминимални број карактера који се резервише за испис неког броја. То је позитивна вредност. Уколико је за испис потребно мање карактера од броја који је одређен параметром Sirina, испис се допуњава бленковима (размацима) и поравнава се у десно. • Уколико се испред параметра Sirina наведе 0 бленкови се, уколико постоје, замењују нулама.
  • 76.
    76 ” ”%[ %[Sirina Sirina][.Prec] ][.Prec]Tip Tip_ _kon kon” ” • printf(″%5c%4d″, ’A’,35); резултат је: А 35 /* четири бленка испред А и два бленка испред 35 • printf(″%04d″, 35); • резултат је: 0035 /* нуле замењују празна места • printf("%07.3f", 42.123); /*042.123*/ укупно 7 цифара од тога три цифре након децим. тачке и једна за децим. тачку */
  • 77.
    77 Додатно форматирање Додатно форматирање escapesequence a – bell -- backslash b – backspace ? – question mark f – formfeed ’ – single quote n – new line ” – quote mark r – CR o# – # in octal t – horiz. tab x# – # in hex v – vertical tab
  • 78.
    78 printf("%cnt%dn%fn", 'A',35, 42.126); резултатје: А 35 /* t je znak tab, 35 je pomeren u desno*/ 42.126000
  • 79.
    79 Променљиве и излаз Пример: #include<stdio.h> main() { int i=9,j; float a,b; j=i/2; a=i/2.0; b=a*2.0/j; printf( ”i=%dn”, i ); printf( ”j=%dn”, j ); printf( ”a=%6.2fn”, a ); printf( ”b=%6.2fn”, b ); } MEMORIJA j a b i 0000 1001 0000 0000 9 0000 0100 0000 0000 4 1001 0000 0100 0000 0000 0000 0000 0000 4.5 0001 0000 0100 0000 0000 0000 0000 0000 2.25 b=a*2.0/j; printf( ”i=%dn”, i ); i=9 printf( ”i=%dn”, i ); printf( ”j=%dn”, j ); j=4 printf( ”j=%dn”, j ); printf( ”a=%6.2fn”, a ); a= 4.50 printf( ”a=%6.2fn”, a ); printf( ”b=%6.2fn”, b ); b= 2.25
  • 80.
    80 Читање података-стандардни улаз Читањеподатака-стандардни улаз • Општи облик наредбе је следећи: scanf(format,&podatak,...,&podatak) • Oператор & испред имена променљиве означава да се функцији scanf() додељује меморијска адреса променљиве (податка) на коју се уписује резултат конверзије. • format има исти облик као и код функције printf().
  • 81.
    81 Стандардни улаз података Стандардниулаз података Пример: #include <stdio.h> main() { int broj; /*printf( ”Unesite ceо broj:n” );*/ scanf( ”%d”, &broj ); printf( ”Uneli ste %dn”, broj ); } } MEMOРИЈA broj broj _ 6 00 0000 00 0110 0110 0000 0 0000 000 000 0 Uneli ste 6
  • 82.
    82 Стандардни улаз података Стандардниулаз података Primjer: #include <stdio.h> main() { int broj; printf( ”Unesite cео broj:n” ); scanf( ”%d”, &broj ); printf( ”Uneli ste %dn”, broj ); } } MEMOРИJA broj broj Unesite cео broj: 6 00 0000 00 0110 0110 0000 0 0000 000 000 0 Uneli ste 6 Пре сваке наредбе за унос пошаљите поруку на екран!!
  • 83.
    83 пример 1 пример 1 #include<stdio.h> main() { char cVar; int dVar; float fVar; scanf("%c %d %f", &cVar,&dVar, &fVar); printf("n%c n%d n%fn",cVar, dVar, fVar); }
  • 84.
  • 85.
    85 пример 2 пример 2 #include<stdio.h> main() { int x; char c; float y; scanf("%d %c %f", &x, &c, &y); printf("n%d n%c n%fn",x, c, y); scanf("%d", &x); printf("Da li sam cekao za drugi unos?n"); printf("n%dn",x); }
  • 86.
  • 87.
    87 Оператори Оператори • Радње којесе извршавају над операндима и које дају одређени резултат. – Аритметички оператори – Оператор доделе вредности – Релацијски оператори – Логички оператори – Оператори по битовима – Величина податка – Условни израз
  • 88.
    88 Аритметички оператори Аритметички оператори Бинарни оператори  Име Oператор Пример  Сабирање + num1 + num2  Одузимање - initial - spent  Множење * kolicna * 6  Дељење / suma /kolicina  Модуо % m % n
  • 89.
    89 Дељење Дељење • Ако суоба операнда при дељењу типа int онда ће и резултат бити типа int. 17 / 5 = 3 4 / 3 = 1 35 / 9 = 3 #include <stdio.h> main() { int x=5, y=2, а; float z; а=x/y; /* a=2 */ z=x/y; /* z = 2.5 */ }
  • 90.
    90 Дељење Дељење • Aко јебар један операнд типа float резултат ће бити типа float. • Примери: 17.0/ 5 = 3.4  4/ 3.2 = 1.25  35.2/9.1 = 3.86813 • Објашњење? Целобројни (int) операнд се привремено конвертује у реалну вредност (float), па се онда обави дељење.
  • 91.
    91 Дељење нулом Дељење нулом •Дељење нулом није математички дефинисано. • Ако у току извршавања програма дође до дељења нулом то ће проузроковати прекид извшења програма fatal error.
  • 92.
    92 Модуо - Остатакпри дељењу Модуо - Остатак при дељењу • Израрз m % n даје целобројни остатак дељења m са n. • Оба операнда МОРАЈУ бити целобројна • Примери : 17 % 5 = 2  6 % 3 = 0  9 % 2 = 1  5 % 8 = 5  a % b = a – (a/b)*b
  • 93.
    93 Модуо - Остатакпри дељењу Модуо - Остатак при дељењу Primjer: #include <stdio.h> main() { int sek; printf( ”Unesite vreme u sekundama: ” ); scanf( ”%d”, &sek ); /* ovde se ucitava podatak */ printf( ”To je: %02d:%02d:%02dn”, sek/3600,sek%3600/60,sek %60 ); } } Unesite vreme u sekundama: 4000 To je: 01:06:40 Пример употребе % оператора
  • 94.
    94 Аритметички оператори Аритметички оператори •Унарни оператори: +, - Представљају предзнак операнда • Унарни оператори: ++, −−  Оператор ++ увећава вредност операнда за 1 (increment).  Оператор −− умањује вредност операнда за 1 (decrement).
  • 95.
    95 Унарни оператори: ++,−− Унарни оператори: ++, −− а++; /* одговара наредби а = а+1; */ ++а; /* одговара наредби а = а+1; */ а--; /* одговара наредби а = а-1; */ --а; /* одговара наредби а = а-1; */
  • 96.
    96 Унарни оператори: ++,−− Унарни оператори: ++, −− int broj_a, broj_b, broj_c, broj_d; broj_a = 3; broj_b = 6; broj_c = broj_b++; /* broj_c je jednak 6 a nakon toga se povećava b na 7*/ broj_c = ++broj_a; /* prvo se broj_a poveća na 4 a potom je broj_c jednak 4*/ broj_d= broj_b; /* broj_d je jednak 7*/
  • 97.
    97 Оператор доделе вредности Оператордоделе вредности operator = += - = *= /= %= Општи облик ime_promenljive [operator]= izraz
  • 98.
    98 Оператор доделе вредности Оператордоделе вредности Пример: #include <stdio.h> main() { int a,b,c; a=b=c=10; printf( ”%d %d %dn”, a,b,c ); a = (b=10) + (c=20); printf( ”%d %d %dn”, a,b,c ); } MEMOРИJA a a 0000 1010 0000 1010 0000 0000 0000 0000 b b 0000 1010 0000 1010 0000 0000 0000 0000 c c 0000 1010 0000 1010 0000 0000 0000 0000 10 10 10 0001 0100 0001 0100 0000 0000 0000 0000 0001 1110 0001 1110 0000 0000 0000 0000 30 10 20
  • 99.
    99 Оператор доделе, пример Оператордоделе, пример broj_a=3; broj_c= broj_b; a=а+1; a += b; /* isto je sto i a=a+b; */ a -= b; /* isto je sto i a=a-b; */ a *= b; /* isto je sto i a=a*b; */ a /= b; /* isto je sto i a=a/b; */ a %= b; /* isto je sto i a=a%b; */ a=b=c=27; b += c+2; /* isto je sto i b=b+(c+2); */ d *= e-5; /* isto je sto i d=d*(e-5); */
  • 100.
    100 Релацијски оператори Релацијски оператори >веће од a > b < мање од a < b >= веће и једнако a >= b <= мање и једнако a <= b == једнако a == b != није једнако a != b • Резултати поређења су целобројног типа (int) и могу имати вредност: – 1 ако релација важи или – 0 уколико релација не важи.
  • 101.
    101 Релацијски оператори, пример Релацијскиоператори, пример 3.1 != -3.1 /* rezultat 1 */ 5.2 >= 6 /* rezultat 0 */ 7<= 7 /* rezultat 1 */ 0.5 == 4.2 /* rezultat 0 */ a != 5 /* rezultat zavisi od vrednosti promenljive a */
  • 102.
    102 Логички оператори Логички оператори !негација && логичко И || логичко ИЛИ
  • 103.
    103 Логички оператори, пример Логичкиоператори, пример • да ли се вредност променљиве налази између 10 и 100 (10<а) && (а<100) /* Ako je a>10 i a<100 vrednost izraza je 1, u suprotnom 0*/ • да ли је апс. вредност променљиве већа од 15 • (а <-15) || (а>15) /* ako je a<-15 ili a>15 vrednost izraza je 1, u suprotnom 0 */
  • 104.
    104 Оператори по битовима Операторипо битовима ~ комплемент << логичко попмерање у лево >> логичко померање у десно & логичко И на битском нивоу | логичко ИЛИ на битском нивоу ^ ексклузивно или (exor)
  • 105.
    105 Оператори по битовима,пример Оператори по битовима, пример • 0x1234 & 0x5678 (4660 & 22136) 0001 0010 0011 0100 & 0101 0110 0111 1000 = 0001 0010 0011 0000=0x1230(4656) • 0x1234 | 0x5678 0001 0010 0011 0100 | 0101 0110 0111 1000 = 0101 0110 0111 1100 =0x567c
  • 106.
    106 Оператори по битовима,пример Оператори по битовима, пример • 0x1234 ^ 0x5678 0001 0010 0011 0100 ^ 0101 0110 0111 1000 = 0100 0100 0100 1100 =0x444c • ~0x1234 ~0001 0010 0011 0100 = 1110 1101 1100 1011 =0xedcb • 0x0001<<5 0000 0000 0000 0001 <<5 = 0000 0000 0010 0000
  • 107.
    107 Оператори над битовима,пример Оператори над битовима, пример & - битско AND Пример: #include <stdio.h> main() { char c=’9’; short cifra; cifra = c & 0x0F; printf( ”%dn”, cifra ); } MEMOРИJA c c 00 0011 11 10 1001 01 cifra cifra c c 00 0011 11 10 1001 01 00 0000 00 1 1001 001 0x0F 0x0F 00 0000 00 1 1111 111 & & 00 0000 00 1 1001 001 9
  • 108.
    108 Оператори над битовима,пример Оператори над битовима, пример | - битско OR Пример: #include <stdio.h> main() { short cifra=9; char c; c = cifra | 0x30; printf( ”%cn”, c ); } MEMORIJA cifra cifra 00 0000 00 10 1001 01 c c cifra cifra 00 0000 00 10 1001 01 00 0011 11 1 1001 001 0x30 0x30 00 0011 11 0000 0000 | | 00 0011 11 1 1001 001 9
  • 109.
    109 Оператори над битовима Операторинад битовима ~ - битско NOT Пример: #include <stdio.h> main() { short x=1,y; y = ~x; printf( ”%dn”, y ); } MEMOРИJA x x 00 0000 00 0 00 001 01 y y x x 00 0000 00 0 00 001 01 1111 1111 1110 1110 ~ ~ 1111 1111 1110 1110 -2
  • 110.
    110 Оператори над битовима Операторинад битовима ^ - XOR (EX ILI) Пример: #include <stdio.h> main() { short x=0x73,y; y = x^0x32; printf( ”%cn”, y ); } MEMORIJA x x 0 0111 111 0011 0011 y y x x 0 0111 111 0011 0011 0 0100 100 0001 0001 0x32 0x32 00 0011 11 0010 0010 ^ ^ 0 0100 100 0001 0001 A
  • 111.
    111 Оператори померања Оператори померања <<- померање лево Пример: #include <stdio.h> main() { short x=3,y; y = x<<1; printf( ”%dn”, y ); } MEMOРИJA x x 00 0000 00 0 00 011 11 y y x x 00 0000 00 0 00 011 11 0 0000 000 0 011 110 0 << <<1 1 0000 0000 0110 0110 6
  • 112.
    112 Оператори померања Оператори померања <<- померање лево Пример: #include <stdio.h> main() { short x=3,y; y = x<<4; printf( ”%dn”, y ); } MEMOРИJA x x 00 0000 00 0 00 011 11 y y x x 00 0000 00 0 00 011 11 0 0011 011 0 0000 000 << <<4 4 0011 0000 0011 0000 48
  • 113.
    113 Оператори померања Оператори померања >>- померање десно Пример: #include <stdio.h> main() { short x=12,y; y = x>>1; printf( ”%dn”, y ); } MEMOРИJA x x 00 0000 00 1100 1100 y y x x 00 0000 00 1100 1100 0 0000 000 0 011 110 0 >> >>1 1 0000 0000 0110 0110 6
  • 114.
    114 Оператори померања Оператори померања >>- померање десно Пример: #include <stdio.h> main() { short x=-4,y; y = x>>2; printf( ”%dn”, y ); } MEMOРИJA x x 1111 1111 11 110 00 0 y y x x 1111 1111 11 110 00 0 11 1111 1111 11 1111 >> >>2 2 1111 1111 1111 1111 -1
  • 115.
    115 Величина податка Величина податка •Bеличина меморијске локације коју заузима неки податак се може израчунати употребом оператора sizeof. • Примери: sizeof( short int); sizeof( long int); sizeof( broj_a); sizeof( broj_a*broj_b-3);
  • 116.
    116 Условни оператор Условни оператор uslov? izraz1 : izraz2 c= (a>b) ? a : b; c=(x<=y && y>=z) ? y : (x+z)/2
  • 117.
    117 Условни оператор Условни оператор Условниоператор Условни оператор (?:) (?:) Општи облик Општи облик: : uslov ? izraz1 : izraz2 uslov ? izraz1 : izraz2 ISTINA LAŽ uslov izraz1 izraz2 нпр. y = 5; x = (y>0) ? 100 : 200; ---------- x  100 нпр. y = -2; x = (y>0) ? 100 : 200; ---------- x  200
  • 118.
    118 Конверзија типа Конверзија типа •Бинарни оператори захтевају да два оператора имају исти тип. • Када то није испуњено долази до аутоматске конверије типова. 5+6.0 /* isto sto i 5.0+6.0*/ 5/4+3 /* rezultat 4*/ 3.0*5/4 /* (3.0*5)/4=(3.0*5.0)/4 15.0/4 =15.0/4.0=3.75 */
  • 119.
    119 Конверзија типа Конверзија типа •Експлицитном наредба за промену типа применом тзв. cast-оператора. • Његов општи облик је: (novi_tip) izraz int a; (char)a; float x; double y; y=sin((double)x);
  • 120.
    120 Редослед извршавања оператора Редоследизвршавања оператора • Редослед извршавања оператора је унапред дефинисан одговарајућим приоритетом . • Заграде ( ) имају највиши приоритет.
  • 121.
    121 Приоритет оператора Приоритет оператора Приоритети асоцијативност оператора Приоритет и асоцијативност оператора Приоритет Приоритет оператори оператори Асоцијативност Асоцијативност највиши највиши најнижи најнижи ( ( ) ) { } -> . { } -> .   ! ~ ++ -- + - * & (tip) ! ~ ++ -- + - * & (tip)   ( ) { } -> .   * / % * / %   ! ~ ++ -- + - * & (tip)   + - + -   * / %   << >> << >>   + + -   < <= > >= < <= > >=   << >>   == != & ^ | && || == != & ^ | && ||   < <= > >=   ?: ?:   == != & ^ | && ||   = += -= *= /= %= &= ^= |= = += -= *= /= %= &= ^= |=   ?:   , ,   = += -= *= /= %= &= ^= |=   , ,  
  • 122.
    122 Ас Асоцијативност оцијативност оператора оператора Асоцијативност оператораслева удесно () тзв. лева асоцијативност оператора X op Y op Z  (X op Y) op Z Асоцијативност оператора здесна улево () тзв. десна асоцијативност оператора X op Y op Z  X op (Y op Z)
  • 123.