uvod u programiranje predavanja 1
DESCRIPTION
uvod u programiranjeTRANSCRIPT
Увод у програмирањеУвод у програмирање програмски језик C
Електротехнички факултет у Источном Сарајеву
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. Предобрада # # ((PreprocessingPreprocessing))
• Обавља се програмом који се назива 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””,, MAXINTMAXINT ); );
printf(printf( ” ”%8.5f%8.5f\n”\n”,, PI ); PI );
printf(printf( ” ”%%1010..88ff\n”\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
Октална константа започиње са 0071 = 7*8 + 1*1 = 56 + 1 = 57 dec
#define K_HEX 0x41
Деф. Хексадецималну константу K_HEX = 0x41
Хексадецимална конст. почиње са 0x0x41 = 4*16 + 1*1 = 64 + 1 = 65 dec
printf( ”%d”, MAXINT );
printf( ”%8.5f\n”, PI );
printf( ”%10.8f\n”, 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.5f\n”, PI );
printf( ”%10.8f\n”, EPS );
printf( ”%d %d”,K_OCT, K_HEX );}
printf( ”%d”, MAXINT );
32767_
printf( ”%8.5f\n”, PI );
_3.14159
printf( ”printf( ”%d%d””,, MAXINTMAXINT ); );
0.00000100
printf( ”%10.8f\n”, EPS );
printf(printf( ” ”%8.5f%8.5f\n”\n”,, PI ); PI );
printf( ”%d %d”,K_OCT, K_HEX );
57_65_
printf(printf( ” ”%%1010..88ff\n”\n”,, EPS ); EPS );
printf(printf( ” ”%%d %d”d %d”,,K_OCT, K_HEX );K_OCT, K_HEX );
18
2. Превођење (2. Превођење (CompilationCompilation))
• Програм којим се обавља превођење назива се преводилац (compiler)
• Изворни кôд, претходно подвргнут предобради, преводи се у објектни кôд (object code).
• Проверава се синтакса грешке (errors) и упозорења (warnings)
• Снима објектни кôд на диск (нови фајл).
• Ако се приликом превођења констатује грешка, НЕ ГЕНЕРИШЕ се објектни кôд.
19
3. Повезивање (3. Повезивање (LinkingLinking))
• Уколико је кôд писан у више фајлова постоји више фајлова са објектним кодом.
• Објектни фајлови се повезују у једну целину како би се формирао извршни фајл (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
Формат Формат CC програма - стилпрограма - стил#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
Формат Формат CC програма - стилпрограма - стил
#include<stdio.h>
/* C program koji ispisuje:
"Zdravo!" */
int
main
(
)
{
printf(
"Zdravo!\n"
)
;
return
0
;
}
28
Формат Формат CC програмапрограма
• Најпрегледније, најразумљивије
• Најлакше за тестирање
• Најпогодније за “дораду”
• Правила#include <stdio.h >
printf("Ovo je veoma, veoma,\veoma, veoma,duga linija.");
29
Улога заграда и неких Улога заграда и неких граничникаграничника
• () у именима функција, за смештање аргумената
• {}, означи почетак и крај тела функције, да издвоји блокове инструкција и ограничи област важења података
• ; означава крај једног израза или наредбе
• С језик може у једном реду имати јако дуге и угњеждене изразе (више наредби)
30
Граматика језикаГраматика језика
• Азбука - скуп дозвољених знакова, симбола
• Лексика – исправно писање недељивих целина
• Синтакса – исправно писање решеница
• Семантика – смисао
31
Елементи језика Елементи језика CC
• Скуп знакова • Велика и мала слова енглеског алфабета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 NovoImec5_4 novo_imeJEDAN_BROJ Broj_studenataTX_protocol Broj_StudenataTRUE _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
charA
x
ZGa ABC
2.35
13
13
6-657
ABC
2.35
D
45
Типови променљивих податакаТипови променљивих података
• Тип неког податка одређује :– Меморијски простор који података заузима
– Скуп вредности који тај податак може да има
– Скуп операција дефинисаних над њим.
• Програмски језик CC познаје само нумеричке типове података– целобројни нумерички типови
– реални нумерички типови.
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
””%%[[SirinaSirina][.Prec]][.Prec]TipTip__konkon””
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( ”%2c\n”, ’A’);
printf( ”%4c\n%6c\n”, var, ’B’);
printf( ”%8c\n”, var+1);
printf( ”%3d\n”, ’A’);
printf( ”%03d”, ’A’);
}}
MЕМОРИЈА
0100 0001
int var=65;
Znakovi:
int var=65;
printf( ”Znakovi:\n”);printf( ”Znakovi:\n”);
printf( ”%2c\n”, ’A’);
.A
printf( ”%2c\n”, ’A’);
printf( ”%4c\n%6c\n”, var, ’B’);
...A
.....B
printf( ”%4c\n%6c\n”, var, ’B’);
printf( ”%8c\n”, var+1);
.......B
printf( ”%8c\n”, var+1);
printf( ”%3d\n”, ’A’);
.65
printf( ”%3d\n”, ’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=%d\n”, i );
printf( ”j=%d\n”, j );
printf( ”a=%6.2f\n”, a );
printf( ”b=%6.2f\n”, b );
}
MEMOРИJA
jj
aa
bb
ii
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 10010000 1001
0000 00000000 00009
0000 01000000 0100
0000 00000000 00004
1001 00001001 0000
0100 00000100 0000
0000 00000000 0000
0000 00000000 00004.5
j=i/2;
a=i/2.0;a=i/2.0;a=i/2.0;
b=a*2.0/j;
0001 00000001 0000
0100 00000100 0000
0000 00000000 0000
0000 00000000 00002.25
71
””%[%[SirinaSirina][][.Prec.Prec]]TipTip__konkon””• .Prec представља прецизност исписа
значај само за реалне бројеве: ( e, f, g)• одређује број цифара које ће бити исписане
након децималне тачке. • Подразумевана вредност је 6. • Уколико је наведена прецизност мања од броја
децимала: исписује се онолико цифара колико прецизност дефинише а последња цифра се заокржује.
• За тип конверзије g: одређује укупан број цифара који ће се исписати (целобројни +децимални део). Нема заокруживања.
72
””%[%[SirinaSirina][][.Prec.Prec]]TipTip__konkon””
• printf("%е", 42.126);резултат је: 4.212600е+001
Подразумевана вредност је 6 децимала• printf("%.4е" 42.126);
резултат је: 4.2126е+001
Исписује онолико децимала колико је наведено• printf("%.3е", 42.126);
резултат је: 4.213е+001 Заокруживање последње децимале
73
””%[%[SirinaSirina][][.Prec.Prec]]TipTip__konkon””
• printf("%f", 42.126);резултат је: 42.126000 Подразумевана вредност је 6 децимала
• printf("%.7f", 42.12345679);резултат је: 42.1234568Заокруживање
• printf("%.2f", 42.126);резултат је: 42.13 Заокруживање
74
””%[%[SirinaSirina][][.Prec.Prec]]TipTip__konkon””
• 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
””%[%[SirinaSirina][.Prec]][.Prec]TipTip__konkon””
• Sirina Одређује минимални број карактера који се резервише за испис неког броја. То је позитивна вредност. Уколико је за испис потребно мање карактера од броја који је одређен параметром Sirina, испис се допуњава бленковима (размацима) и поравнава се у десно.
• Уколико се испред параметра Sirina наведе 0 бленкови се, уколико постоје, замењују нулама.
76
””%[%[SirinaSirina][.Prec]][.Prec]TipTip__konkon””
• 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("%c\n\t%d\n%f\n", '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=%d\n”, i );
printf( ”j=%d\n”, j );
printf( ”a=%6.2f\n”, a );
printf( ”b=%6.2f\n”, b );
}
MEMORIJA
j
a
b
i0000 10010000 0000
9
0000 01000000 0000
4
1001 00000100 0000
0000 00000000 0000
4.5
0001 00000100 0000
0000 00000000 0000
2.25
b=a*2.0/j;
printf( ”i=%d\n”, i );
i=9
printf( ”i=%d\n”, i );
printf( ”j=%d\n”, j );
j=4
printf( ”j=%d\n”, j );
printf( ”a=%6.2f\n”, a );
a= 4.50
printf( ”a=%6.2f\n”, a );
printf( ”b=%6.2f\n”, 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 %d\n”, broj );
}}
MEMOРИЈA
brojbroj
_
6
00000000 0110 0110
0000 00000 0000000
Uneli ste 6
82
Стандардни улаз податакаСтандардни улаз података
Primjer:
#include <stdio.h>
main()
{ int broj;
printf( ”Unesite cео broj:\n” );
scanf( ”%d”, &broj );
printf( ”Uneli ste %d\n”, broj );
}}
MEMOРИJA
brojbroj
Unesite cео broj:
6
00000000 0110 0110
0000 00000 0000000
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%f\n",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%f\n",x, c, y);scanf("%d", &x);printf("Da li sam cekao za drugi \ unos?\n");printf("\n%d\n",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 = 135 / 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:%02d\n”, 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 %d\n”, a,b,c );
a = (b=10) + (c=20);
printf( ”%d %d %d\n”, a,b,c );}
MEMOРИJA
aa0000 10100000 1010
0000 00000000 0000
bb0000 10100000 1010
0000 00000000 0000
cc0000 10100000 1010
0000 00000000 0000
10 10 10
0001 01000001 0100
0000 00000000 0000
0001 11100001 1110
0000 00000000 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( ”%d\n”, cifra );}
MEMOРИJA
cc00001111 10 100101
cifracifra
cc00001111 10 100101
00000000 1 1001001
0x0F0x0F00000000 1 1111111&&
00000000 1 1001001
9
108
Оператори над битовима, примерОператори над битовима, пример
| - битско OR
Пример:
#include <stdio.h>
main()
{
short cifra=9;
char c;
c = cifra | 0x30;
printf( ”%c\n”, c );}
MEMORIJA
cifracifra00000000 10 100101
cc
cifracifra00000000 10 100101
00001111 1 1001001
0x300x3000001111 00000000||
00001111 1 1001001
9
109
Оператори над битовимаОператори над битовима
~ - битско NOT
Пример:
#include <stdio.h>
main()
{
short x=1,y;
y = ~x;
printf( ”%d\n”, y );}
MEMOРИJA
xx00000000 00000101
yy
xx00000000 00000101
11111111 11101110~~
11111111 11101110
-2
110
Оператори над битовимаОператори над битовима
^ - XOR (EX ILI)
Пример:
#include <stdio.h>
main()
{
short x=0x73,y;
y = x^0x32;
printf( ”%c\n”, y );}
MEMORIJA
xx00111111 00110011
yy
xx00111111 00110011
00100100 00010001
0x320x3200001111 00100010^̂
00100100 00010001
A
111
Оператори померањаОператори померања
<< - померање лево
Пример:
#include <stdio.h>
main()
{
short x=3,y;
y = x<<1;
printf( ”%d\n”, y );}
MEMOРИJA
xx00000000 00001111
yy
xx00000000 00001111
00000 000 00111100
<<<<11
00000000 01100110
6
112
Оператори померањаОператори померања
<< - померање лево
Пример:
#include <stdio.h>
main()
{
short x=3,y;
y = x<<4;
printf( ”%d\n”, y );}
MEMOРИJA
xx00000000 00001111
yy
xx00000000 00001111
00011 011 00000000
<<<<44
0011 00000011 0000
48
113
Оператори померањаОператори померања
>> - померање десно
Пример:
#include <stdio.h>
main()
{
short x=12,y;
y = x>>1;
printf( ”%d\n”, y );}
MEMOРИJA
xx00000000 11001100
yy
xx00000000 11001100
00000 000 00111100
>>>>11
00000000 01100110
6
114
Оператори померањаОператори померања
>> - померање десно
Пример:
#include <stdio.h>
main()
{
short x=-4,y;
y = x>>2;
printf( ”%d\n”, y );}
MEMOРИJA
xx11111111 11110000
yy
xx11111111 11110000
111111 111111 1111
>>>>22
11111111 11111111
-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 : izraz2uslov ? 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
Хвала на пажњи
Питања?