Wątek przeniesiony 2015-05-27 14:44 z C/C++ przez ŁF.

Nie trzymająca pętla

Yardi
2015-05-26 18:45
Yardi
0

Witam.
Mam problem z pętlą, która wypuszcza. Wygląda ona tak
{
cin>>x1;
if ((x1>ile_w) || (x1<1)) cout<<"BLEDNA KRAWEDZ"<<endl;
} while ((1<=x1) && (x1<=ile_w));


Jest to fragment programu liczący cykle eulera. x1 jest jednym z końców krawędzi (np. gdy jest 5 wierzchołków może być wprowadzona liczba od 1 do 5). Niestety nie ogranicza ona tego warunku i wychodzi nawet jak wpisze np 6, co prowadzi do wysypania programu, co w takim wypadku moge zrobic?

Pozostało 580 znaków

sig
2015-05-26 18:51
sig

Rejestracja: 8 lat temu

Ostatnio: 7 godzin temu

0

Dopisz do na początku tego fragmentu (jeszcze przed {) i będzie dobrze.

Wpisz to do w apostrofy czy coś, bo ciężko przeczytać, o co chodzi :P - Patryk27 2015-05-26 19:02

Pozostało 580 znaków

Yardi
2015-05-26 19:51
Yardi
0

Ale to świetnie skopiowałem. Kod jest z do i wyglada tak:
do
{
cin>>x1;
if ((x1>ile_w) || (x1<1)) cout<<"BLEDNA KRAWEDZ"<<endl;
} while ((1<=x1) && (x1<=ile_w));

Pozostało 580 znaków

sig
2015-05-26 20:04
sig

Rejestracja: 8 lat temu

Ostatnio: 7 godzin temu

0
#include <iostream>

using namespace std;

int *tablica= NULL;
int suma, ilosc, ile;

int main()
{
    int x1 = 0;
    int ile_w = 6;
 do
            {
                cin>>x1;
                if ((x1>ile_w) || (x1<1)) cout<<"BLEDNA KRAWEDZ"<<endl;
            }    while ((1<=x1) && (x1<=ile_w));
    return 0;
}

U mnie ten kod kończy się grzecznie (i nawet komunikat wyświetli) jak wpiszę więcej niż 6, pewnie błąd leży gdzie indziej (złą wartość w ile_w?)

Pozostało 580 znaków

Yardi
2015-05-26 20:52
Yardi
0

Dobrze, zamieszczam więc cały kod:

#include <iostream>
#include <conio.h>

using namespace std;

/*  ZMIENNE GLOBALNE    */

int ile_w, ile_k, sptr, ex;
int ** A;                                                                                   //MACIERZ SĄSIEDZCTWA
int *S;                                                                                     //STOS W TABLICY

void Euler (int x)
{
    int i;

    for(i=1; i<ile_w+1; i++)                                                                    //SPRAWDZENIE SĄSIADÓW
        while(A[x][i])
        {
            A[x][i]--;                                                                      //USUWANIE KRAWĘDZI
            A[i][x]--;
            Euler(i);                                                                       //REKURENCJA
        }
    S[sptr++]=x;
}

int main()
{
    int i,j,x1,x2;
    cout<<"PODAJ LICZBE WIERZCHOLKOW W GRAFIE"<<endl;                                       // CZYTAMY LICZBĘ WIERZCHOŁKÓW
    cin>>ile_w;
    cout<<"PODAJ LICZBE KRAWEDZI W GRAFIE"<<endl;                                           // CZYTAMY LICZBĘ KRAWĘDZI
    cin>>ile_k;

    A = new int * [ile_w];                                                                  //TWORZYMY TABLICĘ WSKAŹNIKÓW
    S = new int [ile_k+1];                                                                  //TWORZYMY STOS
    sptr=1;

    for(i=1;i<ile_w+1;i++)
        A[i]=new int [ile_w];                                                               //TWORZYMY WIERSZE MACIERZY SĄSIEDZCTWA

    for(i=1;i<ile_w+1;i++)
        for(j=1;j<ile_w+1;j++) A[i][j]=0;                                                   //MACIERZ WYPEŁNIAMY ZERAMI

/*  ODCZYT KOLEJNYCH DEFINICJI KRAWĘDZI */

    for(i=1; i<ile_k+1;i++)
        {
            cout<<"PODAJ PIERWSZY WIERZCHOLEK KRAWEDZI NUMER "<<i<<endl;                    //PIERWSZY WIERZCHOLEK KRAWEDZI
            cout<<"DOSTEPNE WIERZCHOLKI OD 1 DO "<<ile_w<<"."<<endl;
            do
            {
                cin>>x1;
                if ((x1>ile_w) || (x1<1)) cout<<"BLEDNA KRAWEDZ"<<endl;
            }    while ((1<=x1) && (x1<=ile_w));
            cout<<"PODAJ DRUGI WIERZCHOLEK KRAWEDZI NUMER "<<i<<"."<<endl;                  //DRUGI WIERZCHOŁEK KRAWĘDZI
            cout<<"DOSTEPNE WIERZCHOLKI OD 1 DO "<<ile_w<<"."<<endl;
            cin>>x2;
            A[x1][x2]++;                                                                    //WYPEŁNIANIE MACIERZY SĄSIEDZCTWA
            A[x2][x1]++;
        }
/* WYZNACZENIE CYKLU EULERA */

    Euler(1);

    cout<<"CYKL EULERA"<<endl;

/* WYPISANIE ZAWARTOŚCI STOSU */

    for(i=1;i<sptr; i++) cout <<S[i]<<" "<<endl;

/* USUNIĘCIE TABLIC DYNAMICZNYCH */

    for(i = 1; i < ile_w+1; i++) delete [] A[i];

    delete [] A;
    delete [] S;

    cout<<endl<<"Wcisnij dowolny klawisz by zakonczyc program."<<endl;
    getch();

    return 0;
} 

Pozostało 580 znaków

Yardi
2015-05-26 21:19
Yardi
0

A czy jak wpiszesz np 7 to musisz wpisac krawedz ponownie czy program sie konczy, bo u mnie po wklejeniu twojego malego programu z moja petla niestety program sie konczy.

Pozostało 580 znaków

sig
2015-05-26 21:44
sig

Rejestracja: 8 lat temu

Ostatnio: 7 godzin temu

0

Jak ma pytać do skutku to coś takiego będzie, a nie twój kod

#include <iostream>

using namespace std;

int main()
{
    int x1 = 8;
    int ile_w = 6;
    cin >> x1;
    while ((1>x1) || (x1> ile_w))
    {
        cout << "krawędź poza zakresem, podaj właściwą" << endl;
        cin >> x1;
    }
    cout << "ok, krawędź właściwa";
    return 0;
}

Zakładając naturalnie że jedynka jest właściwą krawędzią

Pozostało 580 znaków

Yardi
2015-05-27 09:54
Yardi
0

Wielkie dzieki, nareszcie dziala tak jak chce.

Pozostało 580 znaków

Yardi
2015-05-27 10:05
Yardi
0

Kolejny problem ... mianowicie program wysypuje się, gdy podam ilość krawędzi większą niż 4 (dla 5 i 6 się zwykły exe przestał działać).
Osobiście nie wiem sam nawet jak sprawdzać co jest nie tak przy takim błędzie, więc wysyłam kod:

#include <iostream>
#include <conio.h>

using namespace std;

/*  ZMIENNE GLOBALNE    */

int ile_w, ile_k, sptr, ex;
int ** A;                                                                                   //MACIERZ SĄSIEDZCTWA
int *S;                                                                                     //STOS W TABLICY

void Euler (int x)
{
    int i;

    for(i=1; i<ile_w+1; i++)                                                                    //SPRAWDZENIE SĄSIADÓW
        while(A[x][i])
        {
            A[x][i]--;                                                                      //USUWANIE KRAWĘDZI
            A[i][x]--;
            Euler(i);                                                                       //REKURENCJA
        }
    S[sptr++]=x;
}

int main()
{
    int i,j,x1,x2;
    cout<<"PODAJ LICZBE WIERZCHOLKOW W GRAFIE"<<endl;                                       // CZYTAMY LICZBĘ WIERZCHOŁKÓW
    cin>>ile_w;
    cout<<"PODAJ LICZBE KRAWEDZI W GRAFIE"<<endl;                                           // CZYTAMY LICZBĘ KRAWĘDZI
    cin>>ile_k;

    A = new int * [ile_w];                                                                  //TWORZYMY TABLICĘ WSKAŹNIKÓW
    S = new int [ile_k+1];                                                                  //TWORZYMY STOS
    sptr=1;

    for(i=1;i<ile_w+1;i++)
        A[i]=new int [ile_w];                                                               //TWORZYMY WIERSZE MACIERZY SĄSIEDZCTWA

    for(i=1;i<ile_w+1;i++)
        for(j=1;j<ile_w+1;j++) A[i][j]=0;                                                   //MACIERZ WYPEŁNIAMY ZERAMI

/*  ODCZYT KOLEJNYCH DEFINICJI KRAWĘDZI */

    for(i=1; i<ile_k+1;i++)
        {
            cout<<"PODAJ PIERWSZY WIERZCHOLEK KRAWEDZI NUMER "<<i<<endl;                    //PIERWSZY WIERZCHOLEK KRAWEDZI
            cout<<"DOSTEPNE WIERZCHOLKI OD 1 DO "<<ile_w<<"."<<endl;
            cin >> x1;
            while ((1>x1) || (x1> ile_w))
            {
                cout << "BLEDNA KRAWEDZ" << endl;
                cin >> x1;
            }
            cout << "KRAWEDZ PRAWIDLOWA" << endl;
            cout<<"PODAJ DRUGI WIERZCHOLEK KRAWEDZI NUMER "<<i<<"."<<endl;                  //DRUGI WIERZCHOŁEK KRAWĘDZI
            cout<<"DOSTEPNE WIERZCHOLKI OD 1 DO "<<ile_w<<"."<<endl;
            cin >> x2;
            while ((1>x2) || (x2> ile_w))
            {
                cout << "BLEDNA KRAWEDZ" << endl;
                cin >> x2;
            }
            A[x1][x2]++;                                                                    //WYPEŁNIANIE MACIERZY SĄSIEDZCTWA
            A[x2][x1]++;
        }
/* WYZNACZENIE CYKLU EULERA */

    Euler(1);

    cout<<"CYKL EULERA"<<endl;

/* WYPISANIE ZAWARTOŚCI STOSU */

    for(i=1;i<sptr; i++) cout <<S[i]<<" "<<endl;

/* USUNIĘCIE TABLIC DYNAMICZNYCH */

    for(i = 1; i < ile_w+1; i++) delete [] A[i];

    delete [] A;
    delete [] S;

    cout<<endl<<"Wcisnij dowolny klawisz by zakonczyc program."<<endl;
    getch();

    return 0;
} 
To samo w przypadku podania większej ilości wierzchołków. - yardi1993 2015-05-27 10:07

Pozostało 580 znaków

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