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

Problem z zadaniem z C++

Konkurs Mistrz Programowania
+1 głos
276 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ź 479 wizyt
pytanie zadane 5 listopada 2023 w C i C++ przez Oluslolus Nowicjusz (120 p.)
0 głosów
1 odpowiedź 360 wizyt
pytanie zadane 8 września 2022 w C i C++ przez benny13 Obywatel (1,150 p.)
0 głosów
1 odpowiedź 384 wizyt
pytanie zadane 19 sierpnia 2022 w C i C++ przez benny13 Obywatel (1,150 p.)

93,656 zapytań

142,575 odpowiedzi

323,099 komentarzy

63,171 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

Kursy INF.02 i INF.03
...