Uzavery relace – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Uzavery relace – C / C++ – Fórum – Programujte.comUzavery relace – C / C++ – Fórum – Programujte.com

 

Peu
~ Anonymní uživatel
8 příspěvků
23. 3. 2014   #1
-
0
-

 Ahoj, mohly byste mi nekdo rict, proc se po kompilaci kodu nic nevytiskne, popride mi alespon poradit jak funguje to zadavani relace, kdyz treba budu chtit relaci {( 0,1), (1,2), (2,0), (2,3)}, tak jak ji tam mam zadat, dekuji za odpoved :)

#include <stdio.h>
#include <stdlib.h>

// Uzávěrové funkce
char **reflexivni(char **R, int n);
char **symetricky(char **R, int n);
char **tranzitivni(char **R, int n);

// Pomocné funkce
void kopirujMatici(char **co, char **kam, int n);
void vypisRelaci(char **R, int n);
char **novaMatice(int n);

int main(int argc, char **argv)
{
	// Relace R definovaná pomocí matice
	/*
	char r0[] = {0, 0, 1, 0, 0};
	char r1[] = {0, 0, 1, 0, 0};
	char r2[] = {1, 0, 1, 0, 1};
	char r3[] = {0, 0, 0, 0, 0};
	char r4[] = {0, 0, 0, 0, 0};
	*/

	char r0[] = {0, 0, 1, 0, 0};
	char r1[] = {0, 0, 0, 0, 0};
	char r2[] = {0, 0, 0, 3, 0};
	char r3[] = {0, 0, 0, 0, 1};
	char r4[] = {0, 0, 0, 0, 0};

	char *R[] = {r0, r1, r2, r3, r4};

	// Velikost matice je počítána podle počtu prvků v prvním řádku
	int n = sizeof(r0)/sizeof(char);

	// Zjištění uzávěrů
	char **Ur = reflexivni(R, n);
	char **Us = symetricky(R, n);
	char **Ut = tranzitivni(R, n);

	// Vypsání relace R
	printf("Relace R je: ");
	vypisRelaci(R, n);

	// Vypsání reflexivního uzávěru
	printf("Reflexivní uzávěr relace R je: ");
	vypisRelaci(Ur, n);

	// Vypsání symetrického uzávěru
	printf("Symetrický uzávěr relace R je: ");
	vypisRelaci(Us, n);

	// Vypsání tranzitivního uzávěru
	printf("Tranzitivní uzávěr relace R je: ");
	vypisRelaci(Ut, n);

	return 0;
}



// Všechny (a, a)eR
char **reflexivni(char **R, int n)
{
	// Vytvoříme novou matici a naplníme ji uspořádaními
	//     dvojicemi z relace R
	char **S = novaMatice(n);
	kopirujMatici(R, S, n);

	// Rozšíříme relaci S o dvojice nezbytné k tomu, aby
	//     byla reflexivní
	int i;
	for(i=0; i<n; i++)
	{
		if(R[i][i]!=1)
		{
			S[i][i] = 1;
		}
	}
	return S;
}

// Pokud (a, b)eR pak musí (b, a)eR
char **symetricky(char **R, int n)
{
	// Vytvoříme novou matici a naplníme ji uspořádaními
	//     dvojicemi z relace R
	char **S = novaMatice(n);
	kopirujMatici(R, S, n);

	// Rozšíříme relaci S o dvojice nezbytné k tomu, aby
	//     byla symetrická
	int i, j;
	for(i=0; i<n; i++)
	{
		for(j=0; j<n; j++)
		{
			if(R[i][j])
				S[j][i] = 1;
		}
	}
	return S;
}

// Pokud (a, b)eR a (b, c)eR, pak musí (a, c)eR
char **tranzitivni(char **R, int n)
{
	// Vytvoříme novou matici a naplníme ji uspořádaními
	//     dvojicemi z relace R
	char **S = novaMatice(n);
	kopirujMatici(R, S, n);

	// Rozšíříme relaci S o dvojice nezbytné k tomu, aby
	//     byla tranzitivní
	int a=0, b, c;
	char zmena = 0;
	do
	{
		//zmena = 1;
		for(a=0; a<n; a++)
		//do
		{
			for(b=0; b<n; b++)
			{
				// Našli jsme (a, b)eR
				if(R[a][b])
				{
					for(c=0; c<n; c++)
					{
						// Našli jsme (b, c)eR
						if(R[b][c])
						{
							S[a][c]=1;
							zmena = 0;
						}
					}
				}
			}
			//a++;
		}
	}while(zmena == 0);
	return S;
}

// Vytvoří a vrátí novou matici
// Všechny žádná uspořádaná dvojice nebude nastavena na pravdu
char **novaMatice(int n)
{
	char **M;
	M = malloc(sizeof(char*)*n);

	int i;
	for(i=0; i<n; i++)
		M[i] = malloc(sizeof(char)*n);
	return M;
}

// Kopíruje uspořádané dvojice z jedné matice do druhé
// Původní dvojice cílové matice zůstanou zachovány
void kopirujMatici(char **co, char **kam, int n)
{
	int i, j;
	for(i=0; i<n; i++)
	{
		for(j=0; j<n; j++)
		{
			if(co[i][j])
				kam[i][j] = 1;
		}
	}
}

// Do konzole vypíše relaci ve tvaru
//     {(0, 2), (1, 2), (2, 0), (2, 2), (2, 4), }
void vypisRelaci(char **R, int n)
{
	printf("{");
	int i, j;
	for(i=0; i<n; i++)
	{
		for(j=0; j<n; j++)
		{
			if(R[i][j])
				printf("(%i, %i), ", i, j);
		}
	}
	printf("}\n");
}
Nahlásit jako SPAM
IP: 93.93.33.–
Peu
~ Anonymní uživatel
8 příspěvků
23. 3. 2014   #2
-
0
-

uz jsem na to prisel :D chyba byla ve fci **tranzitivni, zmena==0 a ma tam byt zmena==1 :)

Nahlásit jako SPAM
IP: 93.93.33.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 143 hostů

Podobná vlákna

Relace v mysql — založil Paja2

Relace nevydrží — založil Alex Candle

Binární relace — založil Mautinek

Relace 1: N v mysql — založil Paja2

JPA 2.0 realizace relace — založil Martin

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý