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

C liczby pierwsze

Object Storage Arubacloud
0 głosów
339 wizyt
pytanie zadane 2 lipca 2018 w C i C++ przez Oskar F. Użytkownik (620 p.)
edycja 2 lipca 2018 przez Oskar F.

Ma ktoś pomysł co jest źle? Program ciągle daje odpowiedź "tak".
 

#include <stdio.h>
#include <stdbool.h>
int main()
{
int n;
bool t;
t=true;
scanf("%d",&n);

for(int i;i<n;i++)
{
    if(n%i==0)
    {
    t=false;
    }
    i++;
}
if(t=false)
    {
    printf("NIE");
    }
else
    {
    printf("TAK");
    }
}

EDIT: Dzięki wszystkim już działa :).

komentarz 2 lipca 2018 przez Mariusz08 Maniak (62,300 p.)
Kod bez bloczka

3 odpowiedzi

+2 głosów
odpowiedź 2 lipca 2018 przez mokrowski Mędrzec (155,460 p.)
wybrane 2 lipca 2018 przez Oskar F.
 
Najlepsza

No to jest to co powiedział mi kompilator o tym czymś co napisałeś:

$ clang -std=c99 -Weverything -o prime prime.c 
prime.c:16:5: warning: variable 'i' is incremented both in the loop header and in the loop body [-Wfor-loop-analysis]
    i++;
    ^
prime.c:10:15: note: incremented here
for(int i;i<n;i++)
              ^
prime.c:18:5: warning: using the result of an assignment as a condition without parentheses [-Wparentheses]
if(t=false)
   ~^~~~~~
prime.c:18:5: note: place parentheses around the assignment to silence this warning
if(t=false)
    ^
   (      )
prime.c:18:5: note: use '==' to turn this assignment into an equality comparison
if(t=false)
    ^
    ==
prime.c:10:11: warning: variable 'i' is uninitialized when used here [-Wuninitialized]
for(int i;i<n;i++)
          ^
prime.c:10:10: note: initialize the variable 'i' to silence this warning
for(int i;i<n;i++)
         ^
          = 0
3 warnings generated.

Na szybko :

1. linia 16 i 10, zmienna i jest inkrementowana w ciele pętli oraz w jej nagłówku

2. linia 18, następuje przypisane do zmiennej t. Jeśli naprawdę chcesz przypisać, otocz nawiasem. Jeśli nie zastanów się nad == 

3. linia 10, zmienna i nie jest zainicjowana.

Zacznij od komunikatów ostrzeżeń kompilatora. Później stosuj narzędzia sprawdzania statycznego kodu.

Te ostatnie z kolei zgłosiły:

1. brak prawidłowej sygnatury funkcji main(). Powinno być: int main(void)

2. Brak obsługi wartości zwracanej z funkcji scanf("%d", &n) . Tu można to ostrzeżenie wyłączyć poprzedzając ją void. Będzie to wyglądało tak: (void) scanf("%d", &n)

3. Brak wartości 0 zwracanej z main(...).

Tyle o kodzie co do jego składni. Co do poprawności (a to jest najważniejsze), stosujesz nieprawidłowy algorytm. Zbędne jest iterowanie do n. Wystarczy do pierwiastka kwadratowego z n. Pomyśl... czy po pierwiastku kwadratowym z n może być jakiś większy dzielnik?

 

komentarz 2 lipca 2018 przez Oskar F. Użytkownik (620 p.)
no właśnie ten while(0==0) służy wykonywania pętli n razy
komentarz 2 lipca 2018 przez mokrowski Mędrzec (155,460 p.)
No to nie wiem co powiedzieć.... Powiem więc... Mylisz się, wróć do podstaw i przeczytaj odpowiedni rozdział w książce...
komentarz 2 lipca 2018 przez Oskar F. Użytkownik (620 p.)
Dobrze tak więc zrobię :)
komentarz 2 lipca 2018 przez Oskar F. Użytkownik (620 p.)
W takim razie temat do zamknięcia.
komentarz 2 lipca 2018 przez Oskar F. Użytkownik (620 p.)
Jestem idiotą cały dzień się z tym męcze a tam pisze że podaje ile razy. Sorry że tak długo zawracałem głowe.
+1 głos
odpowiedź 2 lipca 2018 przez niezalogowany
Nie masz zainicjalizowanej zmiennej i w pętli.

Musi być i=2;

P.s kod w bloczek
komentarz 2 lipca 2018 przez monika90 Pasjonat (22,940 p.)
Ale przecież ma deklarację, za to brakuje inicjalizacji.
komentarz 2 lipca 2018 przez niezalogowany
Dzięki za zwrócenie uwagi, pisałem to kilka chwil po przebudzeniu :p
0 głosów
odpowiedź 2 lipca 2018 przez Bondrusiek Maniak (61,370 p.)

Witam,

w języku C nie możesz definiować zmiennej w pętli for.

...
int i;
for(i = 2; i<n ; i++)
{
...

Drugim błędem, który popełniłeś jest użycie operatora = do porównania wartości. Jest to częsta pomyłka, musisz użyć operatora ==.

...
if(t==false)
    {
    printf("NIE");
    }
...

 

komentarz 2 lipca 2018 przez monika90 Pasjonat (22,940 p.)
Oczywiście że można w C deklarować zmienną w pętli for i tak właśnie powinno się robić.
komentarz 2 lipca 2018 przez Bondrusiek Maniak (61,370 p.)
Dopiero w nowszych wersjach kompilatora GCC >= 4.5 wykorzystuje możliwość deklaracji zmiennych w dowolnym miejscu w programie przyjęte z języka C++ (C99). Wydaje mi się że lepiej to definiować zmienne dla pętli poza nią gdyż zwiększy to kompatybilność programu.
komentarz 2 lipca 2018 przez Hiskiel Pasjonat (22,830 p.)
Jak masz Worda, to używasz notepada?
1
komentarz 2 lipca 2018 przez Eryk Andrzejewski Mędrzec (164,260 p.)

@Bondrusiek, jeżeli jakiś kompilator nie wspiera ogólnie przyjętego standardu starszego ode mnie, no to... hmm, chyba należałoby go zmienić. wink

Podobne pytania

0 głosów
1 odpowiedź 203 wizyt
pytanie zadane 21 listopada 2017 w C i C++ przez rayman22 Użytkownik (710 p.)
0 głosów
3 odpowiedzi 5,970 wizyt
pytanie zadane 11 listopada 2017 w C i C++ przez Scypyon Gaduła (3,450 p.)
0 głosów
3 odpowiedzi 920 wizyt
pytanie zadane 28 kwietnia 2017 w C i C++ przez seba Dyskutant (8,900 p.)

92,538 zapytań

141,377 odpowiedzi

319,456 komentarzy

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

...