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

Program się nie kompiluje.

Object Storage Arubacloud
0 głosów
558 wizyt
pytanie zadane 26 maja 2017 w Rozwój zawodowy, nauka, praca przez pawlo392 Nowicjusz (130 p.)

Nie wiem dlaczego program który ma działać w poniższy sposób, nie kompiluje się,

Program ma działać następująco:
- zwraca komendę "jest pierwsza" kiedy liczba jest pierwsza,
- silnię największego wspólnego dzielnika jej i liczby 1024 kiedy jest parzysta i podzielna przez 2,
- sumę wszystkich liczb mniejszych od niej w przeciwnym wypadku.

 

#include<iostream>
#include<cstdlib>
using namespace std;
 
bool czy_pierwsza(int n)
{
  if(n<2)
    return false; 
 
  for(int i=2;i*i<=n;i++)
    if(n%i==0)
      return false; 
  return true;
}  
 int wynik;
    int silnia(int n)
{
        if(n==1){
                 wynik=1;
                 }
         else{
                      wynik=n*silnia(n-1);
                      }
}   


int suma(int n)


		  {
		  
		    if (n%2!=0 or n==2)
		  	{int sum=0;
		  		for(int s=0; s<n; s++)
    			{ sum += s;
				} }}
int dzielniki(int n )
            {
			if(n%2==0 && n!=2)
          		{	int a=n;
          			int b=1024;
				  	while(a!=b)
						{
						if(a>b) a=a-b;
						else b=b-a;
						}}}
 int main()
{
 int n,a,sum;
    cout << "podaj liczbe naturalna" << endl;
    cin >> n;
      if(czy_pierwsza(n)) 
    cout<<"Liczba "<<n<<" jest pierwsza"<<endl;
    exit(0);
    else
    if(suma(n))
    cout<<"Suma wszystkich liczb mniejszych od "<<n<<" = "<<sum<<endl;
			exit(0);
    else 
    if(dzielniki(n))
    cout << "Najwiekszy wspolny dzielnik liczb "<<n<<" i 1024 to: " << a << endl;
			cout <<a<< "! = "<<silnia(a)<<endl;
		  
			  exit (0);	
			  
			  
			    
				
				system("PAUSE");
  return 0;}

Z góry dziękuję za pomoc.

komentarz 26 maja 2017 przez OfftheCode Gaduła (4,050 p.)
Jaki błąd otrzymujesz ?
komentarz 26 maja 2017 przez pawlo392 Nowicjusz (130 p.)
Następujący :  'else' without a previous 'if'
komentarz 26 maja 2017 przez Arkadiusz Sikorski Pasjonat (20,160 p.)
edycja 26 maja 2017 przez Arkadiusz Sikorski

Twój kod zawiera dość sporo różnych rzeczy, których się nie praktykuje...Na przykład tymczasowy wynik, który obliczasz w silni przetrzymujesz w zmiennej globalnej. Takich rzeczy się nie robi.

Ponadto Twoje funkcje do sumowania i silni nie zabezpieczają się przed niewłaściwymi danymi (liczby ujemne). Kod jest mocno niespójny i trochę trudno jest połapać się, co w danym miejscu masz na myśli (definiujesz funkcje zwracające typ int, a nic w nich nie zwracasz).

Tak swoją drogą, post jest chyba w złej sekcji.

3 odpowiedzi

0 głosów
odpowiedź 26 maja 2017 przez Arkadiusz Sikorski Pasjonat (20,160 p.)
edycja 26 maja 2017 przez Arkadiusz Sikorski

Twoje ify w mainie używają dwóch komend, powinieneś ująć odpowiednie cout i exit w klamerki.

EDIT: dostałem minusika, co mnie zasmutkowało, więc trochę bardziej postaram się z odpowiedzią.

Prze-edytowałem Twój program, żeby robił to co w "przepisie", ale jest troszkę poprawniej (zarówno składniowo, jak i logicznie). Starałem się wszystko mocno o-komentować, spróbuj to przeanalizować. Mam nadzieję, że wskazówki okażą się pomocne i wyciągniesz z nich jakieś wnioski :)

#include <iostream>
#include <cstdlib>
using namespace std;

bool czy_pierwsza(int n)
{
    if(n <  2)
        return false;

    for(int i = 2; i*i <= n; i++)
        if(n % i == 0)
            return false;
    return true;
}

int silnia(int n)
{
    if(n == 0) // tu musi byc zero, bo jezeli uzytkownik poda 0, to wynik nie bedzie poprawny (silnia z zera to 1); niektorzy uwazaja zero za liczbe naturalna, tak swoja droga :)
        return 1;
    else
        return n * silnia(n - 1); // rekurencyjnie
}

int suma(int n)
{
    int sum = 0;
    for(int s = n - 1; s > 0 ; s--) // bardziej klarownie, jezeli policzymy "od tylu", ale to juz kwestia gustu
        sum += s;
    // drobna uwaga: mozemy to tez krotko (bez pomocy petli) policzyc przy uzyciu wzoru na ciag arytmetyczny (poziom szkoly sredniej)
    return sum; // zwracamy sume
}

int NWD1024(int n) // tutaj nie potrzeba wiele komentarza
{
    int a = n, b = 1024;
    while(a != b)
       if(a > b)
           a -= b; // a = a - b
       else
           b -= a; // b = b - a
    return a;
}

int main()
{
    int n;
    cout << "Podaj liczbe naturalna: " << endl;
    cin >> n;
    if(n <= 0) // robimy program "user-proof" - nie chcemy operowac na niepoprawnych danych :)
        cout << "nie podales liczby naturalnej, nie wiem co z tym zrobic :/" << endl;
    else if( czy_pierwsza(n) )
        cout << "Liczba " << n << " jest pierwsza" << endl; // tutaj jedna komenda "pod" if-em, wiec nie musimy uzywac klamerek
    else if( n % 2 == 0 )
    // nie robimy dodatkowego warunku, czy liczba jest rozna od 2 -> sprawdza to warunek if( czy_pierwsza(n) )
    // (2 jest liczba pierwsza, wiec gdy n=2 zostanie wykonane to co pod wspomnianym warunkiem, to co ponizej - nie)
    { // tutaj juz sa trzy komendy "pod" if-em, wiec musimy uzyc klamerek
        int liczba = NWD1024(n); // liczymy najwiekszy wspolny dzielnik
        cout << "Najwiekszy wspolny dzielnik liczb " << n << " i 1024 to: " << liczba << endl;
        cout << "Silnia tej liczby wynosi " << silnia(liczba)<< endl; // liczymy silnie z NWD(n, 1024)
    }
    else
        cout << "Suma wszystkich liczb mniejszych od " << n <<" = " << suma(n) <<endl;

    // no i po kazdym sprawdzonym warunku nie dodawaj exit(0)
    // po co konczyc program, skoro chcemy zobaczyc, co nam wyswietli? :)
    system("PAUSE");
    return 0;
}

(tutaj jest to samo)

komentarz 26 maja 2017 przez OfftheCode Gaduła (4,050 p.)
Dokładnie, wpisałeś dwa polecenia do if'a bez klamer, a w takim przypadku dozwolona jest tylko jedna komenda.
komentarz 26 maja 2017 przez pawlo392 Nowicjusz (130 p.)
Dziękuje. Mam jednak problem z silnią. Jak podam liczbę to pokazuje mi największy wspólny dzielnik 0 i wyłącza program.
–2 głosów
odpowiedź 26 maja 2017 przez littlerunaway Obywatel (1,790 p.)
if (n%2!=0 or n==2)

powinno być || zamiast or
komentarz 26 maja 2017 przez pawlo392 Nowicjusz (130 p.)
To chyba nie to. Zresztą liczenie sumy działa poprawnie.
komentarz 26 maja 2017 przez Arkadiusz Sikorski Pasjonat (20,160 p.)

Dokładnie, standard mówi zarówno o or jak i o ||, a także o innych (link)

–3 głosów
odpowiedź 26 maja 2017 przez Jan Patryk Kowalski Obywatel (1,880 p.)
Czego używasz do kompilowania?
komentarz 26 maja 2017 przez pawlo392 Nowicjusz (130 p.)
Używam Dev-C++. Błąd który się pojawia to : 'else' without a previous 'if'. Niw widzę jednak błędu.
komentarz 26 maja 2017 przez Arkadiusz Sikorski Pasjonat (20,160 p.)
Dev-C++ to IDE, nie kompilator. Swoją drogą, o ile pamiętam, nie jest już rozwijany, więc warto byłoby pomyśleć o czymś innym ;)

Podobne pytania

0 głosów
1 odpowiedź 180 wizyt
0 głosów
0 odpowiedzi 175 wizyt
0 głosów
1 odpowiedź 456 wizyt

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

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

...