IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
blaze
Neregistrovaný
Avatar
blaze:24.5.2013 16:51

ahoj, mam problém s programem, má vygenerovat požadovaný počet lidí (každý má své jméno, příjmení, věk) a poté vypsat....jenže mi třeba desetkrát vypíše jen jednoho vygenerovaného člověka a pořád tu chybu nemůžu najít

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> jmena = new List<string>() {"Igor", "Ivan", "Eda"};
            List<string> prijmeni = new List<string>() {"Igorovic", "Ivanovic", "Edovic"};
            List<int> veky = new List<int>() { 32, 25, 27 };

            Lide lide = new Lide();
            lide.GenLide(jmena, prijmeni, veky);
            lide.VypisLidi();

            Console.ReadKey();
        }
    }

    class Clovek
    {
        public string jmeno, prijmeni;
        public int vek;

        public string Jmeno
        {
            set
            {
                jmeno = value;
            }
            get
            {
                return jmeno;
            }
        }

        public string Prijmeni
        {
            set
            {
                prijmeni = value;
            }
            get
            {
                return prijmeni;
            }
        }

        public int Vek
        {
            set
            {
                vek = value;
            }
            get
            {
                return vek;
            }
        }

        public string Vypis()
        {
            return jmeno + " " + prijmeni + " " + vek;
        }
    }

    class Lide
    {
        public List<Clovek> lide;
        public Random rand;

        public Clovek GenClovek(List<string> jmena, List<string> prijmeni, List<int> veky)
        {
            rand = new Random();
            Clovek clovek = new Clovek();

            clovek.Jmeno = jmena[rand.Next(0, jmena.Count)];
            clovek.Prijmeni = prijmeni[rand.Next(0, prijmeni.Count)];
            clovek.Vek = veky[rand.Next(0, veky.Count)];

            return clovek;
        }

        public void GenLide(List<string> jmena, List<string> prijmeni, List<int> veky)
        {
            lide = new List<Clovek>();

            Clovek clovek;
            for (int i = 0; i < 10; i++)
            {
                clovek = GenClovek(jmena, prijmeni, veky);
                lide.Add(clovek);
            }
        }

        public void VypisLidi()
        {
            for (int i = 0; i < lide.Count; i++)
                Console.WriteLine(lide[i].Vypis());
        }

    }
}
 
Odpovědět
24.5.2013 16:51
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na
David Hartinger:24.5.2013 16:56

Ten kód je dost divný, třída Clovek se dá zkrátit na několik řádků, C# od verze 2 (což je už nějaký ten pátek) vlastnosti sám generuje. Metoda Vypis je špatně, máš přepisovat ToString(). Chyba se kteoru se potýkáš je pravděpodobně v tom, že instanci Randomu tvoříš v metodě stále znovu a znovu, vytvoř ji jednou takto:

class Lide
{
        public List<Clovek> lide;
        public Random rand = new Random();
Nahoru Odpovědět
24.5.2013 16:56
New kid back on the block with a R.I.P
Avatar
matesax
Tvůrce
Avatar
matesax:24.5.2013 17:00

Cyklu pro vypsání se zbav - když stačí přetížit ToString... A generuj jednodušeji:

List<string> jmena = new List<string>() {"Igor", "Ivan", "Eda"};
            List<string> prijmeni = new List<string>() {"Igorovic", "Ivanovic", "Edovic"};
            List<int> veky = new List<int>() { 32, 25, 27 };

Nejsou to listy, ale pole. Výběr náhodného prvku dej jako novou funkci zděděného pole...

Editováno 24.5.2013 17:01
 
Nahoru Odpovědět
24.5.2013 17:00
Avatar
matesax
Tvůrce
Avatar
matesax:24.5.2013 17:03

Už mě to štve - Sdraco:

"Vypis je špatně, máš přepisovat ToString()"

A já píši ať to přetíží - tedy totéž... A zbytek - co proti tomu může kdo namítnout? Tohle fakt není normální... :)

Editováno 24.5.2013 17:04
 
Nahoru Odpovědět
24.5.2013 17:03
Avatar
blaze
Neregistrovaný
Avatar
Odpovídá na David Hartinger
blaze:24.5.2013 17:06

díky, už mi to jde, zkusim to ještě napsat trochu líp, teprve začínam

 
Nahoru Odpovědět
24.5.2013 17:06
Avatar
Kit
Tvůrce
Avatar
Odpovídá na
Kit:24.5.2013 17:09

Ty gettery a settery tam vůbec nejsou potřebné. Stačí místo nich napsat jeden konstruktor se třemi parametry.

Nahoru Odpovědět
24.5.2013 17:09
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
blaze
Neregistrovaný
Avatar
Odpovídá na Kit
blaze:24.5.2013 17:18

ale když ten konstruktor napíšu tímto způsobem, tak musím předělat metotu GenClovek a asi i další věci

public Clovek(string jmeno, string prijmeni, int vek)
        {
            this.jmeno = jmeno;
            this.prijmeni = prijmeni;
            this.vek = vek;
        }
 
Nahoru Odpovědět
24.5.2013 17:18
Avatar
blaze
Neregistrovaný
Avatar
Odpovídá na matesax
blaze:24.5.2013 17:21

a jak mam generovat jednouše?

 
Nahoru Odpovědět
24.5.2013 17:21
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na matesax
David Hartinger:24.5.2013 17:24

"Výběr náhodného prvku dej jako novou funkci zděděného pole" - ty bereš nějaké omamné látky?

  1. Jsou to listy
  2. Pro textovou reprezentaci objektu je ToString(). ToString() se nepřetěžuje, ale přepisuje.
  3. Random se v u něj v metodě neustále seeduje, proto to není náhodné.
Nahoru Odpovědět
24.5.2013 17:24
New kid back on the block with a R.I.P
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na
Petr Nymsa:24.5.2013 17:27

Přes kontruktor to nastavíš pohodlněji a lépe. Gettery a Settery tam můžeš nechat

Nahoru Odpovědět
24.5.2013 17:27
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
blaze
Neregistrovaný
Avatar
blaze:24.5.2013 17:30

děkuju za rady, zkusim to napsat lepším způsobem

 
Nahoru Odpovědět
24.5.2013 17:30
Avatar
Odpovídá na David Hartinger
Luboš Běhounek Satik:24.5.2013 17:34

V release by ten random nahodny byl, v release je seedem tusim cas, ale v debug je seed vzdy stejny

Nahoru Odpovědět
24.5.2013 17:34
https://www.facebook.com/peasantsandcastles/
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Luboš Běhounek Satik
David Hartinger:24.5.2013 17:42

Netušíš proč to takhle udělali?

Nahoru Odpovědět
24.5.2013 17:42
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá na
Kit:24.5.2013 17:55

Ano, metoda GenClovek se tím zjednoduší.

Nahoru Odpovědět
24.5.2013 17:55
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:24.5.2013 17:58

Kvůli testování a ladění. Aby byla pokaždé stejná série.

Nahoru Odpovědět
24.5.2013 17:58
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Hartinger
matesax:24.5.2013 17:59

Co bereš ty - přetížit znamená dát novou funkci... (override)

Editováno 24.5.2013 18:01
 
Nahoru Odpovědět
24.5.2013 17:59
Avatar
Odpovídá na David Hartinger
Luboš Běhounek Satik:24.5.2013 18:06

V DEBUG verzi jsou spousty takovychto pomocnych drobnosti, treba v C++ je v DEBUG modu pamet predem vyplnena nejakym patternem, treba 0xBADF00D, 0xBADBADBAD apod, takze poznas, ze ctes z nealokovany/u­volneny pameti apod.

Nahoru Odpovědět
24.5.2013 18:06
https://www.facebook.com/peasantsandcastles/
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:24.5.2013 18:07

Override znamená překrytí. Přetížení je overload.

Nahoru Odpovědět
24.5.2013 18:07
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na matesax
Luboš Běhounek Satik:24.5.2013 18:08

A co teda znamena slovo overload? :)

Nahoru Odpovědět
24.5.2013 18:08
https://www.facebook.com/peasantsandcastles/
Avatar
Neaktivní uživatel:24.5.2013 18:16

Overload je víc metod v jedné třídě lišící se počtem nebo typem parametrů, ale se stejným jménem.

Nahoru Odpovědět
24.5.2013 18:16
Neaktivní uživatelský účet
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na matesax
Petr Nymsa:24.5.2013 18:17

Podle mě, přetížit metodu je něco jiného než překrýt. Překrytím ji dám zcela novou funkci, přetížením rozšířím funkčnost metody (upravím i chování).Spousta metoda má přetížení. Například

void Pozdrav(string jmeno)
  Console.WriteLine(jmeno);

void Pozdrav(string jmeno, string prikaz)
   Console.WriteLine("{0} {1}",prikaz,jmeno);

/* A můžu definovat až do třeba 5 parametru, dky nastavím ještě barvu textu apod */
Nahoru Odpovědět
24.5.2013 18:17
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Lukáš Hruda
Tvůrce
Avatar
Lukáš Hruda:24.5.2013 18:34

Třeba v C++ se v některých případech metoda při přetížení zároveň i přepíše :)

 
Nahoru Odpovědět
24.5.2013 18:34
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 22 zpráv z 22.