Diskuze: problem s vytisnutim, pro zkusenejsi

C++ C a C++ problem s vytisnutim, pro zkusenejsi

Avatar
14fuk
Člen
Avatar
14fuk:
#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");
}

mohl by mi prosim nekdo poradit, proc se nic nevytiskne? urcite je vtom jem nejaka malickost, dekuji za odpovedi

 
Odpovědět 23.3.2014 19:22
Avatar
Odpovídá na 14fuk
Luboš Běhounek (Satik):

Skoro to vypada, ze jsi nekde vzal kod, kteremu nerozumis a netusis, proc to nejde :D

Pokud se nic nevypise, tak mozna nekde dojde k chybe, nehlasi ti to nejakou?

Pripadne zkus na dulezita mista dat breakpoint a krokovat kod.

Nahoru Odpovědět 23.3.2014 19:26
:)
Avatar
Odpovídá na 14fuk
Libor Šimo (libcosenior):

Chybu máš tu:

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

Vkladáš do poľa char čísla a nie znaky.
Oprav si to asi takto:

char r0[] = {'0', '0', '1', '0', '0'};

Samozrejme všetky tie riadky a ak tam nemáš inú chybu, malo vy to vypisovať.

Editováno 23.3.2014 20:30
Nahoru Odpovědět 23.3.2014 20:28
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na 14fuk
Libor Šimo (libcosenior):

Celé to máš chybné.
Vytvoril si polia char-ov a vo funkciách pracuješ s int-ami.
Toto ti fungovať nebude.

Nahoru Odpovědět 23.3.2014 20:38
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na 14fuk
Lukáš Hruda (Luckin):

Ve funkci tranzitivni máš nekonečný cyklus, proměnná zmena není nikdy 1.

 
Nahoru Odpovědět 23.3.2014 22:15
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Libor Šimo (libcosenior):

Musím sa ospravedlniť. Nemal som pravdu.

Nahoru Odpovědět 24.3.2014 10:13
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.