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

Program z wykorzystaniem tablicy jednowymiarowej.

VPS Starter Arubacloud
0 głosów
321 wizyt
pytanie zadane 19 kwietnia 2020 w C i C++ przez KABAK Nowicjusz (230 p.)

ogółem to dostalem zadanie do wykonania i mecze sie z nim juz pare dni,licze ze ktos z was mnie nakieruje w jakis sposób. Polecenie: napisz program z wykorzystaniem tablicy jednowymiarowej ktory sprawdza czy wsrod n liczb istnieje para liczb jednakowych(wartosc n jest wczytywana). 

#include <iostream>

using namespace std;

int n;
int main()
{
    cout << "podaj n: ";
    cin >> n;

    int tablica[n];

    for (int i=n-1;i>=0;i--)
    {
        cout << "podaj liczbe: ";
        cin >> tablica[i];
    }
    

    return 0;
}

 Poki co mam tylko to czyli utworzenie tablicy i przypisanie liczb ale nie bardzo rozumiem jak moge sprawdzic czy wsrod tych liczb istnieje para liczb jednakowych.

3 odpowiedzi

0 głosów
odpowiedź 19 kwietnia 2020 przez jankustosz1 Nałogowiec (35,880 p.)

Po pierwsze taki zapis jest błędny:

int tablica[n];

zamień na 

int *tablica = new int[n];

Co do sprawdzenia czy jest jakaś para masz 3 możliwości:

1)  Dla każdej liczby przejrzeć całą tablicę i zliczyć ile jest jej wystąpień w tablicy, jeżeli jest więcej niż jeden to para istnieje 

2) Użyć seta, ale raczej nie o to chodzi.

3) Zrobić dużą tablicę booli i jako indeks traktować każdą z liczb. Należy przejść cała tablicę i dla każdego elementu sprawdzić czy już został do tej tablicy dodany, jeżeli tak to para istnieje w przeciwnym wypadku ustawić true pod odpowiednim indeksem i kontynuować.

Edit.

Możesz też sprawdzić czy jest jakaś liczba, parzysta, bo to znaczy, że ma parę.

komentarz 19 kwietnia 2020 przez KABAK Nowicjusz (230 p.)

a co da/zmieni mi taki zapis?? 

int *tablica = new int[n];

 

komentarz 20 kwietnia 2020 przez jankustosz1 Nałogowiec (35,880 p.)
To, że będzie to prawidłowy zapis zgodny ze standardem i będzie działał na każdym kompilatorze.
komentarz 20 kwietnia 2020 przez Anahan89 Obywatel (1,270 p.)

@jankustosz1, mam pytanie co d zapisu tablicy- dobrą praktyką jest już na samym początku nauki (zaczynam) zapisywać tablicę w tej formie?


int *tablica = new int[n];

Czy taki zapis wymaga również funkcji delete [] tablica, za każdym razem kiedy program ma zaprzestać pracy z nią?

1
komentarz 24 kwietnia 2020 przez jankustosz1 Nałogowiec (35,880 p.)
Zależy co robisz. System po zakończeniu działania programu powinien zwolnić pamięć, więc jakieś krótkie skrypty można robić bez delete. Przy większych projektach lepiej delete robić, żeby nie było wycieków pamięci, np. jakbyś kopiował jakieś obrazki i nie robił delete, to ram po chwili by zdechł.
0 głosów
odpowiedź 19 kwietnia 2020 przez mokrowski Mędrzec (155,460 p.)

Napisz funkcję wyszukania liczby w tablicy i jej użyj (w trybie bardzo szkolnym):

bool is_value_in_table(const int value, const int * table, const std::size_t size) {
    bool result = false;
    for(std::size_t i = 0; i < size; ++i) {
        if (value == table[i]) {
            result = true;
            break;
        }
    }
    return result;
}

Oczywiście rozwiązanie nie będzie algorytmicznie optymalne ( O(n^2) ), ale przy niewielkiej ilości danych, wystarczające.

Jeśli wiesz że zakres liczb wprowadzanych jest ograniczony, możesz użyć ustawionych bitów jako znacznika że już dane się pojawiły. Przy pełnym zakresie 32-bitowych liczb, wymaga to sporej pamięci. Da jednak rozwiązanie optymalne co do złożoności obliczeniowej ( O(1) ).

Takie rozwiązanie da także użycie zbioru (std::set). Jednak ma duży koszt stały na wyliczanie funkcji skrótu.

Rozwiązaniem pośrednim jest sortowanie zgromadzonych liczb i sprawdzenie czy nie występują obok siebie takie same. To da rozwiązanie z kosztem O(n * log(n)).

0 głosów
odpowiedź 20 kwietnia 2020 przez TOWaD Mądrala (5,700 p.)
edycja 20 kwietnia 2020 przez TOWaD

jakby rozwiązuje problem w jedna stronę,

#include <iostream>
#include <string>
#include <set>

int main()
{
    //const int n;
    //cin>n;
    int tab[11] {1,2,3,5,4,5,7,3,2,4,5};
    //int reversetab[11];
    
    
    int* ptr32=&tab[0];
    long int* ptr64;
    std::pair<std::set<long>::iterator,bool> ret;
    std::set<long> s;
    for (int i=0;i<10;i++){
        ptr64=(long*)ptr32++;
          ret = s.insert(*ptr64);
        if(!ret.second) std::cout<<*(ptr32-1)<<','<<*(ptr32)<<'\n';
        }
}

https://en.cppreference.com/w/cpp/container/set/insert
http://www.cplusplus.com/reference/set/set/insert/

Podobne pytania

0 głosów
1 odpowiedź 1,552 wizyt
–3 głosów
1 odpowiedź 347 wizyt
0 głosów
1 odpowiedź 181 wizyt

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...