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

C++, Program po uruchomieniu zawiesza się i nie wykonuje dalej. Proszę o pomoc.

Ostatnio zmodyfikowano 2012-10-18 10:58
Autor Wiadomość
sparkymen
Temat założony przez niniejszego użytkownika
C++, Program po uruchomieniu zawiesza się i nie wykonuje dalej. Proszę o pomoc.
» 2012-10-17 00:36:25
Witam, pisałem program który wypisuje dzielniki podanej liczby. Kompiluje się, lecz zawiesza się po podaniu kilku dzielników. Wygląda on tak:

C/C++
int main()
{
    int liczba;
    cout << "Podaj liczbe" << endl;
    cin >> liczba;
    int dzielnik; // zmienna przez ktora bedzie dzielona liczba
    bool czyparzysta; // zmienna do sprawdzania czy liczba jest parzysta czy nie do mechanizmu opytmalizacyjnego (nie wiem czy jest takie slowo :s )
   
    if( liczba < 0 ) liczba = liczba *- 1; //zamienia liczbe ujemna na dodatnia (jest to potrzebne bo inaczej warunek w petli nie zadziala)
   
    if( liczba % 2 == 0 && liczba > 2 ) czyparzysta = true; // sprawdza czy liczba jest parzysta czy nie
    else czyparzysta = false;
   
    cout << "Dzielniki liczby " << liczba << " to: ";
    if( liczba != 0 ) cout << "1 "; // kazda liczba dzieli sie przez 1 (procz zera)
   
    if( czyparzysta == true ) // petla dla liczb parzystych - sprawdza wszystkie liczby od 2 do liczby
    {
        dzielnik = 2;
        do
        {
            if( liczba % dzielnik == 0 )
            {
                cout << dzielnik << " ";
                dzielnik++;
            }
        } while( dzielnik < liczba );
       
    }
    if( czyparzysta == false ) // petla dla liczb parzystych - sprawdza wszystkie liczby nieparzyste od 3 do liczby
    {
        dzielnik = 3;
        do
        {
            if( dzielnik % liczba == 0 )
            {
                cout << dzielnik << " ";
                dzielnik = dzielnik + 2;
            }
        } while( dzielnik < liczba );
       
    }
    cout << liczba;
}

Czy ktoś mógłby sprawdzić to u siebie czy też się zawiesza, a najlepiej podać przyczynę? Będę bardzo wdzięczny. Pozdrawiam.
P-66962
OSA_PL
» 2012-10-17 07:54:49
dzielnik++;
 i
dzielnik = dzielnik + 2;
 daj poza if.

Kod daj w
[cpp] ... [/cpp]
P-66969
sparkymen
Temat założony przez niniejszego użytkownika
» 2012-10-17 15:54:38
Okej, zrobię co kazałeś i sprawdzę czy działa.
P-66975
sparkymen
Temat założony przez niniejszego użytkownika
» 2012-10-17 16:06:35
Zrobiłem tak jak kazałeś i owszem nie zawiesza się, ale nie działa dla liczb nieparzystych. Pokazuje tylko że dzielniki liczby to 1 i dana liczba, tak jakby pomijał pętle.

Kod po przerobieniu według Twoich uwag wygląda tak:
C/C++
#include <cstdlib>
#include <iostream>
#include <math.h>

using namespace std;

int main()
{
    int liczba;
    cout << "Podaj liczbe" << endl;
    cin >> liczba;
    int dzielnik; // zmienna przez ktora bedzie dzielona liczba
    bool czyparzysta; // zmienna do sprawdzania czy liczba jest parzysta czy nie do mechanizmu opytmalizacyjnego (nie wiem czy jest takie slowo :s )
   
    if( liczba < 0 ) liczba = liczba *- 1; //zamienia liczbe ujemna na dodatnia (jest to potrzebne bo inaczej warunek w petli nie zadziala)
   
    if( liczba % 2 == 0 && liczba > 2 ) czyparzysta = true; // sprawdza czy liczba jest parzysta czy nie
    else czyparzysta = false;
   
    cout << "Dzielniki liczby " << liczba << " to: ";
    if( liczba != 0 ) cout << "1 "; // kazda liczba dzieli sie przez 1 (procz zera)
   
    if( czyparzysta == true ) // petla dla liczb parzystych - sprawdza wszystkie liczby od 2 do liczby
    {
        dzielnik = 2;
        do
        {
            if( liczba % dzielnik == 0 )
            {
                cout << dzielnik << " ";
            }
            dzielnik++;
        } while( dzielnik < liczba );
       
    }
    if( czyparzysta == false ) // petla dla liczb parzystych - sprawdza wszystkie liczby nieparzyste od 3 do liczby
    {
        dzielnik = 3;
        do
        {
            if( dzielnik % liczba == 0 )
            {
                cout << dzielnik << " ";
            }
            dzielnik = dzielnik + 2;
        } while( dzielnik < liczba );
       
    }
    cout << liczba << endl;
   
    system( "PAUSE" );
    return EXIT_SUCCESS;
}
P-66976
OSA_PL
» 2012-10-17 17:06:35
Popatrz sobie na warunek w if'ie dla liczb nieparzystych.
P-66982
crash
» 2012-10-17 18:29:31
Mała sugestia. Jeśli szukasz dzielników liczby X, to nie ma sensu jechać z pętlą aż do liczby X - wystarczy do X/2. Dzieląc X przez liczbę z przedziału 1..X/2 można otrzymać liczbę całkowitą mogącą być dzielnikiem, natomiast z przedziału od połowy aż do X tylko i wyłącznie ułamki z przedziału 1..2, malejąco
P-66984
sparkymen
Temat założony przez niniejszego użytkownika
» 2012-10-17 21:32:56
Okej dzięki, wszystko działa. Dziękuję również za sugestie że wystarczy sprawdzać do x/2 :).
P-66995
sparkymen
Temat założony przez niniejszego użytkownika
» 2012-10-17 21:37:52
Napisałem kolejny program i znowu się zapętla...

C/C++
#include <cstdlib>
#include <iostream>
#include <math.h>

using namespace std;

int main()
{
    int liczba;
    cin >> liczba;
    int dzielnik; // liczba przez ktora bedziemy dzielic i sprawdzac reszte
    dzielnik = 2; // podstawiamy od razu 2 bo to najmniejsza liczba od ktorej musimy sprawdzac
    cout << "Czynniki pierwsze tej liczby to: " << endl;
   
    do
    {
        if( liczba % dzielnik == 0 )
        {
            liczba = liczba / dzielnik;
            cout << dzielnik;
            dzielnik = 3;
        }
        else while( liczba % dzielnik != 0 )
        {
            if( liczba % dzielnik == 0 )
            {
                liczba = liczba / dzielnik;
                cout << dzielnik;
            }
            else dzielnik = dzielnik + 2;
           
        }
        dzielnik = 2;
    } while( liczba != 0 );
   
    system( "PAUSE" );
    return EXIT_SUCCESS;
}
P-66997
« 1 » 2
  Strona 1 z 2 Następna strona