Šta je novo?

C# corner

Mare

Čuven
Učlanjen(a)
01.02.2002
Poruke
6,049
Poena
845
Evo moj predlog je da se pokrene jedna tema (mozda i kao stiki), gde bi ljudi mogli zgodne male trikove i forice koje su provalili da podele sa drugima, ili da iznesu neki svoj problem... znaci cilj bi bio razmena iskustava u C#-u.


Evo ja cu prvi... jednostavan primer...

Zadatak je:
Napisati program koji vraca kolekciju koja za dati niz izlistava koliko se svaki clan puta pojvaljuje u datom nizu (unique elements count):

Resenje (uz extra kod koji demonstira program), moje resenje primenjuje generics, tako da je potreban .net 2.0 kompajler:

Kod:
using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;

namespace IspitivanjePonavljanjaElemenataNiza
{
    class Program
    {
        public static Dictionary<object, int> GetUniqueElementCollection(object[] PassedArray)
        {
            Dictionary<object, int> ResultList = new Dictionary<object, int>();
            foreach (object origObject in PassedArray)
            {
                bool exist = false;
                foreach (KeyValuePair<object, int> obj in ResultList)
                {
                    if (obj.Key.Equals(origObject)) exist = true;
                }

                if (exist)
                {
                    ResultList[origObject] += 1;
                }
                else
                {
                    ResultList.Add(origObject, 1);
                }
            }
            return ResultList;
        }

        static void Main(string[] args)
        {
            //Array za testiranje
            object[] originalObjectArray = new object[5];
            Console.WriteLine("Unesite niz");
            for (int i = 0; i < 5; i++)
                originalObjectArray[i] = Console.ReadLine();
            //rezultujuca kolekcija
            Dictionary<object, int> ResultList = GetUniqueElementCollection(originalObjectArray);
            foreach (KeyValuePair<object, int> N in ResultList)
                Console.WriteLine("Broj ponavljanja elementa " + N.Key.ToString() + " je " + ResultList[N.Key].ToString());
        }
    }
}

:)

P.S program uopste nije ogranicen na stringove (a i kako bi bio kad koristi object tip), niti mu je to cilj, samo u demonstracione svrhe je ubacen unos niza sa konzole...
 
Poslednja izmena:
Poenta asocijativnih nizova je da do vrednosti možeš da dođeš bez iteriranja kroz skup ključeva, tako da ti je unutrašnji for nepotreban.
Kod:
if (ResultList.TryGetValue(origObject, out int value))
{
	Result[origObject] = value + 1;
}
else
{
	ResultList.Add(origObject, 1);
}
 
Poenta asocijativnih nizova je da do vrednosti možeš da dođeš bez iteriranja kroz skup ključeva, tako da ti je unutrašnji for nepotreban.
Kod:
if (ResultList.TryGetValue(origObject, out int value))
{
	Result[origObject] = value + 1;
}
else
{
	ResultList.Add(origObject, 1);
}


Dobro, generics i ove kolekcije uopste su za mene skroz nova stvar... a program je prvobitno koristio 2 dimenzionalni niz za rezultat :D... evo znaci postoji bolje resenje... mada i ovo gore radi :D
Kod:
 public static Dictionary<object, int> GetUniqueElementCollection(object[] PassedArray)
     {
            Dictionary<object, int> ResultList = new Dictionary<object, int>();
            foreach (object origObject in PassedArray)
            {
                if (ResultList.ContainsKey(origObject))
                {
                    ResultList[origObject] += 1;
                }
                else
                {
                    ResultList.Add(origObject, 1);
                }
            }
            return ResultList;
        }
nego mislim da je kompajleru svejedno sta god od ovoga da prevede interno je verovatno ista stvar... samo je manje koda za pisanje...
 
Poslednja izmena:
Za pocetnike

Evo necega za pocetnike*:
*programi ne predstavljaju best practice ali su dovljno dobri da ukazu na to kako se neke osnovne stvari rade

Primer 1:
Kod:
using System;
using System.Collections.Generic;
using System.Text;
 
namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
            
        {    
             int age = 27;// zameniti svojim proizvljnim brojem
             System.Console.WriteLine("Hello World, you are age: " + age);
        } 
    }
}

Primer 2:

Kod:
using System;
using System.Collections.Generic;
using System.Text;
 
namespace Stepenovnje
{
    class Program
    {
        static void Main(string[] args)
        {
            
            Console.WriteLine("Unesite broj od koji zelite da stepenujete (iskljucivo ceo broj): ");
            string s1 = Console.ReadLine();
            Console.WriteLine("Na koji stepen zelite da stepenujete (iskljucivo ceo broj): ");
            string s2 = Console.ReadLine();
            int x = int.Parse(s1);
            int n = int.Parse(s2);
            int rez = x;
            
            Console.WriteLine("Postupno stepenovnje: ");
            for (int i = 1; i < n; i++)
            {   
                Console.WriteLine("{0} na {1} = {2} ", s1, i, rez);
                rez *= x;
            }
 
            Console.WriteLine("Finalni rezultat {0} na {1} = {2} ", s1, n, rez);
        }
    }
}

Eto cisto da neko ko ne zna uopste ista o programiranju (ili C#-u) stekne neku sliku...

P.S. Bice toga jos :) uskoro:D
 
Poslednja izmena:
Ma primeri su ti ******.
Ili piši kako treba ili nemoj da pišeš.
Ako su početnički primeri, onda uopšte ne treba da se koristi namespace. To je ipak malo advance.
Ako ti ni jedan primer ne zehteva

using System.Collections.Generic;
using System.Text;

Zašto si to stavljao u kod?
 
Mislim da bi bolja varijanta bila

Kod:
using System;
 
namespace Stepenovnje
{
    class Program
    {
        static void Main(string[] args)
        {
            int x;
            int n;
            try {
                 Console.WriteLine("Unesite broj od koji zelite da stepenujete (iskljucivo ceo broj): ");
                 x = int.Parse(Console.ReadLine());
                 Console.WriteLine("Na koji stepen zelite da stepenujete (iskljucivo ceo broj): ");
                 n = int.Parse(Console.ReadLine());
            } catch {
                 Console.WriteLine("Niste uneli broj.");
                 return;
            }

            int rez = x;
            
            Console.WriteLine("Postupno stepenovnje: ");
            for (int i = 1; i < n; i++)
            {   
                Console.WriteLine("{0} na {1} = {2} ", x, i, rez);
                rez *= x;
            }
 
            Console.WriteLine("Finalni rezultat {0} na {1} = {2} ", x, n, rez);
        }
    }
}
 
Za one malo advanced:eyebrows: :crash: . Prenabudzeni "Hello World what is my age" console application :-devil-: .
PHP:
#region System Namespaces
using System;
#endregion

#region Other Namespaces
//We will add here latter some other namespaces
#endregion

namespace AdvancedHelloWorldApplication
{
    class Program
    {
        /// <summary>
        /// The starting point of the application
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            //We specify our age
            int age = 15;

            //Write one line in console with the infomation of our age
            Console.WriteLine(String.Format("Hello world, your age is: {0}", age));

            //Wait for user to press enter to close the program
            Console.ReadLine();

        } // end Main;
    } //end class Program
} //end namespace

P.S. Kako jadno izgleda bojenje ovakvo bojenje teksta :bottle: .

Evo napravio sam jednu dosta zanimljivu stvar za pocetnike (zanimljivije je sigurno od hello world-a :D ).
Za one koji uce C#, preporucujem da pogledaju ovaj program i da naprave nesto slicno.

Puno srece ;)



P.S. @mods: nemojte da mi spojite postove, nisu vezani jedno za drugo!
 
Poslednja izmena:
Ljudi, nemojte bre da zezate :D, ove programe sam pisao kad sam pocinjao tek da radim c# i nisam isao na to da ih modifikujem sada.

Recimo da je logicno da korisnik koristi template console application ako pise program i onda naravno dobije i:

using System.Collections.Generic;
using System.Text;

C# nije java i apsolutno nema veze koliko using statmenta sam stavio, kompajleru je svejedno... znam da je java uvozila valjda (bar pre) sve klase iz paketa koji se deklarisu...

Namespace nije advance ni po kom osnovu, u vecni knjiga to je prvo sto se objasni...

Da se ne zezamo...

Evo jos jedan isto kao prosli samo sve u metodama... znaci opet stepenovanje

Kod:
using System;
 
namespace StepenovanjeSaMetodama
{
    class Program
    {       
    //konzolni program koji stepenuje celobrojnu promenjljivu drugom celobrojnom promenljivom    
        static void Main(string[] args)
        {   
            //glavni program
            int x, n, rez, z;
            z = 1;
            while (z != 0) //omogucava ponovo izvrsavanje u slucaju da korisnik zeli da ponovo racnunanje sa novim vrednostima
            {
                x = unosParametraA(); //poziva metod za unos parametra X
                n = unosParametraB();
                rez = stepenovanje(x, n); //poziva metod za stepenovanje
                ispisRezultat(x, n, rez); //ispisuje rezultat pozivom metode ispisRezultata
                Console.WriteLine("Da li zelite da ponovite racunanje sa novim parametrima (0 za kraj rada)? ");
                string s3 = Console.ReadLine();
                z = int.Parse(s3);
            }
        }
 
        private static int unosParametraB()
        {
            Console.WriteLine("Na koji stepen zelite da stepenujete (iskljucivo ceo broj): ");
            int n = int.Parse(Console.ReadLine()); //ucitava unetu vrednost i pretvara je u integer te je dodeljuje promenjivoj n
            return n; //vraca ucitanu vrednost
        }
 
        private static int unosParametraA()
        {
            Console.WriteLine("Unesite broj od koji zelite da stepenujete (iskljucivo ceo broj): ");
             int x = int.Parse(Console.ReadLine()); //isto kao prethodno
             return x;
        }
               
        private static void ispisRezultat(int x, int n, int rez)
        {
            Console.WriteLine("Finalni rezultat {0} na {1} = {2} ", x, n, rez);
            //ispis rezultata na konzoli {0} itd je placeholder za promenljive navedene iza ,
        }
 
        private static int stepenovanje(int a, int b)
        {
            //racuna koliko je x na n;
            Console.WriteLine("Postupno stepenovnje: ");
            int re, origBR;
            re = origBR = a;
            for (int i = 1; i < b; i++)
            {
                Console.WriteLine("{0} na {1} = {2} ", origBR, i, re);
                //u svakom prolazu ispisuje se medjurezultat koji je zapravo rezultat iz prethodnog koraka
                //zatim se stepenuje jos jedan put
                re *= a;
            }
            return re; 
                //vraca se rezultat
        }
      
 
    }
}

*program mozda ne predstavljaju best practice ali je sasvim dobar da pokaze kako bi se neke stvari odradile

BTW Voodoo hvala za hint, to je sledeci logican korak, ali opet try/catch se obicno radi dosta kasnije, tako da za ovakav primer nije neophodan ali je svakako pozeljan detalj.
 
Upravo sam primetio da sam slucajno uploadovao pogresan source file (eksperimentisao sam nesto i VS pre build-a se automatski save-uje fajlove pa onda runuje, pa posle kada sam uploadovao sam zaboravio da vratim te stvari nego sam samo uzeo fajl iz direktorijuma i bacio ga u rar:wall: . Uglavnom, program radi isti posao i ovako, funkcionishe on, ali u source-u nesto ne stoji kako treba. Pusticu ovako da provalite sami sta nije u redu, veoma se lako nalazi "bug :crash: ", GL ;) .

I moglo bi da se postavljaju razni "zadaci" u ovom threadu, kao npr.: provaljivanje zasto nesto ne funkcionishe kako treba (naci bug u soruce kodu) ili zadatak "napraviti program koji ce to i to da radi" i tako...
 
Poslednja izmena:
Ovaj "MSDN Community Distribution CD February 2007" što može da se skine OVDE, jel se radi o apgrejdu za retail MSDN, ili je u pitanju full koji radi nezavisno? I da li mogu da ga instaliram preko MSDN-a koji dolazi uz Express edicija Visual Studija?
 
Ne vidim u cemu je poenta postavljanja nasumicno izabranih delova koda? Mislim, cenim trud, ali nekako deluje kao pucanj u prazno. Delovi koda se obicno postuju kada neko pita, tj. zatrazi nesto konkretno ili kao ilustracija nekog metoda. Ovde nema nikakve diskusije, nego padaju code quotovi samo onako.

Ako si vec hteo ljude da privuces u c# temu, trebalo je prvo da definises ciljnu grupu.
Ako su to pocetnici, bilo bi bolje da si prvo rekao koju rec o jeziku. Potom objasnio sta je sve potrebno (od biblioteka, editora itd), kako se instalira i podesava. A tek nakon toga neki uvod u jezik sa laganim primerima. Ne odmah kod iz neba pa u rebra. Pocetnicima takodje uz kod treba objasniti koja je ideja, na kom principu je baziran algoritam, komentar u samom kodu koji razjasnjava upotrebu itd.
Ako ciljna grupa nisu bili bas takvi pocetnici, onda treba probrati primere, jer sortiranje niza ili stepenovanje ipak ne spadaju u trikove i fore. Ponavljam, cenim trud, ali mislim da se promasio koncept.
 
Ima stvari sa kojima se slazem svakako, nisam mislio da cu u ovome biti sam, tj. ocekivao sam da i drugi postuju pa da se brzo nakupi par stranica materijala... nego svaki moj program je aplikacija koja moze da se izbildije i vidi kako radi... tako da nisu random delovi koda...

Programi jesu pocetnicki tu se slazem... ali su vise za nekoga ko nije bas skroz nov u programiranju... vec razume bar osnovne koncepte tipa petlje, varijabli, metoda, isl.

Videcu da dam dalji doprinos u vidu uputstva gde naci kompajlere sta sve instalirati, kojim redom itd.

I naravno pozivam sve zaintresovane da daju i oni svoj doprinos... da bi tema zazivela...
 
Ovaj "MSDN Community Distribution CD February 2007" što može da se skine OVDE, jel se radi o apgrejdu za retail MSDN, ili je u pitanju full koji radi nezavisno? I da li mogu da ga instaliram preko MSDN-a koji dolazi uz Express edicija Visual Studija?
Nije upgrade u pitanju... vec obicna kolekcija raznih zanimljivih textova, videa i primera... sve jedno je zanimljivo...
 
Pa ko hoce da nauci C# i slicno, prvo sto treba da se pita sta ce mu to u zivotu.... ako mu treba da bi se bavio time onda verovatno ide ili na fax ili programira vec u nekom jeziku.... dakle odgovor je kupiti knjigu i procitati... ako neko nikad nije pisao programe ni u jednom jeziku onda je verovatno C# malo veci zalogaj i bolje je poceti od paskala ili eventualno C-a( mada bolje je paskal jer je ljudskiji)..

fakulteti koji odmah pocinju sa javom verovatno imaju kriterijum za upis na isti da vec znas programiranje u nekom jeziku i to daju kao test... ETF nema takve kriterijume i zato polazi od paskala i C-a...

Mare, to sto si hteo je super ideja ali nije za forum vec vise za licni sajt na kome bi nakacio tutoriajale...ali u sustini kao sto je silver rekao morad prvo da odaberes ciljnu grupu to jest sta je minimum predznanja koji je potreban da bi se oni razumeli i da ih organizujes tako da bude razumljivo.... ako pocnes recimo sa evo ga hello world pa lupis namespace-ove pa klase pa metode i sve ostalo ljudi ce da se zbune...

recimo pocni od toga sta su klase , instance klasa (objekti), pa recimo metode i polja detaljnije pa izvodjenje klasa , pa klasa Object pa polimorfizam, pa paketi pa onda hello world , pa neke strukture podataka i sl... samo treba da se ubode pravi redosled
 
Poslednja izmena:
Pa ko hoce da nauci C# i slicno, prvo sto treba da se pita sta ce mu to u zivotu.... ako mu treba da bi se bavio time onda verovatno ide ili na fax ili programira vec u nekom jeziku.... dakle odgovor je kupiti knjigu i procitati... ako neko nikad nije pisao programe ni u jednom jeziku onda je verovatno C# malo veci zalogaj i bolje je poceti od paskala ili eventualno C-a( mada bolje je paskal jer je ljudskiji)..

fakulteti koji odmah pocinju sa javom verovatno imaju kriterijum za upis na isti da vec znas programiranje u nekom jeziku i to daju kao test... ETF nema takve kriterijume i zato polazi od paskala i C-a...

Mare, to sto si hteo je super ideja ali nije za forum vec vise za licni sajt na kome bi nakacio tutoriajale...ali u sustini kao sto je silver rekao morad prvo da odaberes ciljnu grupu to jest sta je minimum predznanja koji je potreban da bi se oni razumeli i da ih organizujes tako da bude razumljivo.... ako pocnes recimo sa evo ga hello world pa lupis namespace-ove pa klase pa metode i sve ostalo ljudi ce da se zbune...

recimo pocni od toga sta su klase , instance klasa (objekti), pa recimo metode i polja detaljnije pa izvodjenje klasa , pa klasa Object pa polimorfizam, pa paketi pa onda hello world , pa neke strukture podataka i sl... samo treba da se ubode pravi redosled
U pravu si ali recimo ona 3 programa hello, stepenovanje i stepenovanje sa metodama su moja prva 3 programa u C# koja sam uradio 1. dana... dakle nikakvo posebno predznanje... istina pre toga sam posvetio dosta paznje .net-u i framework-u... tako da nisam bio bez osnove kad sam usao u IDE.

Za sajt se slazem... ali trenutno nemam dovoljno vremena (materijala cak i imam, bar programa... par stotina primera imam svojih)... mada... videcu...

Iskreno ocekivao sam ko sto vec rekoh da ovo bude zajednicka tema... pa bi se lako nakupilo svega za par dana... ali dobro...
 
Iskreno ocekivao sam ko sto vec rekoh da ovo bude zajednicka tema... pa bi se lako nakupilo svega za par dana... ali dobro...

Welcome to the CLUB :)

I ja sam tako mislio na početku, ali budi uporan i napravi nešto korisno. Ja sam na kraju skapirao da nemaju svi vremena, a neki ni koristi, da rade nešto takvo.
Društveno koristan rad se ne isplati, ali ako imaš volje i želje samo napred.
Fali mi jedan kvalitetan tutorijal iz C# da okačim.
Ako ti treba neki materijal javi mi da ti pošaljem. Imam nešto ali nije kompletno pa ga zato nisam ni kačio do sada.
 
Imam jedan problem sa threadovima u C#, pa ako bi neko od vas znalaca mogao da mi pomogne. Elem, kada pokusam da pristupim nekoj kontroli, npr. textBox, iz nekog thread-a, visual studio mi kaze da ne mogu da pristupam kontroli iz threada iz kojeg nije stvorena. Sto u principu znaci da ne mogu da koristim threadove uopste. Inace u java-i je ovo lepo radilo. Ako neko ima resenje bio bih mu vrlo zahvalan.
 
PA u principu nije bas ni lepo da iz vise tredova pristupas UI-u.. mislim i ako mozes to ti nije bas objektno orijentisano programiranje...
Dakle ja bih ti predlozio da taj thread koji radi sa ui-jem samo on radi sa njim... ako hoces nesto da promenis sto se ui-a tice posanji poruku tom thread-u pa nek on obavi azuriranje kada na njega dodje red.
 
Delphi je imao Synchronize metodu koja "zaključa" kontrolu dok thread nešto po njoj radi, da drugi threadovi ne bi mogli da upadnu. E sad kako to ide u C#, ne znam.
 
možeš da isključiš to upozorenje (nije preporučljivo) sa Control.CheckForIllegalCrossThreadCalls = false
ili da koristiš Invoke metod same kontrole (pravi način)
 
Hvala na pomoci svima problem je uspesno resen preko invoke metode :)
 
Nazad
Vrh Dno