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

question-closed Tablica, wskaźniki, dynamiczna alokacja pamięci

Object Storage Arubacloud
0 głosów
202 wizyt
pytanie zadane 17 marca 2020 w C i C++ przez Niepokonana7999 Bywalec (2,270 p.)
zamknięte 17 marca 2020 przez Niepokonana7999

Witam

Mam błąd i nawet wiem gdzie, ale nie wiem, jak go poprawić, proszę od odpowiedź.

Z pliku tekstowego pobieramy 2 tysiące liczb i interesują nasz tylko liczby pierwsze.

1. policzyć, ile jest liczb pierwszych. I to mi się udało  Zmienna pierwsze poprawnie pokazuje, ile jest tych liczb.

2. Wskazać najmniejszą i największą liczbę pierwszą. No to robię dynamiczną tablicę, której rozmiarem jest zmienna pierwsze, wsadzam do niej liczby pierwsze. Potem używam dwóch funkcji - maksimum i minimum. Te funkcje działają, bo w moim poprzednim pytaniu pytałam o nie i dostałam dobrą odpowiedź. Wiem, że nie działa wsadzanie liczb do tablicy. Jak to poprawić?

Alternatywą jest zrobienie po prostu tablicy, która ma 2000 miejsc, ale to bez sensu przecież.

Proszę bez dawania mi gotowych rozwiązań, kompletnie nowych kodów, bo to jest moja praca domowa i zależy mi na tym, żeby było to jak najbardziej samodzielne, potrzebuję tylko poprawki. Wklejam tylko tę część kodu, która jest do punktu 2. Brakująca część jest tylko do punktu 1., a punkt 1. jest dobrze i nie widzę sensu we wklejaniu wszystkiego.

{int *tablicaPierwszych= new int[pierwsze];


 for ( int i=0; i<2000; i++)
        {
            liczby >> liczba;

            if ( pi(liczba) )
                {
                     tablicaPierwszych[i]=liczba;
                     cout << tablicaPierwszych[i] << endl;
                }

        }



cout << maksimum ( tablicaPierwszych, pierwsze) << endl;


liczby.close();
wynik.close();
delete []tablicaPierwszych;
return 0;}


int maksimum ( int *wsk, int ile)
{
    int najw = *wsk;
    for (int i=1; i<ile; i++)
    {
        if ( najw < *( wsk + i )  )
       {

        najw = *(wsk+i);

        }


    }

    return najw;
}
int minimum ( int *wsk, int ile)
{
    int najw = *wsk;
    for (int i=1; i<8; i++)
    {
        if ( najw > *( wsk + i )  )
       {

        najw = *(wsk+i);

        }


    }

    return najw;
}

 

komentarz zamknięcia: już wiem

1 odpowiedź

0 głosów
odpowiedź 17 marca 2020 przez tangarr Mędrzec (154,860 p.)
wybrane 17 marca 2020 przez Niepokonana7999
 
Najlepsza
Nie potrzebujesz żadnych dynamicznych tablic. Wystarczą 3 zmienne: ilosc_liczb_pierwszysch, najmniejsza_liczba_pierwsza, najwieksza_liczba_pierwsza.
Zainicjuj je zerami.

Następnie algorytm wygląda następująco:
1. Wczytaj liczbę
2. Jeżeli liczba nie jest pierwsza skocz do kroku 1
3. Jeżeli ilosc_liczb_pierwszych jest równa 0 to ustaw najmniejsza_liczba_pierwsza = najwieksza_liczba_pierwsza = liczba
4. Jeżeli liczba > najwieksza_liczba_pierwsza to najwieksza_liczba_pierwsza  = liczba
5. Jeżeli liczba < najmniejsza_liczba_pierwsza  to najmniejsza_liczba_pierwsza  = liczba
6. Zwiększ ilosc_liczb_pierwszych o 1
7. Skocz do 1
komentarz 17 marca 2020 przez Niepokonana7999 Bywalec (2,270 p.)
Nie chcę niszczyć mojego kodu i robić na nowo. Naprawdę nie ma jak to naprawić?
komentarz 17 marca 2020 przez tkz Nałogowiec (42,000 p.)
Nie przywiązuj się do kodu... Skoro jest lepsze rozwiązanie, nawet nie powinnaś się zastanawiać.
komentarz 17 marca 2020 przez tangarr Mędrzec (154,860 p.)

Jeżeli tak bardzo zależy ci na zachowaniu bieżącej logiki to musisz wprowadzić kilka poprawek.

void wczytajLiczby(istream &liczby, int ile_liczb) 
{
    int *tablicaPierwszych= new int[ile_liczb];
    int pierwsze = 0;
    for ( int i=0; i<ile_liczb; i++) {
        liczby >> liczba;
        // w przypadku błędu odczytu przerywamy pętlę
        if (!liczby.good())
            break;
        // jeżeli liczba jest liczbą pierwszą
        if (pi(liczba)) {
             // dopisujemy liczbę do tablicy na pierwszym wolnym miejscu
             tablicaPierwszych[pierwsze]=liczba;
             cout << liczba << endl;
             // zwiększamy ilość liczb pierwszych
             pierwsze++;
        }
    }
    // jeżeli nie wczytano żadnej liczby pierwszej zakończ funkcję
    if (pierwsze > 0) {
        // szukamy tylko w zapełnionej częśći tablicy
        cout << maksimum ( tablicaPierwszych, pierwsze) << endl;
    }
    delete []tablicaPierwszych;
}

 

komentarz 17 marca 2020 przez Niepokonana7999 Bywalec (2,270 p.)
edycja 17 marca 2020 przez Niepokonana7999

@tkz, To nie był miły komentarz z pana strony. :/ Nie musi być pan dla mnie wredny. 

Jestem beznadziejna z informatyki, nie idzie mi i nigdy nie będzie, ale muszę jakoś wytrzymać. Tyle.

 

No dobra, wywalę kod i zrobię od nowa, dzięki za pomoc. I tak nie dostanę za to więcej niż 3, więc co mi zależy. Faktycznie ta logika bez tablicy i funkcji jest prostsza.

komentarz 17 marca 2020 przez tangarr Mędrzec (154,860 p.)
Komentarz tkz nie był wredny. Kolega po prostu sugerował trzymania się zasady KISS (keep it simple stupid).

Podobne pytania

0 głosów
2 odpowiedzi 917 wizyt
pytanie zadane 3 lipca 2018 w C i C++ przez qlucha Obywatel (1,790 p.)
0 głosów
1 odpowiedź 279 wizyt
0 głosów
1 odpowiedź 515 wizyt
pytanie zadane 12 sierpnia 2016 w C i C++ przez niezalogowany

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

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

...