Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Liczby pierwsze

Ostatnio zmodyfikowano 2014-04-15 17:28
Autor Wiadomość
mati1995g
Temat założony przez niniejszego użytkownika
[C++] Liczby pierwsze
» 2014-04-10 21:10:48
Witam!
W szkole dostałem zadanie napisania programu do sprawdzenia czy liczba jest liczbą pierwszą, ale mój nauczyciel powiedział, że muszę poprawić program bo jest źle napisany i mam mu przynieść do oceny jak poprawie. Więc od razu mówię,że jestem kompletnym amatorem, program napisałem w 5min i myślałem, że tak powinno być, więc proszę o ewentualnie wskazówki co powinienem poprawić ( nauczyciel mówi co jest źle dopiero po ocenie :p). Z góry dziękuje za pomoc.

C/C++
#include <iostream>


#include <cstdlib>


using namespace std;
int main( int argc, char * argv[] ) {
    int x = 0;
    float wynik = 0;
    int z = 0;
    cout << "Podaj liczbe:  ";
    cin >> x;
    for( int i = 1; i < x + 1; i++ ) {
        wynik = x % i;
        if( wynik == 0 ) z = z + 1;
       
    }
    cout << endl;
    cout << "Liczba dzielnikow:  " << z << endl << endl;
    if( z == 2 ) cout << "To jest liczba pierwsza !!!" << endl << endl;
   
    system( "pause" );
    return 0;
}
P-108020
michal11
» 2014-04-10 23:29:25
1. Spróbuj lepiej formatować kod, przede wszystkim dawać więcej enterów wtedy wygodniej się to czyta.
2. Spróbuj inaczej nazywać zmienne, bo jak widzę
z = z + 1
 (co nawiasem mówiąc powinno wyglądać tak:
++z
) to muszę się domyślać i sprawdzać co to oznacza.
3. Nie używaj float tylko double, no chyba, że musisz.
4. W ogóle zmienna wynik nie jest potrzebna wystarczy
if( x % i == 0 )
.
5. W pętli
i < x + 1
 zamienił bym na
i <= x

Ciężko coś tutaj namieszać bo to jest dość prosty algorytm, i wydaje mi się, że twój nauczyciel miał właśnie zastrzeżenia dotyczące formy i ogólnych praktyk(czyli to co wypunktowałem).
P-108027
bombatom69
» 2014-04-11 03:54:21
Pomijając dziwny kod, masz błędy merytoryczne.

1. Nie słuchaj mojego poprzednika w kwestii typu, bo liczby pierwsze są wszystkie jak jedna naturalne a więc całkowite dodatnie. Zrezygnuj z float.


2. Liczba "1" jest tzw. niezmiennikiem mnożenia. Nie jest liczbą pierwszą i jako taka powinna być odrzucana wcześniej. Ogolnie przydałaby się instrukcja w stylu

if(x<2) ... liczba nie jest pierwsza

3.

    for( int i = 2; i < x; i++ ) {

Bo nie możesz wymieniać wsrod dzielnikow jedynki i liczby badanej. Kazda liczba dzieli się przez 1 i sama siebie.
P-108030
michal11
» 2014-04-11 18:11:42
Hmm szczerze mówiąc to nie wiem o co chodzi z tym "Nie słuchaj mojego poprzednika w kwestii typu". bombatom69 jak byś mógł wyjaśnić.
P-108044
bombatom69
» 2014-04-12 23:15:11
Hmm szczerze mówiąc to nie wiem o co chodzi z tym "Nie słuchaj mojego poprzednika w kwestii typu". bombatom69 jak byś mógł wyjaśnić.

Nie ma tam w programie wskazania do używania liczb ułamkowych. Zbiór liczb pierwszych jest podzbiorem naturalnych. Reszta z dzielenia również jest całkowitą wartością. Więc i z punktu widzenia zarówno matematyki jak i C/C++, typ zmiennoprzecinkowy nie powinien się tam znaleźć żaden.




P-108087
michal11
» 2014-04-13 19:51:16
No tak mi tylko chodziło o to, żeby programując nie używał float tylko double, ponieważ double jest bardziej dokładne.
P-108130
bombatom69
» 2014-04-14 22:41:27
Wybacz, ale to co piszesz jest jakąś nowoczesną paplaniną.

1. Gdyby float było z natury złe(jak można wywnioskować z Twojej wypowiedzi), byłoby z całą pewnością już dawno wycięte.
2. Zapoznaj się z opisem formatu, wówczas może dowiesz się jakie warunki musiałbyś spełnić aby float stało się niedokładne. Sprawdź na swojej maszynie rozmiar float i zobacz parametry tego formatu dla takiego rozmiaru.
3. Nakłanianie ludzi aby korzystali z double zamiast float, jest zupełnie dla mnie niezrozumiałe. Przyjdzie Ci kiedyś fantazja namówić siebie na rezygnację z double na rzecz long double, pomimo skromnych potrzeb. Może się zdarzy, że będziesz potrzebował zaalokować sporą tablicę. Wówczas zaczniesz zachodzić w głowę, dlaczego właściwie stało się tak, że program wyssał Ci tyle pamięci.

Tutaj pytający nie potrzebuje w ogóle ułamków a Ty zachęcasz go do zwiększenia zakresu. Gdzie w tym sens?
P-108188
michal11
» 2014-04-15 17:28:09
Może inaczej, ja mam złe doświadczenia z float, dlatego dla liczb zmiennoprzecinkowych stosuję double.
P-108211
« 1 »
  Strona 1 z 1