Унос и приказ целих бројева¶
Пошто програмски језик C потиче са UNIX система, он све уређаје третира као датотеке. Тако и податке које требаш унети у програм или исписати из програма можеш посматрати као датотеке које садрже низове сукцесивних знакова који се називају токови (енгл. streams).
Улазни подаци читају се из тока stdin
, излазни уписују у ток stdout
, а
кодови грешака насталих при извршењу програма уписују се у ток stderr
.
Извориште података за унос може бити тастатура, било који улазни уређај или
датотека, док одредиште за испис може бити екран, штампач, било који излазни
уређај или датотека. Ток stdin
назива се стандардни улаз, ток stdout
стандардни излаз и ток stderr
стандардни излаз за грешке.

Ове школске године, једино извориште података које ћеш користити је тастатура, а једино одредиште за испис података екран. Коришћење других изворишта и одредишта биће теме следеће школске године.
Подаци се са тастатуре уносе као низ знакова, у меморији представљају у бинарном облику и на екрану исписују у текстуалном облику. У току преноса знакова унетих са тастатуре у бинарни облик у меморији, врши се улазна конверзија. У току преноса бинарних података из меморије у текстуални облик који се исписује на екрану врши се излазна конверзија.
У програмском језику C наредбе за улаз/излаз формирају се коришћењем посебних
функција дефинисаних у заглављу stdio.h
. У овом заглављу дефинисано је више
функција које се могу користити за улаз/излаз, а ти ћеш користити функцију
printf()
за излаз и функцију scanf()
за улаз.
Функција за приказ података¶
Функцију printf()
до сада си користио само за испис текста који се налазио
између наводника. Међутим, ова функција има и могућност исписа података било
ког типа на стандардном излазу тј. на екрану уз примену излазне конверзије.
Каже се да ова функција обавља форматирани излаз јер као аргумент користи
низ знакова којима се управља конверзијом, а који се назива формат.
Библиотечка функција printf()
има следећи општи облик…
printf(format, lista_argumenata);
…где је format
низ знакова записан између наводника који може наизменично
да садржи текст (укључујући и размаке), управљачке карактере и спецификаторе
конверзија, док lista_argumenata
садржи вредности које ће бити исписане,
обично у форми идентификатора или израза. Спецификатор конверзије прецизно
одређује начин конверзије податка који се исписује. Увек почиње знаком %
и
има општи облик:
%[dodatne_opcije]simbol_konverzije
Симболи конверзије за излазне податке целобројног типа су:
d
илиi
- означени цео број у декадном бројевном систему,u
- неозначени цео број у декадном бројевном систему,o
- неозначени цео број у окталном бројевном систему,x
илиX
- неозначени цео број у хексадекадном бројевном систему.
Место на коме се исписује излазни податак назива се поље. Број знакова који се може сместити у неко поље назива се ширина поља.
Спецификатор конверзије %d
је један од симбола за целобројни податак типа
int
.
Напиши програм у програмском језику C који на стандардни излаз исписује
вредности којима су иницијализоване целобројне променљиве t = 16
и v = 18
.
Нека су то вредности које представљају број година које ученици Тамара и Влада
имају на данашњи дан.
#include <stdio.h>
int main(void)
{
int t = 16, v = 18;
printf("Tamara ima %d, a ", t);
printf("Vlada %d godina.", v);
return 0;
}
На стандардном излазу исписаће се:
Tamara ima 16, a Vlada 18 godina.
У оквиру једне printf()
функције можеш користити више поља истовремено и
претходни програм можеш написати и овако:
#include <stdio.h>
int main(void)
{
int t = 16, v = 18;
printf("Tamara ima %d, a Vlada %d godina.", t, v);
return 0;
}
На стандардном излазу исписаће се исти текст:
Tamara ima 16, a Vlada 18 godina.
Често ће се у задацима тражити да напишеш програм који ће на стандардни излаз исписати само бројчане податке.
Напиши програм у програмском језику C који на стандардни излаз исписује број година које Тамара и Влада и имају на данашњи дан. Нека су то вредности задате у претходним задацима.
#include <stdio.h>
int main(void)
{
int t = 16, v = 18;
printf("%d %d", t, v);
return 0;
}
Сада ће се на стандардном излазу исписати само бројеви:
16 18
Додатне опције које можеш користити у спецификатору конверзије омогућују да
прецизно дефинишеш како ће изгледати испис на главном излазу. Општи облик
спецификатора конверзије са додатним опцијама за функцију printf()
је:
%[parametri][širina][.preciznost][dužina]simbol_konverzije
Знак %
и simbol_konverzije
су обавезни елементи, а између њих можеш
додатно навести, по датом редоследу и следеће необавезне елементе:
параметар
–
означава да се излазни податак поравна у пољу улево (подразумевано је поравнање удесно и додавање размака с леве стране),параметар
+
означава да се испред позитивног излазног податка испише знак плус (подразумевано је да је излазни податак без знака позитиван),параметар размак означава да треба оставити једно празно место испред означеног излазног податка, ако податак нема исписан ни један знак.
параметар
#
за вредности различите од нуле означава обавезно исписивање0
за излазне податке у окталном бројевном систему и0х
или0Х
за излазне податке у хексадекадном бројевном систему.параметар
0
означава да се приликом поравнања удесно, са леве стране излазних података дописују нуле уместо размака.širina
је целобројна вредност која задаје минималну ширину поља, тј. укупан број позиција коју заузима излазни податак (уз допуну размацима са лева). Ако је за приказ излазног података потребно више позиција, поље се аутоматски проширује за потребан број места..preciznost
је целобројна вредност која задаје најмањи број цифара за испис излазног податка. Ако је број цифара за испис мањи од задате вредности, дописују се нуле на почетку, а ако је прецизност задата нулом, за излазни податак0
неће бити исписана ни једна цифра.dužina
се задаје карактеромh
заshort
,l
заlong
, илиll
заlong long
означене или неозначене излазне податке типаint
. Задавањемhh
исписује се карактер на основу задате бројчане вредности из ASCII табеле.
Уместо ширине поља може се ставити знак *
, након чега се вредност за
минималну ширину поља наводи у листи аргумената функције којa мора бити
целобројног типа int
и претходити идентификатору променљиве која се исписује.
Исто важи и за прецизност.
Напиши програм у програмском језику C којим се на стандарни излаз исписују четири
формата записивања датума, раздвојена међусобно знаком |
:
Д.М.Г. формат, где поља нису фиксне ширине (нпр. 1.9.2023.),
ДД-ММ-ГГГГ формат, где су поља фиксне ширине (нпр. 01-09-2023),
ММ-ДД-ГГГГ формат, где су поља фиксне ширине (нпр. 09-01-2023), као у САД, и
ГГГГ-ММ-ДД формат, где су поља фиксне ширине (нпр. 2023-09-01), по ISO 8601 стандарду.
Нека је задат датум: први септембар 2023. године.
#include <stdio.h>
int main(void)
{
int d = 1, m = 9, g = 2023;
printf("%d.%d.%d. | ", d, m, g);
printf("%02d-%02d-%04d | ", d, m, g);
printf("%02d-%02d-%04d | ", m, d, g);
printf("%04d-%02d-%02d", g, m, d);
return 0;
}
На стандардном излазу исписаће се тражена четири формата писања датума:
1.9.2023. | 01-09-2023 | 09-01-2023 | 2023-09-01
Функције за унос података¶
До сада си научио да на стандардни излаз исписујеш податке које си сâм
дефинисао у оквиру програма. Међутим, у већини случајева подаци нису унапред
познати, односно, корисник програма треба сâм да уноси податке. Функција
scanf()
чита податке са стандардног улаза тј. са тастатуре уз примену улазне
конверзије. Каже се да ова функција обавља форматирани улаз јер као
аргумент користи низ знакова којим се управља конверзијом, а који се назива
формат.
Библиотечка функција scanf()
има следећи општи облик:
scanf(format, lista_adresa);
format
је низ знакова записан између наводника који може наизменично
да садржи размаке, управљачке карактере и спецификаторе конверзија.
lista_adresa
садржи адресе променљивих које се записују у облику
&identifikator
, у које се уносе конвертоване вредности учитаних података.
Спецификатор конверзије прецизно одређује начин конверзије податка који се
исписује. Увек почиње знаком %
и има општи облик:
%[dodatne_opcije]simbol_konverzije
Симболи конверзије за излазне податке целобројног типа исти су као и за улазне
податке у функцији printf()
. Општи облик спецификатора конверзије са додатним
опцијама за функцију scanf()
је следећи:
%[*][širina][dužina]simbol_konverzije
Знак %
и simbol_konverzije
су обавезни елементи, а између њих можеш
додатно навести, по датом редоследу и следеће необавезне елементе:
*
, карактер који означава да ће се улазни податак прочитати и игнорисати,širina
, целобројна вредност која задаје највећи број карактера улазног податка,dužina
, задаје се карактеромl
заdouble
илиL
заlong double
.
Функција scanf() сматра се небезбедном функцијом јер не проверава величину унетих података. Ово се показало изузетно опасно, нарочито када је у питању унос низа карактера (енгл. string), о чему ћеш учити следеће школске године. Ако корисник програма унесе дужи низ карактера од предвиђеног, може се десити да се у оперативној меморији препишу подаци који су смештени близу тог низа. То може да узрокује пуцање програма, грешке у раду оперативног система и озбиљне безбедносне пропусте. Због свега наведеног, у новијим верзијама Microsoft C/C++ компајлера, моћи ћеш да користиш функцију scanf() само уз обавезно навођење директиве #define _CRT_SECURE_NO_WARNINGS на почетку програма. Исто ће важити и за групу функција за унос коју ћеш учити следеће школске године. Ова директива неће сметати другим компајлерима, док алтернативна функција scanf_s() коју Microsoft C/C++ компајлер нуди, у другим компајлерима неће бити препозната као библиотечка функција.
Напиши програм у програмском језику C којим се са стандардног улаза уноси број година корисника програма, а потом тај податак исписује на стандардни излаз:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int godine;
printf("Koliko imas godina: ");
scanf("%d", &godine);
printf("Uneo si broj %d", godine);
return 0;
}
Извршавање овог програма може да изгледа овако:
Koliko imas godina: 15
Uneo si broj 15
Једним позивом scanf()
функције можеш унети више података истовремено.
Напиши програм у програмском језику C којим се са стандардног улаза уноси број година корисника програма и његова висина у центиметрима, па се потом унети подаци исписују на стандардни излаз.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int godine, visina;
printf("Unesi redom koliko imas godina i svoju visinu u cm: ");
scanf("%d%d", &godine, &visina);
printf("Ti imas %d godina i visok si %d cm.", godine, visina);
return 0;
}
Извршавање овог програма може да изгледа овако:
Unesi redom koliko imas godina i svoju visinu u cm: 15 176
Ti imas 15 godina i visok si 176 cm.
Програм ће исто радити и ако корисник притисне тастер ENTER
након броја 15
.
Unesi redom: koliko imas godina i svoju visinu u cm: 15
176
Ti imas 15 godina i visok si 176 cm.