Pole objektov – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Pole objektov – .NET – Fórum – Programujte.comPole objektov – .NET – Fórum – Programujte.com

 

Tayson0
Stálý člen
31. 1. 2013   #1
-
0
-

static void Main(string[] args)
        {
             int i;
             zamestnanec[] zam = new zamestnanec[10000];
            for(i=1;i<10000;i++)
            {  
             zam[i].ziskajmeno();
             zam[i].ziskajpriezvisko();
             zam[i].ziskajvek();
             zam[i].ziskajmzdu();
             zam[i].vypis();
            }
            Console.ReadLine();
        }

Mám takýto program no chcem prididávať viac osob takze si chcem vytvorit nejake pole objektov ale nejde mi to. Neviete mi poradit ? samozrejme mám vytvorenu triedu. chcel by som viacej objektov ktore by kazdy obsahovl meno priezvisko a tak ....a da sa potom následne nájsť a vypísať daný objekt ? dakujem.....a este jedna vec ...dá sa pole ktore sa automaticky prisposobuje podla poctu objektov aby som tam nemal 10000.

Nahlásit jako SPAM
IP: 213.81.131.–
Atheo+4
Stálý člen
31. 1. 2013   #2
-
0
-

#1 Tayson
ježiš :D zkus to přes list... něco malinkýho jsem ti napsal ( je to prasečina ) ale snad to z toho dobře pochopíš.. zkus použit list.

// main.cs
using System;
using System.Collections.Generic;
using System.Text;

namespace OOpblbost
{
    class Program
    {
        static void Main(string[] args)
        {
            Uzivatele uziv = new Uzivatele();
            List<string> uzivatele = new List<string>();

            string
                jmeno,
                prijmeni;

            uziv.ZjistiJmeno(out jmeno);
            uziv.ZjistiPrijmeni(out prijmeni);
            uzivatele.Add(jmeno + ";" + prijmeni + ";");
            Console.WriteLine(uzivatele[0]); // vypise "Karel;Novak;"
            // chci zjistit jen jmeno nebo jen prijmeni
            string[] Split = uzivatele[0].Split(';');
            Console.WriteLine("jmeno = " + Split[0]); // vypise jmeno
            Console.WriteLine("Prijmeni = " + Split[1]); // vypise prijmeni
        }
    }
}

no a pak třída kde zjistíš ty jmena atd..

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

namespace OOpblbost
{
    class Uzivatele
    {
        public void ZjistiJmeno(out string jmeno)
        {
            jmeno = "Karel";
        }

        public void ZjistiPrijmeni(out string prijmeni)
        {
            prijmeni = "Novák";
        }
    }
}

pokud budeš chtít projet tim listem .. nepoužívej žádný for (int i = 0 ; i < 50000000; i ++); to je největší blbost.. uděláš jen:

foreach(string i in uzivatele)
     Console.WriteLine(i);

a tohle ti vypíše všechny uživatele a jejich jména příjmení a tyhle blbosti..

Winitrix

Nahlásit jako SPAM
IP: 188.175.140.–
LukoSS
~ Anonymní uživatel
73 příspěvků
31. 1. 2013   #3
-
+1
-
Zajímavé

#1 Tayson
Příkazem

zamestnanec[] zam = new zamestnanec[10000];

pouze řekneš, že chceš alokovat paměť pro 10000 prvků typu zamestnanec, ale toto pole je stále prázdné, takže při pokusu o přístup k prvku 

zam[i].ziskajmeno();

nepřistupuješ k objektu zaměstance, ale k hodnotě NULL, což samozřejmě vyhodí vyjímku.

Aby tvůj příklad fungoval, musel by ten for cyklus vypadat třeba takhle:
 

for(i=1;i<10000;i++)
{
	zam[i] = new zamestnanec();
	zam[i].ziskajmeno();
	...

Samozřejmě, jak jsi správně uvedl, je zbytečné vytvářet 10000 prvků. V podstatě máš 2 jednoduché možnosti, jak tohle vyřešit:

  1. Na začátku si vytvoříš pole s 0 prvky. Před přidáním nového prvku zavoláš metodu Array.Resize.
  2. Místo pole použiješ List<zamestnanec>.

Nahlásit jako SPAM
IP: 88.103.252.–
Evzen+2
Návštěvník
1. 2. 2013   #4
-
+2
-
Zajímavé

Ahoj,

dynamické pole v C# (a i jiných jazycích) najdeš v tzn. kolekcích (zkus google, určitě najdeš podrobnosti).

Pro začátek si zajisté vystačíš s generickým listem:

List<Zamestnanec> zamestnanci = new List<Zamestnanec>();

S rozhraním tě teď ještě nebudeme trápit.

Jen pro vysvětlení toho tvého kódu:

zamestnanec[] zam = new zamestnanec[10000];

- toto prakticky znamená "vytvoř mi 10 000 škatulek, kam budu dávat objekty typu "zamestnanec"

- analogicky sis připravil 10 000 prázdných sklenic, ale ještě si do nich nenalil třeba pivo

- před napitím tedy musíš vůbec specifikovat, jestli to je pivo, džus, víno či jiná tekutina a nalít tam třeba jen půlku či celou

for(i=1;i<10000;i++)
- tady pozor! u C# a i jiných jazyků jsou pole indexovány od 0, nikoliv od 1, nevím, jestli to byl od tebe záměr

Chyba v tvém kódu (tedy aspoň ta zásadní) je, že nemáš inicializovaný objekt, se kterých pracuješ.

        static void Main(string[] args)
        {
            int i;
            zamestnanec[] zam = new zamestnanec[10000];
            for(i=0;i<10000;i++) // iterujeme od 0!
            {  
                // nejprve inicializujeme zamestnance
                zam[i] = new zamestnanec();

                zam[i].ziskajmeno();
                zam[i].ziskajpriezvisko();
                zam[i].ziskajvek();
                zam[i].ziskajmzdu();
                zam[i].vypis();
            }
            Console.ReadLine();
        }

Ty si zkrátka připravil 10 000 pracovních míst, ale zapomněl si najmout zaměstnance ;)

Rady na závěr.

  • Když neznáš přesný počet, tak použil kolekce, třeba právě zmíněný List
  • Iteruj ve for cyklu od nuly (for (int i = 0; i < ....)
  • Názvy objektu piš s prvním velkým počátečním písmenem (zamestnanec-> Zamestnanec)

Evžen

Nahlásit jako SPAM
IP: 193.179.183.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 96 hostů

Podobná vlákna

Pole objektov — založil Milos

Mnozenie objektov — založil adoweb

Presvitanie objektov — založil robo1990o

Výpis objektov — založil Bigbob

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý