

Рецензенти
др Филип Марић, доцент на Математичком факултету у Београду, Милан Чабаркапа, професор у Математичкој гимназији у Београду и Снежана Марковић, професор у VI београдској гимназији
Уредник Слободан Павловић
Одговорни уредник Татјана Костић
За издавача Драгољуб
CIP - Каталогизација у публикацији
Народна библиотека Србије, Београд
37.016:004(075.3)
МАТКОВИЋ, Станка, 1968Рачунарство и информатика : за трећи разред гимназије / Станка Матковић, Душа
Вуковић, Мијодраг Ђуришић. - 1. изд. -
Београд : Завод за уџбенике, 2014 (Лапово : Колорпрес). - 256 стр. : илустр. ; 24 cm
Тираж 1.500. - Библиографија: стр. 254.Регистар.
ISBN 978-86-17-18654-6
1. Вуковић, Душа, 1977- [аутор] 2. Ђуришић, Мијодраг, 1963- [аутор] COBISS.SR-ID 208830476











































































рачунара неопходно је креирати програм у неком програмском језику. Размотримо, на пример, ситуацију када је потребно креирати
вати резултати такмичења ученика. Могући изглед таквог програма, тј. апликације, приказан је на следећој слици.

Рачунарство и информатика
Процес креирања програма је комплексан и у њему се може издвојити неколико фаза.
Поставка проблема Проблем који се решава треба прецизно и потпуно описати на природном језику. То ради корисник коме је програм намењен, у сарадњи са програмерима. Јасно се одређује циљ, анализирају се постојеће информације и прави избор неопходних почетних информација. У нашем примеру проблем би се описао на следећи начин: „Потребан је програм који ће обезбедити уношење резултата одржаног такмичења. За сваког учесника треба унети име, презиме и број освојених поена. Програм обезбеђује преуређење листе, тако да на врху буду они
алгоритма).
изабраног поступка за решавање проблема неопходно је прецизно извести. О поменутим аспектима треба посебно водити рачуна приликом решавања сложених проблема, док се код једноставних проблема они занемарују. Основни проблем у нашем примеру јесте да се
Решавање проблема применом рачунара
11
ција, тј. структура података. За креирање поменутог програма добар
избор програмског језика је C#. Треба анализирати све податке. Број учесника и број поена сваког такмичара су бројеви, док су имена и презимена текстуални подаци. Пошто је број такмичара већи од један, користимо сложену структуру података која нам омогућава чување податке о свим такмичарима.
Кодирање У овој фази, у неком програмском језику, описују се подаци и поступак решавања проблема, дефинисани у претходним фазама. Програм записан у неком програмском језику често се назива кôд, па се зато ова
алгоритам кад су у питању сложенији проблеми и сл. Посебно се креира документација за корисника, која објашњава начин коришћења програма, и документација за програмере, која се користи при одржавању програма. Документација се
Рачунарство и информатика
програма, тако
преправљају постојећи. У овој фази долази и до проширивања програма додавањем нових функционалности.
Када се развија велики пројекат, различити људи и тимови задужени су и специјализовани за различите фазе, које су подједнако важне. Често се фазе решавања проблема циклично понављају.
Оспособљавање програмера за успешно реализовање великих
начин:
подижемо слушалицу, i)
iv) разговарамо, v) спуштамо слушалицу −
поступка. vi) Следећа слика садржи графички приказ.
слушалицу, i)
ii) лефонирање), бирамо број, iii)
iv)
ако добијамо сигнал
корак iii),
ако се позвани корисник не јави− крај поступка v)
vi)
vii) У претходном опису поступка телефонирања кораци
је употребљив ако се његовом применом добија резултат
Програмски језик је средство којим програмер саопштава рачунару програм. Природни језици допуштају неједнозначност и непрецизност. Рачунар може „разумети” само формални запис, не толеришући ни најмање непрецизности.
низови битова имају различита тумачења и различите су
захтева добро познавање начина рада и архитектуре одређеног
једној наред-
би одговара више инструкција симболичког језика. С
рачунар разуме само
типа су: Fortran, Cobol, Basic, Pascal, C, као и машински зависни језици.
Елементи процедуралних програмских језика задржали су се и у програмском језику који се изучава у
уџбенику, тако да
нећемо посебно објашњавати. Показаћемо само примере са сабирањем. Наредба сабирања два броја, приказана у машинском и асемблерском језику, у програмским језицима вишег нивоа још је природнија за програмера и подсећа на наредбу сабирања како је
float zbir = 0, poeni; //unose se poeni sve dok se ne unese nula int broj = 0; scanf(“%f”, &poeni); while (poeni>0) { zbir += poeni; //racuna se zbir broj ++; //prebrojavaju se scanf(“%f”, &poeni); }
printf(“%f”, zbir/broj);
складишта за чување великих количина података.
служе
се добиле неке корисне информације из базе. Претпоставимо да се сви
подаци о такмичарима (име, презиме, број освојених поена и др.) налазе у табели takmicari. Уколико је потребан, просечан број поена освојених на такмичењу одређује се следећом наредбом: SELECT AVG(poeni) FROM takmicari;
Цео поступак израчунавања просечне
језицима, обавља сам систем. Посебну класу чине објектно
у процедуралним језицима који су крајње пасивни. Приступ подацима
објекта контролише програмер; подацима се најчешће може приступити само унутар објекта. Сваки такав објекат изгледа као мали рачунар: има унутрашње стање (недоступно споља) и има операције које можемо захтевати да изврши. Јасно се може уочити аналогија између таквих
објеката и објеката у реалном свету.
Мноштво различитих објеката можемо уочити у графичком корисничком окружењу (енгл. GUI − Graphic User Interface). Дугмад, поља за унос текста и остали слични елементи графичког корисничког окружења су објекти. Сваком је придружен скуп својстава и акција које описују како они реагују на спољашње догађаје,

























такмичара. Сваки појединачни такмичар је примерак (инстанца) класе Takmicar и
описан је скупом вредности атрибута те класе. Вредност атрибута ime
за конкретног такмичара је „Милица”
Програми засновани на прозорима
После креирања објекта можемо да приступамо његовим својствима, на пример takmicar1.Ime, takmicar2.Nagrada, као и да позивамо његове методе. Позив метода takmicar1.OsvojioPoene(300) доделиће такмичару takmicar1 300 поена. Вредности које се проследе методима називају се параметри. На пример, у позиву метода takmicar2. OsvojioPoene(285) вредност параметра је број 285.
Често смо у прилици да уочимо објекте који имају заједниче особине, али и неке специфичности
дугме, поље за унос текста, падајући
ки оквир итд. Ти
називају се и контроле. Сваки од њих има своје карактетристике
(висину, ширину), може да има оквир, насловну линију, можемо да га затворимо, да га померамо по екрану, мењамо димензије, и слично. У објекно оријентисаним језицима постоје многе
Рачунарство и информатика
Програми засновани на прозорима и класе за цртање
Савремени оперативни системи су графички, па и већина програма
која се користи на њима има графички интерфејс. Програму је придру-
жен прозор преко којег комуницира са корисником, често се већи про-
посебан прозор. Унутар прозора углавном се постављају разни графички објекти (компоненте) помоћу којих програм комуницира са
и обрнуто. Најчешће
(
box) , поље за унос бројева (numeric up down), дугме (button), листа (list box), комбинована листа (combo box), радио дугме (radio button), падајући мени (drop-down menu).
акцију (притисак на тастер миша, отпуштање тастера миша, притисак на тастер тастатуре, померање миша, избор ставке из листе итд.) или промену стања у рачунару (истекне одређени временски период). Да би
дошло до жељене реакције објекта, треба написати одговарајући кôд –
Програми засновани на прозорима
У програмима вођеним догађајима програмер не дефинише унапред ток програма, већ корисник дефинише редослед извршавања и ток програма.
Посматрајмо, на пример, апликацију Paint, која је део оперативног система Windows. Корисник ове апликације може да црта по површини за цртање тако што контролише миша. Цртање започиње притиском на тастер миша који активира

се црта. Прво га морамо креирати, а затим користити. Позивањем метода CreateGraphics() за неку контролу креира се објекат класе Graphics, тако
DrawRectangle
Приликом коришћења метода
(објекат
облика, или четку (објекат класе SolidBrush ) ако желимо попуњен
облик. Објектом класе Pen дефинишемо боју, ширину и стил линија и кривих које цртамо. Својство Color објекта класе Pen представља
боју, док својство Width представља ширину линије. Креирање
Point a;
private void Form1_MouseDown(object sender, MouseEventArgs e)
{ a = new Point(e.X, e.Y);
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{ Graphics g = CreateGraphics( );
Pen olovka = new Pen(Color.Black, 3);
Point b = new Point(e.X, e.Y);
g.DrawLine(olovka, a, b);
}












Програмски











слова,


знаци). Као и у сваком другом програмском језику, постоје тзв. службене или резервисане речи које имају унапред дефинисано значење
користити за именовање било каквих објеката. Примери таквих
раније напоменули, у класи разликујемо својства, којима



Увод у развојно окружење програмског језика
Прозор Solution Explorer приказује све делове нашег решењa и
обезбеђује манипулацију њима (брисање, додавање, измена). Решење (Solution) може да се састоји од више пројеката. За сваки пројекат приказане су датотеке од којих се састоји. Ставка References садржи списак библиотека именских простора које користимо у пројекту. Ставка Properties садржи разне додатне информације о пројекту (верзија у којој је рађен пројекат, икона придружена пројекту, врста пројекта итд). Коришћењем ове ставке пројекту
ресурсе, на пример слике, звучне датотеке... За нас, у овом моменту, најважнија ставка Solution Explorer-a је Form1.cs. Двоструким кликом миша на ову ставку, у централном делу окружења отвара се простор у коме можемо дизајнирати изабрану форму (подесити величину, разна њена својства и додавати компоненте на њој). У прозору Toolbox налази се списак








File/Open project из падајућег менија. Приликом отварања можемо
изабрати фајл типа Solution (.sln) (Pahuljica.sln) или типа C# Project file (.csproj) (Pahuljica. csproj). Двоструким кликом на назив форме у прозору Solution Explorer обезбедићемо приказ форме у централном делу окружења.
На пример, корисник уноси податке у поље за унос текста и кликом на дугме покреће одређену акцију у апликацији. Поље за унос текста и дугме су контроле. Апликација приказује
варајуће контроле. Објекте које у фази дизајна укључујемо
System.Windows.Forms.Control

RadioButton
контрола
CheckBox
контрола
TextBox
контрола
Label контрола
ListBox
Text
класе (али почиње малим словом) и броја. Без обзира
Font Својством
ForeColor, BackColor
својстава ForeColor и BackColor.
Width, Height (Size)
Left, Top
Top. Anchor , Dock Коришћењем својства Anchor
„причвршћена“ је константно. На пример, ако је контрола причвршћена за
Enabled Вредност својства Enabled може бити
Visible
ClientRectangle

На пример, контролама типа Button редом
следећа имена btPrikaz, btCrvena, btPlava, btZuta. Својство Name контроле TextBox поставимо на tbIme, а контроле label2 поставимо
lbPozdrav. Контролу label1 нећемо именовати



(sender), као и одређеним параметрима (EventArgs). У зависности од догађаја,
MouseClick
MouseDown
MouseUp
MouseMove
TextChanged Дешава
Resize Дешава



Green, Blue, Yellow, Black, White

Тестирањем апликације
уочити
промене величине форме написани
није центриран. Зато треба испрограмирати реакцију на догађај промене величине форме (Resize). Такође, треба обезбедити
за унос имена избрише претходни садржај контроле lbPozdrav (реакција на догађај TextChanged контроле tbIme ).
private void Form1_Resize(object sender, EventArgs e) { lbPozdrav.Top = (ClientRectangle.Height - lbPozdrav.Height) / 2; lbPozdrav.Left = (ClientRectangle.Width - lbPozdrav.Width) / 2; }
private void tbIme_TextChanged(object sender, EventArgs e) { lbPozdrav.Text=””; }
Проширимо апликацију
контроле GroupBox
две контроле Button, именујмо их btPokreni и btZaustavi. Нема смисла да зауставимо мењање боје уколико га нисмо покренули, тако да вред-
ност својства Enabled за дугме btZaustavi у почетку треба да буде false.
Када корисник притисне дугме btPokreni, треба покренути часовник
и активирати дугме btZaustavi. Притиском на дугме btZaustavi треба
зауставити часовник. Сваким откуцајем (Tick) часовника треба насумично да се промени боја позадине форме. Часовник се покреће позивом метода Start, а зауставља позивом метода Stop. Вредност својства Interval дефинише временски интервал изражен у милисекундама (ms), после којег се понавља откуцај
Next(maxVrednost) – враћа
maxVrednost,
Next(minVrednost, – maxVrednost)
једнак од minVrednost
Структура Color садржи
боја:
од maxVrednost.
FromArgb(nivoCrvene, nivoZelene, nivoPlave).
Вредности nivoCrvene, nivoZelene, nivoPlave су цели
255. Случајну боју можемо
кôда:
private void btPokreni_Click(object sender, EventArgs e)
{ timer1.Interval = 500; timer1.Start();
btPokreni.Enabled = false; btZaustavi.Enabled = true; }
Random r = new Random(); private void timer1_Tick(object sender, EventArgs e)
{
lbPozdrav..ForeColor=Color.FromArgb(r.Next(256), r.Next(256), r.Next(256)); }
private void btZaustavi_Click(object sender, EventArgs e) { timer1.Stop();
btPokreni.Enabled = true;
btZaustavi.Enabled = false; }

форме, својство форме FormBorderStyle
FixedDialog
(редом lbDatum и lbVreme).
ToLongDateString() и ToLongTimeString() структуре DateTime датум и време конвертујемо у стрингове,
и секунд. Добијене стрингове приказујемо у одговарајућим
трола lbVreme и lbDatum.
private void Form1_Load(object sender, EventArgs e) { lbDatum.Text = DateTime.Now.ToLongDateString(); lbVreme.Text = DateTime.Now.ToLongTimeString(); }
класе Timer (timer1) на форму, у прозору Properties, својству Interval додељујемо вредност 1000 (1 секунд), а својству Enabled вредност true. Како и у

FromArgb(nivoCrvene, nivoZelene, nivoPlave).
Вредности nivoCrvene, nivoZelene, nivoPlave су цели
255. Уколико желимо црвену боју, nivoCrvene би морао
има максималну, док би nivoZelene и nivoPlave
FromArgb(255, 0, 0).
FromArgb(198, 25, 51).
(између 180 и 255) за црвени ниво, а малу (испод 100) за зелени и плави. За приказивање једне тачке користимо структуру Point, која представља тачку у равни са целобројним координатама и дефинише један пиксел. Структура Point садржи јавна својства X и Y, којима постављамо и добијамо координате тачке. Приликом креирање једне тачке наводимо два цела броја
DrawLine(Pen olovka, Point A, Point B).

Point o; Random r = new Random(); private void Form1_MouseClick(object sender, MouseEventArgs e)
{ o = new Point(e.X, e.Y); timer1.Start(); timer1.Interval = 30; }
private void timer1_Tick(object sender, EventArgs e)
{ Point b= new Point(r.Next(o.X - 50, o.X + 50),
r.Next(o.Y - 50, o.Y + 50));
Graphics g = CreateGraphics();
Color boja = Color.FromArgb(r.Next(180, 256), r.Next(120), r.Next(120));
Pen olovka=new Pen(boja, r.Next(1,4)); g.DrawLine(olovka, o, b); }
оквира. Преко већег дела форме рашири се површина за цртање pictureBox1, објекат типа PictureBox Боја се мења кликом на дугме (btBoja) коришћењем дијалошког оквира, објекта colorDialog1 класе ColorDialog. У горњем делу форме постављен је joш један објекат, pbBoja (PictureBox), који у сваком тренутку приказује изабрану боју за цртање, односно бојење кругова. У оквиру реакције на догађај Click за контролу btBoja важно је да прикажемо дијалошки оквир colorDialog1. Основни метод свих класа које наслеђују класу CommonDialog јесте ShowDialog(), којим се постиже приказивање дијалога. Овај метод враћа вредност енумерацијског типа DialogResult (None, OK, Cancel, Abort, Retry, Ignore, Yes, No), у зависности од начина напуштања дијалога (које је дугме корисник притиснуо при изласку). Дијалошки оквир ColorDialog има својство Color чија вредност представља изабрану боју.
DrawEllipse
начин:
g.DrawEllipse(olovka, x – a/2, y – b/2, a, b);
Код круга су ширина и висина
чки (x,
g.DrawEllipse(olovka, x – r, y – r, 2*r, 2*r); Пошто
CreateGraphics() на следећи начин:
Graphics g = pictureBox1.CreateGraphics(); За догађај MouseClick треба да
MouseDoubleClick
DrawEllipse класе Graphics
тода FillEllipse и
Color boja = Color.Black; private void btBoja_Click(object sender, EventArgs e) { colorDialog1.ShowDialog(); boja = colorDialog1.Color; pbBoja.BackColor = boja; }
private void pictureBox1_MouseDoubleClick(object sender, MouseEventArgs e)
{ Graphics g = pictureBox1.CreateGraphics(); SolidBrush cetka = new SolidBrush(boja); g.FillEllipse(cetka, e.X - 30, e.Y - 30, 60, 60); }
FromArgb(255, 0, 255).
да нам методом Next
већу вредност (између 180 и 255) за
private void Form1_Load(object sender, EventArgs e) { timer1.Start(); }
Random r = new Random(); private void timer1_Tick(object sender, EventArgs e) { Graphics g = CreateGraphics();
Color boja = Color.FromArgb (r.Next(180, 256), r.Next(100), r.Next(180, 256));
SolidBrush cetka = new SolidBrush(boja); int a = r.Next(15, 30);
Point o = new Point (r.Next(ClientRectangle.Width), r.Next(ClientRectangle.Height));
g.FillEllipse(cetka, o.X - a, o.Y - a, 2 * a, 2 * a);
g.FillRectangle(cetka, o.X - a, o.Y, 2 * a, 3 * a); cetka.Color = Color.SandyBrown; g.FillRectangle(cetka, o.X - a / 4, o.Y + 3 * a, a / 2, 2 * a); }

Graphics g = e.Graphics;

вођене догађајима. За сваки догађај чију реализацију

























Рачунарство и информатика
Цели бројеви представљају се у бинарном бројевном систему одређеним бројем битова. У N битова можемо регистровати неозначене целе бројеве од 0 до 2N-1, а означене целе бројеве од –2N-1 до 2N-1-1. Свакако, све целе бројеве не можемо регистровати јер би било потребно неограничено много битова. Зато се простор за регистровање целих бројева ограничава и, у зависности од величине простора који им је „додељен“, разликује
Слово u на почетку назива неких од типова указује на то да
цифара (прецизности).
Са нумеричким вредностима могу
другим.
ре-
оператора == (једнако), != (различито), < (мање), > (веће), <= (мање или једнако) и >= (веће или једнако).
Над нумеричким вредностима можемо извршавати и бројне математичке функције које су дефинисане као методи класе Math (на пример, Math. Abs(x), Math.Exp(x), Math.Sin(x), Math.Log(x), Mat.Min(x,y), Math. Max(x,y) и други, где су x и y произвољне нумеричке вредности).
Алфанумеричке вредности у програмском језику C# представљамо основним типовима char и string.
Константе типа char пишу се
Типови података
ком аритметичком изразу, систем га третира као цео број. Такође, при
поређењу знакова систем заправо пореди њихове целобројне кодове.
Често се у основне типове програмског језика C# убраја и string иако он представља низ карактера. За разлику од осталих наведених основних типова, количина меморије коју заузима један стринг није унапред
одређена, па број знакова у стрингу није ограничен. Константе типа string наводе се између знакова навода (“”). На пример, стрингови су:
“Ovo je string” “Beograd” “” (празан стринг)
Над стринговима се може извршавати операција конкатенације (надовезивања) која је реализована оператором +. Системски су дефинисани и бројни методи који враћају разне информације о стрингу, издвајају делове стринга, трансформишу стринг... О тим методима биће више речи у наредним поглављима.
вредности
типа, које су представљене константама true и false Са логичким вредностима могу се
уобичајене основне логичке операције (конјункција, дисјункција
представљене одговарајућим операторима (&&, || и !). Оператор ! вишег je приоритета
од оператора && и ||.
У следећој табели приказане су карактеристике неких основних типова података.
Тип Дозвољене вредности Величина int од –2,147,483,648 до 2,147,483,647 (од –231 до 231 –1)
4 бајта (32 бита)
uint од 0 до 4,294,967,295 (од 0 до 232 – 1 ) 4 бајта (32 бита)
long од –9,223,372,036,854,775,808 до 9,223,372,036,854,775,807 (од –263 до 263 – 1 ) 8 бајтова (64 бита)
float од ±1.5 × 10–45 до ±3.4 × 1038 (7 цифара) 4 бајта (32 бита)
double од ±5.0 × 10–324 до ±1.7 × 10308 (15–16 цифара)
8 бајтова (64 бита)
boolfalse (нетачно), true (тачно) 1 бајт (8 битова)
Рачунарство и информатика
Декларација и дефиниција променљиве
Променљива је име (идентификатор) меморијске локације у којој апликација чува вредност. Важно је у програму давати смислена имена као
што су, на пример, ime, brojBodova, suma, olovka итд. За математичке
појмове користе се ознаке као у математици: n, a, b... за бројеве; x, y за
координате и сл.
Идентификатор (име) који програмер дефинише гради се на основу
следећег правила.
Идентификатор је низ слова (великих и малих), знака за подвлачење (_) и цифара. Име мора да почне словом
Према томе, примери идентификатора су
brojSlova, ученик1, Rezultat, радниДан, _x, škola ...,
док
broj-Slova, godisnje+doba, 1dan ...
нису идентификатори.
Важно је напоменути да С# (попут програмског језика С) разликује велика и мала слова тако да идентификатори GodišnjeDoba и godišnjeDoba
нису исти.
У програмском језику С# променљиве су
променљивом вредносног типа садржи вредност, док локација именована променљивом референтног типа садржи адресу локације
променљиве референтног типа
објекат: int x,y; Takmicar takmicar1, takmicar2;
Самом декларацијом променљивој се
подразумевана вредност. Ако желимо да контролишемо вредност променљиве (да јој додељујемо вредност), користимо оператор = (оператор доделе) на следећи начин: <promenljiva>=<izraz>
Тип вредности израза мора се поклапати са типом променљиве (или се имплицитном конверзијом може конвертовати у тип променљиве)1: int x,y; x=5; y=-145+x;
Уколико променљивој декларисаној
не користи подразумевану вредност већ пријављује грешку (коришћење
недодељене вредности).
Декларацијом
референцу (адресу). Да бисмо направили простор за вредност, употребљавамо израз облика new <ime referentnog tipa>(<lista parametara>)
Коришћењем оператора new у динамичкој
регистровање вредности типа <ime referentnog tipa>. Тај оператор враћа адресу додељеног
Takmicar a; a=new Takmicar(“Branislav”, “Zoranovic”);
Рачунарство и информатика
Takmicar(“Branislav”, “Zoranovic”), у простору одвојеном коришћењем оператора new, постављају се одговарајуће вредности.
Дакле увођење променљиве одвија се у два корака:
декларација променљиве
иницијализација променљиве (за променљиве вредносног типа експлицитно наводимо вредност а за променљиве референтног типа оператором new у динамичкој меморији одвајамо простор за вредност одговарајућег типа).
У програмском језику C# дата је могућност
два корака, што врло често користимо. int x=2006; Takmicar a=new Takmicar(“Branislav”, “Zoranovic”); Pen olovka=new Pen(Color.Blue);
definicije atributa i metoda klase
Типови података
Приватност атрибута уведена је да би се подаци заштитили, иако тиме подаци наизглед постају неупотребљиви. Контролисани приступ податку да бисмо, на пример, само прочитали његову вредност или је искористили за одређивање неких других карактеристика објекта, у програмском језику C# можемо обезбедити креирањем јавних својстава (Properties). Природно је да креирајући, на пример, класу квадрат за атрибут изаберемо дужину странице. Као својства можемо дефинисати страницу, површину, обим, дијагоналу квадрата...
Методи углавном служе за комуникацију објеката класе са осталим елементима апликације,
Pen olovka = new Pen(Color.Blue, 2); btnPokreni = new System.Windows.Forms.Button();2 Random r = new Radnom();
Својствима
btnPokreni.Enabled = false; //podatak o tome da li je dugme aktivno btnPokreni.BackColor = Color.Green; //boja pozadine dugmeta olovka.Color = Color.Red; //boja olovke olovka.Width = 4; //debljina olovke
Слично
int x = r.Next(256); //generisanje slucajnog broja g.DrawLine(olovka, x, y, x + 100, y + 100); //crtanje linije
функционалности.
следећи начин:
struct <imeStrukture>
definicije atributa i metoda strukture
којима су реализовани основни типови података: System.SByte(sbyte) , System.Byte(byte) , System.Int16(short) , System.UInt16(ushort) , System.Int32(int) , System.UInt32(uint) , System.Int64(long), System.UInt64(ulong), System.Single(float), System.Double(double), System.Decimal(decimal), System. Char(char) и System.Bool(bool).
одређени поредак, можемо дефинисати енумерацијски (набројиви) тип
следећи
enum <ime tipa> {<vrednost1>, <vrednost2>,…,<vrednostN>}
Наведеним вредностима C# додељује, редом, целобројне константе почев од 0. Тако је вредности <vrednost1> придружена константа 0, а вредности <vrednostN> придружена је константа N-1.
enum DaniUNedelji {Ponedeljak, Utorak, Sreda, Cetvrtak, Petak, Subota, Nedelja}
enum Pol {Muski, Zenski}
enum GodisnjeDoba {Zima, Prolece, Leto, Jesen}
типове:
Променљиве енумерацијског
DaniUNedelji dan; Pol p; GodisnjeDoba doba; Константама енумерацијског
<ime tipa>.<vrednost> Претходно декларисаним
dan=DaniUNedelji.Ponedeljak; p=Pol.Muski; doba=GodisnjeDoba.Jesen;

























Рачунарство
Дефиниција
константе,
v)
Примери исправно записаних
су следећи: 123 a+4*b x>y+12 (12+ x*(a+3))/(b - 3)+1
Оператори
Сваки оператор карактеришу следеће особине: арност оператора (број вредности које повезује; једна − унарни, две − бинарни, три − тернарни),
тип вредности на које се примењује
резултата;
редослед извршавања операција приликом израчунавања вредности израза), асоцијативност (одређује редослед, слева удесно или здесна улево, извршавања операција истог
Врста оператораОператори аритметички+ – * / %
Треба водити рачуна о оператору дељења јер се понаша другачије ако се примени на целе или на реалне бројеве.
Уколико је променљива a типа int и има вредност 2, израз a/4 имаће
вредност 0 јер су операнди цели бројеви, па се израчунава вредност
целобројног дељења.
Уколико је бар један од операнада реалан број, ако променљиву a, на пример, дефинишемо као double с вредношћу 2, примениће се реално
дељење и вредност израза a/4 је 0.5.
Сви релацијски оператори служе за поређење вредности операнада и враћају логичку вредност true или false (тачно или нетачно). Оператори == (једнако), != (различито), < (мање), > (веће), <= (мање или једнако) и >= (веће или једнако) дефинисани су за
Израз облика logičkaVrednost1 && logičkaVrednost2 има вредност true само ако
Израз облика logičkaVrednost1 || logičkaVrednost2 има вредност false само ако
вредности имају вредност false. У противном, вредност израза је true.
Унарни логички оператор ! негира логичку вредност на
мењује и вишег је приоритета од свих до сада
носно 55 је веће од 50. Израз x>10 је тачан,
x<20
онда ни део израза после оператора ||
тачан.
би променљива x имала вредност 2, израз би био тачан јер је
израза (2>50) тачна, а тачно или било шта
даје тачно. Бинарни оператор +, који се уобичајено тумачи као аритметички оператор, када се примењује на нумеричке типове података, може се применити и на операнде типа string. У случају да је, при употреби бинарног оператора +, бар један операнд типа string, онда је оператор + оператор спајања (конкатенације) стрингова, при чему се евентуални операнд који није string аутоматски конвертује у свој текстуални облик.
При наведеним дефиницијама променљивих string ime=”Bane”; int poeni=285;
вредност израза “Takmicar “+ime+” je osvojio “+poeni+” poena.” јe:
Takmicar Bane je osvojio 285 poena.
Као што је наглашено у
<promenljiva>=<izraz>
x= 5
x = x+2
a = b*3+78
p=(a>5) && (a<20)
s=”Ja se zovem “+ime+” “+prezime
<promenljiva>=<promenljiva><op><izraz>
тора доделе <op>= на следећи начин: <promenljiva><op>= <izraz>
Израз x+=3*(y-6)+5 еквивалентан је изразу x=x+3*(y-6)+5
a*=b+c изразу
вредност променљиве мењамо за 1, можемо користити операторе карактеристичне за програмски језик С: ++ (увећање за 1) и –– (умањење за 1). Оператори ++ и –– су унарни оператори, који имају две нотације − префиксну и постфиксну
префиксна нотација ++imePromenljive, ––imePromenljive постфиксна нотација imePromenljive++, imePromenljive––
Рачунарство и информатика По извршавању инструкција
double x = 1.5, y; y=x++;
нова вредност променљиве x је 2.5, а вредност променљиве y једнака је старој вредности x (1.5). Ако оператор ++ користимо у префиксној нотацији
double x = 1.5, y; y=++x;
вредност променљиве x је као и у претходном случају 2.5, али је вредност променљиве y једнака новој вредности
Изрази и наредбе
75
Често смо у ситуацији да изводимо аритметичке операције над подацима различитог типа (int, double), па је неопходно податке превести у
одговарајући облик.
Додела вредности променљивој може се извршити само ако је вредност
истог типа као променљива или се може превести у одговарајући тип.
Превођење података из једног типа у други у програмском језику C# може се вршити аутоматски (имплицитна конверзија) или под контролом програмера (експлицитна конверзија).
Имплицитна конверзија
double b=12.45; int x=10; b=b+x;
Експлицитна конверзија
Експлицитном конверзијом програмер додатним кодом захтева тражену конверзију. Експлицитна конверзија
a=(int)b
одсецања децималног дела податка. Према томе, коришћењем експлицитне конверзије може доћи до губитка информација, тј. до сужавања података, када је скуп вредности у који се податак конвертује подскуп скупа вредности податка који конвертујемо.
Пример int a=11,b=4; double x; x=a/b;
7:54:44 PM
Изрази и наредбе
77
Пошто су променљиве a и b типа int, приликом израчунавања вредности израза a/b не долази до имплицитне конверзије и вредност израза је цео број 2, чиме је дошло до губитка децималног дела резултата (2.75). При додели вредности израза a/b типа int променљивој x типа double долази до имплицитне конверзије (int у double) и вредност променљиве x је 2.0. Ако у изразу a/b употребимо оператор cast x=(double)a/b; онда се прво врши експлицитна конверзија вредности променљиве а у тип double. Сада су операнди различитог
int x=212; string s=Convert.ToString(x); string p=”123”; int y=Convert.ToInt32(p); Конверзија помоћу
Convert.ToInt32(p)
Рачунарство и информатика
тип string. Зато све структуре, којима су представљени основни типови података, садрже метод ToString(), којим је омогућено превођење вредности основног типа y string. Kao параметар, овај метод може да има формат у којем ће се број приказати, на пример “0.00” уколико желимо приказ само две децимале.
Пример int x=212; string s=x.ToString(); double a=-345.239801; string p=a.ToString(“0.00”);
складу
вредност израза. Како се израчуната вредност занемарује, наредбе креирамо од израза који при израчунавању производе такозване споредне (бочне) ефекте. То су изрази који у себи садрже операторе доделе (=, +=, *= и други), позиве метода и операторе увећања и смањења променљиве (++ и --). Исправно написане наредбе израза су: 3 + 4*5; n = 3; c++; f(x);
Иако
Осим наредби израза у програмском језику C#,
и наредбе циклуса.
Наредбе гранања омогућавају различит пут при извршавању метода у зависности од испуњености постављених услова. Постоје две наредбе гранања (if, switch) и обе ће
циклуса омогућавају
int x, y, a;
private void Form1_Load(object sender, EventArgs e)
{ a = 30; x = -a; y = ClientRectangle.Height / 2; }
private void Form1_Paint(object sender, PaintEventArgs e)
{ Graphics g = e.Graphics; Pen olovka = new Pen(Color.Black, 4);
g.DrawLine(olovka, x - 2 * a, y, x - a, y + a);
g.DrawLine(olovka, x - a, y + a, x + a, y + a);
g.DrawLine(olovka, x + a, y + a, x + 2 * a, y);
g.DrawLine(olovka, x + 2 * a, y, x - 2 * a, y);
g.DrawLine(olovka, x, y - 2 * a, x + 2 * a, y - a);
g.DrawLine(olovka, x + 2 * a, y - a, x, y);
g.DrawLine(olovka, x, y, x, y - 2 * a); }
private void timer1_Tick(object sender, EventArgs e) { x += 5; Refresh(); }

int x, y, a; Random r = new Random(); Color boja;
private void Form1_MouseDown(object sender, MouseEventArgs e) { boja = Color.FromArgb(r.Next(256), r.Next(256), r.Next(256)); x = e.X; y = e.Y; a = 5; timer1.Start(); }
private void timer1_Tick(object sender, EventArgs e) { Graphics g = CreateGraphics(); Pen olovka = new Pen(Color.Orange, 15); a += 3; g.Clear(BackColor); SolidBrush cetka = new SolidBrush(boja);
g.DrawLine(olovka, x - a, y, x, y + 3 * a);
g.DrawLine(olovka, x, y + 3 * a, x + a, y);
g.FillEllipse(cetka, x - a, y - a, 2 * a, 2 * a); }
private void Form1_MouseUp(object sender, MouseEventArgs e) { timer1.Stop(); }

Рачунарство и информатика
Поставимо на форму потребне компоненте:
три Label контроле − поставимо њихова својства Text
вредности и подесимо својство Font;
три TextBox контроле − именујмо их по њиховим функцијама у апликацији, на пример tbPrviBroj, tbDrugiBroj, tbRezultat; поставимо њихово својство Text на празан стринг; поставимо својство Font на жељену вредност и својство TextAlign на вредност Right; за контролу tbRezulat поставимо својство Enable на false;
контролу Button − поставимо својство Name на вредност btSaberi, а својство Text на Saberi. Да бисмо обезбедили да се кликом на дугме btSaberi сабере садржај контрола tbPrviBroj и tbDrugiBroj, неопходно је да програмирамо догађај Click за дугме btSaberi. Садржај својства Text за обе контроле tbPrviBroj и tbDrugiBroj, који је типа string, неопходно је прво конвертовати у нумерички тип. Конверзија стринга s у тип int може се извршити коришћењем метода ToInt32 класе Convert (Convert. ToInt32(s)). Вредности добијене конверзијом региструјемо у променљивима x и y типа int, а збир променљивих x и y у променљивој z. На крају нам преостаје да резултат, тј. вредност променљиве z, прикажемо у контроли tbRezultat. Зато је неопходно конвертовати променљиву z у тип string и добијену вредност доделити својству Text контроле tbRezultat. Конверзију можемо извршити коришћењем класе Convert (Convert.ToString(z)), као и коришћењем метода ToString() структуре double (z.ToString()).
private void btSaberi_Click(object sender, EventArgs e) { int x = Convert.ToInt32(tbPrviBroj.Text); int y = Convert.ToInt32(tbDrugiBroj.Text); int z = x + y; tbRezultat.Text = Convert.ToString(z); // ili tbRezultat.Text=z.ToString(); }
// pri promeni svojstva Text kontrola tbPrviBroj i tbDrugiBroj // svojstvo Text kontrole tbRezultat treba postaviti na prazan string private void tbPrviBroj_TextChanged(object sender, EventArgs e)
7/3/2013 7:54:44 PM
{ tbRezultat.Text = “”; } private void tbDrugiBroj_TextChanged(object sender, EventArgs e) { tbRezultat.Text = “”; } Апликација креирана на
ако су
блоку try пишемо кôд који може изазвати („испалити”, генерисати) изузетак (грешку), а блок catch садржи кôд који се извршава када је изузетак генерисан („испаљен”). Када дође до изузетка, прекида се извршавање блока try и извршава се блок catch Генерално, можемо имати више различитих блокова catch да бисмо обезбедили различите реакције на различите типове изузетака. У том случају, блок catch има следећи облик: catch (TipIzuzetka e) { . . . }
7:54:44
Рачунарство и информатика
Ако параметар блока catch изоставимо, добијамо општи catch блок, који ће реаговати на све изузетке. У блоку catch најчешће приказујемо поруке кориснику употребом класе MessageBox. Оквир са поруком приказаћемо позивом метода Show класе MessageBox на следећи начин:
MessageBox.Show(tekst_poruke, naslov);
По позиву наведеног метода, управљање апликацијом преноси се на MessageBox. Да бисмо наставили уобичајено коришћење апликације, неопходно је да у дијалошком оквиру MessageBox кликнемо на дугме OK.
Постоје и другачији прикази MessageBox, у зависности

private void btSaberi_Click(object sender, EventArgs e) { try
{ int x = Convert.ToInt32(tbPrviBroj.Text); int y = Convert.ToInt32(tbDrugiBroj.Text); int z = x + y; tbRezultat.Text = Convert.ToString(z); } catch
{ MessageBox.Show(“ Neispravni podaci”, “Greska”); } }



private void btIzracunaj_Click(object sender, EventArgs e) { //unos podataka
double x0 = Convert.ToDouble(tbX0.Text); double y0 = Convert.ToDouble(tbY0.Text); double x1 = Convert.ToDouble(tbX1.Text); double y1 = Convert.ToDouble(tbY1.Text); //duzina dijagonale
double d = Math.Sqrt((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0));
//duzina stranice kvadrata
double a = d / Math.Sqrt(2); //ispis rezultata
lbPovrsina.Text = “Povrsina trga je” + (a * a).ToString(“0.00”);
lbObim.Text = “Duzina ulica oko trga je “ + (4 * a).ToString(“0.00”);

private void btZameniCifre_Click(object sender, EventArgs e) { int n = Convert.ToInt32(tbBroj.Text); int a, b;
a = n % 10; // odredjivanje cifre jedinica
b = (n / 100) % 10; // odredjivanje cifre stotina
n = n - a - b * 100 + a * 100 + b;
lbRezultat.Text = “Broj posle transformacije je “ + n; } private void tbBroj_TextChanged(object sender, EventArgs e) { lbRezultat.Text = “”; }
tbPrvi.Text=tbDrugi.Text; tbDrugi.Text= tbPrvi.Text;
блема. Направимо аналогију са проблемом мењања садржаја две исте шоље ако се у једној налази чај, а у другој кафа. У овом случају јасно је да морамо имати празну шољу која би служила да се у њу привремено смести садржај једне од пуних шоља. Ако празну шољу
променљивом p (у нашем примеру типа sting), размену можемо извршити низом наредби приказаних у методу btRazmeni_Click
private void btRazmeni_Click(object sender, EventArgs e) {
string p = tbPrvi.Text; tbPrvi.Text = tbDrugi.Text; tbDrugi.Text = p; }
Класа String Класа String (односно основни тип string) представља
s.Substring(PocetniIndeks, Duzina)
Duzina; уколико се
s.IndexOf(Tekst)
s.LastIndexOf(Tekst)
s.CompareTo(Tekst)
s.StartsWith(Tekst) враћа
s.Remove(PocetniIndeks, Duzina)
карактера почев од позиције PocetniIndeks, па до краја;
s.Insert(PocetniIndeks, Tekst)
позиције PocetniIndeks;
s.ToUpper() и s.ToLower()

private void btDodaj_Click(object sender, EventArgs e)
{
string s = tbImePrezime.Text, ime, prezime; int pozPraznine = s.IndexOf(‘ ‘); ime = s.Substring(0, pozPraznine); prezime = s.Substring(pozPraznine + 1); lbIme.Items.Add(ime); //dodavanje elementa u ListBox lbPrezime.Items.Add(prezime); tbImePrezime.Text = “”;

private void Form1_Load(object sender, EventArgs e)
{ BackColor = Color.GreenYellow; lbTekst.Text= “osnovi*programiranja*u*okruzenju*grafickih*operativnih*sistema”; lbTekst.ForeColor = Color.Red; timer1.Interval = 500; timer1.Start(); }
private void timer1_Tick(object sender, EventArgs e)
{
string s = lbTekst.Text; int pozicija = s.IndexOf(‘*’); string prvaRec = s.Substring(0, pozicija); s = s.Remove(0, pozicija + 1); s += “*” + prvaRec; lbTekst.Text = s; }
оператор (pozicija > -1) ? pozicija : s.Length – 1,
-1
private void btnObrisiPrvuRec_Click(object sender, EventArgs e) {
string s = tbRecenica.Text; int pozicija = s.IndexOf(‘ ‘); pozicija = (pozicija > -1) ? pozicija : s.Length - 1; tbRecenica.Text = s.Remove(0, pozicija + 1); }
private void btnObrisiPoslednjuRec_Click(object sender, EventArgs e) { try
{ string s = tbRecenica.Text; int pozicija = s.LastIndexOf(‘ ‘); pozicija = (pozicija > -1) ? pozicija : 0; tbRecenica.Text = s.Remove(pozicija); } catch (Exception izuzetak)
{ MessageBox.Show(izuzetak.Message, “Greska”); } }
Низ променљивих, константи и позива метода међусобно одвојених операцијским знацима називамо изразом. Изрази могу да буду прости (само константа, променљива, позив метода) или сложени, са произвољним бројем оператора и елемената израза одвојених заградама. Оператори могу да буду аритметички (+,-, *, /,%),

























a) x = 15; y = 7; if (x > y)
z = x - y; else
z = x + y;
z++;
б) x = 15; y = 15; if (x > y)
z = x - y; else
z = x + y; z++;
в) x = 15; y = 7; if (x > y) z = x - y; else { z = x + y; z++; }
Услов x>y (15>7) је испуњен, па се
г) x = 15; y = 15; if (x > y) z = x - y; else { z = x + y; z++; }
Сада услов x > y (15>15) није испуњен, па се
if
y
if
y
if
if (a>b) if (a>c) max3 = a; else max3 = c; else if (b>c) max3 = b; else max3 = c;
знатно прихватљивије следеће решење: max3= a; if (b>max3) max3 = b; if (c>max3) max3 = c;
Прва вредност је, природно, максимум свих до сада анализираних вредности, а сваку наредну поредимо са до сада највећом − уколико је већа од ње, она је максимална вредност. При таквом приступу број вредности које посматрамо
if (A) if (B) C1 else C2 else C3
if (A) { if (B) C1} else C3
if(a>b)
{ int pom=a; a=b; b=pom;}
if(a>c)
{ int pom=a; a=c; c=pom;}
if(b>c)
{ int pom=b; b=c; c=pom;}

(brojDana++;).
private void btBrojDana_Click(object sender, EventArgs e)
{ int t1 = Convert.ToInt32(tbTemp1.Text); int t2 = Convert.ToInt32(tbTemp2.Text); int t3 = Convert.ToInt32(tbTemp3.Text); int brojDana = 0; if (t1 < 0) brojDana++; if (t2 < 0) brojDana++; if (t3 < 0) brojDana++; lbRezultat.Text = “Broj dana: “+brojDana; }
Услови
променљивој
за неку оцену, наставља проверавање услова за остале оцене, тако да се увек проверава пет услова. Коришћењем угнежђене
private void btOcena_Click(object sender, EventArgs e) { int brPoena = Convert.ToInt32(tbPoeni.Text); int ocena; if (brPoena >= 90)
ocena = 5; else if (brPoena >= 70)
ocena = 4; else if (brPoena >= 50)
ocena = 3; else if (brPoena >= 40)
ocena = 2; else
ocena = 1; lbOcena.Text = “Ocena je “ + ocena; }
за сваку вредност x. Уколико је b различито од 0, једначина се своди на
x из скупа реалних бројева.
private void btResi_Click(object sender, EventArgs e) { double a=Convert.ToDouble(tbA.Text); double b=Convert.ToDouble(tbB.Text); if (a!=0) { double x=-b/a;
lResenje.Text=“Jedinstveno resenje je x= “+x; } else if (b==0)
lResenje.Text=“Ima beskonacno mnogo resenja“; else
lResenje.Text=“Nema resenja“; }
private void btMinTrocifren_Click(object sender, EventArgs e) { int X,N = Convert.ToInt32(textBox1.Text); if (N < 100 || N > 999)
lbRezultat.Text = “Unesite trocifren broj“; else
{ int a, b, c, p;
a = N % 10;
b = (N / 10) % 10; c = N / 100;
if (a > b)
{ p = a; a = b; b = p; }
if (a > c)
{ p = a; a = c; c = p;}
if (b > c)
{ p = b; b = c; c = p; } if (a != 0)
X = a * 100 + b * 10 + c; else if (b != 0)
X = b * 100 + c; //n=b*100+a*10+c; else
X = c * 100; lbRezultat.Text = X.ToString(); } }
месту. Договорили су се да први који дође чека 10 минута другог, па ако овај дође, чекају још 5 минута трећег. Креирајте апликацију којом се за дата времена доласка (0 ≤ сат ≤ 23, 0 ≤ минут ≤ 59), редом, Марка, Јанка и Петра даје одговор на питање да ли су се срела ова три пријатеља. Дата времена доласка су исправна и представљају времена у једном дану. На пример, ако су дата времена, редом, 13:05, 13:09, 12:55, одговор је − срели су се. Уколико су дата времена, редом, 13:05, 12:54, 13:09, одговор је − нису се срели. Времена долазака сваког пријатеља изразимо у минутима (сат* 60+ мин), па их уредимо по редоследу доласка: x≤y≤z. После уређивања довољно је проверити да ли

гранања је притиснут тастер (треба цртати); у противном − има вредност false (не треба цртати). Постављање вредности променљиве crtaj на true обављамо у догађају MouseDown, а постављање на false − у догађају MouseUp. У догађају MouseMove цртамо линију тако што спајамо претходну тачку линије са тачком чије су координате (e.X, e.Y) и вршимо корекцију претходне тачке линије.
bool crtaj=false; int xp,yp;// koordinate prethodne tacke linije private void Form1_MouseDown(object sender, MouseEventArgs e) { crtaj=true; xp=e.X; yp=e.Y; }
private void Form1_MouseMove(object sender, MouseEventArgs e) { if(crtaj) { Graphics g=CreateGraphics(); g.DrawLine(Pens.Blue,xp,yp,e.X,e.Y); xp=e.X; yp=e.Y; g.Dispose(); } }
private void Form1_MouseUp(object sender, MouseEventArgs e) { crtaj=false; }
де исцртава круг на случајној позицији). Целобројне променљиве brKrugova и brPogodaka, редом, садрже
укупно исцртаних кругова, односно број кругова на које је играч кликнуо; на почетку их иницијализујемо нулом. Променљивом pokusaj региструјемо да ли је
int brPogodaka = 0, brKrugova = 0; int xc, yc; bool pokusaj = false;
Random R = new Random(); private void timer1_Tick(object sender, EventArgs e) { Refresh();
SolidBrush cetka = new SolidBrush(Color.Red); Graphics g = CreateGraphics(); // slucajan izbor centra kruga
xc = R.Next(15, ClientRectangle.Width - 15);
yc = R.Next(15, ClientRectangle.Height - 15); // crtanje kruga
g.FillEllipse(cetka, xc - 15, yc - 15, 30, 30); // uvećanje broja iscrtanih krugova
brKrugova++;
Text = brPogodaka + “ od “ + brKrugova; pokusaj = false; g.Dispose(); }
да погоди тај круг. Ако није (pokusaj==false), извршимо проверу да ли је кликнуо на круг, а уколико јесте, променљиву којом региструјемо број погођених кругова увећамо за 1 (brPogodaka++). У сваком случају, променљиву pokusaj поставимо на true јер је
ди исцртани круг. private void Form1_MouseDown(object sender, MouseEventArgs e) { if (!pokusaj) // tj. (pokusaj == false) { // provera da li je igrac kliknuo na krug if (((e.X - xc) * (e.X - xc) + (e.Y - yc) * (e.Y - yc)) <= 15 * 15) { brPogodaka++; Text = brPogodaka + “ od “ + brKrugova; } pokusaj = true; } }
switch (Izraz)
{case Vrednost1: B1; break; case Vrednost2: B2; break; case Vrednost3: B3; break; case VrednostN: BN; break; default: B; break; }
Vrednost1, Vrednost2, …, VrednostN
ности израза.
могуће вред-
Свако Bi (B1, B2, …, BN, B) представља низ произвољних инструкција међусобно раздвојених знаком ; (тачка и зарез).
Инструкција вишеструког избора се извршава тако што се прво одређује вредност селектора Izraz, затим се међу вредностима Vrednost1, Vrednost2, …, VrednostN проналази VrednostI једнака израчунатој вредности Izraz, па се на крају
вредностима Vrednost1, Vrednost2, …, VrednostN не налази
switch (Ocena)
{case 1: Text=“nedovoljan“; break;
case 2: Text=“dovoljan“; break;
case 3: Text=“dobar“; break;
case 4: Text=“vrlo dobar“; break;
case 5: Text=“odlican“; break;
default: Text=“greska“; break; }
switch (Izraz)
{case Vrednost1:case Vrednost2: case Vrednost3:case Vrednost4: B1; break; case Vrednost5:case Vrednost6: B3; break;
case VrednostN: BN; break; default: B; break;
switch (m) { case 1: case 2: case 3: Text = “zima“; break; case 4: case 5: case 6: Text = “prolece“; break; case 7:case 8: case 9: Text = “leto“; break; default: Text = “jesen“; break; }

можемо мењати (повећавати, односно смањивати за одређени
дугме контроле (up, down). Број придружен контроли дефинисан је својством Value које је типа
private void nudDan_ValueChanged(object sender, EventArgs e)
{ int dan=(int)nudDan.Value; switch (dan)
{ case 1: lbDan.Text = “ponedeljak“; break; case 2: lbDan.Text = “utorak“; break; case 3: lbDan.Text = “sreda“; break; case 4: lbDan.Text = “cetvrtak“; break; case 5: lbDan.Text = “petak“; break; case 6: lbDan.Text = “subota“; break; case 7: lbDan.Text = “nedelja“; break; }
NumericUpDown које, редом, именујемо nudDan, nudMesec и nudGodina, а користимо их за унос исправног датума. Поставимо својства Minimum на вредност 1, а својства Maximum, редом, на вредности 31 (максималан број дана у првом месецу), 12 (максималан број месеци) и 3000 (максимална година).
Приказивање системског датума при учитавању форме постижемо на следећи начин:
private void Form1_Load(object sender, EventArgs e) { nudDan.Value = System.DateTime.Now.Day; nudMesec.Value = System.DateTime.Now.Month; nudGodina.Value = System.DateTime.Now.Year; }
111 7/3/2013 7:54:46 PM
private void nudMesec_ValueChanged(object sender, EventArgs e)
{ int m = (int)nudMesec.Value, g = (int)nudGodina.Value; int bd; switch (m)
{
case 1: case 3: case 5: case 7: case 8: case 10: case 12: bd = 31; break; case 2:
if ((g % 4 == 0 && g % 100 != 0) || g % 400 == 0) bd = 29; else bd = 28; break; default: bd = 30; break; }
nudDan.Maximum = bd; }
private void nudGodina_ValueChanged(object sender, EventArgs e)
{ int m = (int)nudMesec.Value, g = (int)nudGodina.Value; if (m == 2)
if ((g % 4 == 0 && g % 100 != 0) || g % 400 == 0) nudDan.Maximum = 29; else nudDan.Maximum = 28; }
private void btSledeciDan_Click(object sender, EventArgs e)
{ int d = (int)nudDan.Value, m = (int)nudMesec.Value, g = (int)nudGodina.Value; if (d == (int)nudDan.Maximum)
{ d = 1; if (m < 12) m++; else { m = 1; g++; } } else d++; lbSledeciDan.Text = d + “ . “ +
}
(switch) switch (Izraz) { case Vrednost1: B1; break; case Vrednost2: B2; break; ... case VrednostN: BN; break; default: B; break; }
Izraz представља произвољан
даљи ток апликације. Vrednost1, Vrednost2, …, VrednostN представљају могуће вредности израза. Свако Bi(B1, B2, …, BN, B) представља низ произвољних инструкција међусобно раздвојених знаком ; (тачка и зарез). Наредба вишеструког избора се извршава тако што се прво одређује вредност селектора Izraz, затим се међу вредностима Vrednost1, Vrednost2, …, VrednostN проналази VrednostI једнака
Vrednost1, Vrednost2, …, VrednostN не налази израчуната вредност Izraz, извршава се низ инструкција B.








Контроле




CheckBox













боља организација форме, што кориснику олакшава коришћење

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{ Color boja; if (rbCrvena.Checked)
boja = Color.Red; else if (rbZelena.Checked)
boja = Color.Green; else
boja = Color.Blue; SolidBrush cetka = new SolidBrush(boja); Graphics g = e.Graphics; int x, y; x = pictureBox1.Width / 2; y = pictureBox1.Height / 2; g.FillEllipse(cetka, x-70,y-70,140 , 140); }
RadioButton
private void rbCrvena_CheckedChanged(object sender, EventArgs e) { if(rbCrveno.Checked) pictureBox1.Refresh();
CheckBox
Checked
Пример
(kontura)
круг (FillEllipse).
SolidBrush cetka = new SolidBrush(boja); Pen olovka = new Pen(boja, 3); if (cbKontura.Checked)
DrawEllipse
g.DrawEllipse(olovka, x - 70, y - 70, 140, 140); else
g.FillEllipse(cetka, x - 70, y - 70, 140, 140);
kontura
CheckBox на следећи начин:
CheckedChanged
private void cbKontura_CheckedChanged(object sender, EventArgs e) { pictureBox1.Refresh(); }
Контроле
GroupBox и Panel
све RadioButton контроле које чине једну групу ставимо у једну


if (rbKrug.Checked) if (cbKontura.Checked)
g.DrawEllipse(olovka, x - 70, y - 70, 140, 140); else
g.FillEllipse(cetka, x - 70, y - 70, 140, 140); else if (cbKontura.Checked)
g.DrawRectangle(olovka, x - 70, y - 70, 140, 140); else
g.FillRectangle(cetka, x - 70, y - 70, 140, 140);
сада неке разлике између контрола GroupBox и Panel:
контрола GroupBox има својство Text којим се ближе описује значење контрола које садржи, док контрола Panel то нема; у контроли Panel можемо приказати траке за померање (scroll bar), док у контроли GroupBox то не можемо; контрола Panel се подразумевано приказује без граница, а коришћењем својства BorderStyle може се поставити стандардна или тродимензионална граница, док контрола GroupBox има границу која се не може мењати.
Задаци
33. Креирајте апликацију

private void cbSlova_CheckedChanged(object sender, EventArgs e) { if(cbSlova.Checked)
label1.ForeColor=Color.Yellow; else
label1.ForeColor=Color.Black; }
private void cbPozadina_CheckedChanged(object sender, EventArgs e) {
if(cbPozadina.Checked)
label1.BackColor=Color.Blue; else
label1.BackColor=Color.Silver; }

private void btOdredi_Click(object sender, EventArgs e) { int n = Convert.ToInt32(tbN.Text); int k = Convert.ToInt32(tbK.Text); int br1; // broj pesama na jednom mediju if (rbCD.Checked)
br1 = 700/k; else
br1 = (int)(4.7 * 1024)/k; int x;// broj potrebnih medija x = n / br1; if (n % br1 != 0)
x++;
lbRezultat.Text = “Broj potrebnih “;
if (rbCD.Checked)
lbRezultat.Text += “CD-ova je “; else
lbRezultat.Text += “DVD-ova je “;
lbRezultat.Text += x + “ . “;
35.
објекат класе TextBox у којем корисник уноси просек ученика; ако ученик има недовољне оцене, треба онемогућити кориснику да уноси просек (користити својство Enabled за TextBox);
објекат класе Button којим се по уносу потребних података захтева исписивање успеха ученика; објекат

M
Pen olovka = new Pen(Color.Black, 4); float x1, y1;//koordinte tačke M private void pbCrtez_MouseDown(object sender, MouseEventArgs e) { x1 = e.X; y1 = e.Y; } private void pbCrtez_MouseUp(object sender, MouseEventArgs e)
{ Graphics g = pbCrtez.CreateGraphics();
float x2, y2;// koordinate tačke N x2 = e.X; y2 = e.Y; if (rbDuz.Checked)
g.DrawLine(olovka, x1, y1, x2, y2); else if (rbKruznica.Checked)
{
float r = (float)Math.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)) / 2; // određivanje centra kruga x1 = (x1 + x2) / 2; y1 = (y1 + y2) / 2;
g.DrawEllipse(olovka, x1 - r, y1 - r, 2 * r, 2 * r); } else {
float a = Math.Abs(x1 - x2); float b = Math.Abs(y1 - y2); // odredjivanje koordinate gornjeg levog temena // pravougaonika if (x1 > x2) x1 = x2; if (y1 > y2) y1 = y2; g.DrawRectangle(olovka, x1, y1, a, b); } } // promena boje linije
private void pbOlovka_Click(object sender, EventArgs e) { if (colorDialog1.ShowDialog() == DialogResult.OK) olovka.Color = pbOlovka.BackColor = colorDialog1.Color; }
Paint за
кат по којем цртамо (позив метода Refresh() у догађају Tick). Избор врсте кретања корисник дефинише помоћу четири RadioButton контроле.
Начин кретања лоптице дефинишемо коришћењем две целобројне променљиве − korakX, korakY, чије вредности постављамо у зависности од стања контрола RadioButton. Ако се лоптица креће горе (доле), korakX има вредност 0, а korakY вредност -1 (1). Слично за правац десно (лево), korakX има вредност 1 (-1), а korakY вредност 0. Када лоптица дође до ивице објекта класе PictureBox, променом одговарајуће координате обезбеђујемо да она
int r=10,pomeraj=1; int x, y; int korakX, korakY;
// postavljanje početnog položaja i načina kretanja loptice
private void Form1_Load(object sender, EventArgs e)
{ x = pictureBox1.Width / 2; y = pictureBox1.Height / 2; korakX = 0; korakY = -pomeraj; timer1.Start(); }
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{ Graphics g = e.Graphics; g.FillEllipse(Brushes.Blue, x - r, y - r, 2 * r, 2 * r); }
private void timer1_Tick(object sender, EventArgs e) { x += korakX; y += korakY;
// ako loptica udara u levu ivicu vraćamo je na desnu ivicu if (x < r)
x = pictureBox1.Width - r;
// ako loptica udara u desnu ivicu vraćamo je na levu ivicu if (x > pictureBox1.Width - r)
x = r;
// ako loptica udara u gornju ivicu vraćamo je na donju ivicu if (y < r)
y = pictureBox1.Height-r;
// ako loptica udara u donju ivicu vraćamo je na gornju ivicu if (y > pictureBox1.Height - r)
y = r; pictureBox1.Refresh(); }
// izbor načina kretanja
private void rbGore_CheckedChanged(object sender, EventArgs e) { if (rbGore.Checked) { korakX = 0; korakY = -pomeraj; } }
(korakX=-korakX
(korakY=-korakY
private void timer1_Tick(object sender, EventArgs e) { // ako loptica udara u levu ili desnu ivicu if (x + korakX < r || x + korakX > pictureBox1.Width - r) korakX = -korakX; // ako loptica udara u gornju ili donju ivicu if (y + korakY < r || y > pictureBox1.Height - r) korakY = -korakY; x += korakX; y += korakY; pictureBox1.Refresh(); }
Контролу

listBox1.Items.Add(noviElement);
listBox1.Items.Add(“a“); listBox1.Items.Add(“b“); listBox1.Items.Add(“c“);
Нови елемент додаје се на крај
уколико
уређена; иначе, додаје се на одговарајуће место тако да се сачува уређеност листе.
Коришћењем својства Sorted можемо обезбедити да се елементи листе приказују у абецедном поретку. Ако је то својство постављено на true, елементи ће бити аутоматски уређени; у противном неће.
Број елемената листе дефинисан је својством Count колекције Items (ListBox1.Items.Count;). Елементи листе су индексирани редом од 0
до Items.Count-1.
Својство SelectedIndex има вредност редног броја (индекса) одабраног (селектованог) елемента из
− има вредност -1.
SelectedItem
listBox1.SelectedIndex = -1; listBox1.Text = x; if (listBox1.SelectedIndex == -1) listBox1.Items.Add(x);
listBox1.Items.RemoveAt(0); listBox1.Items.RemoveAt(listBox1.Items.Count-1); listBox1.Items.RemoveAt(listBox1.SelectedIndex);
Брисање свих елемената из
својства Items: listbox1.Items.Clear();
те листе, без обзира

private void rbDodaj_Click(object sender, EventArgs e) { lbSpisak.SelectedIndex = -1; if (tbIme.Text != ““) { lbSpisak.Text = tbIme.Text; if (lbSpisak.SelectedIndex == -1) { lbSpisak.Items.Add(tbIme.Text); tbIme.Text = ““; } }
Clear
rbDodaj.Checked = false; }
private void rbBrisiIzabrani_Click(object sender, EventArgs e)
{ if (lbSpisak.SelectedIndex != -1)
lbSpisak.Items.RemoveAt(lbSpisak.SelectedIndex); rbBrisiIzabrani.Checked = false; }
private void rbBrisiSve_Click(object sender, EventArgs e)
{
lbSpisak.Items.Clear(); rbBrisiSve.Checked = false;

private void btIzbor_Click(object sender, EventArgs e)
{ if (lbSpisak.SelectedIndex != -1) {
lbIzbor.Items.Add(lbSpisak.Text); if(!cbKopija.Checked)
lbSpisak.Items.RemoveAt(lbSpisak.SelectedIndex); lbSpisak. SelectedIndex =-1; } }
Контрола ComboBox
Контрола
уписивање у
за унос текста.
Подразумевани стил за контролу ComboBox је DropDown.
Својства Items, Sort, SelectedIndex и SelectedItem имају иста значење као код контроле ListBox. Садржај
контроле ComboBox дефинисан је својством Text.
Значајни догађаји су SelectedIndexChanged (дешава се кад се промени изабрани елемент) и TextChanged (дешава се кад се

дефинисана. Ако јесте, одређујемо резултат, у протовном
private void btIzracunaj_Click(object sender, EventArgs e)
{ double a,c = 0; a = Convert.ToInt32(tbA.Text); bool ok = true; switch (cmbIzbor.SelectedIndex)
{ case 0: if (a != 0) c = 1/a; else ok = false; break; case 1: if (a >= 0) c = Math.Sqrt(a); else ok = false; break; case 2: c = a*a; break; case 3: c = a *a*a; break; } if (ok)
tbRezultat.Text = c.ToString(); else
tbRezultat.Text = “Greska!!!“; } private void cmbIzbor_SelectedIndexChanged(object sender, EventArgs e)
{ tbRezultat.Text = ““; }

private void lbIzbor_SelectedIndexChanged(object sender, System.EventArgs e)
{ int broj = Convert.ToInt32(tbBroj.Text), cifra = 0; switch (lbIzbor.SelectedIndex)
{ case 0: cifra = (broj / 100) % 10; break; case 1: cifra = (broj / 10) % 10; break; case 2: cifra = broj % 10; break; } tbCifra.Text = cifra.ToString(); }
int pomeraj=
Form1_Load(object
EventArgs e) { // postavljanje pozadine i pozicije objekta klase PictureBox // mozemo realizovati i u etapi dizajna pbZmaj.BackgroundImage = Image.FromFile(“zmaj.bmp“); pbZmaj.BackgroundImageLayout= ImageLayout.Stretch;
pbZmaj.Top = pbZmaj.Left = 0; }
private void lbVetar _SelectedIndexChanged(object sender, EventArgs e)
{ if (pomeraj > 0)
pomeraj = Convert.ToInt32(lbVetar.Text); else pomeraj = -Convert.ToInt32(lbVetar.Text); }
private void timer1_Tick(object sender, EventArgs e)
{ if (pbZmaj.Left + pbZmaj.Width > ClientRectangle.Width)
pomeraj = -pomeraj; if (pbZmaj.Left < 0) pomeraj = -pomeraj; pbZmaj.Left += pomeraj; }

private void btPobednik_Click(object sender, EventArgs e)
{ lbPobednik.Items.Clear();
int t1 = Convert.ToInt32(tb1.Text); int t2= Convert.ToInt32(tb2.Text); int t3 = Convert.ToInt32(tb3.Text); int min = t1; if (t2 < min) min = t2; if (t3 < min) min = t3; if (t1 == min)
lbPobednik.Items.Add(“Marko“); if (t2 == min)
lbPobednik.Items.Add(“Janko“); if (t3 == min)
lbPobednik.Items.Add(“Petar“); }



private void btDodaj_Click(object sender, System.EventArgs e) { double a = Convert.ToDouble(tbRacun.Text); lbRacuni.Items.Add(a);
double t = Convert.ToDouble(tbTekuci.Text); double r = Convert.ToDouble(tbRata.Text); if (3000 <= a)
{ r += a / 6; t += a / 6; } else
t += a; tbTekuci.Text = t.ToString(); tbRata.Text = r.ToString(); }

Контроле избора радио-дугме (RadioButton), оквир за потврду (CheckBox), оквир с листом (ListBox) и комбиновани оквир (ComboBox) омогућују избор једне или више могућности. За контроле RadioButton и CheckBox својство Checked показује да ли је контрола означена или није, а догађај CheckedChanged дешава се када дође до промене својства Checked. За контроле
SelectedIndex

























Програмски језик C# настао је на темељима популарног програмског
језика C од којег је наследио основне инструкције, па и инструкције циклуса. Као
циклуса:
циклуси са предусловом while, for;
циклус са постусловом do − while.
while (Uslov) TeloCiklusa
Uslov
TeloCiklusa представља низ произвољних инструкција. Уколико у низу постоји једна инструкција, иза ње наводимо тачка зарез ( ; ), а уколико низ садржи више од једне инструкције, наводимо их између { и }, међусобно раздвојене тачка зарезом ( ; ).
Циклус while се реализује на следећи начин: одређује
suma = 0; i = 1; while(i < 101)
suma += i; //suma = suma + i; i++;
(kolicnik++)
for(Inicijalizacija; Uslov; Korekcija) TeloCiklusa
Inicijalizacija
Uslov
Korekcija је израз којим се најчешће мењају
TeloCiklusa представља низ произвољних инструкција. Уколико у низу постоји једна инструкција, иза ње наводимо тачка зарез ( ; ), а уколико низ садржи
собно раздвојене знаком тачка зарез ( ; ).
For циклус се реализује на следећи начин:
извршава се i) Inicijalizacija; одређује се вредност
ii)
се iii) TeloCiklusa
се iv) Korekcija,
iv);
for (suma = 0, i = 1; i < 101; i++)
suma += i; for (suma = 0, i = 1; i < 101; suma += i, i++) ; for (suma = 0, i = 1; i < 101; ) { suma += i; i++;
for (kolicnik=0; a>=b; kolicnik++)
do - while
suma
suma
kolicnik

Уведена променљива i редом узима жељене вредности које, једну по једну, уписујемо у ListBox. Уколико желимо да упишемо само парне бројеве, довољно је да у овом циклусу променимо иницијализацију, јер први парни број који
је 2, и да променимо корекцију, јер је сваки следећи парни
for(int i=2; i<=N; i+=2)
lbBrojevi.Items.Add(i);
for(; N>0; N--)
lbBrojevi.Items.Add(N);
while(N>0)
{
lbBrojevi.Items.Add(N); N--; }
for(int i=1; i<=N; i++)
lbBrojevi.Items.Add(2*i);
private void rbod1doN_CheckedChanged(object sender, EventArgs e) { if (rbod1doN.Checked)
{ int N=Convert.ToInt32(tbN.Text); lbBrojevi.Items.Clear();
for(int i=1; i<=N; i++) lbBrojevi.Items.Add(i); } }
private void tbN_TextChanged(object sender, EventArgs e) { rbod1doN.Checked=false; rbodNdo1.Checked=false; rbParni.Checked=false; rbNeparni.Checked=false; rbNParnih.Checked=false; lbBrojevi.Items.Clear();
(1*2)*3, ((1*2)*3)*4 итд. Управо тако, одговарајућим циклусом,
f) у којој памтимо производ. Њена почетна вредност је вредност
) множимо, редом,
private void btFaktorijel_Click(object sender, EventArgs e) { int N = Convert.ToInt32(tbBroj.Text); int f = 1; for(int i=2; i<=N; i++) f *= i; tbRezultat.Text = f.ToString(); }
private void btStepen_Click(object sender, EventArgs e) { int n=Convert.ToInt32(tbn.Text); int a=Convert.ToInt32(tba.Text); int st=1; for(int i=0; i<n; i++) st*=a; tbStepen.Text=st.ToString();
нично мењају знак,
зато уводимо
znak
наизменично, вредности 1 и -1. Знак на почетку има вредност 1, а приликом преласка на следећи сабирак мењамо његову вредност
знак (znak=-znak). На суму додајемо сабирке облика znak/i за свако i од 1 до N.
private void btSuma_Click(object sender, EventArgs e) { int N=Convert.ToInt32(tbN.Text);
float S = 0; int znak = 1; for (int i = 1; i <=N; i++) { S = S + (float)znak / i; znak = -znak; }
lbRezultat.Text = S.ToString(); }
циклус треба поставити почетне вредности за факторијел и степен, а затим у циклусу треба додати члан у суму и израчунати
private void btSumaA_Click(object sender, EventArgs e) { int n = Convert.ToInt32(tbN.Text);
float x = Convert.ToSingle(tbX.Text); int f = 1;
float st = x;
float s = 0; for (int i = 1; i <= n; i++) { f = f * i; s += f / st; st = -st * x; }
lbRezultat.Text = s.ToString(); }
x, и променљиву
садржати именилац. У сваком кораку имениоцу додајемо одговарајући степен.
private void btSumaB_Click(object sender, EventArgs e)
{ int n = Convert.ToInt32(tbN.Text);
float x = Convert.ToSingle(tbX.Text);
float s = 0; int brojilac = 1;
float imenilac = 0;
float st = 1; for (int i = 1; i <= n; i++)
{ brojilac *= i; st *= x; imenilac += st; s += brojilac / imenilac; }
lbRezultat.Text = s.ToString(); }


private void btTabela_Click(object sender, EventArgs e) { lbTabela.Items.Clear(); double a = Convert.ToDouble(tbA.Text); double b = Convert.ToDouble(tbB.Text); if (rbKorak.Checked) { double korak = Convert.ToDouble(tbPodela.Text); for (double x = a; x <= b; x += korak) { if (x * x - 4 * x - 6 >= 0 && 17 - 4 * x != 0) { double y = (2 + Math.Sqrt(x * x - 4 * x - 6)) / (17 - 4 * x); lbTabela.Items.Add(“f(“ + x.ToString(“0.00“) + “)=“ + y.ToString(“0.00“)); }
else
lbTabela.Items.Add(“Za “ + x.ToString(“0.00“) + “ nije definisana“); } } else
{ int broj = Convert.ToInt32(tbPodela.Text); double x = a, korak = (b - a) / (broj - 1); for (int i = 0; i < broj; i++, x+=korak) { if (x * x - 4 * x - 6 >= 0 && 17 - 4 * x != 0) { double y = (2 + Math.Sqrt(x * x - 4 * x - 6)) / (17 - 4 * x);
lbTabela.Items.Add(“f(“ + x.ToString(“0.00“) + “)= “ + y.ToString(“0.00“)); } else
lbTabela.Items.Add(“Za “ + x.ToString(“0.00“) + “ nije definisana“); } } } 58.
private void btPrikazCifara_Click(object sender, EventArgs e) { lbCifre.Items.Clear(); int n = Convert.ToInt32(tbN.Text); int c; while (n > 0) { c = n % 10; lbCifre.Items.Add(c); n /= 10; } }
private void btProveri_Click(object sender, EventArgs e) { int x = Convert.ToInt32(tbCifra.Text); int n = Convert.ToInt32(tbN.Text); bool nadjena = false; while (n > 0 && !nadjena) { if (x == n % 10) nadjena = true; n /= 10; } if (nadjena)
lbRez.Text = “Ima“; else
lbRez.Text = “Nema“; }
в) производ цифара,
г) број парних цифара,
д) број појављивања цифре 5, ђ) цифра највеће тежине.
б)
ђ)
private void btSumaCifara_Click(object sender, EventArgs e)
{ int n = Convert.ToInt32(tbBroj.Text); int suma = 0;
while (n > 0)
{ suma += n % 10; n /= 10; }
lbOdgovor.Text = “Suma cifara: “ + suma; }
private void btCifraNajTezine_Click(object sender, EventArgs e)
{ int n = Convert.ToInt32(tbBroj.Text);
while (n > 9) n /= 10; lbOdgovor.Text = “Cifra najvece tezine: “ + n; }
63. Креирајте апликацију
x =
while (n > 0) { x = x * 10 + n %
private void btIspisi_Click(object sender, EventArgs e) { int n=Convert.ToInt32(tbn.Text); lbDelioci.Items.Clear(); for(int i=1; i <= n / 2; i++) if (n % i == 0) lbDelioci.Items.Add(i); lbDelioci.Items.Add(n); }

private void btProstiFaktori_Click(object sender, EventArgs e)
{ lbProstiFaktori.Items.Clear(); int n = Convert.ToInt32(tbn.Text); int faktor = 2; while (n != 1) if (n % faktor == 0) { lbProstiFaktori.Items.Add(faktor); n /= faktor; } else faktor++; }


private void btTrening_Click(object sender, EventArgs e)
{
float A = Convert.ToSingle(tbA.Text);
float R = Convert.ToSingle(tbR.Text); int i = 1;// redni broj dana
lbTrening.Items.Clear(); lbTrening.Items.Add(A);
Рачунарство
while (A <= R)
{ A += 10 * A / 100;// uvećavanje A za 10% i++; // uvećanje broja dana lbTrening.Items.Add(A); }
lbOdgovor.Text = “Redni broj dana: “ + i; }
private void btUkupno_Click(object sender, EventArgs e)
{
float A = Convert.ToSingle(tbA.Text);
float R = Convert.ToSingle(tbR.Text); int i = 1;
float S = A;// ukupni predjeni broj km lbTrening.Items.Clear(); lbTrening.Items.Add(A); while (S <= R)
{
A += 10 * A / 100; S += A;// uvećavnje ukupne sume za dnevni trening i++; lbTrening.Items.Add(A); }
lbOdgovor.Text = “Redni broj dana: “ + i; }
зује колико ће спортиста претрчати сваког дана.
Спортиста повећава норму трећег, петог, седмог, ... дана. Према томе, сваког непарног дана, изузев првог, треба повећати норму. Зато први дан посебно упишемо у ListBox, а за остале дане (2, 3, ..., n) у циклусу for приказујемо норму, па ако је непаран дан (i%2==1), прво је увећамо.
lbTrening.Items.Add(A); for (int i = 2; i <= n; i++)
{ if (i%2==1)
A += 10 * A / 100; lbTrening.Items.Add(A); }
racunarstvo_i_informatika.indb 158
7/3/2013 7:54:51 PM
могуће квадрате. Креирајте апликацију
исписује колико другова се послужило чоколадом. На пример, ако је
узимали квадрате страница 7, 5, 2, 2, 1, 1. br = 0; //broj drugova while (A > 0) { if (A >= B)
A -= B; else
B -= A; br++; }

Рачунарство
Шрафирање форме
динату ClientRectangle Width, y координата прве тачке је 0, а сваке следеће је за ClientRectangle Height/30 већа од претходне. Линије исцртавамо док је y координата тачке десне ивице форме у границама форме, тј. док је y<=ClientRectangle.Height Да бисмо приликом промене величине форме ту форму поновно шрафирали, довољно је у догађају Resize позвати методе Refresh().
private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; int CH = ClientRectangle.Height, CW = ClientRectangle.Width; for (int y = 0; y <= CH; y += CH / 30) { g.DrawLine(Pens.Indigo, 0, 0, CW, y); g.DrawLine(Pens.Indigo, 0, CH, CW, y); } }
private void Form1_Resize(object sender, EventArgs e) { Refresh(); }

y је ClientRectangle Height. Цртамо степеник по степеник и после сваког нацтраног степеника променљиву x увећамо, а променљиву y смањимо за 20. Пошто нацртане степенице треба да се налазе
private void Form1_Paint(object sender, PaintEventArgs e)
{ Graphics g=e.Graphics; int x=0,y=ClientRectangle.Height; while(x<ClientRectangle.Width && y>0)
{
g.DrawLine(Pens.Red, x, y, x, y - 20); g.DrawLine(Pens.Red, x, y - 20, x + 20, y - 20); x+=20; y-=20; } }
private void Form1_Resize(object sender, EventArgs e) { Refresh(); }

private void btCrtaj_Click(object sender, EventArgs e)
{ int d,x,y; try
{ // odredjivanje duzine stranica prvog kvadrata d=Convert.ToInt32(tbStranica.Text); } catch
{ // ako nije ispravan ceo broj
MessageBox.Show(“ Neispravna dužina stranice podaci“ , “Greška“); tbStranica.SelectAll(); tbStranica.Focus(); return ; }
Graphics g=CreateGraphics();
Random r=new Random(); Pen olovka=new Pen(Color.Blue,2); Refresh();
// odredjivanje koordinata centra radne površine x = ClientRectangle.Width/2; y = panel1.Height + (ClientRectangle.Height-panel1.Height) / 2; while(d > 0)
{ // slucajan izbor nijanse plave boje olovka.Color=Color.FromArgb(r.Next(150), r.Next(150),255); // crtanje kvadrata ciji je centar (x,y) a duzina stranice d // gornje levo teme je (x-d/2,y-d/2) g.DrawRectangle(olovka, x-d/2,y-d/2,d,d); // smanjivanje duzine stranice kvadrata d = d - 20; }
olovka.Dispose(); g.Dispose(); }

SolidBrush cetka = new SolidBrush(Color.Black); Random random = new Random(); int x, y; private void btBoja_Click(object sender, EventArgs e)
{ if (colorDialog1.ShowDialog() == DialogResult.OK)
{ cetka.Color = colorDialog1.Color; pbBoja.BackColor = cetka.Color; }
}
private void pbCrtez_MouseDown(object sender, MouseEventArgs e)
{ x = e.X; y = e.Y; timer1.Start();
}
private void pbCrtez_MouseUp(object sender, MouseEventArgs e) { timer1.Stop(); }
private void pbCrtez_MouseMove(object sender, MouseEventArgs e)
{ x = e.X; y = e.Y; }
private void timer1_Tick(object sender, EventArgs e)
{ Graphics g = pbCrtez.CreateGraphics(); for (int i = 0; i < 10; i++)
{ int x1 = random.Next(x - 15, x + 15); int y1 = random.Next(y - 15, y + 15); g.FillEllipse(cetka, x1 - 1, y1 - 1, 2, 2); }
PictureBox
PictureBox
NumericUpDown

private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { pictureBox1.Refresh();
Graphics g = pictureBox1.CreateGraphics(); int br = (int)nudBrojDelova.Value; float dx = (float)pictureBox1.Width / br; float dy = (float)pictureBox1.Height / br; float x = e.X; float y = e.Y; for (int i = 0; i <= br; i++)
{
g.DrawLine(Pens.Red, x, y, i * dx, 0); g.DrawLine(Pens.Red, x, y, i * dx, pictureBox1.Height);
g.DrawLine(Pens.Red, x, y, 0, i * dy);
g.DrawLine(Pens.Red, x, y, pictureBox1.Width, i * dy); } } private void nudBrojDelova_ValueChanged(object sender, EventArgs e) { pictureBox1.Refresh(); }
ComboBox

датотека (енгл. file). Основне операције при раду са датотекама су читање из датотеке и упис у датотеку. Читање и упис података реализују се коришћењем токова (енгл. stream). Ток
приступом (из било ког места датотеке
читати подаци или уписивати на било које место), за рад са текстуалним улазним/излазним токовима.
Класе помоћу којих се једноставно
података су StreamReader и StreamWriter. Овим класама омогућен је само секвенцијални приступ текстуалним датотекама, тј. подаци се
путања C:\MojiProjekti\proba.txt је
proba.txt. При коришћењу
рачуна о томе да се апликација у процесу њене израде налази
ImeProjekta\Bin\Debug Примери креирања
StreamReader
StreamReader sr=new StreamReader(“proba.txt“);
StreamReader sr=new StreamReader(“C:\\MojiProjekti\\proba.txt“);
StreamWriter:
StreamWriter sw=new StreamWriter (“nova.txt“);
лико желимо да се подаци дописују у
167 Наредбе за организацију циклуса
постојећу датотеку, потребно је да то прецизирамо на следећи начин: StreamWriter sw = new StreamWriter(“nova.txt“, true);
Ако датотека не постоји, без обзира на параметре који су прослеђени
конструктору креира се нова. Уколико пак датотека постоји и други параметар је false, отвара се нова (садржај старе се брише – overwrite), а ако је параметар true, не формира се нова датотека, него се евентуални упис врши на крај већ постојеће (append). Позиви конструктора
StreamWriter(“nova.txt“) и
StreamWriter(“nova.txt“, false)
StreamWriter(“nova.txt“) и
StreamWriter(“nova.txt“, true)
нису еквивалентни јер се
дођемо до краја фајла (!f.EndOfStream), читамо број по број из датотеке. Прочитани број упишемо у контролу ListBox, додамо га променљивој suma (suma +=a;) и при томе променљиву br увећавамо за 1 (br++;). На крају број и суму бројева из датотеке прикажемо у одговарајућим објектима класе TextBox. private void Form1_Load(object sender, EventArgs e) { StreamReader f = new StreamReader(“brojevi.txt”); lbBrojevi.Items.Clear(); int suma = 0; int br = 0; while (!f.EndOfStream) { int a = Convert.ToInt32(f.ReadLine()); br++; suma += a; lbBrojevi.Items.Add(a); }
tbBroj.Text = br.ToString(); tbSuma.Text = suma.ToString(); f.Close(); }


Рачунарство и информатика
На форму поставимо објекат класе ComboBox, именујемо га cbIzborFile, у његовом својству Items упишемо имена датотека које обрађујемо (датотеке се налазе у директоријуму Debug наше апликације), а у својству Text упишемо „Izaberite datoteku”. Поставимо објекат класе ListBox и именујемо га lbBrojevi. У објекту gbIzbor класе GroupBox поставимо објекте класе RadioButton, које, редом, именујемо rbMax, rbMaxBrojPojavljivanja, rbProsek. Сваком објекту класе RadioButton својство Checked поставимо на false, а објекту gbIzbor својство Enabled на false (јер на почетку није изабрана ниједна датотека, па избор операција није дозвољен). На форму поставимо и објекат lRezultat класе Label ради приказивања тражених
сваког објекта класе RadioButton поставимо на false, и садржај објекта lRezultat
using System.IO; private void cbIzborFile_SelectedIndexChanged(object sender, EventArgs e) { if(cbIzborFile.Text!=“Izaberite datoteku“) { StreamReader f = new StreamReader(cbIzborFile.Text+“.txt“); lbBrojevi.Items.Clear(); while(!f.EndOfStream) { lbBrojevi.Items.Add(f.ReadLine()); } f.Close(); gbIzbor.Enabled=true; lRezultat.Text=””; rbMax.Checked = rbMaxBrojPojavljivanja.Checked = rbProsek.Checked = false; } }
171 Наредбе за организацију циклуса
При одређивању максималног броја у датотеци први број који прочитамо прогласимо за максималан. Затим, редом, читамо линију по линију из датотеке − све до краја датотеке, за сваку прочитану линију одредимо који број садржи и да ли је тај број (x) већи од до сада одређеног максималног броја (max). Ако јесте, вредност променљиве max поставимо на x, тј.
private void rbMax_CheckedChanged(object sender, EventArgs e) { if(rbMax.Checked) { StreamReader f = new StreamReader(cbIzborFile.Text+”.txt”); int max,x; max = Convert.ToInt32(f.ReadLine()); while(!f.EndOfStream) { x = Convert.ToInt32(f.ReadLine()); if (x > max) max = x; } f.Close(); lRezultat.Text=“Max broj je “+max; }
Да бисмо одредили
из датотеке, а број појављивања на 1 (bp=1;). Затим редом читамо бројеве из датотеке. За сваки прочитани број проверимо
bp++;). У противном, проверавамо да ли је прочитани број већи од вредности променљиве max (x>max), па ако јесте, коригујемо вредност променљиве max и вредност променљиве bp поставимо на 1 (јер је то прво појављивање максималног елемента). На крају, резултат (max и bp) прикажемо коришћењем својства Text објекта lRezultat. private void rbMaxBrojPojavljivanja_CheckedChanged(object sender, EventArgs e) { if (rbMaxBrojPojavljivanja.Checked) { StreamReader f;
f = new StreamReader(cbIzborFile.Text+”.txt”); int max, x, bp; max = Convert.ToInt32(f.ReadLine()); bp = 1; while (!f.EndOfStream)
{ x = Convert.ToInt32(f.ReadLine()); if (x == max) bp++; else if (x > max)
{ max = x; bp = 1; } }
f.Close();
lRezultat.Text=“Maksimalan broj je “+max+ “ pojavljuje se “+bp+“ puta“; } }
(double p=suma*1.0/ broj;).
private void rbProsek_CheckedChanged(object sender, EventArgs e) { if (rbProsek.Checked)
{ StreamReader f; f = new StreamReader(cbIzborFile.Text+“.txt“); int x,suma=0,broj=0; while (!f.EndOfStream)
{ x = Convert.ToInt32(f.ReadLine()); suma += x; broj++; }
f.Close(); double p = suma * 1.0 / broj; lRezultat.Text=“Prosek je “+p.ToString(“0.00“); } }
Наредбе за организацију циклуса
173
80. У фајлу imenik.txt, за сваку особу са којом се комуницира пише, редом, по линијама име, презиме, телефон и старост. Потребно је обезбедити: да корисник унесе почетни део имена или презимена (избор врши коришћењем објекта класе RadioButton) при чему се у објекту класе ListBox приказују имена, презимена и телефони свих особа из фајла којима име или презиме

private void tbX_TextChanged(object sender, EventArgs e)
{
lbSpisak.Items.Clear();
StreamReader sr = new StreamReader(“imenik.txt“); string x = tbX.Text.ToUpper(); string ime, prezime, telefon; int godine; lbSpisak.Items.Clear(); while (!sr.EndOfStream)
{ ime = sr.ReadLine(); prezime = sr.ReadLine(); telefon = sr.ReadLine(); godine = Convert.ToInt32(sr.ReadLine()); if (rbIme.Checked)
{ if (ime.ToUpper().StartsWith(x))
lbSpisak.Items.Add(ime + “ “ + prezime + “ “ + telefon); }
else { if (prezime.ToUpper().StartsWith(x)) lbSpisak.Items.Add(ime + “ “ + prezime + “ “ + telefon); } } sr.Close(); }
private void btDodaj_Click(object sender, EventArgs e) { StreamWriter sw = new StreamWriter(“imenik.txt“ , true); string ime, prezime, telefon; int godine; ime = tbIme.Text; prezime = tbPrezime.Text; telefon = tbTelefon.Text; godine = Convert.ToInt32(tbStarost.Text); sw.WriteLine(ime); sw.WriteLine(prezime); sw.WriteLine(telefon); sw.WriteLine(godine); tbIme.Text = tbPrezime.Text = tbTelefon.Text = tbStarost.Text = ““; sw.Close(); }

Циклус while while (Uslov)
TeloCiklusa
Uslov
TeloCiklusa
Циклус for for( Inicijalizacija; Uslov; Korekcija)
TeloCiklusa
Inicijalizacija
Korekcija
TeloCiklusa
TeloCiklusa

























особине и функционалности. Особине описујемо атрибутима, а функционалности методима.
Посматрајмо наставни процес
2 професор Мика предаје свим ученицима одељења IVb нову
ни објекти који учествују у њему: Пера, Мика, Лаза, IVa, IVb, математика, физика, учионица 1 и др. Лако се може уочити да Мика и Лаза координирају наставни процес тако што
Класа, конструктори, атрибути и методи
177
До класа долазимо полазећи од појединачних објеката. Посматрањем свих ученика уочавамо њихове заједничке особине. На пример, за све ученике је потребно пратити име, презиме, датум рођења, разред, одељење. Те особине називају се атрибути. Поред тога, свим ученицима
можемо придружити исте акције: ученик одговара и добија оцену, уче-
ник мења одељење и сл. Ове акције у оквиру класе називају се методи класе и њима се описује функционалност објеката те класе.
Класу дефинишемо навођењем резервисане речи class иза које следи идентификатор класе (име класе). Затим наводимо тело класе у којем у витичастим заградама {} дефинишемо чланове класе (атрибуте и методе).
class <imeKlase>
{ opis / definicija članova klase } На пример, класу ученика можемо интуитивно дефинисати на следећи начин:
class Ucenik
{ string ime, prezime; DateTime datumRodjenja; int razred; char odeljenje; Ocena[] ocene; public Ucenik()
{ //Podrazumevani konstruktor } public Ucenik(string i, string p)
{ //Konstruktor koji postavlja osnovne atribute } double prosek()
{ //Metod koji odredjuje prosek ocena ucenika } double prosek(Predmet P)
{ //Metod kojim se odredjuje prosek ocena iz predmeta P
178
Рачунарство и информатика } void uci(Lekcija X) { //Metod koji opisuje ucenje lekcije X… } }
Објекти претходно дефинисане класе описани су атрибутима ime, prezime, datumRodjenja, razred, odeljenje и ocene, као и методима prosek(), prosek(Predmet P) и uci(Lekcija X). Објекте класе Ucenik можемо креирати користећи два конструктора: Ucenik() и Ucenik(string i, string p).
У програмском језику C# при декларацији променљиве типа неке класе, објектне променљиве, резервише се простор за адресу објекта (референцу), а сам објекат се креира коришћењем оператора new: <ime klase> <promenljiva> = new <ime klase>(<lista parametara>); Оператор new враћа адресу
Prosek
imeObjekta.ImeMetoda(lista stvarnih parametara) На пример,
Lekcija
”Pera”; double d=this.Prosek(); this.Uci(L);
различитих рачунских операција са разломцима. При
резултат метода (повратни тип), затим име метода, за којим следи у малим заградама списак параметара. После заглавља наводи
<povratni tip> <ime metoda>(<lista parametara>) <telo metoda> <povratni tip>
тип резултата метода и може да буде било који тип програмског
се вршити
обрада у телу метода. За сваки параметар наводи се тип, па затим име
параметра.
Може се навести и једна од службених речи
out,
типа параметра. Њима се одређује начин преноса параметра (о чему ће касније бити више речи).
Ако метод има више од једног параметра, међусобно
али се заграде морају навести. Пошто приликом креирања метода немамо конкретне податке које обрађујемо, параметри
(енгл. overloading).
int MaxDvaBroja(int a, int b)
враћа реалан број: double MaxDvaBroja(double a, double b)
Највећи заједнички делилац
uint NZD(uint a, uint b)
void Pisi(string s)
void Pisi()
<telo
резултат метода. При томе повратни тип метода и тип израза,
int Saberi(int a, int b) { return a + b; }
int MaxDvaBroja(int a, int b)
{ int max; if (a > b) max = a; else max = b; return max; }
метода.
Исказом return обезбеђује се враћање резултата из метода, као и
прекидање даљег извршавања метода. Уобичајено је да се овај исказ налази на крају тела метода. Често смо у ситуацији да под одређеним условима треба да прекинемо извршавање метода пре краја. У том случају исказ return наводимо у наредби гранања којом проверавамо испуњеност одређеног услова. Тако, метод за одређивање
int MaxDvaBroja(int a, int b) { if (a > b) return a; return b;
uint NZD(uint a, uint b)
{ if (a == 0) return b; if (b == 0) return a; uint x = a; if (x > b) x = b; while (a % x != 0 || b % x != 0) x--; return x; }
void Pisi(string s)
{ label1.Text = s; return; // ovaj iskaz mozemo izostaviti }
return ; // ovaj iskaz ne mozemo izostaviti } ... return ; // ovaj iskaz mozemo izostaviti }

void Auto(int x, int y, int a, int b, Color boja, Graphics g)
Pen olovka = new Pen(Color.Black, 2); SolidBrush cetka = new SolidBrush(boja); g.FillRectangle(cetka, x - a / 4, y - b / 2, a / 2, b / 2);
g.FillRectangle(cetka, x - a / 2, y, a, b / 2);
g.DrawLine(olovka, x - a / 4, y - b / 2, x + a / 4, y - b / 2);
g.DrawLine(olovka, x - a / 2, y + b / 2, x + a / 2, y + b / 2);
g.DrawLine(olovka, x - a / 2, y, x - a / 4, y);
g.DrawLine(olovka, x + a / 2, y, x + a / 4, y);
g.DrawLine(olovka, x - a / 2, y, x - a / 2, y + b / 2);
g.DrawLine(olovka, x + a / 2, y, x + a / 2, y + b / 2);
g.DrawLine(olovka, x - a / 4, y, x - a / 4, y - b / 2);
g.DrawLine(olovka, x + a / 4, y, x + a / 4, y - b / 2);
cetka.Color = Color.Black;
g.FillEllipse(cetka, x - a / 4 - a / 6, y + b / 2 - a / 6, a / 3, a / 3);
g.FillEllipse(cetka, x + a / 4 - a / 6, y + b / 2 - a / 6, a / 3, a / 3); }
параметар не користимо њену претходну вредност, уколико је
Рачунарство
службене речи
самим тим и променити његово стање, али не може променити локацију (адресу, вредност референтне променљиве) на којој се тај објекат налази. При коришћењу службене речи ref променљива која се преноси као стварни параметар мора бити иницијализована. Уколико је у питању променљива референтног типа, можемо променити не само стање него и локацију објекта, односно направити потпуно нови објекат на који
параметре out јер самим
double Povrsina(double a, double b, out double O)
{ O = 2 * (a + b); return a * b; }
void IzracunajOP(double a, double b, out double P, out double O)
{ P= a * b; O= 2 * (a + b); }
void Skrati(ref uint a, ref uint b)
{ uint x = NZD(a,b); a /= x; b /= x; }
void Skrati2(uint a, uint b, out uint a1, out uint b1)
{ uint x = NZD(a,b); a1 = a / x; b1 = b / x; }
вредности неопходне
изведене акције. Метод позивамо на следећи начин: <ime metoda>(<lista stvarnih parametara>) <lista stvarnih parametara>
садржи изразе чијим вредностима иницијализујемо фиктивне параметре. Наведени изрази морају се по броју и типу слагати са описом фиктивних параметара у дефиницији метода. Параметре међусобно одвајамо зарезом. Ако метод нема параметара, при његовом позиву морамо навести заграде. Позив метода maxDvaBroja, дефинисаног на следећи начин: int MaxDvaBroja(int a, int b) { if (a > b) return a; return b; }
7:54:54
MaxDvaBroja(17,89);
MaxDvaBroja(Convert.ToInt32(tB1.Text),Convert.ToInt32(tB2.Text)); MaxDvaBroja(x,y);
MaxDvaBroja(x+34,300-2*y);
MaxDvaBroja ; MaxDvaBroja(); MaxDvaBroja(23);
MaxDvaBroja(”23” , ”67”); MaxDvaBroja(tB1.Text, tB2.Text);
IzracunajOP
IzracunajOP(a, b, out P, out O);
int a,b,x,y,z = MaxDvaBroja(12,89); label1.Text = z.ToString(); label1.Text = MaxDvaBroja(12,89).ToString(); z = MaxDvaBroja(MaxDvaBroja(x,y), MaxDvaBroja(a,b)); if (MaxDvaBroja(x, y) > 100)



struct
mesec, godina;
Datum Sutra(Datum danas)
Datum Juce(Datum danas)
191 Класа, конструктори, атрибути и методи
Ако после позива метода нећемо да користимо полазни датум, можемо променљиве које га дефинишу искористити за прихватање резултата. У том случају приликом преноса параметара природно је користити службену реч ref јер стварни параматри имају вредност пре позива метода, која се мења у методу. Тада би методи имали заглавље облика:
void Sutra(ref int d, ref int m, ref int g)
void Juce (ref int d, ref int m, ref int g)
Уколико желимо да после позива метода користимо и полазни датум, неопходно је да уведемо нове параметре метода − за прихватање резултата. У том случају приликом
void Sutra(int d, int m, int g, out int d1, out int m1, out int g1)
void Juce (int d, int m, int g, out int d1, out int m1, out int g1)
променљиве међусобно мењају вредност.
Резултат
void razmeni(ref int a, ref int b) { int p = a; a = b; b = p; }
bool Prost(uint Broj)
bool Prost(uint x)
{ if (x == 2) return true; if (x % 2 == 0) return false; for (int i = 3; i <= Math.Sqrt(x); i+=2)
{ if (x % i == 0) return false;
//broj je složen ako ima bar jednog delioca }
//ako delioci ne postoje do korena broja onda ih i //nema pa je broj prost return true;

private void btOdredi_Click(object sender, EventArgs e) { uint x = (uint)nmUPDBroj.Value; if (rbNajblizi.Checked)
lblIzvestaj.Text = “Najblizi prost broj je “ + NajbliziProst(x); else lblIzvestaj.Text = “Najveci prosti faktor broja je “ + NajveciProstFaktor(x); }
//metod za određivanje najvećeg prostog faktora broja private uint NajveciProstFaktor(uint x)
{ if (Prost(x)) return x; uint faktor = 2; while (x > faktor) if (x % faktor == 0) x /= faktor; else faktor++; return faktor; }
//metod za određivanje najbližeg prostog broja datom broju uint NajbliziProst(uint x)
{ uint k = 0; //ciklus ce biti prekinut komandom return, kad pronađemo prost broj while (true)
{ if (Prost(x - k)) return x - k; if (Prost(x + k)) return x + k; k++; }
void Goldbah(uint N, out uint prost1, out uint prost2) { if (N == 4) {prost1 = prost2 = 2; return;} prost1 = 3; prost2 = N - prost1; while (!Prost(prost1) || !Prost(prost2)) { prost1 += 2; prost2 = N - prost1; } }
. Креирајте апликацију којом ће бити реализована игра погађања задате комбинације од 6 боја, дужине 4, ако се боје могу понављати у комбинацији. Играч покушава да погоди комбинацију у највише 6 покушаја. После сваког покушаја добија информацију о броју погодака који су на правом месту, као и о броју погодака који нису на правом месту. Када играч погоди праву комбинацију или кад искористи свих 6
IgrajPotez
која зависи од редног броја потеза (променљива brojKlika),
ако је потезом изабрана и четврта боја, израчунава број погодака поређењем задате и изабране комбинације. Уколико је изабрана комбинација једнака задатој, метод враћа true, у противном − враћа false.
bool IgrajPotez(Graphics g, int brojKlika, Color boja) { int x = 10 + (brojKlika % 4) * (dimenzija + razmak); int y = 80 + (brojKlika / 4) * (dimenzija + razmak); SolidBrush cetka = new SolidBrush(boja); g.FillRectangle(cetka, x, y, dimenzija, dimenzija); switch (brojKlika % 4) { case 0: izabrana1 = boja; break; case 1: izabrana2 = boja; break; case 2: izabrana3 = boja; break; case 3: izabrana4 = boja;
brojPokusaja++; if (PogodjenaKombinacija(g, x, y)) { MessageBox.Show(“Pogodili ste u “ + brojPokusaja + ”. pokusaju.“ , ”Kraj igre“); KrajIgre(g); return true; } break; } return false; }

int PronadjiIPrikazi(string

tbEngleski
int PronadjiIPrikazi(string sr, string eng, ListBox lbSrpski, ListBox lbEngleski)
{ lbSrpski.Items.Clear(); lbEngleski.Items.Clear();
StreamReader rSrpski = new StreamReader(“srpski.txt“); StreamReader rEngleski = new StreamReader(“engleski.txt“); int brReci = 0;
while(!rSrpski.EndOfStream)
{ string srpskaRec = rSrpski.ReadLine(); string engleskaRec = rEngleski.ReadLine(); if(PronadjenaRec(sr,srpskaRec,eng,engleskaRec)) { brReci++; lbSrpski.Items.Add(srpskaRec); lbEngleski.Items.Add(engleskaRec); } }
rSrpski.Close(); rEngleski.Close(); return brReci;//vraćamo broj pronađenih parova reči }

потребно проверити да ли може стати у претходну, димензије кутија ћемо
методом: bool uzmiSledecuKutiju(StreamReader sr, out int a, out int b, out int c)
Приликом преноса
void uredi(ref
тора new, при чему позивамо конструктор (метод
иницијализујемо атрибуте објекта). Када креирамо објекат, његове атрибуте позивамо на следећи начин:

























Низ садржи информације истог типа, распоређене у познатом редоследу. Појединачним елементима низа може се приступити произвољно, навођењем имена низа и позиције елемента у свакој од димензија низа. Позиција елемента у свакој од димензија низа назива се индекс
елемента.
Ако посматрамо низ оцена неког ученика, оцена из трећег предмета налази се на трећој позицији у низу. Када посматрамо табелу оцена једног одељeња, оцена петог ученика из трећег предмета налази се у
петој врсти табеле, на трећој позицији.
У програмском језику C# могу се креирати низови чији су елементи произвољног типа. Низ се декларише навођењем типа елемената, за
којим следи пар средњих заграда ([]), а затим, после размака, име низа. Уколико је низ вишедимензионалан,
int[] oceneUcenika1, oceneUcenika2; // oceneUcenika1, oceneUcenika2 su promenljive deklarisane kao // jednodimenzionalni nizovi celih brojeva int[,] oceneOdeljenja1, oceneOdeljenja2; // oceneOdeljenja1, oceneOdeljenja2 su promenljive deklarisane kao // dvodimenzionalni nizovi celih brojeva int[, ,] oceneSkole; // oceneSkole je promenljiva deklarisana kao trodimenzionalni niz // celih brojeva string[] imenaProfesora; Pen[] olovke; Button[,] tabla;
При дефинисању низа, као и при дефинисању осталих променљивих референтног типа, користи се оператор new. Једнодимензионални низови дефинишу се на следећи начин:
imeNiza=new tipElemenata[kapacitetNiza]
У претходној дефиницији imeNiza је идентификатор
језика C#; tipElemenata је произвољан тип података, системски или претходно дефинисан,
oceneUcenika1=new int[10]; oceneUcenika2=new int[n];
int[] oceneUcenika1=new int[10]; Pen[] olovke=new Pen[10];
oceneUcenika1 одваја се
x
int[] y = { 12, -3, 46, 634, 7
imeNiza[indeks]
Tip[] niz=new Tip[n]; for(int i=0;i<n;i++) niz[i]= DodeliVrednost(i); при чему је DodeliVrednost(int i) метод којим се враћа вредност
типа Tip у зависности од индекса i Можемо формирати низ x од n случајних
бројева из интервала [a,b] на следећи начин:
Random R = new Random(); int[] x = new int[n]; for (int i = 0; i < n; i++) x[i] = R.Next(a, b+1);
Pen[] x = new Pen[n]; Random R = new Random(); for (int i = 0; i < n; i++)
{ Color boja=Color.FromArgb (R.Next(256),R.Next(256),R.Next(256)); x[i] = new Pen(boja,R.Next(1,11)); }
for(int i=0;i<n;i++) obrada(niz[i]);
suma = 0; for (int i = 0; i < n; i++) { suma += x[i]; }
pom=x[n-1]; // cuvanje vrednosti poslednjeg elementa for (int i = n-1; i>k ; i--) //pomeranje elemenata od //pretposlednjeg do k-tog za jedno mesto udesno { x[i]= x[i-1]; }
x[k] = pom; //upis sačuvanog elementa na poziciju k
а) ii)
void citaj(string s, out int[] a, out int n)
{ StreamReader sr = new StreamReader(s); n = Convert.ToInt32(sr.ReadLine()); a = new int[n]; for (int i = 0; i < n; i++) a[i] = Convert.ToInt32(sr.ReadLine()); sr.Close(); }
б)
void generisi(int a, int b, Random R, out int n, out int[] x)
{ n = R.Next(10, 101); x = new int[n]; for (int i = 0; i < n; i++) x[i] = R.Next(a, b+1); }
void prikaz(int[] a, int n, ListBox lb) { for (int i = 0; i < n; i++) lb.Items.Add(a[i].ToString()); }
93. Напишите метод којим се од елемената низа целих бројева x дужине n формирају два низа − parni и neparni, тако да низ parni садржи парне, а низ neparni непарне елементе полазног низа x. Низовима parni и neparni треба одредите дужину
void podeli(int[] x, int n, out int[] parni, out int bp, out int[] neparni, out int bn)
{ bp = bn = 0; parni = new int[n]; neparni = new int[n]; for(int i = 0; i < n; i ++) if (x[i] % 2 == 0) { parni[bp] = x[i]; bp++; } else { neparni[bn] = x[i]; bn++; } }
редом, цифара 0,1, ..., 9. На почетку све елементе низа иницијализујемо нулом. За све бројеве из интервала од A до B издвајамо цифре једну за другом и увећавамо одговарајући члан
ListBox приказујемо тражене податке. private void btBrojCifara_Click(object sender, EventArgs e)
{ int[] br = new int[10]; for (int i = 0; i < 10; i++) br[i] = 0; for (int i = A; i <= B; i++)
{ int broj = i; while (broj > 0)
{ br[broj % 10]++; broj /= 10; } }
listBox1.Items.Clear(); for (int i = 0; i <10; i++) if (br[i] > 0)
listBox1.Items.Add(i + “ se pojavljuje “ + br[i] + “ puta“); }
Напишите метод којим се у
одређује:
сума елемената низа, максимални члан, индекс максималног члана.
целих
a дужине n (n ≥ 1)
int suma(int[] a, int n) { int s = 0; for (int i = 0; i < n; i++) s += a[i]; return s; } Вредност максималног елемента низа региструјемо у променљивој max. На почетку променљивој max доделимо први елемент низа (a[0]). Затим, редом, анализирамо остале елементе низа (a[i]) и за сваки од њих проверавамо да ли има вредност већу
сималног
int maxNiza(int[] a, int n) { int i, max; max = a[0];
for (i = 1; i < n; i++) if (a[i] > max) max = a[i]; return max; } Слично као у претходном
int indexMaxNiza(int[] a, int n) { int i, iMax; iMax = 0; for (i = 1; i < n; i++) if (a[i] > a[iMax]) iMax = i; return iMax;
bool pripada(int[] a, int n, int x)
{ for (int i = 0; i < n; i++) if (a[i] == x) return true; return false; }
int brojPojavljivanja(int[] a, int n, int x) { int br = 0; for (int i = 0; i < n; i++) if (a[i] == x) br++; return br; }
разматрамо
да ли је стринг палиндром не треба узимати у обзир разлику између малих и великих слова, сва слова стринга преводимо у мала слова. Треба проверити да ли је прво слово стринга ( s[0] ) једнако последњем слову ( s[n-1] ), да ли је друго слово ( s[1] ) једнако претпоследњем ( s[n-2] ), и тако редом − да ли
је i -то слово с почетка ( s[i] ) једнако i -том слову
bool palindrom (string s)
{ s = s.ToLower(); int n = s.Length; for(int i = 0; i < n / 2; i++) if (s[i] != s[n-1-i]) return false; return true; }
void maxSerijaJednakih(int[] a, int n, ref int poc, ref int duz) { int i,t = 1; // t duzina tekuce serije duz = 0; for (i = 1; i < n; i++) if (a[i] == a[i - 1]) t++; else { if (t > duz){ duz = t; poc = i - t;} t = 1; }
// provera poslednje serije da li je duza if (t > duz) { duz = t; poc = n - t; } }
пример,
2, а није део низа 1,2,7,3,5,4,8,2. За сваку позицију i у
чува, што постижемо употребом службене речи ref уз одговарајући
итд. − до краја низа. Према томе, редом, за свако i од k
n-2 на позицију i у низу ставимо i+1-ви елемент (a[i] = a[i + 1]).
void ukloniKtiElement(int[] a, ref int n, int k)
{ for (int i = k; i < n - 1; i++) a[i] = a[i + 1]; n--; }
void ukloniKtiElement2(int[] a, ref int n, int k) { a[k] = a[n - 1]; n--; }
213 Низови
тод за уклањање i-тог елемента низа a. Треба напоменути да у том случају не мењамо вредност променљиве i јер, после брисања због померања елемената низа, на i-тој позицији се налази елемент који још нисмо анализирали. Ако елемент a[i] није једнак броју x
решење Приликом решавања
сређеном делу низа (a[k]=a[i]). Притом увећавамо дужину сређеног
променљивој k (n=k).
void brisiX(int[] a, ref int n, int x)
{ int i, k; k = 0; for (i = 0; i < n; i++) if (a[i] != x) { a[k] = a[i]; k++; } n = k; } 103. Напишите метод којим
сви елементи који се понављају, при чему се оставља њихово прво појављивање.
сваки елемент проверавамо да ли се појављује у сређеном делу низа, тј. међу првих k чланова низа. Ако се не појављује, придружујемо га сређеном делу низа и дужину сређеног дела низа увећамо за 1 (x[k]=x[i]; k++;). У противном
).
void bezpon(int[] x, ref int n)
{ int j, i, k = 1; for (i = 1; i < n; i++)
{ j = 0; while (j < k && x[j] != x[i]) j++; if (j == k) { x[k] = x[i]; k++; } } n = k; }
ако је a[0]≤a[1]≤a[2]≤ . . .≤a[n-1], тј. ако је a[i]≤a[i+1] за свако i од 0 до n-2, нерастући поредак ако је a[0]≥ a[1]≥ a[2]≥ . . .≥ a[n-1], тј. ако је a[i]≥ a[i+1] за свако i од
елементом низа (a[0]). Поступак настављамо тражењем минималног елемента дела низа од елемента са индексом 1 до последњег елемента и његовим постављањем на позицију 1. Понављањем поступка за све позиције у низу од 0 до n-2 долази
Скица таквог решења изгледа овако: За свако i од 0 до n-2 нађемо позицију (minInd) минималног елемента међу елементима a[j] за j од i до n-1 ( a[i], a[i+1], ..., a[n-1]) и разменимо минимални елемент a[minInd] са елементом a[i]. Илуструјмо алгоритам на примеру низа 4, 2, 7, 1. Минимални елемент међу елементима a[0], a[1], a [2], a[3] разменимо са елементом a[0]. Сада је елемент a[0] исправно постављен, па даље тражимо минимални елемент међу елементима a[1], a[2], a[3] и разменимо га са елементом a[1]. Елементи a[0] и a[1] исправно су постављени. Затим нађемо минимални елемент међу елементима a[2], a[3] и разменимо га са елементом a[2]
Сада су елементи a[0], a[1], a[2] исправно постављени, а самим тим и елемент a[3], па је низ уређен.
216 7/3/2013 7:54:57 PM
void sortSelection(int[] a, int n)
{ int i, k; for (i = 0; i < n - 1; i++)
{ k = IndeksMin(a, n, i); razmeni(ref a[i], ref a[k]); }
}
int IndeksMin(int[] a, int n, int i)
{ int minInd = i; for (int j = i + 1; j < n; j++) if (a[minInd] > a[j]) minInd = j; return minInd; }
реализације уводимо променљиву granica чија вредност
void sortBubble(int[] a, int n) { bool biloPromene = true; int granica = n - 1; while (biloPromene && granica > 0) { biloPromene = false; for (int i = 0; i < granica; i++) if (a[i] > a[i + 1])
{ razmeni(ref a[i], ref a[i + 1]); biloPromene = true; } granica--; } }
void ispisiKNajmanjih(int[] temperature, int brDana, int k, ListBox l)
{ for (int i = 0; i < k; i++)
{ int indeksMin = i; for (int j = i + 1; j < brDana; j++)
{ if (temperature[j] < temperature[indeksMin]) indeksMin = j; }
razmeni(ref temperature[i], ref temperature[indeksMin]); } for (int i = 0; i < k; i++)
{ l.Items.Add(temperature[i]); } }
public struct DnevnaTemperatura { public int temperatura; public int dan; }
109.
фајлу takmicenje.txt
struct Stanica
{ public string Ime; public int Kol; public int Cena; }
Stanica[] a; int n; private void Form1_Load(object sender, EventArgs e)
{ StreamReader sr = new StreamReader(“stanice.txt“); n = Convert.ToInt32(sr.ReadLine()); a = new Stanica[n]; for (int i = 0; i < n; i++) a[i] = citajStanicu(sr); sr.Close(); // uredjujemo niz po cenama u neopadajucem poretku // (od najniže do najviše cene) sortStanice(a,n); }
Stanica citajStanicu(StreamReader sr)
{ Stanica X; string s = sr.ReadLine();
//podaci o stanici su u jednoj liniji //odvojeni sa po jednim blanko znakom //imeStanice kolicina cena int p = s.IndexOf(“ “);
X.Ime = s.Substring(0, p); s = s.Substring(p + 1); p = s.IndexOf(“ “);
X.Kol = Convert.ToInt32(s.Substring(0, p)); s = s.Substring(p + 1);
X.Cena = Convert.ToInt32(s); return X; }
int minInd(Stanica[] a, int n, int i) {
int minI = i; for (int j = i + 1; j < n; j++)
{ if (a[minI].Cena > a[j].Cena) minI = j; }
return minI; }
void sortStanice(Stanica[]a, int n)
{ for (int i = 0; i < n - 1; i++)
{ int j=minInd(a,n,i); if (i!=j && a[i].Cena > a[j].Cena)
{ Stanica pom = a[i]; a[i] = a[j]; a[j] = pom; } } }
private void btVoce_Click(object sender, EventArgs e)
{ lb.Items.Clear();
int S = Convert.ToInt32(tbS.Text); int i = 0; while (i<n && S > 0)
{ if (a[i].Kol >= S) { a[i].Kol = a[i].Kol - S; lb.Items.Add(a[i].Ime + “ “ + S); S = 0; } else { lb.Items.Add(a[i].Ime + “ “ + a[i].Kol); S -= a[i].Kol; a[i].Kol = 0; } i++; } if (S > 0)
{
lb.Items.Clear(); lb.Items.Add(“Voća nema dovoljno“); } }
111. Око куће је n стабала која су од ње подједнако удаљена. У првој линији фајла stabla.txt дат је број стабала, а затим у свакој наредној линији, за свако стабло, x и y координата његовог положаја у односу на кућу (кућа је координатни почетак). Треба подићи ограду око куће коришћењем стабала као стубова.

поретку, треба их уредити тако да око куће формирају многоугао.
којима је y координата негативна, па стабла којимa је y координата ненегативна. Стабла која су испод x осе, тј. којима је y координата негативна, треба обилазити, редом, у растућем поретку по x координати (од најмање до највеће x координате), а остала стабла (која су изнад x осе или на њој) треба обилазити, редом, у опадајућем поретку по
bool uporedi(int x1, int y1, int x2, int y2)
{ return ( (y1 >= 0 && y2 < 0)
|| (y1 >= 0 && y2 >= 0 && x1 < x2)
|| (y1 < 0 && y2 < 0 && x1 > x2) ); }
void sortiraj(int[] x, int[] y, int n)
{ for (int i = 0; i < n - 1; i++)
{ for (int j = i + 1; j < n; j++)
{ if (uporedi(x[i],y[i],x[j],y[j]))
{ razmeni(ref y[i], ref y[j]); razmeni(ref x[i], ref x[j]); } } } }
void razmeni(ref int x, ref int y)
{ int p = x; x = y; y = p; } int[] x; int[] y; int n;
private void Form1_Load(object sender, EventArgs e)
{ StreamReader sr = new StreamReader(“stabla.txt“); n = Convert.ToInt32(sr.ReadLine());
x = new int[n];
y = new int[n]; for (int i = 0; i < n; i++)
{
string s = sr.ReadLine(); x[i] = Convert.ToInt32(s.Substring(0, s.IndexOf(‘ ‘))); s = s.Substring(s.IndexOf(‘ ‘) + 1); y[i] = Convert.ToInt32(s); }
sr.Close(); sortiraj(x, y, n); }
квадрата са центром у тачки на коју је корисник кликнуо (xc, yc). Затим, редом, цртамо стабла и спајамо их линијама. Пошто је положај стабла дат релативно у односу на положај куће, стабло чије су координате (x[i], y[i]) на објекту класе Graphics има координате (xc+x[i], yc-y[i]). Упоредо са цртањем i-тог стабла црта се део ограде (линија) који спаја i-то и (i+1)-во стабло и одређује се
треба спојити последње, са индексом (n-1), и прво стабло, са индексом 0.
double rastojanje(int x1, int y1, int x2, int y2) { return Math.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); }
private void pb1_MouseClick(object sender, MouseEventArgs e)
{ int xc = e.X; int yc = e.Y; pb1.Refresh(); Graphics g = pb1.CreateGraphics(); SolidBrush cetka = new SolidBrush(Color.Red); g.FillRectangle(cetka, xc - 10, yc - 10, 20, 20); cetka.Color = Color.Green; Pen olovka = new Pen(Color.Brown); double s = 0; for (int i = 0; i < n; i++) { g.FillEllipse(cetka, xc + x[i] - 5, yc - y[i] - 5, 10, 10); if (i != n - 1)
{ g.DrawLine(olovka, xc + x[i], yc - y[i], xc + x[i + 1], yc - y[i + 1]);
226
Рачунарство и информатика
s += rastojanje(x[i], y[i], x[i + 1], y[i + 1]); } }
g.DrawLine(olovka, xc + x[n - 1], yc - y[n - 1], xc + x[0], yc - y[0]); s += rastojanje(x[0], y[0], x[n - 1], y[n - 1]);
label1.Text = “Duzina ograde je “ + s.ToString(“0.00“); }
112.
Напишите метод којим се од елемената два неопадајуће уређена
низа x и y, дужина, редом, n и m, формира низ z уређен у неопадајући поредак.
Низ z можемо формирати тако што прво препишемо
j) увећамо за 1. На тај начин низ z формира се као неопадајуће уређен низ. Елементе низова x и y можемо упоређивати док не исцрпимо један низ, тј. док је i<n и j<m, после чега остатак низа x, односно низа y препишемо у низ z.
void spoji(int[] x, int n, int[] y, int m, int[] z) { int i, j, k; i = j = k = 0; while (i < n && j < m) { if (x[i] < y[j]) { z[k] = x[i]; i++; } else
227
{ z[k] = y[j]; j++; } k++; }
while (i < n) { z[k++] = x[i++]; } while (j < m) { z[k++] = y[j++]; } }
Бинарна претрага
Један
Секвенцијалну претрагу низа реализујемо тако што редом, почев од првог елемента низа, упоређујемо елементе низа (a[i] за i од 0 до n-1) са траженим податком x: ако је елемент једнак податку x, вратимо његов индекс; у противном, настављамо да
број x једнак је елементу а[s], па смо нашли тражени број
преполовимо дужину дела низа у којем настављамо претрагу, па се
а индекс последњег елемента на n-1 (d=n-1). Док је део низа у којем тражимо непразан (l<=d), одредимо индекс средњег елемента s=(l+d)/2, затим упоредимо a[s] са траженим бројем x. Ако је x мање од a[s], настављамо претрагу у левом делу, па променимо десну границу дела низа (d=s–1). Уколико је x веће од a[s], претрагу настављамо у десном делу низа, па променимо леву границу (l=s+1). У противном − нашли смо број x и метод враћа позицију s. Ако у једном тренутку лева граница премаши десну (l>d), метод враћа -1 јер се x не налази у низу.
Следи решење бинарне претраге броја x у неопадајуће уређеном низу a дужине n int binPretraga(int[] a, int n, int x) { int l, d, s; l = 0; d = n - 1; while (l <= d) { s = (l + d) / 2; if (x < a[s]) d = s - 1; else if (x > a[s])
l = s +
else return s; } return -1; }
int binPretragaModifikovana(int[] a, int n, int x)
{ int l, d, s; l = 0; d = n - 1; while (l <= d)
{ s = (l + d) / 2; if (x < a[s]) d = s - 1; else
if (x > a[s]) l = s + 1; else
return s; } return d; }
private void button1_Click(object sender, EventArgs e) { int A = (int)numericUpDown1.Value; int B = (int)numericUpDown2.Value; int mestoA = binPretragaModifikovana (a, n, A); int mestoB = binPretragaModifikovana(a, n, B); while (mestoA>0 && a[mestoA - 1] == A) mestoA--; if (mestoA < 0 || a[mestoA] != A) mestoA++; while (mestoB < n - 1 && a[mestoB + 1] == B) mestoB++; label1.Text = (mestoB - mestoA + 1).ToString(); } Дводимензионални
школски дневник. Један од најбитнијих делова дневника
Дводимензионални низ декларишемо навођењем типа елемената, за
којим следи пар средњих заграда са једним зарезом између њих([,]), а
затим, после размака, име низа. Матрицу a целих бројева декларишемо на следећи начин: int[,] a;
Приликом дефинисања матрице коришћењем оператора new потребно је навести њено име, тип података који се у њој чувају, као и капацитет матрице одређен максималним бројем редова и максималним бројем колона. Може се десити да подацима попунимо само део алоцираних локација, па се саветује да се, поред матрице, дефинишу и две променљиве које означавају број редова и колона попуњених подацима. Дефиниција матрице a целих бројева
a=new int[100,50];
int[,] a=new int[100, 50];
Point[,] tacke=new Point[100, 200];
Color[,] boje=new Color[10, 10];
double[,] b=new double[50, 50];
bool[,] c=new bool[50, 100];
Елементу матрице приступа се
прве димензије (реда), затим зарез, па индекс друге димензије (колоне). Тако је a[i, j] елемент који се налази у i-том реду (врсти) и j-тој колони. Приликом навођења индекса треба
int[,] a ; a = new int[2, 3] { { 1, 2, 3 }, { 4, 5, 6 } }; int[,] b = { { 1, 2, 3 }, { 4, 5, 6 } };

int [,] ocene=new int [6,10];
int s = 0; for (int i = 0; i < 6; i++)
{ for (int j = 0; j < 10; j++)
s += ocena[i,j];
} double prosek = (double)s / (6 * 10);
int s;
double[] x = new double[6]; for (int i = 0; i < 6; i++)
{ s = 0; for (int j = 0; j < 10; j++) s += ocena[i,j]; x[i] = s / 10.0; }
int s; double[] x = new double[10]; for (int j = 0; j < 10; j++)
{ s = 0; for (int i = 0; i < 6; i++)
s += ocena[i,j]; x[j] = s / 6.0; }
Рачунарство и информатика
Контрола DataGridView
Контрола DataGridView служи за уношење и приказивање података који су организовани у облику дводимензионалне табеле. Састоји се
од пôља (ћелија, енгл. cell) која се налазе у пресеку одговарајуће колоне (енгл. column) и реда, врсте (енгл. row). Уколико објекат класе DataGridView има m колона, њихови индекси су 0, 1, 2, 3, ..., m-1. Слично, ако објекат класе DataGridView има n редова, њихови индекси су 0, 1, 2, 3, ..., n-1. Свако поље дефинисано је редним бројем колоне и реда којем припада. Поље у горњем левом углу
AllowUserToAddRows, AllowUserToDeleteRows
AllowUserToResizeRows, AllowUserToResizeColumns
RowCount
број редова;
ColumnCount
број колона;
Rows
низ (колекција) који садржи све редове контроле, објекат класе DataGridViewRowCollection
Приступ појединачном реду остварујемо на уобичајени начин у раду са низовима − навођењем
реда у угластим заградама, на пример Rows[i]. Могуће је додавати
DataGridViewRowCollection
ћелија које чине ред,
Height – висина реда,
ReadOnly – да ли се садржај
HeaderCell
остале методе
HeaderCell
целог DataGridView-а, висине свих редова и ширине свих колона. Све
//preciziranje prikaza dvg DataGridView-a koji ima n redova i m // kolona a svako polje ima sirinu w i visinu h void PostaviDataGridView(DataGridView dgv, int n, int m, int w, int h) { //onemoguciti korisniku da dodaje redove, menja velicinu
dgv.AllowUserToAddRows = false;
dgv.AllowUserToDeleteRows = false;
dgv.AllowUserToOrderColumns = false;
dgv.AllowUserToResizeColumns = false;
dgv.AllowUserToResizeRows = false;
//ukidanje zaglavlja za redove i kolone
dgv.ColumnHeadersVisible = false;
dgv.RowHeadersVisible = false;
dgv.ScrollBars = ScrollBars.None;
dgv.RowCount = n; //broj redova
dgv.ColumnCount = m; //broj kolona
dgv.Height = h * n+3; //visina celog DataGridView-a (+3 zbog ivica)
dgv.Width = w * m+3;
//sirina celog DataGridView-a (+3 zbog ivica)
for (int i = 0; i < n; i++)
{//visina svakog reda
dgv.Rows[i].Height = h; } for (int j = 0; j < m; j++)
{//sirina svake kolone
dgv.Columns[j].Width = w; } } private void Form1_Load(object sender, EventArgs e) { PostaviDataGridView(dataGridView1, 15, 11, 30, 20);
//pozicija DataGridView-a na formi dataGridView1.Top = 5; dataGridView1.Left = 5;
//velicina forme tako da se vidi ceo DataGridView Width = dataGridView1.Width + 20; Height = dataGridView1.Height + 50; } Појединачном пољу објекта класе DataGridView приступамо навођењем
System.Object
Convert.ToInt32(dgv[0,0].Value),

dgv.RowCount = 2; dgv.ColumnCount = 3; dgv.Columns[0].Name = “Jun“; dgv.Columns[1].Name = “Jul“; dgv.Columns[2].Name = “Avgust“; dgv.Rows[0].HeaderCell.Value = “min“; dgv.Rows[1].HeaderCell.Value = “max“; dgv[“Jun“,0].Value=20; dgv[“Jun“, 1].Value = 30; dgv.Rows[0].Cells[“Jul“].Value = 23; dgv.Rows[1].Cells[1].Value = 35; dgv.Rows[0].Cells[“Avgust“].Value = 15; dgv[2,1].Value = 35; dgv.RowHeadersWidth = 60; for (int i = 0; i < dgv.ColumnCount; i++) {
dgv.Columns[i].Width = 50;
dgv[i, 0].Style.ForeColor = Color.Blue; dgv[i, 1].Style.ForeColor = Color.Red; dgv[i, 0].Style.Font = new Font(“Time New Roman“ , 12, FontStyle.Italic);
dgv[i, 1].Style.Font = new Font(“Time New Roman“ , 12, FontStyle.Bold); }
e.RowIndex].Value
грида (j≥0, j<n).
void ParalelaGlavne(int p, int q, int n) { int i, j; for (i = 0; i < n; i++) { j = i - p + q; // p-q=i-j prema tome j=i-p+q if (j >= 0 && j < n)
dgv[j, i].Style.BackColor = Color.Indigo; } }
void ParalelaGlavne(int p, int q, int n)
{ int i, j; int poc = 0;
if (p - q > 0)
poc = p - q; int kraj = n; if (p - q < 0)
kraj = n + (p - q); for (i = poc; i < kraj; i++) { j = i - p + q; dgv[j, i].Style.BackColor = Color.Indigo; } }
void ParalelaSporedne(int p, int q, int n)
{ for (int i = 0; i < n; i++)
{ // p+q=i+j prema tome j=p+q-i int j = p + q - i; if (j >= 0 && j < n)
dgv[j, i].Style.BackColor = Color.Indigo; } }

int n = 7, m = 9;
private void Form1_Load(object sender, EventArgs e)
{ PostaviDataGridView(dgv, n, m, 30, 30); }
Random r = new Random(); private void btGenerisi_Click(object sender, EventArgs e) { for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) dgv[j, i].Value = r.Next(100); tbZbir.Clear(); }
private void btZbir_Click(object sender, EventArgs e)
{ int zbir = 0; for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) zbir += Convert.ToInt32(dgv[j, i].Value); tbZbir.Text = zbir.ToString(); }

private void Form1_Load(object sender, EventArgs e) { dgv.Visible = false; }
private void numericUpDown1_ValueChanged(object sender, EventArgs e) { int n = (int)numericUpDown1.Value; int m = (int)numericUpDown2.Value; if (n > 0 && m > 0) { dgv.Visible = true; PostaviDataGridView(dgv, n, m, 35, 20); for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) dgv[j, i].Value = 0; } }
private void btUpis_Click(object sender, EventArgs e)
{ int n = (int)numericUpDown1.Value; int m = (int)numericUpDown2.Value; if (saveFileDialog1.ShowDialog() == DialogResult.OK) { string imeFajla = saveFileDialog1.FileName; StreamWriter f = new StreamWriter(imeFajla); try
{ for (int i = 0; i < n; i++)
{ for (int j = 0; j < m; j++) f.Write(Convert.ToInt32(dgv[j, i].Value) + “ “); f.WriteLine(); } f.Close(); } catch (Exception izuzetak) { MessageBox.Show(izuzetak.Message, “GRESKA“); f.Close(); File.Delete(imeFajla); } } }
// odredjivanje ukupne proizvodnje u periodu j – suma j-te kolone int sumaPerioda(int[,] a, int n, int j) { int s = 0; for (int i = 0; i < n; i++) s += a[i, j]; return s; }
// odredjivanje perioda najmanje produktivnosti - min po kolonama int rbMinPeriod(int[,] a, int n, int m)
{ int s,rb=-1, min=-1; for (int j = 0; j < m; j++)
{ s = sumaPerioda(a, n, j); if (min == -1 || s < min)
{ min = s; rb = j; } } return rb; }
// odredjivanje ukupne proizvodnje pogona i – suma i-te vrste int sumaPogona(int[,] a, int m, int i)
{ int s = 0; for (int j = 0; j < m; j++) s += a[i, j];
return s; }
// odredjivanje perioda najproduktivnijeg pogona - max po vrstama int rbMaxPogon(int[,] a, int n, int m)
{ int s, rb = -1, max = 0; for (int i = 0; i < n; i++)
{ s = sumaPogona(a, m, i); if (s > max)
{ max = s; rb = i; } }
return rb; }
Рачунарство
Симетричним пресликавањем
дијагонале,
вратили на почетно место у матрици (други елемент прве врсте). Слично томе,
симетралу елементи колоне чији
фигура топа, скакача,
таблу, чије димензије корисник задаје употребом објекта класе NumericUpDown,
Низови
247

Топ који се налази у ћелији tabla[q, p] креће се по колони q и по реду p, па у складу са тим означимо све ћелије реда p и колоне q.
void top(int p, int q, int n)
{ int i; for (i = 0; i < n; i++)
{ tabla[i, p].Value = ‘X‘; tabla[q, i].Value = ‘X‘; }
tabla[q, p].Value = ‘T‘; }
Могуће потезе скакача дефинишемо помоћу два низа. Низом dx дефинишемо за колико се мења ред, а низом dy − за колико се мења колона у којој је скакач. Израчунамо нову позицију скакача, па ако се она налази на табли, означимо ћелију.
void skakac(int p, int q, int n)
{ int i;
int[] dx ={ 2, 2, -2, -2, 1, 1, -1, -1 }; int[] dy ={ 1, -1, 1, -1, 2, -2, 2, -2 }; for (i = 0; i < 8; i++)
{ if (p + dx[i] >= 0 && p + dx[i] < n && q + dy[i] >= 0 && q + dy[i] < n)
tabla[q + dy[i], p + dx[i]].Value = ‘X‘; }
tabla[q, p].Value = ‘S‘; }
void lovac(int p, int q, int n)
{ int i, j; for ( i = 0; i < n; i++)
{ j = i - (p - q); if (j >= 0 && j < n)
tabla[j, i].Value = ‘X‘; j = p + q - i;
if (j >= 0 && j < n)
tabla[j, i].Value = ‘X‘; }
tabla[q, p].Value = ‘L‘; } Краљица
void kraljica(int p, int q, int n) {
top(p, q, n);
lovac(p, q, n); tabla[q, p].Value = ‘K‘; }

void prikazi(int[,] a, int n, int m, DataGridView dgv)
{ PostaviDataGridView(dgv, n, m, 30, 30); for (int i = 0; i < n; i++) for (int j = 0; j < m; j++)
{ dgv[j, i].Value = a[i, j]; dgv[j, i].Style.BackColor = Color.White; } for (int j = 0; j < m; j++)
{ if(opadajucaKolona(a, n, j)) for (int i = 0; i < n; i++) dgv[j, i].Style.BackColor = Color.PaleGreen; } } bool opadajucaKolona(int[,] a, int n, int j) { for (int i = 1; i < n ; i++) { if (a[i, j] >= a[i - 1, j]) return false; } return true; }
редом за сваког ученика. Креирајте апликацију која
приказује просек за сваког ученика, просек из сваког предмета, као и просечну оцену целог одељења.
int[,] a; //matrica sa ocenama ucenika int n; //broj ucenika, tj. broj redova u matrici int m; //broj predmeta, tj. broj kolona u matrici string[] ime; //niz imena ucenika
private void Form1_Load(object sender, EventArgs e)
7:55:00

//citanje iz fajla
StreamReader f = new StreamReader(“uspeh.txt“);
n = Convert.ToInt32(f.ReadLine());
m = Convert.ToInt32(f.ReadLine());
a = new int[n, m]; ime = new string[n]; for (int i = 0; i < n; i++)
{ ime[i] = f.ReadLine(); for (int j = 0; j < m; j++)
{ a[i, j] = Convert.ToInt32(f.ReadLine()); }
}
f.Close();
// DataGridView sa ocenama dgvOcene.Visible = true; PostaviDataGridView(dgvOcene, n, m, 40, 20); for (int i = 0; i < n; i++)
{ for (int j = 0; j < m; j++)
{ dgvOcene[j, i].Value = a[i, j]; }
}
//DataGridView sa imenima dgvImena.Visible = true; racunarstvo_i_informatika.indb
7/3/2013 7:55:00 PM
PostaviDataGridView(dgvImena, n, 1, 120, 20); for (int i = 0; i < n; i++) { dgvImena[0, i].Value = ime[i]; } } catch (Exception izuzetak) { MessageBox.Show(izuzetak.Message, “GRESKA“); } }
private void btUspeh_Click(object sender, EventArgs e) { btUspeh.Enabled = false; //dataGridView sa uspehom svakog ucenika dgvUspeh.Visible = true; dgvUspeh.Left = dgvOcene.Left + dgvOcene.Width + 10; PostaviDataGridView(dgvUspeh, n, 1, 120, 20); for (int i = 0; i < n; i++) { double prosek = 0; bool nedovoljan = false; for (int j = 0; j < m; j++) { prosek += a[i, j]; if (a[i, j] == 1) nedovoljan = true; }
prosek /= m; if (nedovoljan)
dgvUspeh[0, i].Value = “nedovoljan“; else if (prosek >= 4.5)
dgvUspeh[0, i].Value = “odlican (“ + prosek.ToString(“0.00“) + “)“; else if (prosek >= 3.5)
dgvUspeh[0, i].Value = “vrlo dobar (“ + prosek.ToString(“0.00“) + “)“; else if (prosek >= 2.5)
dgvUspeh[0, i].Value = “dobar (“ + prosek.ToString(“0.00“) + “)“; else
dgvUspeh[0, i].Value = “dovoljan (“ + prosek.ToString(“0.00“) + “)“; }

//dataGridView sa prosekom po predmetima dgvProsekPr.Visible = true; dgvProsekPr.Top = dgvOcene.Top + dgvOcene.Height + 10; PostaviDataGridView(dgvProsekPr, 1, m, 40, 20); for (int j = 0; j < m; j++)
{ double prosek = 0; for (int i = 0; i < n; i++)
prosek += a[i, j]; prosek /= n; dgvProsekPr[j, 0].Value = prosek.ToString(“0.00“); }
//prosek celog odeljenja double ocena = 0; for (int i = 0; i < n; i++)
{ for (int j = 0; j < m; j++) ocena += a[i, j]; }
ocena /= (m * n); textBox1.Visible = true; textBox1.Text = “Prosecna ocena odeljenja je:“ + ocena.ToString(“0.00“); }
120. Креирајте апликацију којом корисник, пошто прецизира димензије
матрице помоћу две контроле NumericUpDown, уноси у DataGridView матрицу целих бројева. Сваким притиском на дугме из матрице се (тиме и из DataGridView) уклања колона са најмањим збиром. Треба обезбедити да брисање не буде могуће када се све колоне обришу. Притом треба написати
imeNiza = new tipElemenata[brojVrsta, brojKolona]























Основи програмирања програмски језик С#
2. програмски језик С#
програмирања у


Литература
1. , Станка Матковић, Душа Вуковић, Мијодраг Ђуришић, Завод
оперативних система –
Станка Матковић, мр. Бранислава Бајковић-Лазаревић, Мијодраг
Душа Зорановић, CET, Београд, 2007.
Основи програмирања у окружењу графичких оперативних система –
3. програмски језик С#, Станка Матковић, мр. Бранислава Бајковић-Лазаревић, Мијодраг Ђуришић, Душа Зорановић, CET, Београд, 2006.
Објектно оријентисани начин мишљења
4. , Matt Weisfeld, CET, Београд, 2003.
C/C++ збирка задатака 5. , Милан Чабаркапа, Станка Матковић, Круг, Београд, 2003.
C# кроз практичне примере, 6. Charles Wright, Микро књига, Београд, 2002.
Од почетка... С# 7. , Karli Watson, CET, Београд, 2002.
Microsoft Visual C#.NET – корак по корак 8. , John Sharp, Jon Jagger, CET, Београд, 2002.
Алгоритми 9. , Миодраг Живковић, Математички факултет, Београд, 2000.
Методичка збирка задатака из програмирања са решењима у Pascal-у 10. , књига 1, Милан Чабаркапа, Невенка Спалевић, Сова, Београд, 1997.
Методичка збирка задатака из
са решењима у Pascal-у, 11.
књига 2, Милан
Сова, Београд, Београд, 1996. racunarstvo_i_informatika.indb 254 7/3/2013 7:55:01 PM








алгоритам, 10, 12
апстракција, 24
аритметички оператори, 60, 70
атрибут, 24, 64, 177, 179
базе података, 20
бинарна азбука, 18
бинарна претрага, 227
вредносне променљиве, 62, 66
графичко корисничко окружење, 21
датотеке, 165
дводимензиони низови, 230
декларација променљиве, 62, 63
дефиниција променљиве, 62
догађај, 26, 33, 45
експлицитна конверзија, 76
енумерацијски тип, 67
етапа дизајна корисничког интерфејса, 36, 39
етапа кодирања, 36, 45
идентификатор, 62
израз, 69
изузетак, 83
именски простор, 25, 34
импилицитна конверзија, 75
иницијализација променљиве, 64
инструкције гранања, 79, 94
инструкције израза, 78
инструкције циклуса, 79, 140
инструкције, 78
једнодимензионални низови , 200
класа, 24, 64, 176










кодирање, 11
конверзије података, 74 конструктор, 178 контрола, 25, 33, 39 координатни систем, 28
логички оператори, 70, 71







машински зависни језици, 17
машински језик, 18
машински независни језици, 17
метод, 24, 64, 176, 179
наредба вишеструког избора, 107
наредба условног преласка, 94
наслеђивање, 25
низови, 199
објекат, 24, 64, 178
објектно оријентисани језици, 20
објектно оријентисано програмирање, 23
оператор cast, 76
оператор доделе, 63, 72
оператор, 70
основни типови података, 59
програм, 9
алгоритми линијске структуре, 13
алгоритми разгранате структуре, 15
алгоритми цикличне структуре, 15
програмски језици, 17
пројекат Windows Forms Application, 31
променљива, 62
резервисане речи, 30
релацијски оператори, 70
референтне променљиве, 62
својство, 24, 65
симболички језик, 18
системске библиотеке класа, 33
сортирање, 215
структура, 66
текстуални оператори, 70, 72
тип података, 59
условни оператор, 74, 92 BackColor, 35,41 bool, 61 Button, 39, 43, 82 CheckBox, 40, 117 Close, 168 Color, 28, 48 ColorDialog, 54 ComboBox, 40, 132 CommonDialog, 39, 54 CompаreTo, 89 Control, 39 Convert, 76 DataGridView, 234 DateTime, 51 double, 60 do-while циклус, 144 DrawEllipse, 27, 55 DrawLine, 27, 36, 53 DrawRectangle, 27 EndOfStream, 167 FillEllipse, 27 FillRectangle, 27 float, 60 Font, 41 for циклус, 142 Form, 34 FromArgb, 50 Graphics, 27, 36, 55, 58 GroupBox, 40, 118 IndexOf, 89 Insert, 90 int, 60 Label, 40, 43 LastIndexOf, 89 ListBox, 40, 128 Load, 46
long, 60 Main, 37 MouseClick, 36, 45 MouseDown, 27, 45 MouseMove, 45 MouseUp, 27, 45 Name, 41 Next, 49 Paint, 28,45 Panel, 118 Pen, 28, 36, 53 PictureBox, 40, 55 Point, 53 Properties, 33, 35, 47 RadioButton, 40, 115 Random, 49 Read, 167 ReadLine, 167 Remove,90 Resize, 46 SolidBrush, 28, 34 Solution Explorer, 33 StartsWith, 90 StreamReader, 166 StreamWriter, 166 string, 60, 89 Substring, 89 System именски простор , 34 System.Drawing – именски простор, 34 System.IO – именски простор, 166 Text, 41 TextBox, 40, 82 Tick, 49, 52 Timer, 49, 56 ToLower, 90 Toolbox, 33, 39 ToString, 78 ToUpper, 90 try-catch, 83 uint, 60 using директива , 34 while циклус, 140 Write, 167 WriteLine, 167
Лектор
Корице Душа Вуковић
Коректори Тамара Бачковић Обим:

