c++ Przeglądanie dwuwymiarowej tablicy obiektów

0

Witam posiadam dosyć zapewne prosty problem. Mam napisac program symulujący chorobę Liszaja. Tzn na dwuwymiarowej tablicy mam obiekty z których środkowy jest zarażony i ma on infekować sąsiednie pola co jeden cykl. Mam funkcję składową pobierającą tę tablicę obiektów i przyjąłem że zarazony obiekt bedzie co jeden cykl infekował jeden dolny obiekt na jeden cykl, niestety infekuje mi całą linijkę obiektów w dół i na boki też jakoś tak w ogole nie stabilnie. I nie wiem w czym lezy ten problem już probowałem na wszelkie sposoby. Problem lezy w funkcji nastepny chociaż niekoniecznie.

klasa.cpp

#include <iostream>
#include "klasa.h"

using namespace std;

void Cliszaj::ustaw_xy(int n,int m)	// ustawia wspolrzedne i domyslny stan 1 - zdrowy
{
	x=n;
	y=m;
	stan=1;
	przebieg=1;
}
void Cliszaj::wypisz_xy()		//wypisuje tablice
{
	
	if(stan==1)
	cout<<"+";
		else if(stan>1 || stan<8)
			cout<<"-";
		else
			cout<<"0";
}
void Cliszaj::zacznij()// zaraza pole srodkowe stan 2-7
{
	stan=2;		
}
void Cliszaj::zaraz()
{
	if(przebieg!=2)
	stan=2;
	przebieg=2;
}
void Cliszaj::nastepny(Cliszaj **wsk,int n)
{
	for(int i=1;i<n-1;i++)
	{
		for(int j=1;j<n-1;j++)
		{
			if((wsk[i][j].stan>1)&&(wsk[i][j].stan<8)) 
				if(wsk[i+1][j].przebieg==1)
				{
				wsk[i+1][j].zaraz();
				}
		}
	}
} 

main.cpp

#include <iostream>
#include "klasa.h"
#include <ctime>

using namespace std;

void czekaj( int iMilisekundy );

void main()
{ 
	int n,x;		//n rozmiar macierzy, x jednostka czasu
	cout<<"Podaj szerokosc tablicy"<<endl;
	Cliszaj **Pwsk;
	cin>>n;
	Cliszaj **tab = new Cliszaj *[n];	//dynamiczna tablica tablic obiektow
	Pwsk=tab;
	cout<<"Podaj przedzial czasowy"<<endl;
	cin>>x;
	system( "cls" );
	for (int i = 0; i < n; ++i )
	tab[i] = new Cliszaj[n];
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			tab[i][j].ustaw_xy(i,j);
		}
	}
	tab[n/2][n/2].zacznij();
	while(true)
	{
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
				tab[i][j].wypisz_xy();
			}
			cout<<endl<<endl;
		}
		tab[0][0].nastepny(Pwsk,n);
		czekaj(x*1000);
		system( "cls" );
	}
cin>>n;
}


void czekaj( int iMilisekundy )		//zegar
{
	clock_t koniec = clock() + iMilisekundy * CLOCKS_PER_SEC / 1000.0;
	while( clock() < koniec ) continue;
} 
3

Potrzebujesz trzech stanów:

  1. zdrowy
  2. zainfekowany - w następnym cyklu stanie się chorym i dopiero wtedy może zarażać.
  3. chory
    W twoim przypadku ostatnie dwa stany są tożsame, więc zaraża nawet ten który został zainfekowany w tym samym cyklu.
0

Tam istnieje zmienna przebieg ktora miala przechowywac wartość 1 jeśli byly wykonywane dzialania na obiekcie tak by ich nie powtarzać a problem dalej wystepuje :(

0

Ja ci mówię że w twoim kodzie zarażony zaczyna zarażać natychmiast a ty dajesz kontrargument że masz mechanizm który pilnuje nie zarażanie się ponownie?

0

Sugeruję tylko że myślałem o czymś takim, próbowałem tak jak mówisz zamiast zmiennej przebieg uwzględnic zmienna stan dla której wartość 0 oznacza zdrowy 1-zainfekowany 2-chory niestety nijak to niedziala. Mógłbyś napisać jak by ta funkcja mogła wyglądać dopiero się uczę i przydałby mi sie jakiś podgląd. Wczoraj z tym do 3 wnocy siedzialem i dzis od rana bezskutecznie widać robie to całkiem źle.

0

Pokaż ten kod który "... niestety nijak to niedziala ..."

0

na tym podejsciu nr.9999 zarazony zostaje tylko nastepny element.

klasa.cpp

#include <iostream>
#include "klasa.h"

using namespace std;

void Cliszaj::ustaw_xy(int n,int m)	// ustawia wspolrzedne i domyslny stan 1 - zdrowy
{
	x=n;
	y=m;
	stan=0;	//stan 0 zdrowy 1 zainfekowany 2 chory 

}
void Cliszaj::wypisz_xy()		//wypisuje tablice
{
	
	if(stan==0)
	cout<<"+";//zdrowy
		else if(stan==1)
			cout<<"-";//zainfekowany 
		else if(stan>1)
			cout<<"0";//chory
}
void Cliszaj::zacznij()
{
	stan=2;//chory
}
void Cliszaj::zaraz()
{
	
}
void Cliszaj::nastepny(Cliszaj **wsk,int n)
{
	for(int i=1;i<n-1;i++)
	{
		for(int j=1;j<n-1;j++)
		{
			if((wsk[i][j].stan>1)&&(wsk[i][++j].stan<1))
				wsk[i][j].stan=1;
			
			
		}
	}
}
void Cliszaj::ustaw_stan(Cliszaj **wsk,int n)
{
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(wsk[i][j].stan==1)
				wsk[i][j].stan=2;		
		}
	}
}

main.cpp

 #include <iostream>
#include "klasa.h"
#include <ctime>

using namespace std;

void czekaj( int iMilisekundy );

void main()
{ 
	int n,x;		//n rozmiar macierzy, x jednostka czasu
	cout<<"Podaj szerokosc tablicy"<<endl;
	Cliszaj **Pwsk;
	cin>>n;
	Cliszaj **tab = new Cliszaj *[n];	//dynamiczna tablica tablic obiektow
	Pwsk=tab;
	cout<<"Podaj przedzial czasowy"<<endl;
	cin>>x;
	system( "cls" );
	for (int i = 0; i < n; ++i )
	tab[i] = new Cliszaj[n];
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			tab[i][j].ustaw_xy(i,j);
		}
	}
	tab[n/2][n/2].zacznij();
	while(true)
	{
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
				tab[i][j].wypisz_xy();
			}
			cout<<endl<<endl;
		}
		tab[0][0].nastepny(Pwsk,n);
		tab[0][0].ustaw_stan(Pwsk,n);
		czekaj(x*1000);
		system( "cls" );
	}
cin>>n;
}


void czekaj( int iMilisekundy )		//zegar
{
	clock_t koniec = clock() + iMilisekundy * CLOCKS_PER_SEC / 1000.0;
	while( clock() < koniec ) continue;
}
0

Co wg ciebie robi ten wiersz?
if((wsk[i][j].stan>1)&&(wsk[i][++j].stan<1)) ?

Tak sobie pomyślałem wywal w cholerę to co piszesz i zamień tym:

#include <cmath>
#include <iostream>
#include <windows.h>
using namespace std;

int main()
  {
   int n,tm,y,x,p,v,s,S;
   cout<<"Podaj szerokosc tablicy: ";
   cin>>n;
   cout<<"Podaj przedzial czasowy: ";
   cin>>tm;
   for(tm*=1000,p=n>>1,S=(p<<1)+1,s=0;s<S;++s,Sleep(tm))
     {
      COORD cls={0,0};
      SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cls);
      for(y=0;y<n;++y,cout<<endl) for(x=0;x<n;cout<<("+-0"[(v>0)+(v>=0)]),++x) v=s-abs(y-p)-abs(x-p);
     }
   return 0;
  }
0

if((wsk[i][j].stan>1)&&(wsk[i][++j].stan<1)) ?

sprawdza czy dany obiekt w tablicy[i][j] jest zarazony i czy obiekt po jego lewej stronie nie jest zainfekowany. Jeśli tak to w nastepnej linijce infekuje obiekt po jego lewej stronie.

co do Twojego kodu to niestety ale jest to projekt na studia i musze go wykonać z jak największą ilością różnych działań na obiektach :(.

0

Już sobie poradziłem stosując się do drugiego postu. problem był gdy pisałem właśnie to co wyzej

 if((wsk[i][j].stan>1)&&(wsk[i][++j].stan<1)) ?

zrobiłem to w trochę inny lepiej wyglądający sposób

if(wsk[i][j].stan==2)
			{
				int k=j+1;
				if(wsk[i][k].stan==0)
				wsk[i][k].stan=1;
0

Odpaliłeś sobie kod który podałem?

0

Tak odpaliłem dokładnie o takie coś mi chodziło. Ale jak pisałem program ma być wykonany objektowo i będe wypytywany co jak dziala.

w tym kodzie juz jestem bardzo blisko celu tylko środkowy element mi się resetuje i ponownie zaraza ale to juz dam rade
klasa.cpp

 #include <iostream>
#include "klasa.h"

using namespace std;

void Cliszaj::ustaw_xy(int n,int m)	// ustawia wspolrzedne i domyslny stan 1 - zdrowy
{
	x=n;
	y=m;
	stan=0;	
}
void Cliszaj::wypisz_xy()		//wypisuje tablice
{
	
	if(stan==0)
	cout<<"+  ";//zdrowy
		else if((stan>0)&&(stan<7))
			cout<<"-  ";//zarazony 
		else if((stan>6)&&(stan<11))
			cout<<"0  ";//odporny
}
void Cliszaj::zacznij()
{
	stan=1;//chory
}
void Cliszaj::jeden(Cliszaj **wsk, int n)
{
	for(int i=1;i<n-1;i++)
	{
		for(int j=1;j<n-1;j++)
		{
			if((wsk[i][j].stan>1)&&(wsk[i][j].stan<8))
			{
				int l;
				int k=i-1;
				if(wsk[k][k].stan==0)
					wsk[k][k].stan=1; 
					k=i-1;
				if(wsk[k][j].stan==0)
					wsk[k][j].stan=1;
					k=i-1;
					l=j+1;
				if(wsk[k][l].stan==0)
					wsk[k][l].stan=1;
					l=j-1;
				if(wsk[i][l].stan==0)
					wsk[i][l].stan=1;
					l=j+1;
				if(wsk[i][l].stan==0)
					wsk[i][l].stan=1;
					k=i+1;
					l=j-1;
				if(wsk[k][l].stan==0)
					wsk[k][l].stan=1; 
					k=i+1;
				if(wsk[k][j].stan==0)
					wsk[k][j].stan=1;
					k=i+1;
					l=j+1;
				if(wsk[k][l].stan==0)
					wsk[k][l].stan=1;

			}
		}
	}
}
void Cliszaj::dwa(Cliszaj **wsk, int n)
{
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(wsk[i][j].stan==10)
				wsk[i][j].stan=1;
			if(wsk[i][j].stan!=0)
			wsk[i][j].stan++;	
		}
	}
}

klasa.h

#pragma once
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

class Cliszaj
{
	int x;
	int y;
	int stan;//1 - zdrowa 2-7 zarazona 7-11 odporna
public:
	void ustaw_xy(int n,int m);
	void wypisz_xy();
	void zacznij();
	void jeden(Cliszaj **wsk, int n);
	void dwa(Cliszaj **wsk, int n);
}; 

main.cpp

	int n,x;		//n rozmiar macierzy, x jednostka czasu
	cout<<"Podaj szerokosc tablicy"<<endl;
	Cliszaj **Pwsk;
	cin>>n;
	Cliszaj **tab = new Cliszaj *[n];	//dynamiczna tablica tablic obiektow
	Pwsk=tab;
	cout<<"Podaj przedzial czasowy"<<endl;
	cin>>x;
	system( "cls" );
	for (int i = 0; i < n; ++i )
	tab[i] = new Cliszaj[n];
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			tab[i][j].ustaw_xy(i,j);
		}
	}
	tab[n/2][n/2].zacznij();
	while(true)
	{
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
				tab[i][j].wypisz_xy();
			}
			cout<<endl<<endl;
		}
		tab[1][1].jeden(tab,n);
		tab[1][1].dwa(tab,n);
		czekaj(x*100);
		system( "cls" );
	}
cin>>n;
}


void czekaj( int iMilisekundy )		//zegar
{
	clock_t koniec = clock() + iMilisekundy * CLOCKS_PER_SEC / 1000.0;
	while( clock() < koniec ) continue;
}


 

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