👤

co jest źle w tym programie że nie działa? C++

i po co właściwie to wyrażenie na fioletowo

cały program

#include
using namespace std;
int main(int argc, char** argv)
{

int n;
int dzielnik;
cout << "Program sprawdza, czy zadana liczba jest pierwsza.\n";
cout << "©2003 student\n\n\n";
cout << "Podaj liczbe n=";
cin >> n;
dzielnik=2;

while ( ((n % dzielnik) != 0) && ((dzielnik <= sqrt(n))) )

dzielnik++;

if (dzielnik>sqrt(n))
{
cout << "\n\nPIERWSZA\n\n";

else
cout << "\n\nZLO—ONA\n\n";
}
}

zdjęcie bo ładniej i wyraźniej to widać


Co Jest Źle W Tym Programie Że Nie Działa C I Po Co Właściwie To Wyrażenie Na Fioletowo Cały Program Include Using Namespace Std Int Mainint Argc Char Argv Int class=

Odpowiedź :

Jest kilka rzeczy źle:

1. Powinno być

#include <iostream>

#include <math.h>

//bibliotego math.h jest potrzebna, bo korzystamy z funkcji sqrt

2. pętla while powinna być z nawiasami, czyli

while(warunki)

{

jakieś instrukcje

}

3. Warunek if oraz else powinny być poza pętlą while, bo nie ma sensu drukować komunikatów w każdej iteracji, poza tym jeśli liczba n będzie podzielna przez 2 to pętla while wcale nie startuje i wtedy nic by nie było drukowane, więc

while(warunki)

{

}

if (dzielnik>sqrt(n))

cout << "\n\nPIERWSZA\n\n";

else

cout << "\n\nZLOŻONA\n\n";

4. Jak widać powyżej, te nawiasy {.} przy if nie są potrzebne, bo instrukcja jest w jednej linijce, jeśli już, to oddzielnia nawiasy dla if i dla else

Warunek dzielnik <= sqrt(n) jest dlatego, że nie ma sensu sprawdzać dzielników, które są większe od pierwiastka z liczby. Jeżeli pierwszym dzielnikiem jest k=sqrt(n), czyli k jest liczbą pierwszą, to znaczy, że nasza liczba jest postaci k*k i innych dzielników nie ma, natomiast jeśli k nie jest dzielnikiem liczby n, to powyżej k, już z pewnością ich nie będzie. Oczywiście jeśli k nie musi być liczbą pierwszą, ale wtedy nasz program zatrzyma się już na wcześniejszym etapie.

pozdrawiam

Zobacz obrazek Platon1984