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

Nie trzymająca pętla

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?
0

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

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));

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?)

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;
} 
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.

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ą

0

Wielkie dzieki, nareszcie dziala tak jak chce.

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;
} 

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