четвртак, 25 априла, 2024
Како да...?

Увод у програмски језик C (2. део)

Аутор: Стефан Ножинић

У претходном броју смо дали оквирну слику о томе како изгледа један једноставан C програм који смо назвали Hello world и који је имао задатак да на стандардни излаз исписује реченицу Hello, world. Такође смо објаснили једноставан процес превођења изворног C кода у извршни коришћењем GNU Compiler-а (gcc). У овом делу вам објашњавамо шта су то типови података, променљиве и како да им доделите вредности у програму или да их учитате са стандардног улаза. Такође вам представљамо и неке основне, али и честе грешке које праве не само почетници него и искусни програмери. Ове грешке се називају синтаксне грешке и настају обично када се јави грешка у куцању (тзв. typo).

Типови података

У радној меморији рачунара чувају се разни подаци, као што су бројеви, текст, имена и друго. На пример, када отворите овај часопис, ваш PDF читач (или ePUB, ако читате то издање) вероватно је учитани фајл сместио у RAM (Random Access Memory), одатле чита потребне податке и приказује их на вашем екрану. Ти подаци се пре приказивања обично обрађују, па тако добијате лепу и читљиву страницу овог документа. Код PDF читача ово се зове рендеровање и служи да векторски формат прикаже као слику на екрану.

Као што смо рекли, постоје разни подаци који се могу чувати у меморији. Они су подељени по њиховом садржају и за сваки тип података је одређено тачно колико меморије заузима. Заузеће меморије зависи од програмског језика, али и од архитектуре на којој се покреће програм, односно за коју је програм преведен (компајлиран).

Сваки тип, поред своје величине, има свој скуп могућих вредности (домен), скуп операција које се могу извршити над овим типом података и скуп релација које важе за овај тип података. Овде вам представљамо неке основне типове података, њихове кључне речи у C програмском језику које ће нам бити корисне код дефинисања променљивих и дајемо вам увид у неке операције, односно релације за сваки од наведених типова.

Први тип који ћемо да поменемо, јесте integer. Ово није најједноставнији тип, али се обично наводи као први јер је најближи човековом схватању рачунара. Овај тип описује целе бројеве (…, -2, -1, 0, 1, 2, …) и кључна реч у C-у му је int. Домен овог типа су цели бројеви који улазе у опсег [-231 , 231 – 1]. Сигурно сте се запитали зашто баш овакав опсег и како смо дошли до њега. Одговор лежи у чињеници да на већини архитектура integer заузима 4B односно 32 бита. Ако сте у добрим односима са комбинаториком, онда знате да је то укупно 232 комбинација, па је домен подељен на негативне вредности, позитивне вредности и нулу. Операције које важе за овај тип података, исте су оне које важе и за целе бројеве у математици. То су операције доделе (оператор = ), сабирање, одузимање, множење, дељење и модуло (% оператор). Ништа није другачије ни са релацијама, па ту имамо релације једнакости (== оператор), веће, мање, веће или једнако, мање или једнако и није једнако. Потребно је обратити пажњу да се оператор за доделу вредности ( = ) обележава са једним знаком једнакости, док се релација за једнакост обележава са два.

Следећи тип података је char. Он представља један карактер. Заузима 1B у меморији, па је тиме могуће описати 256 вредности. Ово је сасвим довољно да опише енглески алфабет, бројеве и још доста других знакова. Најчешћа операција је операција доделе, а најчешћа релација је релација еквиваленције (= – додела, == – релација еквиваленције). Свако слово има своју бројчану вредност која се може видети у ASCII табели.

Тип података који служи за опис неких реалних бројева је double. За њега важе све релације и операције као и за integer, изузев модуло операције (она нема овде сврхе, зар не? – прим.аут.).

Последњи тип података који ћемо поменути у овом тексту, јесте bool (boolean у неким другим језицима). За његов опис је такође потребан 1B и може имати само две вредности, а то су true или false, односно тачно и нетачно. Операције које се могу извршити на овим типовима, јесу операција доделе, логичко „и” (&&), логичко „или” (||) и логичко „не” (!). Овај тип података враћа све релације на другим типовима података, па се овај тип, иако не на први поглед, доста користи у условном гранању, о којем ће бити више речи у наредном тексту.

Променљиве

Сада када знамо оквирно чему служе неки основни типови података, можемо да их искористимо и сачувамо нешто у меморију.

Свака променљива мора да има свој тип података. Променљиве би обично требало да имају вредност, али ће се ваш програм успешно превести чак и кад нека променљива не буде имала додељену вредност. Наравно, треба напоменути да ово искључиво зависи од подешавања вашег преводиоца. Свака променљива се дефинише на следећа два начина:

tip_podataka ime_promenljive = vrednost;
tip_podataka ime_promenljive;

У првом случају је променљивој додељена одмах вредност, док у другом случају она нема вредност (има неку насумичну вредност која нам није од неке користи). Што се тиче другог случаја, променљивој можемо доделити касније вредност, коришћењем оператора доделе:

ime_promenljive = vrednost;

Следе примери дефинисања неких променљивих:

int a = 1;
int b = 1000;
int c = -5645;
char d = 'a';
bool e = true;
double f = 0.0015;

Учитавање променљивих са стандардног улаза

Сви они који редовно користе конзолне програме, знају да они могу да питају корисника за неки податак током свог извршавања и да чекају да корисник тај податак унесе. Овај податак се потом смешта у меморију и касније се користи и обрађује. После обраде резултат се исписује на стандардни излаз, коришћењем нама свима добро познате функције printf коју смо користили у нашем првом програму да бисмо исписали фразу Hello, world! на стандардни излаз.

Неко је рекао да се уз пример најбоље учи, а ми кажемо да се уз пример најбоље објашњава.

Програм који учитава два броја и потом исписује њихов збир:

#include <stdio.h>

int main()
{
    int a;
    int b;
    printf("Unesite dva broja: ");
    scanf(" %d %d", &a, &b);
    int zbir = a+b;
    printf("Zbir je: %d", zbir);
    return 0;
}

Као што можемо видети, користили смо исто main функцију као прошли пут, учитали смо исту библиотеку, али нам је код унутар наше main функције мало другачији. Прво смо дефинисали две променљиве типа int које нам служе да у њих учитамо задате бројеве. Потом, помоћу нове функције scanf учитавамо те бројеве. Ова функција захтева string који говори како да парсира улаз, па тако функција зна да ми очекујемо два цела броја (%d) размакнута једним размаком. Потребно је приметити да је размак направљен и на почетку string-а, што функцији говори да не обраћа пажњу на специјалне знакове, као прелазак у нови ред (ентер). Ово значи да ви можете унети први број, притиснути тастер ентер, а затим унети други број и опет притиснути ентер. Функција тражи и имена променљивих у које ће бити учитане вредности. Потребно је приметити знак & на почетку имена обе променљиве. Овај знак говори да се податак упише на локацију адреса тих променљивих у меморији. Ако вам ово изгледа збуњујуће, верујте – нисте једини. О адресама у локацијама у меморији ћемо писати у будућим бројевима када будемо дискутовали о показивачима. Као што сте могли да приметите, обе функције (scanf и printf) користе специјалне изразе да би се навео тип података. Тако %d говори да се на улазу очекује int тип података, или да се на излазу исписује вредност променљиве тог типа. Неки остали знакови за форматирање су:

  • %c – карактер типа char
  • %lf – реални број, тип података double
  • %d – цео број, int тип података

Честе синтаксне грешке

Оставићемо за крај променљиве и типове мало по страни и враћамо се поново на почетак. Хајде да видимо, које све грешке могу да се направе и како преводилац реагује на њих.

Посматрајмо следећи код:

#include <stdio.h>

int main()
{
    printf("Hello, world!\n");
    return 0
}

Ако ово покушамо да преведемо са коришћењем gcc преводиоца као у тексту који је објављен у прошлом броју, добићемо следећу грешку:

error: expected ‘;’ before ‘}’ token

Као што видимо, негде смо изоставили „;”, тј. тамо где је требало да се налази. Потребно је погледати у ред где стоји return 0 без потребног знака на крају.

Погледајмо сада овај код:

#include <studio.h>

int main()
{
    printf("Hello, world!\n");
    return 0;
}

Шта каже преводилац?

fatal error: studio.h: No such file or directory

Видите ли где је грешка? Омашили смо назив библиотеке!

А ово?

#include <stdio.h>

int main()
{
    printf("Hello, world!\l");
    return 0;
}

излаз:

warning: unknown escape sequence: '\l' [enabled by default]

Као што видимо, специјалан карактер „\l” не постоји. Потребно је приметити да ће се по почетним подешавањима овако нешто превести уз упозорење.

Завршетак

У овом тексту смо вам дали основне информације о типовима података, променљивама и стандардном улазу и излазу. Исто тако смо показали неке стандардне грешке које праве почетници, али и они искусни, како бисмо вам указали на грешке које ваш преводилац избацује и које вам могу помоћи да исте грешке уклоните. Овде треба напоменути да преводилац не упозорава на грешке које нису стриктно везане за сам језик, па вас тако неће упозорити ако сте направили део програма који може да се закуца, или ако сте направили сигурносни пропуст.

Претходни део овог серијала можете прочитати овде.

Наредни део овог серијала можете прочитати овде.

2 thoughts on “Увод у програмски језик C (2. део)

  • Hvala na ukazanim greškama.

    Serijal „Uvod u programski jezik C“ ima 11 delova, i već su objavljeni u LiBRE! časopisu (od 23. do 30. broja i od 32. do 35. broja). Možete da preuzmete posebno brojeve pa da pročitate nastavke serijala, a možete i da sačekate, jer ćemo u narednih desetak dana objaviti na sajtu preostale delove ovog serijala.

    Srdačan pozdrav,
    – LiBRE! time

  • Postoje dve malene greške u tekstu:

    1. ‘;’ fali kod „return“ naredbe u primeru sa sabiranjem brojeva
    2. Programski jezik C ne poznaje logički „bool“ tip kao primitivni, već je „utkan“ pomoću celobrojnog tipa. Od izvesnog standarda postoji proširenje za njegovu podršku putem biblioteke , tako da primer inicijalizacije promenljive tipa „bool“ je svojstven za programski jezik C++.

    Serijal mi se sviđa, voleo bih da što duže traje. 🙂

Comments are closed.