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

liczenie elementów tablicy podanych w konsoli

Object Storage Arubacloud
0 głosów
297 wizyt
pytanie zadane 13 listopada 2019 w C i C++ przez Tawka Nowicjusz (200 p.)
edycja 13 listopada 2019 przez Tawka

Hej, piszę program, który ma zliczyć ile razy występuje w tablicy element podany przez użytkownika, jednak nie mogę dojść do tego, aby jako wynik nie wyświetlały się losowe liczby, tylko rzeczywiście ilość danego elementu w tablicy.

Póki co część odpowiedzialna za wynik wygląda tak:

#include <iostream>
#include <conio.h>
#include <cstdlib>
#include <ctime>

using namespace std;
int a;
int b;
int n;
int elem;
int licz = 0;
int main()
{
     cout << "Podaj rozmiar tablicy <=100" << endl;
    cin >> n;
    if ( n> 100)
    {
        cout << "Podany rozmiar jest zbyt duzy. Podaj liczbe <=100" << endl;
    }
    else
        cout << "Podaj poczatek przedzialu liczb (0-100)" << endl;
    cin >> a;
    cout << "Podaj koniec przedzialu liczb (0-100)" << endl;
    cin >> b;
int tab[n];
cout << "Wylosowana tablica wynosi: " << endl;
srand(time(NULL));
for (int i = 0; i < n; i++)
{
tab[n] = (rand() % (b-a+1)+a);
cout << "tab[" << i << "]= " << tab[n] << endl;}
 // koniec tablicy losującej liczby
cout << "Podaj element do szukania:" << endl;
    cin >>elem;
       for (int i=0; i<n; i++){
        if (tab[i] == licz)
        {
            licz++;
        }
        }

cout << "Podanych elementow jest: " << licz << endl;
        _getch();
return 0;
}

 

Wiem, że rozwiązanie jest zapewne banalnie proste, jednak nie wiem kompletnie już co wstawić w miejsce tab[n]. Jakieś pomysły jak nakierować nowicjusza?

komentarz 13 listopada 2019 przez tkz Nałogowiec (42,000 p.)
Chcesz sam napisać rozwiązanie, czy możesz skorzystać z STL? Plus wklejaj cały kod, łatwiej jest wykonać kopiuj-wklej, niż dopisywać potrzebne rzeczy.
komentarz 13 listopada 2019 przez Tawka Nowicjusz (200 p.)
Wolę jednak samodzielnie. Już poprawiam w takim razie :)
komentarz 13 listopada 2019 przez tkz Nałogowiec (42,000 p.)

https://en.cppreference.com/w/cpp/algorithm/count

Masz dwie wersję implementacyjne. 

2 odpowiedzi

0 głosów
odpowiedź 13 listopada 2019 przez mmarszik Mądrala (7,390 p.)

Zadeklaruj dodatkowy element na zliczanie elementów, np.:

int licz = 0;

Potem:

 if (tab[i] == elem)
        {
            licz++;
        }

Zazwyczaj ostatni index w C/C++ jest n-1 a nie n, to być może powoduje błędy

tab[n]

Wyświetl licz, a nie tab[n]

cout << "Podanych elementow jest: " << licz << endl;

 

komentarz 13 listopada 2019 przez Tawka Nowicjusz (200 p.)
Niestety po tych poprawkach ciągle podaje wynik jako 1 :/
–1 głos
odpowiedź 13 listopada 2019 przez mmarszik Mądrala (7,390 p.)

Już wklejam przykładowy kod, czekam na czepialską krytykę i co najmniej 10 downvote ;-)

#include <iostream>
#include <vector>
#include <ctime>
#include <cstdlib>
#include <random>
#include <algorithm>
#include <new>
#include <unordered_map>



class MyException : public std::exception {
private:
    const std::string swhat;

public:
    MyException( const char *const swhat ) : swhat(swhat) {
    }

    virtual const char* what() const throw(){
        return swhat.c_str();
    }
};

static int getSize() {
    std::cout << "Podaj rozmiar: ";
    int n;
    std::cin >> n;
    if( std::cin.fail() || n < 1) {
        throw MyException("Nieprawidłowy rozmiar");
    }
    return n;
}


static int getMin() {
    std::cout << "Podaj minimum przedziału: ";
    int n;
    std::cin >> n;
    if( std::cin.fail() ) {
        throw MyException("Nieprawidłowe minimum");
    }
    return n;
}

static int getMax(const int min) {
    std::cout << "Podaj maksimum przedziału: ";
    int n;
    std::cin >> n;
    if( std::cin.fail() || n < min ) {
        throw MyException("Nieprawidłowe maksimum");
    }
    return n;
}

static int getElem(const int min,const int max) {
    std::cout << "Podaj zliczany element: ";
    int n;
    std::cin >> n;
    if( std::cin.fail() || n < min || n > max ) {
        throw MyException("Nieprawidłowy szukany element");
    }
    return n;
}


int main(int argc, char *argv[]) {
    (void)argc;
    (void)argv;
    try {
        std::vector<int> rnds;
        const int seed = (int)time(NULL);
        std::cout << "seed = " << seed << std::endl;
        const int size = getSize();
        const int min = getMin();
        const int max = getMax(min);
        const int elem = getElem(min,max);
        std::ranlux48 generator( seed );
        std::uniform_int_distribution<int> distribution(min,max);
        for( int i=0 ; i<size ; i++ ) {
            rnds.push_back( distribution(generator) );
        }
        for( int i=0 ; i<rnds.size() ; i++ ) {
            std::cout << i << " " << rnds[i] << std::endl;
        }
        //Własnoręczne rozwiązanie
        {
            int count = 0;
            for( int i=0 ; i<rnds.size() ; i++ ) {
                if( rnds[i] == elem ) {
                    count ++ ;
                }
            }
            std::cout << "Ilosc elementow == " << count << std::endl;
        }
        //Biblioteczne
        {
            const int count = std::count (rnds.begin(), rnds.end(), elem);
            std::cout << "Ilosc elementow == " << count << std::endl;
        }

    }
    catch( std::exception &e ) {
        std::cout << "Wystapił błąd: " << e.what() << std::endl;
    }
    return 0;
}

 

komentarz 13 listopada 2019 przez mokrowski Mędrzec (155,460 p.)
prog.cpp:21:38: warning: dynamic exception specifications are deprecated [-Wdeprecated-dynamic-exception-spec]
    virtual const char* what() const throw(){
                                     ^~~~~~~
prog.cpp:21:38: note: use 'noexcept' instead
    virtual const char* what() const throw(){
                                     ^~~~~~~
                                     noexcept
prog.cpp:18:36: warning: constructor parameter 'swhat' shadows the field 'swhat' of 'MyException' [-Wshadow-field-in-constructor]
    MyException( const char *const swhat ) : swhat(swhat) {
                                   ^
prog.cpp:15:23: note: previous declaration is here
    const std::string swhat;
                      ^
prog.cpp:73:36: warning: zero as null pointer constant [-Wzero-as-null-pointer-constant]
        const int seed = (int)time(NULL);
                                   ^~~~
                                   nullptr
/opt/local/libexec/llvm-9.0/lib/clang/9.0.0/include/stddef.h:84:18: note: expanded from macro 'NULL'
#    define NULL __null
                 ^
prog.cpp:73:26: warning: use of old-style cast [-Wold-style-cast]
        const int seed = (int)time(NULL);
                         ^    ~~~~~~~~~~
prog.cpp:79:34: warning: implicit conversion changes signedness: 'const int' to
      'std::__1::discard_block_engine<std::__1::subtract_with_carry_engine<unsigned long long, 48, 5, 12>, 389, 11>::result_type'
      (aka 'unsigned long long') [-Wsign-conversion]
        std::ranlux48 generator( seed );
                      ~~~~~~~~~  ^~~~
prog.cpp:85:43: warning: implicit conversion changes signedness: 'int' to 'std::__1::vector<int, std::__1::allocator<int> >::size_type'
      (aka 'unsigned long') [-Wsign-conversion]
            std::cout << i << " " << rnds[i] << std::endl;
                                     ~~~~ ^
prog.cpp:91:26: warning: implicit conversion changes signedness: 'int' to 'std::__1::vector<int, std::__1::allocator<int> >::size_type'
      (aka 'unsigned long') [-Wsign-conversion]
                if( rnds[i] == elem ) {
                    ~~~~ ^
prog.cpp:84:25: warning: comparison of integers of different signs: 'int' and 'std::__1::vector<int, std::__1::allocator<int> >::size_type'
      (aka 'unsigned long') [-Wsign-compare]
        for( int i=0 ; i<rnds.size() ; i++ ) {
                       ~^~~~~~~~~~~~
prog.cpp:90:29: warning: comparison of integers of different signs: 'int' and 'std::__1::vector<int, std::__1::allocator<int> >::size_type'
      (aka 'unsigned long') [-Wsign-compare]
            for( int i=0 ; i<rnds.size() ; i++ ) {
                           ~^~~~~~~~~~~~
prog.cpp:99:31: warning: implicit conversion loses integer precision: 'typename iterator_traits<__wrap_iter<int *> >::difference_type' (aka 'long')
      to 'const int' [-Wshorten-64-to-32]
            const int count = std::count (rnds.begin(), rnds.end(), elem);
                      ~~~~~   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
prog.cpp:13:7: warning: 'MyException' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit
      [-Wweak-vtables]
class MyException : public std::exception {
      ^

Na początek to co mówi kompilator o Twoim rozwiązaniu.

komentarz 13 listopada 2019 przez mmarszik Mądrala (7,390 p.)
Ustawiłeś C++11?
komentarz 13 listopada 2019 przez mokrowski Mędrzec (155,460 p.)
Włączyłem tylko ostrzeżenia w kompilatorze. Obecnie w zasadzie większość już domyślnie kompiluje w c++14.
komentarz 13 listopada 2019 przez mmarszik Mądrala (7,390 p.)
I nie kompiluje?

Podobne pytania

0 głosów
1 odpowiedź 274 wizyt
pytanie zadane 26 listopada 2019 w C i C++ przez Kumixx Początkujący (250 p.)
0 głosów
0 odpowiedzi 1,019 wizyt
pytanie zadane 25 grudnia 2019 w C i C++ przez Hubertius Bywalec (2,970 p.)
+1 głos
1 odpowiedź 349 wizyt
pytanie zadane 9 maja 2021 w C i C++ przez nzepik324 Początkujący (260 p.)

92,573 zapytań

141,423 odpowiedzi

319,645 komentarzy

61,959 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!

...