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

Dla połowy zadania program działa poprawnie, dla reszty się wysypuje.

Object Storage Arubacloud
0 głosów
420 wizyt
pytanie zadane 6 kwietnia 2016 w C i C++ przez Sidzej Użytkownik (850 p.)

Cześć. Ostatnio na informatyce dostałem do zrobienia zadanie "Liczby pierwsze w trójkolandii".

Link do zadania:  http://kraczkowski.info/wp-content/uploads/2011/09/informatyka_PR_II.pdf

   Napisałem program w c++, który mogłoby się wydawać, że działa poprawnie ponieważ dobrze rozwiązuje podpunkty a i b tego zadania (sprawdzałem w odpowiedziach), natomiast kiedy przychodzi kolej na podpunkty c i d różniące się tylko rozmiarem przedziału liczb w porównaniu z dwoma poprzednimi, program się wysypuje. Próbowałem zamiast "intów" wstawiać "long inty", ale to dalej nie rozwiązywało problemu. Bardzo proszę o pomoc. 

​#include <iostream>


 using namespace std;
 
int p,k,i,l,licznik=0,f,w;


 int main()
 {


     cout << "podaj poczatek przedzialu: ";
     cin >> p;

     cout << "podaj koniec przedzialu: ";
     cin >> k;

     int tab[k-p];


l=p;

     for(i=0; i<k-p; i++) //zapis kolejnych liczb z przedzialu do tablicy
     {

         tab[i]= l;
         l++;

     }

     for(i=0; i<k-p; i++)
     {






            if(tab[i] % 3 == 1)                       //sprawdzanie pierwszego warunku
                    {

                w=0;                                  // jeœli spelniony jest 1. warunek sprawdzanie drugiego warunku
                        for(f=4; f<tab[i]/2; f=f+3)   // sprawdzanie ile dzielnikow, którycb reszta z dzielenia przez 3 jest rowna 1, ma dana liczba
                        {



                                    if(tab[i] % f ==0)
                                    {
                                        w++;

                                    }

                        }


                        if(w==0)                    //jezeli liczba nie ma zadnych takich dzielników to znaczy, ze w trojkolandii jest liczba pierwsza. program wypisuje te liczbe,
                                                    //przy okazji liczac ilosc takich liczb
                                                     
                        {

                        cout << endl << tab[i];
                        licznik++;

                        }


                    }






     }

cout << endl <<  endl << licznik;
return 0;
 }


2 odpowiedzi

+1 głos
odpowiedź 6 kwietnia 2016 przez Daaa22 Dyskutant (8,250 p.)
wybrane 6 kwietnia 2016 przez Sidzej
 
Najlepsza

Co to jest?! (linia 19)

int tab[k-p];

Tak nie można. Liczba zmiennych w tablicy musi być znana w momencie kompilacji. Czytałeś kiedyś o tablicach dynamicznych? Jeżeli nie, to łap: http://www.p-programowanie.pl/cpp/tablice-dynamiczne/ . Ta linijka powinna więc wyglądać tak:

int *tab = new int[k-p];

Należy też pamiętać o zwolnieniu pamięci:

delete [] tab;

 

komentarz 6 kwietnia 2016 przez Daaa22 Dyskutant (8,250 p.)
PS. to jest rozszerzona informatyka? Ja jestem w podstawówce i nie mam problemów z tymi zadaniami...
komentarz 6 kwietnia 2016 przez Aisekai Nałogowiec (42,190 p.)
Nie uczy się wszystkiego od razu, zwolnienie pamięci odstawiłbym na później
komentarz 6 kwietnia 2016 przez Daaa22 Dyskutant (8,250 p.)

Ale powinieneś zawsze na końcu kodu zwolnić pamięć po takiej tablicy.

komentarz 6 kwietnia 2016 przez Daaa22 Dyskutant (8,250 p.)
A tak btw. Działa już program, bo nie testowałem?
komentarz 6 kwietnia 2016 przez draghan VIP (106,230 p.)

Nie uczy się wszystkiego od razu, zwolnienie pamięci odstawiłbym na później

Proszę, nie powtarzaj tego więcej.

Zwolnienie pamięci jest nieodłącznym elementem jej dynamicznej alokacji! Na każde użyte new[] musi wystąpić jedno delete[].

komentarz 6 kwietnia 2016 przez Sidzej Użytkownik (850 p.)
edycja 6 kwietnia 2016 przez Sidzej
Pracował 10 min, ale w końcu podał dla podpunktu c) 98326. Nie wiem czy to dobry wynik bo nie mam przy sobie odpowiedzi, ale przynajmniej się nie wysypuje ;]. Dzięki za pomoc.

PS

Może ktoś wie, czy jest to poprawny wynik dla tego podpunktu?
komentarz 6 kwietnia 2016 przez Aisekai Nałogowiec (42,190 p.)
@Draghan @Daaa22 - okej, mój błąd. Powtarzać już tego więcej nie będę. Nie doszedłem w C++ do dynamicznej tablicy (umiem tyle, co na maturę potrzebuję), uczę się javy. Po prostu myślałem, że zawsze się zwalnia pamięć jak jest ona nie potrzebna (w javie jest to automatyczne) nie myślałem, że dynamiczna tablica i zwalnianie pamięci są nierozłączne.
komentarz 6 kwietnia 2016 przez draghan VIP (106,230 p.)
A to na maturze nie możesz pisać w Javie?
komentarz 6 kwietnia 2016 przez Aisekai Nałogowiec (42,190 p.)
Już nie. Złożyłem na podaniu, że w C++ piszę. Javy dopiero się zacząłem uczyć niecały miesiąc temu, kiedy już było za późno
komentarz 6 kwietnia 2016 przez draghan VIP (106,230 p.)
Powodzenia. :)
komentarz 6 kwietnia 2016 przez Aisekai Nałogowiec (42,190 p.)
Dzięki, przyda się :)
+2 głosów
odpowiedź 6 kwietnia 2016 przez jpacanowski VIP (101,940 p.)
int p,k,i,l,licznik=0,f,w;

Deklarujesz zmienne jako globalne (poza funkcją main), a więc wszystkie zmienne przyjmują wartość domyślną 0 (zero). Taka uwaga, nie mająca nic wspólnego z rozwiązaniem problemu.

Podobne pytania

0 głosów
3 odpowiedzi 844 wizyt
pytanie zadane 17 listopada 2015 w PHP przez Munvik Dyskutant (9,350 p.)
0 głosów
1 odpowiedź 152 wizyt
0 głosów
1 odpowiedź 345 wizyt
pytanie zadane 30 marca 2016 w C i C++ przez Chajol Początkujący (290 p.)

92,615 zapytań

141,465 odpowiedzi

319,777 komentarzy

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

...