C++ eltérő adatok megszámolása
2020-10-26T10:03:27+01:00
2020-10-29T13:31:29+01:00
2022-08-11T22:35:34+02:00
Peribond
Hogyan kell c++ ban tömbök segítségével a beadott adatokból kiszűrni, hogy hány db. nem azonos adat van? Pl: Egy vállalat tárolja dolgozói életkorát és fizetését. Írj programot, amely megadja, hányféle életkorú ember van a vállalatnál!

Tekintettel arra, hogy nem rég óta kezdtem el a c++ al történő barátkozást, eléggé bonyolultan megy ennek a megoldása.
Mutasd a teljes hozzászólást!
És itt a jó megoldás, köszönöm mindenkinek :)

#include <iostream> using std::cin; using std::cout; int main() { int korok[100]; int n; cin >> n; for (int i=0;i<n;++i) { int kor, fizu; cin >> kor; cin >> fizu; korok[i] = kor; } int kulonbozok = 0; // osszegzes for (int j=0;j<n;++j) { // eldontes bool elso = true; for (int k=j+1;k<n;++k) { if (korok[j] == korok[k]) { elso = false; } } if (elso) { kulonbozok++; } } cout << kulonbozok; }
Mutasd a teljes hozzászólást!

  • Végigmész az adatokon, és ha olyat találsz, amit eddig még nem láttál, akkor hozzáadsz egyet a számlálóhoz.
    Mutasd a teljes hozzászólást!
  • Hali!

    Mutasd – forráskóddal/-részlettel –, hogy eddig mivel, hogyan próbálkoztál, meddig jutottál el, mi nem megy, hol/miben akadtál el!

    Mutasd a teljes hozzászólást!
  • Addig jutottam el, hogy megmutatja, melyek azok az elemek, melyekből csak 1 db. van. Ugye ezeknek a száma kellene, illetve van egy extra nehezítő tényező, egy "felesleges" adatsort is be kell vinni, tehát a bemenet során a számok mellé meg kell adni még egy értéket, amit nem használunk.
    Pl Bemenet:
    43 100 
    43 120
    10 20
    30 23

    Akkor a kimenet 2

    #include <iostream>
    using namespace std;
    int non_repeating_elements(int arr[], int n)
    {
    int i,j;
    int count = 1;
    for(i = 0; i < n; i++)
    {
    for(j = 0; j < n; j++)
    {
    if(arr == arr[j] && i != j)
    break;
    }
    if(j == n )
    {
    cout << count << endl;
    ++count;
    }
    }
    return -1;
    }
    int main()
    {
    int n,i;
    cout << "\nEnter the number of elements : ";
    cin >> n;
    int arr[n];
    cout << "\nInput the array elements : ";
    for(i = 0; i < n; i++)
    {
    cin >> arr
    ;
    }
    non_repeating_elements(arr, n);
    return 0;
    }
    Mutasd a teljes hozzászólást!
  • Hali!

    A jövőben használd a forráskód-gombot (a szerkesztő-mező felett, balról a harmadik: </>), ha forráskódot illesztesz be (és akkor nem fog hibásan megjelenni a kódod).

    Mutasd a teljes hozzászólást!
  • Itt miért 2 a kimenet? Nem 3 féle életkor van? 21, 30, 43?

    Legegyszerűbb, ha egy set-be belerakod az értékeket. A set számossága megadja a különböző elemek számát.
    Másik lehetőség az std::unique használata, mely pont azt valósítja meg, amire szükséged van.

    Amennyiben nem C-szerű megoldást szeretnél használni, akkor ebbe az irányba indulnék.
    * saját struct
    * operator>> a structnak
    * iterator és predicate segítségével std::set-be pakolás, vagy ha több feladat van, akkor std::vector-ba beolvasni mindent és ennek a feladatnak a megoldásaként az std::unique-ot használni.
    Mutasd a teljes hozzászólást!
  • A kimenet ugye azért 2, mert csak azokat a számokat kell megszámolnunk, amiből nincsen csak 1 db. Egyébként kezdek rájönni.

    Azt kell csinálni ennél a kérdésnél, hogy először megnézem minden előforduló számra mennyi van belőlük.
    Azaz egy ciklussal végigmegyek rajtuk, és minden elemre összehasonlítom az összes többivel egy belső ciklussal. Ha egyezik megnövelem a kiválasztott elem számát, különben nem.
    Miután ezek a számok megvannak, meg tudom keresni melyikből van 1.

    Ennek a kódolásával vagyok kicsit most elakadva, de az elv megvan.
    Mutasd a teljes hozzászólást!
  • Akkor rosszul értelmeztem a feladatot.
    Ebben az esetben az std::map lehet a segítségedre.
    érték -> előfordulás db

    Elég egyszer végigiterálnod az eredeti adatokon, bár ha nincs egyéb megkötés (futásidő, algoritmus hatékonyság, stb..) akkor természetesen a te megoldásod is megfelelő lesz.
    Mutasd a teljes hozzászólást!
  • //Végül ez lett a megoldás, de ez sem teljesen jó sajna, itt viszont passz, hogy mi lehet a gond #include <iostream> using std::cin, std::cout; int main() { int korok[100]; int fizu; int n; cin >> n; for (int i=0;i<n;++i) { int kor, fizu; cin >> kor; cin >> fizu; korok[i] = kor; } int kulonbozok = 0; // osszegzes for (int j=0;j<n;++j) { // eldontes bool egyedi = true; for (int k=0;k<n;++k) { if (j != k && korok[j] == korok[k]) { egyedi = false; } } if (egyedi) { kulonbozok++; } } cout << kulonbozok; }
    Mutasd a teljes hozzászólást!
  • És itt a jó megoldás, köszönöm mindenkinek :)

    #include <iostream> using std::cin; using std::cout; int main() { int korok[100]; int n; cin >> n; for (int i=0;i<n;++i) { int kor, fizu; cin >> kor; cin >> fizu; korok[i] = kor; } int kulonbozok = 0; // osszegzes for (int j=0;j<n;++j) { // eldontes bool elso = true; for (int k=j+1;k<n;++k) { if (korok[j] == korok[k]) { elso = false; } } if (elso) { kulonbozok++; } } cout << kulonbozok; }
    Mutasd a teljes hozzászólást!
  • Gyorsabban, rövidebben:

    ... int kulonbozok = std::unordered_set<int>(korok, korok+n).size(); ...
    Mutasd a teljes hozzászólást!
  • Én is belefutottam, ha visszaolvasod.
    Nem jó, mivel neki csak azok az elemek kellenek, melyek pontosan 1x fordulnak elő.
    Persze így sem sokkal nehezebb szépen pár sorban megoldani..
    Mutasd a teljes hozzászólást!
  • Rendben, végigolvastam. De így még rosszabb a helyzet. Mert az elfogadott megoldás 3-at ad vissza a megadott példa input adatokra, nem pedig 2-t. Hanem pontosan az összes előforduló elem darabszámát. Igen, az enyém ugyanazt csinálja, mint a Te set-es javaslatod.
    Mutasd a teljes hozzászólást!
abcd