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

liczby pierwsze-pętla do-while

Ostatnio zmodyfikowano 2016-04-18 23:40
Autor Wiadomość
soldiervv
Temat założony przez niniejszego użytkownika
liczby pierwsze-pętla do-while
» 2016-04-18 20:53:10
Mam następujący problem. Napisałem taki oto program (w celach nauki) mający sprawdzić czy wpisana liczba jest pierwsza:

#include<iostream>
#include<conio.h>
#include<math.h>

using namespace std;

int main()
{
int n;
int k;
cout<<"Podaj k"<<endl;
cin>>k;
int pierwsza (int k);
if (pierwsza(k))
cout<<"liczba jest pierwsza";
else
cout<<"nie jest pierwsza";

return 0;
}

int pierwsza (int k)
{
int i=2;
int p=1;

do
{
if(k%i==0)
{
p=0;
//break;
}

else p=1;
++i;
}
while((k%i)&&i<k);
return p;
}


Problem polega na tym, że działa on poprawnie tylko wtedy, gdy w klamrze po "if"-ie jest break. Moim zdaniem jest on niepotrzebny, jednak bez niego program dla dowolnej liczby stwierdza (błędnie) że jest pierwsza. Nie wiem dlaczego tak się dzieje. Z góry dziękuję jakby ktoś zechciałby mi to wytłumaczyć.
P-147411
Masterpc16
» 2016-04-18 22:13:02
Witam trochę bałaganu jest w tym kodzie po co w nawiasach po while jest ten warunek (k%i) on jest zbędny ,nie potrzebne również jest else ponieważ już masz przypisaną wartość zmiennej p gdyby jej nie było to musiałbyś to dać aczkolwiek to by myliło program jeśli nie chcesz dać break ponieważ pętla cały czas się wykonuje i cały czas się zmienia wartość p i tak na prawdę o ostatecznym wyniku zadecyduje działanie k%i gdzie i wynosi k-1, poniżej zamieszczam ten kod z lekkimi poprawkami warto użyć zmiennej typu bool do sprawdzania warunków kiedy masz prawda lub fałsz, teraz ten program działa bez problemu
C/C++
#include<iostream>
#include<conio.h>
#include<math.h>

using namespace std;

int main()
{
    int n;
    int k;
    cout << "Podaj k" << endl;
    cin >> k;
    int pierwsza( int k );
    if( pierwsza( k ) )
         cout << "liczba nie jest pierwsza";
    else
         cout << "liczba jest pierwsza";
   
    return 0;
}

int pierwsza( int k )
{
    int i = 2;
    bool p = true;
   
    do //pętla wykona się przynajmniej raz
    {
        if( k % i == 0 ) // jeśli k dzieli się bez reszty to wykonaj poniższe instrukcje
        {
            p = false; // zmienia się wartość p ponieważ to już nie jest liczba pierwsza
            //break; dobrze by było użyć tego break ponieważ skaraca to ilość działań wykonanych przez program to że dalej będzie działał nic nie zmieni bo zmienna p ma już wartość negatywną
        }
        ++i;
    }
    while( i < k ); // dopuki i jest mniejesze od podanej przez użytkownika liczby pętla ma się powtórzyć;
   
    return p;
}

można jeszcze w inny sposób wykonać to zadanie bez pętli do .. while
C/C++
#include <iostream>
using namespace std;
int main()
{
    int cyfra( 0 );
    bool pierwsza( true );
    cout << "Podaj cyfre ";
    cin >> cyfra;
    for( int i = 2; i < cyfra; i++ )
    {
        if( cyfra % i == 0 )
        {
            pierwsza = false;
            break;
        }
    }
    if( pierwsza ) cout << "Liczba " << cyfra << " jest liczba pierwsza" << endl;
    else cout << "Liczba " << cyfra << " nie jest liczba pierwsza" << endl;
   
}
P-147414
soldiervv
Temat założony przez niniejszego użytkownika
» 2016-04-18 22:23:57
Dzięki. Zauważyłem teraz też, że w moim kodzie będzie wszystko działać poprawnie jak dam operator preinkrementacji zaraz po otwierającej klamrze po "do". Ale i tak twój kod jest dużo bardziej czytelny, tak więc dzięki jeszcze raz.
P-147415
Masterpc16
» 2016-04-18 22:30:50
C/C++
do
{
    i++; // Tyle że jak dasz inkrementację tutaj to wartość zmiennej i musisz zmienić na 1 ponieważ w przeciwnym razie po rozpoczęciu pętli zmienna i będzie miała wartość 3
    if( k % i == 0 )
    {
        p = false; /
    }
}
while( i < k )
P-147416
soldiervv
Temat założony przez niniejszego użytkownika
» 2016-04-18 23:40:25
Racja.
P-147418
« 1 »
  Strona 1 z 1