Jump to content

Програмирање - лекција бр. 1

Оцени ову тему


Препоручена порука

пре 3 часа, uros рече

Jel u C# "ref" nesto ala pointer u C-u? 

Iz tutoriala nije mi bas najjasnije zasto mora (ref number). Zapravo ovo izgleda kao neka ce-sharpshtina 


static void Main(string[] args)
{
    int number = 20;
    AddFive(ref number);
    Console.WriteLine(number);
    Console.ReadKey();
}

static void AddFive(ref int number)
{
    number = number + 5;
}

Ovo bi u C-u bilo nesto ovako:

int AddFive( int number)

  return (number + 5);

Има везе са показивачима (поинтерима или референцама).

Вредност C# променљиве којој доделимо да буде неки објекат је заправо имплицитна референца ка том објекту. С друге стране, бројеви (и још пар типова) нису објектив, већ вредности. Када променљивој доделимо да буде број, та променљива није референца, већ баш тај број. Пошто ни самог себе не разумем шта сам овде написао, нит знам како да се изразим на говорном језику о овоми стварима, ево сликовито:

2sb7uap.jpg

Кућа је засебан објекат у меморији. Променљива 'kuca' (која се налази у неком објекту који је направио кућу, а који није приказан на слици) је само референца ка тој кући. Исто важи и за телевизор. Телевизор је засебан објекат у меморији, а променљива 'televizor', која се налази у кући, је само референца ка том телевизору.

С друге стране, бројеви нису објекти. Променљива 'Broj' није референца, већ заиста садржи број 5 и тај број се у овом примеру налази унутар објекта на кога показује променљива 'kuca' (небитно шта број значи, лупио сам скроз пример).

 

Ово је јако битно разумети јер има веома важне последице за само програмирање. Поушајте да одговорите на следећа питања:

int broj1 = 5;
int broj2 = broj1;
broj1 = 6;
// Koja je sada vrednost promenljive broj2?

Kuca kuca1 =  new Kuca();
Kuca kuca2 = kuca1;
kuca1.televizor.PustiVucica();
//  U kojoj kuci Vucic prica da ce biti bolje za dve, dve i po godine?

 

Link to comment
Подели на овим сајтовима

пре 4 часа, uros рече

Jel u C# "ref" nesto ala pointer u C-u? 

Iz tutoriala nije mi bas najjasnije zasto mora (ref number).

...

Ovo bi u C-u bilo nesto ovako:

int AddFive( int number)

  return (number + 5);

Не мора ref, само су хтели да покажу како се користи. Ако погледаш мој претходни пост, разумећеш да је ref ту да би се бројеви, који су вредности, понашали слично објектима, који су референце. Зашто и када заиста желимо да користимо ref је друга прича.

У C-у би конкретан пример изгледао овако некако, ако се добро сећам:

void AddFive(int* number)
{
    *number = *number + 5;
}

Па би онда у 'main' фунцији стајало:

int number = 20;

AddFive(&number);

и тиме би променљива 'number' добила вредност 25. Класичан пример који користи "passing by reference" у C-у је 'swap' функција у Ричијевој књизи, која замењује вредности две променљиве.

Крајњи Ефекат је исти као када би бројеви били објекти који имају метод 'AddFive()' који на њих додаје 5:

// IntClass ne postoji u C#-у, ali mozete da je napisete za vezbu kasnije, da biste jos bolje razumeli razliku izmedju referenci i vrednosti

IntClass number = IntClass(20);
number.AddFive();

 

Link to comment
Подели на овим сајтовима

Људи, мало је оф, али знате ли неки онлајн квиз за полагање линукса (LPI 102-400) или гдје има каквих тест конгова, дампова и сл.?
Требао бих то полагати ових дана, па што прије положим, прије ћу се прикључити школици, а већ добро касним.
Гризли, Хуан, .. ико?

Χριστός ανέστη εκ νεκρών, θανάτω θάνατον πατήσας, και τοις εν τοις μνήμασι ζωήν χαρισάμενο

Link to comment
Подели на овим сајтовима

пре 7 часа, uros рече

Jel u C# "ref" nesto ala pointer u C-u? 

Iz tutoriala nije mi bas najjasnije zasto mora (ref number). Zapravo ovo izgleda kao neka ce-sharpshtina 


static void Main(string[] args)
{
    int number = 20;
    AddFive(ref number);
    Console.WriteLine(number);
    Console.ReadKey();
}

static void AddFive(ref int number)
{
    number = number + 5;
}

Ovo bi u C-u bilo nesto ovako:

int AddFive( int number)

  return (number + 5);

Да објаснимо и онима који не знају C.

Значи, прво - ако избацимо ово "ref". Варијабли "number" у овом главном делу програма "Main" додељена је вредност 20. И шта год се са њом радило у "подпрограму" AddFive, она ће остати 20. Значи, "имуна" је на било какве измене које су са њом рађене у подпрограму. Све измене у подпрограму (као ово  + 5) су само "локалне" - важе само за подпрограм.

Ако желимо да подпрограм има могућност да измени варијаблу и за главни програм, онда мора да додамо ово "ref". То онда говори да ће свака измена те варијабле у подпрограму важити и за главни програм.

Најбоље - пробајте да избаците "ref", пустите програм и видите шта се добија на екрану. Онда додајте "ref" па видите шта је на екрану.

ΜΟΛΩΝ ΛΑΒΕ

Link to comment
Подели на овим сајтовима

1 hour ago, Goku рече

Људи, мало је оф, али знате ли неки онлајн квиз за полагање линукса (LPI 102-400) или гдје има каквих тест конгова, дампова и сл.?
Требао бих то полагати ових дана, па што прије положим, прије ћу се прикључити школици, а већ добро касним.
Гризли, Хуан, .. ико?

Нажалост не знам о томе пуно...

@ronin знаш ли нешто о овоме?

  • Волим 1

ΜΟΛΩΝ ΛΑΒΕ

Link to comment
Подели на овим сајтовима

Završio sam ovaj basic deo. Sve mi je to bilo poznato jer sam pre 2 meseca gledao neka onlajn predavanja o osnovama programiranja samo što su tu koristili JavaScript za demonstraciju. Ali sad kad pogledam onaj zadatak sa kasom, nisam siguran da bih uspeo sam da ga uradim.. :/

Inače večeras imam prvi čas onog kursa za Web programiranje. Trudiću se da budem aktivan i ovde, koliko budem u mogućnosti. Pokušaću da rešim Grizzlijev zadatak do kraja nedelje. Super je atmosfera ovde, svi smo se pokrenuli :)

Samo napred ljudi! Srećno svima! 

Link to comment
Подели на овим сајтовима

Мислим да слика говори више од речи. Да, имам проблем. :) 

Тотал нисам додао, то бих нешто могао и да буџим. Не знам како да ми упамти онај претходни унос, и како да лепо центрира производ испод производа, количину испод количине итд. 

 

proba.JPG

Не брините се, дакле, за сутра; јер сутра бринуће се за се. Доста је сваком дану зла свога.

(Мт.6, 34)

Link to comment
Подели на овим сајтовима

пре 23 минута, БанеЛ рече

Тотал нисам додао, то бих нешто могао и да буџим. Не знам како да ми упамти онај претходни унос, и како да лепо центрира производ испод производа, количину испод количине итд. 

Пошто можеш да имаш пуно "претходних уноса", значи да ти треба низ, тј. "array". На пример:

            int brojProizvoda = 0;
            string[] proizvodi = new string[100];
            float[] kolicine = new float[100];
            float[] cene = new float[100];

 

Сваки пут када се дода нови производ, убациш га на тренутну позицију у низу и увећаш "бројПроизвода" за један:


                proizvodi [brojProizvoda] = proizvod;
                kolicine [brojProizvoda] = kolicina;
                cene [brojProizvoda] = cena;

                brojProizvoda = brojProizvoda + 1;

 

Тако ћеш имати стално запамћене све претходне производе.

 

 

ΜΟΛΩΝ ΛΑΒΕ

Link to comment
Подели на овим сајтовима

пре 23 минута, Tumaralo. рече

Ali sad kad pogledam onaj zadatak sa kasom, nisam siguran da bih uspeo sam da ga uradim.. :/

Па и не би успео одмах да га урадиш. Онај увод никога не осособљава да уради задатак ”из цуга”, него да почне да га ради и да зна шта да пита и где да тражи кад зашкрипи.

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

Link to comment
Подели на овим сајтовима

Што се "центрирања" тиче, ту треба након сваког уноса обрисати цео екран и исписати све производе из почетка. Треба ти "бесконачна петља" у којој ћеш стално исписивати производе и враћати се на унос.

За брисање екрана: Console.Clear();

Бесконачна петља:

while(true)
{
    // Ovde tvoj kod
}

Исписивање свих производа:

    for (int i = 0; i < brojProizvoda; i++) {
        Console.WriteLine( ... );
        // itd.
    }

ΜΟΛΩΝ ΛΑΒΕ

Link to comment
Подели на овим сајтовима

пре 11 минута, Juanito рече

Па и не би успео одмах да га урадиш. Онај увод никога не осособљава да уради задатак ”из цуга”, него да почне да га ради и да зна шта да пита и где да тражи кад зашкрипи.

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

Управо тако!

Понављам - постављајте питања. То је циљ.

Ако није јасно објашњење, она подпитања. Све док не разјаснимо, зато смо ту!

ΜΟΛΩΝ ΛΑΒΕ

Link to comment
Подели на овим сајтовима

пре 25 минута, Grizzly Adams рече

Пошто можеш да имаш пуно "претходних уноса", значи да ти треба низ, тј. "array". На пример:

            int brojProizvoda = 0;
            string[] proizvodi = new string[100];
            float[] kolicine = new float[100];
            float[] cene = new float[100];

 

Сваки пут када се дода нови производ, убациш га на тренутну позицију у низу и увећаш "бројПроизвода" за један:

            int brojProizvoda = 0;
            string[] proizvodi = new string[100];
            float[] kolicine = new float[100];
            float[] cene = new float[100];

Тако ћеш имати стално запамћене све претходне производе.

Дисклејмер: да се не бисте збунили, прескочите слободно за сада овај пост ви који тек почињете. Постављам питање да бих и сам научио јер не знам неке финесе C#-a и .NET-а.

У мом решењу имам класу ”Каса” која има приватну листу ”Ставки”, а ”Ставка” је класа која има цену, количину, назив и укупно. Имам у ”Каси” један метод који додаје ставку (јер за сада само то треба) и један који рачуна тотал. ”Каса” има јавни гетер који враћа копију ставке као ”IEnumerable<Stavka>” јер ми је небитан конкретан тип (мада би можда било боље ICollection<Stavka> у овом случају).

Да ли је то ОК? Зашто си предложио низ, а не листу и кад користити једно, а кад друго? 

using System.Collections.Generic;
using System.Linq;

namespace RegistarKasa
{
	public class Stavka
	{ 
		public string Naziv { get; }
		public double Cena { get; }
		public int Kolicina { get; }
		public double Ukupno { get; }

		public Stavka(string naziv, double cena, int kolicina)
		{
			this.Naziv = naziv;
			this.Cena = cena;
			this.Kolicina = kolicina;
			this.Ukupno = cena * kolicina;
		}
	}

	public class Kasa 
	{
		private List<Stavka> stavke = new List<Stavka>();

		public IEnumerable<Stavka> Stavke 
		{ 
			get 
			{
				return new List<Stavka>(stavke);
			}
		}

		public void DodajStavku(Stavka stavka)
		{
			this.stavke.Add(stavka);
		}

		public double Ukupno()
		{
			return this.stavke.Select(s => s.Cena * s.Kolicina).Sum();
		}
	}
}

 

Link to comment
Подели на овим сајтовима

пре 2 минута, Juanito рече

Да ли је то ОК? Зашто си предложио низ, а не листу и кад користити једно, а кад друго? 

Наравно да је ОК.

Низове сам предложио из једноставног разлога што је то објашњено у оном поглављу "The Basics" које сам задао за учење. Нисмо још стигли до класа и колекција. Користимо оно што имамо и знамо...

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

  • Волим 1

ΜΟΛΩΝ ΛΑΒΕ

Link to comment
Подели на овим сајтовима

пре 14 минута, Grizzly Adams рече

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

Баш ми занимљиво како су различити језици то решили. На пример, у Swift-у немају листе, само низови и по дифолту можеш да додајеш колико хоћеш. Ако су ти битне перформансе, онда позовеш метод reserveCapacity да би спречио алокацију при сваком додавању. И перформансе су на крају исте као у C-у. Битна разлика је и то што низови у Swift-у нису класе, него structs, само што могу бити мутабилни или имутабилни у зависности од тога да ли их декларишеш са var ili let. 

Link to comment
Подели на овим сајтовима

Ja sam to nekako ovako zamislio kad se otvori ekran on postavlja tri pitanja:

Naziv:unos

Količina:unos

Cena:unos

Zatim da nestane,da bude refreševan ekran koji opet kreće od prvog pitanja da se prehodni unosi zabeleže u nekoj bazi ili šta već pa opet da idu tri pitanja čiji će se unosi zabeležiti u toj nekoj bazi.

 

 

Најдубља молитва јесте  молитва без икаквих речи када у тишини ума једноставно живимо у присуству Божијем. Архимандрит Сава Јањић

Link to comment
Подели на овим сајтовима

×
×
  • Креирај ново...