Avatar
blaze
Neregistrovaný
Avatar
blaze:

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 Čápka
Tým ITnetwork
Avatar
Odpovídá na blaze
David Čápka:

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  +1 24.5.2013 16:56
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
matesax
Redaktor
Avatar
matesax:

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
Redaktor
Avatar
matesax:

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 Čápka
blaze:

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
Redaktor
Avatar
Odpovídá na blaze
Kit:

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:

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:

a jak mam generovat jednouše?

 
Nahoru Odpovědět 24.5.2013 17:21
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka:

"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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na blaze
Petr Nymsa:

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

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

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 Čápka
Luboš Běhounek (Satik):

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
:)
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Luboš Běhounek (Satik)
David Čápka:

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

Nahoru Odpovědět 24.5.2013 17:42
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na blaze
Kit:

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
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

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

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

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 Čápka
Luboš Běhounek (Satik):

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
:)
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

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

Nahoru Odpovědět  +1 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):

A co teda znamena slovo overload? :)

Nahoru Odpovědět  +1 24.5.2013 18:08
:)
Avatar
Jakub Šárník:

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
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na matesax
Petr Nymsa:

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 (Luckin):

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.