UUP_2 C Osnove C, osnovne strukture C PDF
Document Details
Uploaded by VibrantAphorism
Небојша Станковић
Tags
Summary
This document provides an overview of the C programming language. It discusses the history, advantages, and disadvantages of C, focusing on its versatility and efficiency. It also briefly outlines fundamental concepts related to C, such as its structure and key components.
Full Transcript
Шта је С? ❑ Програмски језик C је виши програмски језик опште намене, средњег нивоа и омогућава програмирање како на нивоу хардвера (манипулација битима, процесорским регистрима, приступу подацима на основу адресе итд.), тако и на нивоу сложених података као што су ст...
Шта је С? ❑ Програмски језик C је виши програмски језик опште намене, средњег нивоа и омогућава програмирање како на нивоу хардвера (манипулација битима, процесорским регистрима, приступу подацима на основу адресе итд.), тако и на нивоу сложених података као што су структуре. ❑ Рад на нивоу бита карактерише језике ниског нивоа, а рад на нивоу структуре језике високог нивоа – зато се каже да је он језик средњег нивоа. ❑ У почетку, језик C је развијен да се користи за даљи развој Unix оперативног система. До тада су оперативни системи били писани у асемблеру и очигледна је била потреба за програмским језикoм вишег нивоа. ❑ Други виши програмски језици тог времена (COBOL, FORTRAN, PL/I, ALGOL...) су били превише спори. ❑ Као основа за програмски језик C су послужила два виша програмскa језика: ALGOL (ALGOrithmic Language) и BCPL (Basic Combined Programming Language). 2 Историјат програмског језика С Језик Година Развијен од стране Algol 1960 International Group BCPL 1967 Martin Richard B 1970 Ken Thompson Traditional C 1972 Dennis Ritchie K&RC 1978 Brian Kernighan & Dennis Ritchie ANSI C 1989 ANSI Committee ANSI/ISO C 1990 ISO Committee C99 1999 Standardization Committee 3 Историјат програмског језика С (наставак) ❑ Корен свих савремених језика је АЛГОЛ (Алгоритамски језик). АЛГОЛ је био први рачунарски програмски језик који је користио блок структуру, а представљен је 1960. године. ❑ Године 1967. Мартин Ричардс (Martin Richards) је развио језик под називом BCPL (Basic Combined Programming Language). BCPL је изведен из АЛГОЛ-а. ❑ Кен Томпсон (Ken Thompson ) је 1970. створио језик који користи BCPL под називом В. И BCPL и В програмски језици су били без типова. ❑ С је развијен коришћењем BCPL и В од стране Дениса Ричија (Dennis Ritche) почетком 1972. godine у Беловим лабораторијама (Bell Labs, USA). ❑ Прву дефиницију језика C дали су 1978. године Brian Kernigham и Dennis Ritche у књизи “The C programming language”, који је служио као референца (K & R стандард језика C) за језик све док није успостављен формални стандард у историји језика С. Овде описани C назива се “класични C”. ❑ У лето 1983. године, Амерички национални институт за стандарде (American National Standard Institute (ANSI)) формирао је комитет са циљем успостављања С стандарда. ❑ Крајем 1989. године појављује се ANSI стандард С89 (ANSI С). ❑ Након неколико ажурирања и исправки направљених од ISO (International Organization for Standardization) комитета, 1990. године успостављен је међународни стандард (ANSI/ISO C). 4 ❑ Године 1999. изашла је нова верзија С99 којом је програмски језик С значајно промењен. Та верзија се назива „стандардни С“, ћемо проучавати. Предности С језика 1. C је савремени језик. Укључује оне управљачке структуре које препоручује теоријско и практично програмирање. Резултат оваквог приступа је поуздан и читљив програм. 2. Опште је намене. Користи се од оперативних система до специфичних проблема. 3. C је ефикасан. Има врло ефикасне компајлере за велики број процесора и ОС. С програми су обично компактни и брзи за извршавање. 4. C је преносиви језик (преносивост компајлера). Пружа изузетну преносивост софтвера. Компајлери из овог језика су имплементирани на скоро 40 типова рачунарских система, у распону од 8-битних микропроцесора до најмоћнијих суперкомпјутера тренутно доступних. 5. C је моћан и флексибилан језик. Програми написани у С-у се користе за решавање физичких и техничких проблема, па чак и за производњу анимираних филмова. 6. C је језик средњег нивоа. Има низ контролних конструкција које се обично повезују са асемблерским језиком. Може ефикасно да приступи хардверу. 7. C је погодан језик. Довољно је структуриран да подржи добар стил 5 програмирања, а да вас не оптерећује ограничењима. Има мали скуп наредби и богате библиотеке. Недостаци С језика 1. Сигурност. C језик не сакрива много података јер се више фокусира на видљивост. Стога је безбедност овог програмског језика веома упитна. 2. Без објектно оријентисаног програмског приступа. Само програмирање оријентисано на процедуре је подржано у језику С. Објектно оријентисано програмирање је одсутно (инкапсулација, полиморфизам и наслеђивање недостају у програмском језику С). 3. Откривање грешака (Error Detection). С језику такође недостаје функција провере грешака у времену извођења. Само он подржава проверу типа компајлирања. То значи да се грешке приказују само ако је развој програма завршен. Процес може постати додатно компликован за веће програме. 4. Подршка за именски простор (Namespace Support). Концепт именског простора није присутан у језику С. Именски простор је скуп команди који омогућава декларисање истих имена са различитим променљивим. 5. Управљање меморијом. Сви потребни ресурси се аутоматски додељују програмским језиком С. Стога, у овом језику нису присутне било какве технике управљања меморијом. Међутим, С пружа опцију за динамичку алокацију меморије коришћењем бесплатних функција. 6 6. Нема конструктора и деструктора. Објектно оријентисано програмирање долази са функцијом која се зове конструктори и деструктори. Решавање задатака - кораци 1. Анализа задатака, дефинисање проблема, подела на делове и одређивање коначног циља. 2. Разрада алгоритама, тј. решавање задатка 3. Кодирање програма и превођење на машински језик 4. Тестирање и отклањање грешака 5. Израда коначне документације 7 6. Употреба и одржавање програма Како изгледа програм у програмском језику С 8 Фазе извршења С програма 1. Креирање програма (Editing) 2. Претходна обрада / предобрада (Preprocessing) 3. Превођење програма (Compilation) 4. Повезивање програма са функцијама из С библиотеке (Linking) 5. Извршавање програма (Executing) 9 10 Креирање (писање) програма ❑ С програм се пише у едитору текста, потом се чува у датотеку са екстензијом.с. ❑ Скуп наредби (instructions, statements) се назива кôд (Code) или изворни кôд (Source code). ❑ Фајл који садржи кôд се назива Source file. Пример: student.c ❑ У C програмском језику се низ наредби групише у целине које се називају функције (function) ❑ Сваки програм мора да садржи бар једну функцију и то функцију main( ) 11 Предобрада, претпроцесорска директива ❑ Предобрада је фаза у којој се први пут прослеђује изворни код. ❑ Обавља се програмом који се назива preprocessor. ❑ Приликом предобраде се занемарују коментари (comments) и празан простор (white space) из кôда. ❑ Кôд, који је програмер написао и претходно снимио на диск, НЕ МЕЊА се у процесу предобраде! ❑ Претходно обрађени излаз student.c чува се у датотеци student.i. ❑ Претпроцесорска директива ❑ Директиве служе за повезивање програма са стандардним библиотекама, сваки програм захтева бар једну stdio.h ❑ Екстензија.h је од речи header, заглавље ❑ Корисник може да прави сопствене библиотеке ❑ Служе за дефинисање симболичких константи, свака константа има засебну директиву 12 ❑ Свака директива почиње са # ❑ Иза ових редова нема ; Превођење (компајлирање програма) ❑ Након што се изворни кôд претходно обради фајл (student.i) je спреман за превођење, преводи се у објектни кôд (object code). Програм којим се обавља превођење назива се преводилац (compiler). Након компајлирања креира се компајлирана датотека student.s, која је на нивоу асемблера. ❑ Током процеса превођења, компајлер проверава синтаксе грешке (erros) и упозорења (warnings). Ако C компајлер не даје грешку, онда се у следећој фази student.s узима као улаз и од стране асемблера претвара га у објектни код student.o (креира се нови фајл на диску). ❑ Ако се приликом превођења констатује грешка, НЕ ГЕНЕРИШЕ се објектни кôд. ❑ Ова датотека садржи упутства на нивоу машине. У овој фази, само постојећи код се претвара у машински језик, а позиви функција се не решавају. Пошто објектна датотека није извршна, процес се преноси 13 на линкер, који на крају производи.exe датотеку student.exe. Повезивање и извршавање програма ❑ Уколико је кôд писан у више фајлова постоји више фајлова са објектним кодом. Објектни фајлови се повезују се помоћу линкера у једну целину. ❑ Линкер повезује објектни код програмског фајла са функцијама библиотеке С, што резултира извршном датотеком (executable file, са екстензијом.еxe, student.exe). ❑ Други објектни фајлови могу да настану позивањем готових функција из тзв. библиотека (Libraries, Run-Time Library) или објектних фајлова које је креирао програмер. ❑ Уколико се приликом линковања констатује грешка неће се формирати извршни фајл! ❑ Врсте грешака: ❑ Синтаксне грешке (syntax errors) ❑ Грешке при извршавању (run time error) ❑ Грешке намере (semantic error) ❑ Oтклањање грешака – дибаговање (deBUGing): bug - computer bugs – debug 14 ❑ Извршавање програма је врло једноставан задатак. Помоћу loader-а извршни код се учитава у RAM и извршава. Елементи програмског језика С 1. СКУПОВИ ЗНАКОВА – чине их мала и велика слова енглеског алфабета, децималне цифре, знакови интерпукције. Програмски језик C ПРАВИ разлику између малих и великих слова (Case Sensitive). 2. ЛЕКСИЧКИ СИМБОЛИ – су недељиви низови знакова. У језику C се деле на: идентификаторе, константе, службене речи, операторе и сепараторе. 3. КОМЕНТАР – то је произвољан текст који започиње са “” и служи за појашњења у програму. 4. НАРЕДБЕ – то су низови лексичких симбола. Деле се на декларативне и извршне. Декларативним наредбама се дефинишу неки елементи програма (нпр. подаци, потпрограми), док се извршним наредбама изводе елементарне обраде података. 5. ПРОГРАМИ – су низови наредби помоћу којих се обично врши обрада података. Једна наредба се може протезати на више линија (редова) текста. Завршава се знаком “;” 6. ДИРЕКТИВЕ ПРЕТПРОЦЕСОРУ- су упутства да се неки подаци укључе током компајлирања. Директиве претпроцесору почињу знаком “#”. Препозанју се по 15 томе да први не-бели знак у линији кода је знак “#” Идентификатори ❑ Идентификатори служе за обележавање свих врста елемената програма: података, симболичких константи, типова података које дефинише програмер, потпрограма и ознака које служе као одредиште за наредне скокове. ❑ Могу да се састоје од слова енглеске абецеде (малих и великих), цифара декадног бројног система и специјалног знака доња црта (“_”). ❑ Први знак у имену не може да буде цифра и дужина имена идентификатора не сме да буде већа од 31 карактера ❑ C разликује мала и велика слова (Student и student). ❑ Имена идентификатора не могу да буду из скупа службених (резервисаних) речи: auto, break,case, char, const, continue, default, do, double, else, enum, extern, float, for, goto, if, int, long, register, return, short, signed, sizeof, static, struct, switch, typedef, union, unsigned, void, volatile, while. ❑ Исправни идентификатори: X x Zbir SumaGodina x1_a AKS broj_knjiga Broj_Knjiga _poc mini 16 ❑ Неисправни идентификатори: 66god (почиње цифром); Broj indeksa (размак); float (службена реч); X,y (запета); a*b (знак *); Br-nep (знак -) Типови података ❑ Податак је сваки објекат који се обрађује. ❑ Податак је потпуно одређен типом података који укључује: ❑ скупом могућих вредности које може да узме ❑ скупом могућих операција које се могу да изведу над тим податком. ❑ Подаци у програму могу се представити помоћу вредности или помоћу идентификатора. ❑ Два основна типа података су константе и променљиве. То су објекти у оквиру програма који се карактеришу својим: ❑ именом, ❑ типом података који се могу доделити променљивој, ❑ скупом оператора који се може применити над тим вредностима, ❑ меморијским простором за смештај ❑ КОНСТАНТЕ су подаци које не мењају своју вредност током извршвања програма. Ако се константе представе помоћу идентификатора – то су онда симболичке константе (#define pi 3.141592 #define Broj_studenata 8). ❑ ПРОМЕНЉИВЕ то су подаци који могу мењати своју вредност током извршвања програма. ❑ Све податке можемо груписати у 1) основне и 2) сложене или структуиране ❑ Основни (прости) подаци: целобројни (short, int, long); реални/мешовити 17 (float, double); знаковни (char) ❑ Сложени или структуирани подаци: низови; структуре; уније Декларисање променљивих ❑ Свака променљива мора да се декларише пре употребе! ❑ Декларисати неку променљиву значи: ❑ одредити јој тип (тип података које може да чува), ❑ дати јој назив (име, идентификатор) и ❑ у меморији рачунара одвојити простор за смештај конкретне вредности (вредност која се додељује променљивој). ❑ Основни формат (наредба) декларисања променљивих у програму је: tip_podataka promenljiva1, promenljiva2,... ; ❑ Декларација променљивих се може вршити у оквиру главне функције програма (main) или у оквиру функција које дефинише сам програмер. ❑ Ако узмемо у обзир главну функцију програма – main, декларација променљивих се врши након отворене витичасте заграде иза main() функције. #include // uključivanje header file-a (datoteke) stdio.h main() //glavna funkcija programa { int suma; // deklaracija celobrojne promenljive suma suma=500+150; // dodeljivanje vrednosti promenljivoj suma 18 printf(“Suma 500 i 150 iznosi %d”, suma); // ispis vrednosti na standardnom izlazu } Иницијализација променљивих ❑ Да би се доделила (иницијализирала) нека вредност некој променљивој, користи се оператор =. ❑ Наредба за доделу има облик ime_promenljive = vrednost; ❑ Уколико се ради о целим бројевима (тип int), вредности се могу задати у три различита бројна система: ❑ уколико вредност почиње цифром која није нула, број се третира као декадни. ❑ уколико почиње нулом, број се третира као октални, а ❑ уколико почиње са 0x или 0X број се третира као хексадекадни. int x, y, z; x = 123; // dekadni broj y = 0123; // oktalni broj 19 z = 0x123; // heksadekadni broj Целоброји типови података ❑ Податак неког од целобројних типова (целобројне константе, променљиве, изрази, функције) може имати као вредност неки цео број. ❑ Опсег у коме се може кретати дата вредност одређен је типом који је коришћен (short, int, long) и разликује се по броју бајтова искоришћених за регистровање података: ❑ short int – смањени опсег представљања целобројних променљивих на пола (1 или 2 бајта - 8 или 16 бита), ❑ int - основни целобројни тип (2 или 4 бајта - 16 или 32 бита) ❑ long int – повећани опсег (удвостручени) представљања целобројних променљивих (4 бајта - 32 бита) ❑ long long int - повећани опсег представљања целобројних променљивих (8 бајта - 64 бита) ❑ Сваком од наведених типова може се додати префикс unsigned: unisigned int, unisigned int short, unisigned long int. ❑ То значи да ће се податак тог типа третирати као неозначен цео број,20тј. декларишу се променљиве које чувају само ненегативне вредности или податке без знака. Целобројни типови података (опсези) Дужина у Ознака типа Опсег вредности бајтима 1 од -128 до 127 short int 2 oд -32768 до 32767 1 од 0 до 255 unsigned short int 2 од 0 до 65535 2 oд -32768 до 32767 int 4 од -2,147,483,648 до 2,147,483,647 (од -231 до 231 -1) 2 од 0 до 65535 unsigned int 4 од 0 до 4,294,967,295 (од 0 до 232 -1) long int 4 од -2,147,483,648 до 2,147,483,647 (од -231 до 231 -1) unsigned long int 4 од 0 до 4,294,967,295 (од 0 до 232 -1) од -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807 long long int 8 21 (од -263 до 263 -1) unsigned long long int 8 од 0 до 18,446,744,073,709,551,615 (од 0 до 264 -1) Знаковни тип података ❑ Променљиве и констaнте типa char меморишу карактере. ❑ Променљиве и константе овог типа учествују у изрaзимa својом кодном вредношћу у коме је сваки карактер кодиран својом 7-битном вредношћу ASCII кода. ❑ Та вредност ASCII кода третирa се кaо целобројнa вредност која означава мали цео број који служи да представи ASCII код било којег знака из скупа прописаних знакова (ти знаци су са тастатуре). ❑ Константе типа char се добијају стављањем карактера између једноструких наводника: ‘А’, ‘2’, ‘а’. ❑ Подаци типа char могу бити: ❑ signed char – говори да се ради о означеном малом целом броју ❑ unsigned char - говори да се ради о неозначеном малом целом броју Дужина у Ознака типа Опсег вредности бајтима signed char од -128 до 127 22 char 1 од -128 до 127 или од 0 до 255 unsigned char од 0 до 255 Реални типови података ❑ Реални (мешовити) типови података (float) – реалне променљиве, које могу чувати вредности реалних бројева (вредности са децималним зарезом). ❑ Постоје три врсте реалних података: ❑ float - реални податак једноструке тачности (4 бајта), ❑ double – реални податак двоструке тачности (8 бајтова), ❑ long double - реални податак вишеструке тачности(10 бајтова). ❑ Табела са опсезима: Ознака Дужина у Опсег вредности Прецизност типа бајтовима float 4 1,2*10-38 < 𝑥 < 3,4*1038 до 6 цифара double 8 1,7*10-308 < 𝑥 < 1,7*10308 до 15 цифара 23 long 10 3,4*10-4932 < 𝑥 < 1,1*104932 до 19 цифара double Аритметички оператори ❑ Аритметички оператори, као што им само име говори, служе за извршавање аритметичких операција. ❑ Оператори су симболи који означавају одређену операцију и који повезују један или више операнада у израз. ❑ Постоји укупно 7 аритметичких оператора, 2 унарна (имају један аргумент) и 5 бинарних (имају два аргумента): ❑ ++ увећавање за 1 (инкрементирање) – унарни ❑ -- умањивање за 1 (декрементирање) – унарни ❑ + сабирање - бинарни, ❑ - одузимање - бинарни, ❑ * множење - бинарни, ❑ / дељење - бинарни, ❑ % остатак при дељењу (само за целе бројеве) - бинарни ❑ Нпр. израз 8%3 даје остатак при дељењу броја 8 са бројем 3, тј. 24даје вредност 2. Оператори додељивања ❑ Оператор доделе је бинарни оператор који смешта вредност десног операнда на локацију чије се име налази са леве стране оператора. ❑ Постоје две групе оваквог оператора: ❑ елементарни оператор додељивања (=) (i=i+2), ❑ сложени оператори додељивања, који су настали комбиновањем аритметичких оператора и оператора додељивања: ❑ += додаје се вредност операнда са десне стране оператора вредности операнда са леве стране (i+=2) ❑ -= одузима се вредност операнда са десне стране оператора од вредности операнда са леве стране (х-=2 еквивалентно са х=х-2) ❑ *= вреднст израза са десне стране множи се вредношћу операнда на левој страни и то је нова вредност левог операнда (х*=2 еквивалентно са х=х*2) ❑ /= вредност операнда са леве стране се дели вредношћу операнда са десне стране и то је нова вредност левог операнда (х/=2 еквивалентно са х=х/2) ❑ %= вредност операнда са леве стране се дели вредношћу операнда са десне стране и остатак тог дељења је нова вредност левог операнда (х%=2 еквивалентно са х=х%2) ❑ ^= вредност операнда са леве стране се степенује вредношћу операнда 25 са десне стране и то је нова вредност левог операнда (х^=2 еквивалентно са х=х^2) Аритметички оператори и изрази (примери) Опер- Опис оператора Пример атор + Сабирање x=x+2 - Одузимање x=x-2 * Множење x=x*2 / Дељење x=x/2 % Модул (остатак при дељењу) x=10%2, је x=0 (10/2 је 5 и остатак 0) = Додељивање x=5 += Сабирање и додељивање x+=3 је исто што и x=x+3 -= Одузимање и додељивање x-=3 је исто што и x=x-3 *= Множење и додељивање x*=3 је исто што и x=x*3 /= Дељење и додељивање x/=3 је исто што и x=x/3 26 %= Остатак дељења и додељивање x%=3 је исто што и x=x%3 ^= Степеновање и додељивање x^=3 је исто што и x=x^3 Релацијски оператори ❑ Ови оператори имају исти смисао као и у математици. ❑ У ову групу оператора спадају: ❑ > веће, ❑ < мање, ❑ >= веће или једнако, ❑ c) { наредба или блок наредби која следи иза кључне речи else. max = a; } ❑ Не постоји ограничење на наредби чије је извршавање else условљено if наредбом, тако да је могуће угњеждавати if наредбе. { Mai max = c; ❑ Пример: Максимум три броја } as r } a else { if (b > c) as r as r { c a c max = b; } ax = c ax = ax = c ax = a else { max58= c; } } Каскадни if (else-if) ❑ if–else наредба има само две гране – када је услов испуњен и када није. Међутим некада је потребно испитати више услова и у зависности од њихових вредности извршавати одређене наредбе. У тим случајевима се користи else-if израз (каскадна if наредба). if (uslov1) float x; naredba_1 printf("\tUnesite realan broj: "); else if (uslov2) scanf("%f",&x); if(x > 0) naredba_2 printf("\tBroj %.2f je pozitivan\n",x);... else if(x < 0) else if (uslovn) printf("\tBroj %.2f je negativan\n",x); naredba_n else else naredba printf("\tBroj %.2f je jednak nuli\n,x"); ❑ Тестирање се завршава са првим од услова који је испуњен и извршава се наредба придружена том услову. 59 ❑ Ако ниједан од услова није испуњен извршава се наредба придружена elsе грани ако је наведена. Условни израз – оператор ? ❑ У програмском језику С постоји оператор ? (условни израз) и то је једини тернарни оператор, тј. има три операнда. ❑ Условни изрази обезбеђују алтернативни начин писања if-else конструкције if(uslov) може се записати као naredba1; (uslov) ? naredba1 : naredba2 else naredba2; # Променљивој maks доделити вредност већег између бројева a и b. if(a>b) maks=a; maks = (a>b)?a:b; else maks=b; 60 Наредба вишеструког гранања IZRAZ ❑ Ако је избор наредби које треба да се изврше условљен def вредношћу целобројног израза онда се ради о switch наредби. Niz naredbi1 ❑ Наредба switch се назива још и наредба вишеструког гранања. Овом наредбом се проверава да ли је неки Niz naredbi2 израз једнак једној од више константних целобројних вредности и у зависности од тога, предузима се Niz naredbi3 одговарајућа акција. Општи облик ове наредбе: ❑ свака vrednost представља одређени случај, Niz naredbin ❑ ако неки случај одговара вредности izraza, извршавање почиње од тог случаја, switch (izraz) { ❑ у случају да izraz има вредност vrednost1, тада се case vrednost1: извршавају naredbe1, у случају да има vrednost2 тада naredbe1 се извршавају naredbe2, а у случају да нема ниједну од break; понуђених вредности (default) тада се извршавају case vrednost2: naredbe2 naredbeN, break; ❑ случај означен са default није обавезан, али ако се... 61 default: default не наведе и ниједан други случај не одговара naredbeN вредности израза онда се неће извршити никаква акција. } # На основу висине одредити идеалну тежину особе. Идеална тежина за особе мушког пола је висина - 100, а за особе женског пола висина - 110. Предвидети Пример 4 уношење индикатора пола: 1 - мушки, женски – било шта друго. //Idealna tezina.c #include main() { int ind; float visina, tezina; printf("\n\ Unetit pol - muskarci 1, zene nesto drugo\n"); printf("\tPol? "); scanf("%d",&ind); printf("\n\tUnesite visinu u cm: "); scanf("%f",&visina); if(ind==1) { tezina=visina-100; printf("\n\tIdealna tezina muskarca visine %.2f je: %.2f\n", visina,tezina); } else { tezina=visina-110; printf("\n\tIdealna tezina zene visine %.2f je: %.2f\n" , visina,tezina); } } 62 Пример 5 # Проверити да ли је дати троцифрени природан број n Армстронгов. Број је Армстронгов ако је једнак збиру кубова својих цифара. //Armstrongov broj.c #include main() { int n, cj, cd, cs; printf("\n\tUneti trocifren prirodan broj: "); scanf("%d", &n); cj=n%10; cd=n/10%10; cs=n/100; printf("\n\tCifre prirodnog broja %d su: \n",n); printf("\n\t\tCifra jedinice - %d \n",cj); printf("\n\t\tCifra desetice - %d \n",cd); printf("\n\t\tCifra stotice - %d \n",cs); if(pow(cj,3)+pow(cd,3)+pow(cs,3)==n) printf("\n\tBroj %d jeste Armstrongov \n",n); else printf("\n\tBroj %d nije Armstrongov \n",n); 63 } # За дато природно x израчунати y по формули 2 x,........ x = 1 Пример 6 y = 3x − 1,........ x = 5 1 / x,........ za..ostale...slucajeve //switch_za uneto x izračunati y.c #include main() { int x; float y; printf("\n\tUneti x: "); scanf("%d", &x); switch (x) { case 1: y=2*x; printf("\n\t y = %.2f\n", y); break; case 5: y=3*x-1; printf("\n\t y = %.2f\n", y); break; default: { if (x!=0) { y=(float)1/x; printf("\n\t y = %.2f\n", y);} else printf("\n\tGreska! Deljenje sa nulom!\n"); } 64 } } Циклуси (петље) 65 Циклуси ❑ Постоји велики број ситуација где је потребно да се одређен скуп операција изврши више пута. Такав низ операција који ће се извршити више пута назива се циклус или петља. Значи, циклична структура је алгоритамска структура код које се одређени број алгоритамских корака понавља више пута. ❑ За низ оператора који образују циклус кажемо да чини тело циклуса а услов који одређује да ли ће се тело циклуса поново извршити називамо излазни критеријум циклуса. ❑ Уколико је број понављања дела алгоритма унапред познат, структура је константна (бројачки циклус). Ако број понављања није унапред познат већ зависи од испуњености неких од услова, структура је променљива (условни циклус). ❑ У зависности од положаја излазног критеријума у односу на тело циклуса, циклуси или петље могу бити са предусловом (while) и са постусловом (do while). ❑ Уколико се не зна тачан број понављања циклуса, користе се наредбе while (за циклус са предусловом) и do while (циклус са постусловом). 66 ❑ У случају када је број понављања познат, онда се креира бројачки циклус, који се организује помоћу наредбе циклуса са параметром for. Наредба for ❑ Циклус for се често назива и бројачки циклус јер је подесан у случајевима кад знамо тачан број понављања. ❑ Променљива чију вредност мењамо након сваког понављања назива се бројачка променљива (бројач). ❑ - име променљиве која представља бројач петље, ❑ - почетна вредност бројача петље, ❑ - коначна вредност бројача петље, 67 ❑ - вредност која се додаје бројачу петље на крају сваке итерације. Наредба for (наставак) inicijalizacija; ❑ Синтакса for наредбе у C-у je: while(uslov) { for (inicijalizacija; uslov; inkrementacija) for петља је blok_naredbi while петља blok_naredbi inkrementacija } ❑ inicijalizacija - врши иницијализацију променљивих које се користе у петљи (што може да буде постављање почетне вредности бројача петље), ❑ uslov - представља услов на основу кога се одлучује да ли ће се тело петље још извршавати или се извршење петље прекида - петља се извршава док је вредност овог израза различита од нуле (услов за извршење тела петље може да буде док бројач петље не постигне своју горњу границу) ❑ inkrementacija - дефинише промену вредности променљивих (корак) које се користе у петљи (корак). Наведена промена се врши након сваке итерације (ту се може дефинисати како се мења вредност бројача петље након сваке итерације). Уколико се овакав параметар изостави подразумева се да је корак једнак један. ❑ Ако je параметар uslov изостављен, сматра се да је услов for петље логички тачан, па се петља понаша као бесконачна петља. 68 ❑ Било који од израза може бити изостављен, али се знак ‘;’ мора писати. Наредба while ❑ Петља while је петља са предусловом. ❑ Петља се извршава вишеструко све док је неки услов тачан. ❑ Синтакса наредбе while је: while(uslov){ blok_naredbi; } ❑ Дијаграм тока који илуструје извршавање дат је изнад ❑ Прво се проверава испуњење задатог uslova и ако је услов испуњен извршава се тело петље (blok_naredbi) и иде се поново на проверу услова и све тако док услов постане неиспуњен. ❑ Када услов постане нетачан, прекида се извршавање while петље и ток програма се помера на прву линију после тела while наредбе 69 ❑ Кључна ствар код while петље је та да се она не мора извршити ниједном, што ће се десити ако је услов иницијално нетачан. Напомена за for и while наредбу! ❑ Водити рачуна о томе да ли је наредба која чини тело петље проста или сложена (блок наредби)! ❑ Ако нема витичастих заграда онда се прва наредба иза while, односно for наредбе третира као тело те петље. ❑ У примеру са while петљом, треба сабрати све једноцифрене бројеве. i=1;s=0; ❑ У овом случају се само наредба i++ понавља у while (in #include t=n n=m main() m=t { int n,m,n1,m1,kor,t; kor=n printf("\n Unesite dva prirodna broja n i m: "); scanf("%d%d",&n,&m); n1=n;m1=m; n mod m0 if (m>n) DA { n=n+kor t=n; n=m; m=t; } kor=n; n while(n%m!=0) 80 n+=kor; printf("\n NZS za brojeve %d i %d je %d\n",n1,m1,n); Kraj } ВАША ПИТАЊА! 81 До следећег сусрета! 82