Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2014
    Messaggi
    13

    [C++] Algoritmo con matrice identica

    Salve, oggi stavo provando a fare un programma in c++ che mi dicesse se una matrice letta da input è identica oppure no.
    Però non funziona e non capisco perchè :
    Questa è solo la procedura

    void identica(int x[][3], int n)
    {
    int verif = 0;
    for (int i = 0; i < n ; i++)
    for (int j = i+1; j < n; j++)
    {
    if (x[i][j] != 1)
    verif = 1;
    if (x[i][j] != 0 && x[j][i] != 0);
    verif = 1;
    }
    if (verif != 0)
    cout << "Non Identica" << endl;
    else
    cout << "identica" << endl;
    }

    esempio di matrice identica:
    http://kazur.org/articoli/matematica...g/identica.jpg
    Ultima modifica di Redix123; 23-05-2014 a 19:22

  2. #2
    Utente bannato
    Registrato dal
    May 2014
    Messaggi
    7
    Semmai matrice identità.
    Comunque il tuo problema è che non stai controllando solo gli elementi sulla diagonale principale. Gli elementi sulla diagonale principale sono quelli per cui i coincide con j: pensaci bene, un solo ciclo for ti basta.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2014
    Messaggi
    13
    Grazie per il suggerimento ci sono riuscito


    void identità(int x[][3], int n)
    {
    int verif = 0;
    int j = 0;
    for (int i = 0; i < n; i++)
    {
    if (j == i)
    {
    if(x[i][j] != 1)
    verif = 1;
    }
    else
    if (x[i][j] != 0 && x[j][i] != 0)
    verif = 1;
    }
    j++;
    if (verif == 0)
    cout << "Identica" << endl;
    else
    cout << "Non identica" << endl;
    }
    Ultima modifica di Redix123; 23-05-2014 a 22:28

  4. #4
    Utente bannato
    Registrato dal
    May 2014
    Messaggi
    7
    Pardon errore mio, in realtà con un ciclo for puoi controllare solo se gli elementi sulla diagonale sono 1, ma devi anche controllare che gli altri elementi siano uguali a zero.

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2014
    Messaggi
    13
    Forse tu intendi così:

    void identità(int x[][3], int n)
    {
    int verif = 0;
    for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
    {
    if (j == i)
    {
    if (x[i][j] != 1)
    verif = 1;
    }
    else
    if (x[i][j] != 0 && x[j][i] != 0)
    verif = 1;
    }
    if (verif == 0)
    cout << "Identità" << endl;
    else
    cout << "Non identità" << endl;
    }

    Ma comunque andava bene anche prima

  6. #6
    Utente bannato
    Registrato dal
    May 2014
    Messaggi
    7
    Quello di prima non andava bene e lo puoi verificare con una matrice del tipo {{1,1,0},{0,1,0},{0,0,1}}.
    In realtà neanche l' ultima funzione che hai scritto va bene, l' errore che fai è che assegni il valore di verif, ma non consideri il suo valore precedente. Quindi il test può fallire per tot elementi, ma se gli ultimi sono giusti la funzione la considera ugualmente una matrice identità (conviene usare un and logico).
    Ad esempio la matrice {1,1,1},{0,1,0},{0,0,1} la considera una matrice identità. E tra l' altro non ti serve nemmeno fare il doppio confronto nel secondo if.

    PS: Usa i tag CODE per postare il codice.

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2014
    Messaggi
    13
    Forse ho capito quello che vuoi dire, così dovrebbe andare:

    codice:
    void identica(int x[][3], int n){
    	int verif = 0; int c = 0;
    	for (int i = 0; i < n; i++)
    	for (int j = 0; j < n; j++)
    	{
    		if (j == i)
    		{
    			if (x[i][j] != 1)
    				c = 1;
    		}
    		else
    		if (x[i][j] != 0)
    			verif = 1;
    	}
    	if (verif == 0 && c == 0)
    		cout << "Identica" << endl;
    	else
    		cout << "Non identica" << endl;
    }

  8. #8
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Il tuo codice era complessivamente corretto, ma hai aggiunto un sacco di complicazioni: ti basta una sola variabile di falsificazione e inoltre puoi uscire dal ciclo non appena l'hai settata a 0. Per uscire dal ciclo puoi aggiungerla alla condizione o usare un goto (dovendo attraversare 2 livelli). In questo caso, potendo evitare il goto, io opterei per aggiungerlo alle condizioni.
    codice:
    void identica(int x[][3], int n){
        int identica = 1;
        for (int i = 0; (i < n) && identica; i++)
          for (int j = 0; (i < n) && identica; j++) {
             if (j == i) {
                if (x[i][j] != 1)
                 identica = 0;
             } else if (x[i][j] != 0)
                identica = 0;
          }
        if (identica)
            cout << "Identica" << endl;
        else
            cout << "Non Identica" << endl;
    }
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.