[C++] Hogyan tudom megoldani, hogy kiírja a programom azt, hogy hányféle különböző adat van a tömbömben?
Például:
van a darab[5] tömböm, aminek elemei:
darab[0]=2;
darab[1]=7;
darab[2]=2;
darab[3]=9;
darab[4]=7;
for(int i=0; i<5; i++)
{
if(darab[i]== ????)
{
darab++;
}
}
cout<<darab<<" ilyen elemunk van!"<<endl;
Bocsánat, nem azt kell kiírnom, hogy hányféle különböző, hanem hogy hányféle azonos adatom van.
(Ez nem házi feladat, hanem gyakorlok az ünnepek alatt)
A ????-lek helyére miért nem írsz be egy számot, amit keresel?
(vagy kérd be a felhasználótól, hogy melyik számra kiváncsi és azzal történjen az összehasonlítás)
Mert egy olyan tesztelő ellenőrzi a programot, aminek a bemeneti adatait én nem látom, és 20 különböző esetet letesztel.
Nem tudom, hogy épp mikor milyen adatokkal dolgozik, ezért minden lehetséges esetre működnie kell a programomnak. Ha 0 azonos, ha 10, ha 100 azonos adatom van. Jelen esetben csak 1 konkrét példát írtam, de ha a darab tömbnek 100 eleme van, és mondjuk 70 azonos, arra is ki kellene a 70-et írnia.
Ez a kód teljesen értelmetlen.
Hol tömbként, hol számlalóként próbálod kezelni ugyanazt a változót.
Nem tudom most pontosan mit is akarsz. Megszámlálni, hogy egy adott szám hányszor fordul elő a tömbben? Berakod egy függvénybe, nyomsz rá egy int paramétert, amit a ??? helyére behelyettesítesz, majd a főprogramban bekéred a keresett számot, és meghívod vele a függvényt. Kész :D
Egy pöppet érdekesebb kérdés (és először azt hittem erre vagy kíváncsi), hogy hogyan lehet a tömbben szereplő összes számra meghatározni, hogy hányszor szerepel (tehát nem csak egy megadott számra, hanem a tömb összes elemét összegezni). Ez már egy picit érdekesebb, és nem vagyok teljesen biztos, hogy mi lenne a leggyorsabb megoldás. A legkézenfekvőbb megoldás az lenne, ha létrehoznánk egy map szerkezetet, amit az elemekkel indexelünk, és a darabszámukat fogjuk értékként tárolni. Eztán csak végigiterálunka tömböt egyszer, és feltöltjük a mapet az elemeknek megfelelően. Egy alternatív elképzelés egy lista létrehozása, amin többször végigiterálunk. Elsőkörben a tömb első elemét kijelöljük keresett értéknek, és ahogy végigiterálunk a tömbön, ha keresett értéket találunk, akkor megnöveljük a hozzá rendelt számlálót (ehhez nyilvántarthatunk egy másik tömböt), ha pedig nem keresett elemet, azt hozzáfűzzük a szóban forgó lista végéhez. Miután végigiteráltunk a tömbön, a listában minden elem benne lesz, a keresett elemet kivéve. Eztán a procedúrát a listára ismételjük meg, az első elemet keresett elemmé tesszük, és minden keresett elemnél növeljük a számlálót, valamint eltávolítjuk azt a listából. Addig iterálunk végig az egyre csökkenő listán, amíg elfogy. Valószínűleg ez lényegesen lassabb lenne, mint a map-ben megtalálni a kulcs-érték párokat, de azért a maga módján ötletes.
Elmondom mit szeretnék.
Adott egy N elemű tömb, amiknek feltöltjük az elemeit.
Az N legyen jelen esetben 5, tehát 5 adatot várunk el a felhasználótól.
A tömb első eleme: 2
A tömb második eleme: 7
A tömb harmadik eleme: 2
A tömb negyedik eleme: 9
A tömb ötödik eleme: 7
Ez után, amit nekünk ki kellene íratni, az 1 darab szám, ami azt adja meg, hogy az előbb leírt 5 szám közül hány különböző van egymástól.
Tehát jelen esetben 3 a megoldás, mivel van "2","7","9".
Egyszer meg fogom tanulni a C++-t, de addig muszáj a stackoverflowról összeollózni a válaszokat.
std::set<int> darab_set(begin(darab), end(darab));
std::cout << darab_set.size() << ' ilyen elemünk van!\n';
Ha csak egy fajta elemre kell, akkor számold meg egy ciklusban (majdnem úgy, ahogy csináltad).
Ha mindegyikre kell, akkor rendezd be a tömböt, és keress benne azonos elemből álló sorozatokat.
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!