Operator warunkowy

0

Hej, kolejny problem:

Następujący kod:

bool LiczbaPierwsza(unsigned uLiczba)
{
if (uLiczba == 2) return true;
for (unsigned i = 2; i <= sqrt(uLiczba); ++i)
{
if (uLiczba % i == 0)
return false;
}
return true;
}
void main()
{
unsigned uWartosc;
std::cout << "Podaj liczbe: ";
std::cin >> uWartosc;
if (LiczbaPierwsza(uWartosc))
std::cout << "Liczba " << uWartosc << " jest pierwsza.";
else
std::cout << "Liczba " << uWartosc<< " nie jest pierwsza.";
getch();
}

Należy zamienić warunek if-else operatorem warunkowym "?" Wymociłem coś takiego, ale nie działa, nie chce się skompilować:

bool LiczbaPierwsza(unsigned uLiczba)
{
if (uLiczba == 2) return true;
double sqrt (double uLiczba;
for (unsigned i = 2; i <= sqrt(uLiczba); ++i)
{
if (uLiczba % i == 0)
return false;
}
return true;
}
void main() 
{
unsigned uWartosc;
std::cout << "Podaj liczbe: ";
std::cin >> uWartosc;
return (LiczbaPierwsza(uWartosc) ? std::cout << "Liczba " << uWartosc << " jest pierwsza." : std::cout << "Liczba " << uWartosc<< " nie jest pierwsza." );

getch();
}

Bardzo bym prosił o łopatologiczne wytłumaczenie i opisanie błędów. Nie wiem jak zmusić main do zwrócenia któregoś z tekstów oraz co jest z tym pierwiastkiem, za każdym razem każe mi najpierw całą funkcję sqrt definiować, zanim mogę z niego skorzystać. Korzystam z Visuala 2008

0

Co tu tłumaczyć, pamiętaj, że ?: zwraca wartość. Wedle tego:

if (LiczbaPierwsza(uWartosc))
std::cout << "Liczba " << uWartosc << " jest pierwsza.";
else
std::cout << "Liczba " << uWartosc<< " nie jest pierwsza.";

zmień na:

std::cout << "Liczba " << uWartosc << ((liczbaPierwsza(uWartosc) ? "jest pierwsza" :" nie jest pierwsza.");
// albo
std::cout << "Liczba " << uWartosc << ((liczbaPierwsza(uWartosc) ? "" : " nie") << " jest pierwsza.";
0
#include <iostream>
#include <cmath>
#include <string>

bool LiczbaPierwsza(unsigned uLiczba)
{
  int pierwiastek = int(sqrt(uLiczba));
  if (uLiczba == 2)
    return true;
  else if (!(uLiczba%2)) //parzyste różne od 2 nie są pierwsze
    return false;
  for (int i = 3; i <= pierwiastek; i+=2)
      if (!(uLiczba % i))
        return false;
}

int main()
{
  int uWartosc;
  std::cout << "Podaj liczbe: ";
  std::cin >> uWartosc;
  std::cout << "Liczba " << uWartosc;
  std::string koncowka;
  koncowka = LiczbaPierwsza(uWartosc) ? " jest pierwsza" : " nie jest pierwsza";
  std::cout<<koncowka;
  std::cin.sync();
  std::cin.get();
  return EXIT_SUCCESS;
}

0

Faktycznie ... , na gotowo wygląda to banalnie.

Shalom, dzięki za to:

koncowka = LiczbaPierwsza(uWartosc) ? " jest pierwsza" : " nie jest pierwsza";
  std::cout<<koncowka;

Właśnie w ten sposób kombinowałem, ale nijak nie chciało wyjść :)

0

A mogę się zapytać dlaczego nie mogę skompilować tego w visual C++ a w CodeBlocks działa wszystko dobrze?

W Visual C++ wyskakuje taki błąd:

d:\programowanie\nauka\nauka\main.cpp(7) : error C2668: 'sqrt' : ambiguous call to overloaded function
1> d:\visual studio\vc\include\math.h(581): could be 'long double sqrt(long double)'
1> d:\visual studio\vc\include\math.h(533): or 'float sqrt(float)'
1> d:\visual studio\vc\include\math.h(128): or 'double sqrt(double)'
1> while trying to match the argument list '(unsigned int)'

0

Kompilator MS i g++ (Codeblocks) wykorzystują inne wersje biblioteki cmath. W MS funkcja sqrt() pracuje tylko na liczbach zmiennoprzecinkowych i nie ma wersji dla unsigned. Przy wywołaniu dodaj rzutowania na double/float i będzie działać.

int pierwiastek = int(sqrt(static_cast<double>(uLiczba)));

1 użytkowników online, w tym zalogowanych: 0, gości: 1