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

Zadanie z tablic jednywymarowych

VPS Starter Arubacloud
0 głosów
581 wizyt
pytanie zadane 18 listopada 2017 w C i C++ przez SzaaBao Początkujący (380 p.)

Witam,

mam polecenie które brzmi:

Napisz funkcję, która otrzymuje jako argument liczbę całkowitą n (n>=3) i zwraca jako wartość największą liczbę pierwszą mniejszą od n (do wyznaczenia wyniku użyj algorytmu sita Eratostenesa).

napisałem taki oto kod:

#include <iostream>

using namespace std;

int main()
{
    int n, i, tab[n];
    for(i=0; i<n+1; i++)
        tab[i]=0;
    for(i=2; i<n+1; i++){

        if(tab[i]==0)

    for(int j=i*i; j<n+1; j=j+i)
        tab[j]=1;}
    for(i=n; i>0; i--)
        if(tab[i]==0)
        cout<<i;




    return 0;
}

Niestety gdy go uruchamiam wyskakuje błąd krytyczny czyli program przestał działać. Bardzo proszę o pomoc.

2 odpowiedzi

0 głosów
odpowiedź 18 listopada 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Radzę nauczyć się poprawnie formatować kod, robić wcięcia jak należy. Póki co z twojego kodu trudno cokolwiek zrozumieć, nawet nie wiadomo jak on powinien działać. Porób wcięcia i poustawiaj klamry jak należy, to chętnie pomogę. smiley

W każdym razie w 12 linijce ten if jest dziwnie samotny, co on ma robić konkretnie?

komentarz 18 listopada 2017 przez SzaaBao Początkujący (380 p.)

Przepraszam, jestem początkującym wink. ten if faktycznie był niepotrzebny. Czy teraz jest lepiej? Jeśli nie to doradź co jeszcze zmienić a chętnie to zrobię.

#include <iostream>

using namespace std;

int main()
{
    int n, i, tab[n];
    for(i=0; i<n+1; i++){
        tab[i]=0;}
    for(i=2; i<n+1; i++){
        for(int j=i*i; j<n+1; j=j+i)
            tab[j]=1;}
    for(i=n; i>0; i--)
        if(tab[i]==0)
            cout<<i;










    return 0;
}

 

komentarz 18 listopada 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Rozumiem, każdy kiedyś zaczynał. smiley

Tylko wiesz, w tym przypadku po usunięciu ifa, kod może działać zupełnie inaczej. Rozpiszę Ci jak wyglądał twój wcześniejszy kod, a jak wygląda teraz (może mistrzem czystego kodu nie jestem, ale dobrze by było, żeby mniej więcej tak kod wyglądał (zwróć uwagę na wcięcia)):

Stary kod:

#include <iostream>
 
using namespace std;
 
int main()
{
    int n, i, tab[n];

    for(i=0; i<n+1; i++)
    {
        tab[i]=0;
    }

    for(i=2; i<n+1; i++)
    {
        if(tab[i]==0)
        {
            for(int j=i*i; j<n+1; j=j+i)
            {
                tab[j]=1;
            }
        }

    for(i=n; i>0; i--)
    {
        if(tab[i]==0)
        {
            cout<<i;
        }
    }

    return 0;
}

Nowy kod:

#include <iostream>
 
using namespace std;
 
int main()
{
    int n, i, tab[n];
    for(i=0; i<n+1; i++)
    {
        tab[i]=0;
    }

    for(i=2; i<n+1; i++)
    {
        for(int j=i*i; j<n+1; j=j+i)
        {
            tab[j]=1;
        }
    }

    for(i=n; i>0; i--)
    {
        if(tab[i]==0)
        {
            cout<<i;
        }
    }

    return 0;
}

Teraz oceń, której wersji jest bliżej do poprawności laugh

P.S. Stosujesz konstrukcję, która jest niedopuszczalna w C++ (a to, że twój kompilator - prawdopodobnie GCC/MinGW na to pozwala, to inna sprawa), a mianowicie:

int n, i, tab[n];

Niedopuszczalne jest tworzenie zwykłej tablicy o rozmiarze nieznanym w czasie kompilacji. Dodatkowo w twoim przypadku liczba n ma wartość zupełnie nieokreśloną (nie została do niej przypisana żadna wartość, więc rozmiar tej tablicy która powstanie, może okazać się "losowy" - zależny od śmieci w pamięci).

komentarz 18 listopada 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Jeżeli chcesz stworzyć tablicę o rozmiarze nieznanym w czasie kompilacji (czyli np. poprosisz użytkownika, by podał Ci jaki ma być rozmiar tej tablicy - pisząc kod nie wiesz, jaką wartość poda Ci ten użytkownik), musisz:

  1. Co oczywiste, mieć w zmiennej określającej rozmiar tej nowo tworzonej tablicy, jakąś konkretną wartość, czyli np. 1, 123, albo 23872. Zmienne lokalne mają to do siebie, że nie są domyślnie zerowane, mogą się w nich znaleźć jakieś dane, które pozostawił po sobie inny kawałek kodu. wink
  2. Użyć dynamicznej alokacji pamięci, ale najpierw sugeruję ogarnąć podstawy, niż się za to brać.
  3. Ewentualnie możesz użyć kontenerów STL, np. std::vector, ale moja porada jak wyżej - najpierw poznaj dobrze podstawy języka.

 

komentarz 18 listopada 2017 przez SzaaBao Początkujący (380 p.)

Dziękuję za szczegółowe wyjaśnienie. Teraz posiedzę trochę nad tym i spróbuję samemu do tego dojść laugh

komentarz 18 listopada 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Okej. Ja na początek proponuje ustawienie n jako stałej. Wtedy zapis tab[n] będzie jak najbardziej możliwy i poprawny. smiley

const int n = 10;
int tab[n];

 

0 głosów
odpowiedź 18 listopada 2017 przez Aisekai Nałogowiec (42,190 p.)
1.W zadaniu masz napisane, że masz napisać funkcję - a nie wrzucić wszystko do maina. Oczywiście main też jest funkcją ale nie o to chodzi.

2. Ile według Ciebie wynosi n tutaj:      int n, i, tab[n];. Ile trzeba zaalokować pamięci żeby utworzyć tablicę n elementową, gdy nie wiemy ile to jest to n.

3. Sformatuj ten kod porządnie, bo aż oczy bolą. Zmienne sterujące pęlą, deklaruj w nagłówku pętli, robienie z nich zmiennych (praktycznie) globalnych jest "niebezpieczne".

Podobne pytania

0 głosów
1 odpowiedź 111 wizyt
pytanie zadane 24 października 2018 w C i C++ przez kamyk2 Początkujący (420 p.)
0 głosów
1 odpowiedź 1,952 wizyt
pytanie zadane 25 października 2017 w C i C++ przez bartekzbartek Nowicjusz (140 p.)
0 głosów
2 odpowiedzi 233 wizyt
pytanie zadane 11 maja 2015 w C i C++ przez cartel13 Nowicjusz (160 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 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!

...