C++ klasa I liceum - błąd w programie

0

Czy potraficie wyznaczyć błąd w tym programie?

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

using namespace std;

int n;

void witaj()
{
     cout << "Witaj uzytkowniku!" << endl;
}

void dzielniki(int n)
{
        int i;
        cout << "1, ";
        for(i=2; i<=n/2; i++);
        {
              if(n%i==0)
              cout << i << ", ";
        }
        cout << n << endl;
}
 
bool doskonala(int n)
{
        int suma=1;
        for(int i=2; i<=n/2; i++)
        {
                if(n%i==0)
                suma+=i;
        }
        if((suma==n)&&(n!=1))
        return true;
        return false;
}
 
bool palindromiczna(int n)
{
        int cyfra, liczba=n, nowa=0;
        while(n>0)
        {
                cyfra=n%10;
                nowa=10*nowa+cyfra;
                n/=10;
        }
        if(nowa==liczba)
        return true;
        return false;
}
 
bool pierwsza(int n)
{
        bool odp=true;
        if(n==1)
        return false;
        if((n%2==0)&&(n!=2))
        return false;
        int dzielnik=3;
        while((odp=true)&&(dzielnik<=sqrt((float)n)));
        {
                if(n%dzielnik==0)
                return false;
                else dzielnik+=2;
        }
        return true;
}
 
void czynniki(int n)
{
        while(n%2==0)
        {
                cout << "2, ";
                n/=2;
        }
        int czynnik=3;
        while(n>1)
        {
                while(n%czynnik==0)
                {
                        cout << czynnik << " ";
                        n/=czynnik;
                }
                czynnik=czynnik+2;
        }
}

 void menu ()
 { 			
      int x;     
      while (x!=6)
      {
       cout<<"Uzytkowniku, wybierz program, ktorego chcesz uzyc:"<<endl;
       cout<<"1. Dzielniki liczby."<<endl;
       cout<<"2. Czy liczba jest doskonala?"<<endl;
       cout<<"3. Czy liczba jest palindromiczna?"<<endl;
       cout<<"4. Czy liczba jest pierwsza?"<<endl;
       cout<<"5. Rozklad na czynniki pierwsze."<<endl;
       cout<<"6. Exit."<<endl;
      cin>>x;
	
   if (x==1) dzielniki (n);
   if (x==2) doskonala (n);
   if (x==3) palindromiczna (n);
   if (x==4) pierwsza (n);
   if (x==5) czynniki (n);
   cout<<endl;
}

}


void zegnaj()
{
     cout << "Zegnaj, uzytkowniku!" <<endl;
}

int main(int argc, char *argv[])
{
    witaj();

    cout << "Wpisz liczbe naturalna: " <<endl;
    cin >> n;
    menu ();
    zegnaj();
    
    cin.sync();
    cin.get();
    return 0;
    
    system("PAUSE");
    return EXIT_SUCCESS;

}
0

W sensie, że to zagadka dla nas? Przykro mi, ale jestem zbyt leniwy, żeby skopiować kod do Visual Studio, a co dopiero go całego przeczytać.

0

Nie, nie :) Trochę źle się wyraziłam. Muszę zrobić program na lekcje i zrobiłam, ale przy kompilowaniu, w niektórych przypadkach, gdy wpisuję nr programu nic się nie pokazuje.

0
        if(nowa==liczba)
        return true;
        return false;

Nie brakuje tutaj else?

0

W których przypadkach? Zupełnie losowych?

Radzę popracować nad poprawnym formatowaniem kodu, coś takiego

        if(nowa==liczba)
        return true;
        return false;

woła o pomstę do nieba.

0

Tu wszystko się sypie. Weź debugger w łapkę i przejdź przez to jak się wykonuje twój kod. Zobaczysz błędy.

0
  
    cin.sync();
    cin.get();
    return 0;
 
    //zbędne, wyrzuć.
    //system("PAUSE");
    //return EXIT_SUCCESS;

Zamiast globalnej zmiennej n możesz przesyłać ją do funkcji menu(), a stamtąd do "podprogramów".

   if (x==1) dzielniki (n);
   if (x==2) doskonala (n);
   if (x==3) palindromiczna (n);
   if (x==4) pierwsza (n);
   if (x==5) czynniki (n);

Jest taka konstrukcja jak switch(), albo można zapisać jako:

   if (x==1) dzielniki (n);
   else if (x==2) doskonala (n);
   else if (x==3) palindromiczna (n);
   else if (x==4) pierwsza (n);
   else if (x==5) czynniki (n);

Podaj przypadki, dla których nie działa.

0

W przypadkach: 2,3,4
Wiem, że nie jest zbyt spójne. Niestety, pracowało nad tym mnóstwo osób, bo raczej sama się uczę (pani profesor nie potrafi uczyć) i wielu rzeczy jeszcze nie potrafię.

0
Jadeszek napisał(a)

Zamiast globalnej zmiennej n możesz przesyłać ją do funkcji menu(), a stamtąd do "podprogramów".

Mam narzucone użycie globalnej zmiennej n.

0

Poproś na gwiazdkę http://allegro.pl/symfonia-c-standard-2-tomy-grebosz-miekka-i1963594205.html, sprawdź http://pl.wikibooks.org/wiki/C%2B%2B (and http://en.wikibooks.org/wiki/C%2B%2B_Programming) lub umieść zdjęcie (o ile legal to use) to pewnie znajdzie się ktoś chętny do pomocy.

0
winerfresh napisał(a)

Poproś na gwiazdkę http://allegro.pl/symfonia-c-standard-2-tomy-grebosz-miekka-i1963594205.html, sprawdź http://pl.wikibooks.org/wiki/C%2B%2B (and http://en.wikibooks.org/wiki/C%2B%2B_Programming) lub umieść zdjęcie (o ile legal to use) to pewnie znajdzie się ktoś chętny do pomocy.

Dzięki, przyda się :)

0
#include <cstdlib>
#include <iostream>
#include <math.h> // powinno być cmath

using namespace std;

int n; // lepiej zrezygnować ze zmiennej globalnej i użyć argumentu w funkcji

void witaj() // tego typu jednolinijkowe funkcje tylko zaciemniają kod
{
     cout << "Witaj uzytkowniku!" << endl;
}

void dzielniki(int n)
{
        int i;
        cout << "1, ";
        for(i=2; i<=n/2; i++); // warunek powinien być: <
        {
              if(n%i==0)
              cout << i << ", ";
        }
        cout << n << endl;
}
 
bool doskonala(int n)
{
        int suma=1;
        for(int i=2; i<=n/2; i++)
        {
                if(n%i==0)
                suma+=i;
        }
        if((suma==n)&&(n!=1)) // za dużo tych nawiasów, spójrzcie na tabelkę z priorytetami operatorów. poza tym, co tak naprawdę jest "wartością" tego warunku? prawda albo fałsz. więc można zrobić "return suma == n && n != 1"
        return true;
        return false;
}
 
bool palindromiczna(int n)
{
        int cyfra, liczba=n, nowa=0;
        while(n>0)
        {
                cyfra=n%10;
                nowa=10*nowa+cyfra;
                n/=10;
        }
        if(nowa==liczba)
        return true;
        return false;
}
 
bool pierwsza(int n)
{
        bool odp=true;
        if(n==1)
        return false;
        if((n%2==0)&&(n!=2))
        return false;
        int dzielnik=3;
        while((odp=true)&&(dzielnik<=sqrt((float)n))); // na pewno w tym pierwszym warunku powinno być przypisanie, a nie porównanie? po za tym, porównywanie boola do stałej to trochę przesada, odp == true, to to samo co napisanie po prostu odp (to chyba logiczne, że odp jest prawdą, gdy jest prawdą?)
        {
                if(n%dzielnik==0)
                return false;
                else dzielnik+=2;
        }
        return true;
}
 
void czynniki(int n)
{
        while(n%2==0)
        {
                cout << "2, ";
                n/=2;
        }
        int czynnik=3;
        while(n>1)
        {
                while(n%czynnik==0)
                {
                        cout << czynnik << " ";
                        n/=czynnik;
                }
                czynnik=czynnik+2;
        }
}

 void menu ()
 { 			
      int x;     
      while (x!=6) // niezdefiniowany x. tutaj powinna być pętla do while
      {
       cout<<"Uzytkowniku, wybierz program, ktorego chcesz uzyc:"<<endl;
       cout<<"1. Dzielniki liczby."<<endl;
       cout<<"2. Czy liczba jest doskonala?"<<endl;
       cout<<"3. Czy liczba jest palindromiczna?"<<endl;
       cout<<"4. Czy liczba jest pierwsza?"<<endl;
       cout<<"5. Rozklad na czynniki pierwsze."<<endl;
       cout<<"6. Exit."<<endl;
      cin>>x;
	
   if (x==1) dzielniki (n);
   if (x==2) doskonala (n);
   if (x==3) palindromiczna (n);
   if (x==4) pierwsza (n);
   if (x==5) czynniki (n);
   cout<<endl;
}

}


void zegnaj()
{
     cout << "Zegnaj, uzytkowniku!" <<endl;
}

int main(int argc, char *argv[])
{
    witaj();

    cout << "Wpisz liczbe naturalna: " <<endl;
    cin >> n;
    menu ();
    zegnaj();
    
    cin.sync();
    cin.get();
    return 0;
    
    system("PAUSE"); // ten kod się nie wykona
    return EXIT_SUCCESS;

}

</quote>
0

Ale dalej nie wykonuje się program 2,3,4...

Dobra, edytuję, nie spamuję :)
Oto co się dzieje:
http://i43.tinypic.com/20a5o5h.png
Jak widać, także z dzielnikami jest coś nie tak :/

0

Zauważ, że Twoje funkcje nic nie drukują na ekran. Tylko sprawdzasz czy liczba jest czymśtam, ale nic z tą wiadomością nie robisz.

0
  if (x==2){
      if(doskonala(n)) cout << "jest doskonała\n";
      else cout << "nie jest doskonała\n";}

I analogicznie dla reszty.

Albo w funkcjach zamiast mieć typ bool i zwracać true/false, daj void i po prostu wypisuj co trzeba, tam gdzie teraz masz return

 
if(nowa==liczba)
        cout << "liczba jest czymśtam\n";
else
        cout << "liczba nie jest czymśtam\n";
0

Witam, ja też mam problem, gdyż niezbyt uczę się angielskiego od strony informatycznej. Robię podstawy C++, wcześniej zajmowałem się czym innym. Co tu zmienić żeby kompilacja była poprawna w Devie 4.9.9.2:

  1. include<iostream.h>
  2. inlcude<stdio.h>
  3. inlcude<conio.h>
    main()
    {
    cout <<"Witaj w C++";

getch();
}

0

EvStellciak, usuń średnik po pętli for w dzielnikach.

Zagajnik, I - załóż własny temat, II - oszczędź siebie i forumowiczów i zmień środowisko na Code::Blocks,III - absolutnie wszystko trzeba zmienić, IV - znaczniki <code> są po to by z nich korzystać.

#include<iostream>
using namespace std;
int main()
{
    cout << "Witaj w C++";
    cin.sync();
    cin.get();
    return 0; 

}
0

Po pierwsze funkcje:

void zegnaj()
{
     cout << "Zegnaj, uzytkowniku!" <<endl;
}
void Witaj()
{
     cout << "Witaj uzytkowniku!" << endl;
}

Są bez sensu. Napisz po prostu

cout << "Witaj uzytkowniku" << endl;

oraz

cout << "Zegan uzytkowniku" << endl;

Po drugie:
Zmienne globalne nie są przykładem dobrego stylu. Owszem da się to zrobić tak aby działało, ale zajmiemy się zmiennymi lokalnymi. Czyli wyrzucamy deklarację zmiennej n z początku programu i deklarujemy ją w main(), a n przekazujemy przez parametr, co daję nam taką postać main:

int n;
cout << "Wpisz liczbe naturalna: " <<endl;
cin >> n;
menu(n);

Czyli w main pozostaję tylko wywołanie funkcji menu()

void menu (int n)
{
    int x;
    while (x!=6)
    {
        cout<<"Uzytkowniku, wybierz program, ktorego chcesz uzyc:"<<endl;
        cout<<"1. Dzielniki liczby."<<endl;
        cout<<"2. Czy liczba jest doskonala?"<<endl;
        cout<<"3. Czy liczba jest palindromiczna?"<<endl;
        cout<<"4. Czy liczba jest pierwsza?"<<endl;
        cout<<"5. Rozklad na czynniki pierwsze."<<endl;
        cout<<"6. Exit."<<endl;
        cin>>x;

        if (x==1) 
            dzielniki (n);
        if (x==2) 
            doskonala (n);
        if (x==3)
            palindromiczna (n);
        if (x==4)
            pierwsza (n);
        if (x==5) 
            czynniki (n);
        cout<<endl;
    }
}

Które właściwie wygląda nie najgorzej, więc zostanie prawie nienaruszone, chociaż wczytywanie n przeniósł bym właśnie tutaj.

Rozważmy teraz po kolei każdą funkcję
Funkcja Dzielniki:
zmienną i możesz deklarować w locie

for(int i = 2; i<= (n/2); i++)

i nie możesz na końcu pętli dać tego średnika, bo nie wykona ona tego, co powinna.
Prawidłowy wygląd funkcji:

void dzielniki(int n)
{
    cout << "1, ";
    for(int i = 2; i<= (n/2); i++)
          if(n % i == 0)
            cout << i << ", ";
    cout << n << endl;
}

Następna funkcja:

bool doskonala(int n)
{
        int suma = 1;
        for(int i=2; i<=n/2; i++)
        {
            if(n%i==0)
                suma += i;
        }
        if( (suma==n) && (n!=1) )
            return true;
        return false;
}

zauważ, że w tej funkcji zwracasz wartość typu bool. W takim wypadku albo musisz zmienić funkcję Menu i na podstawie zwracanej wartości wypisywać:

if( doskonala(n) == true)
    cout << "TAK";
else
 cout << "NIE";

Lub robić to bezpośrednio w funkcji:

bool doskonala(int n)
{
        int suma = 1;
        for(int i=2; i<=n/2; i++)
        {
            if(n%i==0)
                suma += i;
        }
        if( (suma==n) && (n!=1) ){
            cout << "Liczba doskonala\n";
            return true;
        }
        cout << "Ta liczba nie jest doskonala\n";
        return false;
}

Chociaż, jeżeli wypisujesz informację o tym jaka jest ta funkcja, to raczej nie musisz zwracać wartości.
W reszcie funkcji chyba są te same błędy, więc popraw je samodzielnie, ładnie sformatuj kod i wstaw go tutaj, a jak będą błędy, to zobaczymy w czym problem.

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