• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z zadaniem z C++

Object Storage Arubacloud
+1 głos
163 wizyt
pytanie zadane 23 marca 2021 w C i C++ przez mattaha Użytkownik (690 p.)

Witam. Mam za zadanie napisać program wczytujący plik oddzielanymi białymi znakami liczb i drukujący te liczby w porządku od najmniejszej do największej, po jednej w wierszu. Każda wartość ma być wydrukowana tylko raz. Jeśli jakaś wartość będzie się powtarzać, ma być wydrukowana obok niej, w tym samym wierszu informacja o liczbie powtórzeń.

Przykładowe dane:

7 5 5 7 3 117 5

Oczekiwana odpowiedź:

3
5    3
7    2
117

Dane zwracane przez program:

3
5
7	3
117	2

Głowię się nad tym zadaniem od jakiegoś czasu i nie wiem dlaczego 3 zwraca pod 7 a nie jak powinno być pod 5.

#include <algorithm>
#include <fstream>
#include <iostream>
#include <stdexcept>
#include <string>
#include <vector>

using namespace std;

int main() {
    cout << "Podaj nazwę pliku wejściowego:\n";
    string iname;
    cin >> iname;
    ifstream ifs {iname};
    if (!ifs) throw runtime_error("Nie można otworzyć pliku wejściowego " + iname);

    vector<int> numbers;
    for (int num; ifs >> num; ) {
        numbers.push_back(num);
    }
    sort(numbers.begin(), numbers.end());

    int n = 1;
    for (int i = 0; i < numbers.size(); ++i) {
        if (i == 0 || numbers[i] != numbers[i - 1]) {
            cout << numbers[i];
            if (n > 1) cout << '\t' << n;
            cout << '\n';
            n = 1;
        } else {
            ++n;
        }
    }
    return 0;
}

 

3 odpowiedzi

+1 głos
odpowiedź 23 marca 2021 przez TOM_CPP Pasjonat (22,640 p.)

Jeżeli nie masz jakiś ograniczeń związanych z biblioteką STL, to polecam użycie do tego celu std::multiset<int>.

#include <iostream>
#include <set>

using namespace std;

int main()
{
    multiset<int> data = { 7, 5, 5, 7, 3, 117, 5 };

    for( auto iter {cbegin(data)} ; iter != cend(data) ; iter = data.equal_range(*iter).second )
    {
        auto count {data.count(*iter)};
        cout << *iter << "\t" << (count==1?"":to_string(count)) << endl;
    }
}

 

0 głosów
odpowiedź 23 marca 2021 przez Michał Muzyka Pasjonat (24,080 p.)
Dzień dobry,
analizując krok po kroku co się dzieje, zauważamy, że w Pana programie podczas zmiany liczby, tj. wykrycia, że skończył się ciąg 5 a zaczął 7, wyświetlane jest numbers[i], a powinno być number[i-1], trzeba dodatkowo rozważyć przypadek wyświetlania pierwszego ciągu liczb.
0 głosów
odpowiedź 23 marca 2021 przez Paweł Nyczkowski Obywatel (1,620 p.)

cześć

podmień kod i daj znać czy pomogło

int n = 1;
		
		int num=numbers[0];
		cout << numbers[0];
		
    for (int i = 1; i < numbers.size(); ++i) {
        if (i == 0 || numbers[i] != num) {            
            if (n > 1) cout << '\t' << n;
            cout << '\n';
						num=numbers[i];
						cout << numbers[i];
            n = 1;
        } else {
            ++n;
        }				
    }
	  if (n > 1) cout << '\t' << n;

jeśli tak to znaczy że wypisywałaś ilość wystąpień a potem liczbę które ono dotyczyło

Podobne pytania

0 głosów
1 odpowiedź 199 wizyt
pytanie zadane 5 listopada 2023 w C i C++ przez Oluslolus Nowicjusz (120 p.)
0 głosów
1 odpowiedź 201 wizyt
pytanie zadane 8 września 2022 w C i C++ przez benny13 Obywatel (1,150 p.)
0 głosów
1 odpowiedź 173 wizyt
pytanie zadane 19 sierpnia 2022 w C i C++ przez benny13 Obywatel (1,150 p.)

92,632 zapytań

141,502 odpowiedzi

319,882 komentarzy

62,015 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...