Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    2

    [C] Confronto fra matrici e array unidimensionali

    Salve a tutti, sono da poco iscritto, e ogni tanto mi diletto nella programmazione.

    Sono ancora all'inizio, ma ho incontrato un bell'ostacolo.

    In pratica io ho 1 array unidimensionale L[7], e 2 matrici, A[7][2] e R[12][3].


    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #define N 12
    #define M 7
    
    void confrontamatrice(int [], int[][2], int [][3]);
    
    int main(){
        
        int L[N] = {4, 18, 1, 12, 8, 10, 7, 16, 5, 9, 20, 15};
        int A[M][2] = {{12, 8}, {20, 9}, {9, 7}, {6, 17}, {4, 15}, {3, 16}, {10, 8}};
        int R[N][3];
        int d = 0, f = 0;
        
        confrontamatrice(L, A, R);
        
        printf("Stampa della matrice R ordinata per Posto, Persona e Persona\n\n");
        for( d = 0; d <= 6; d++){
              printf("%d %d %d\n", R[d][0], R[d][1], R[d][2]);
              }
        
    return 0;
    }
    In pratica con la funzione confrontamatrice devo confrontare il vettore L con la matrice A, per vedere se nel vettore L sono vicini due elementi presenti nelle matrice A della stessa colonna.

    Ad esempio nel vettore L sono vicini in posizione 3 i numeri 12 e 8, che sono la prima riga della matrice A.

    Quindi, se trova corrispondenza, deve scrivere nella matrice R, la posizione e quindi i due elementi che erano vicini.

    Ecco io non riesco a fare questo, ho pensato a un doppio ciclo for per leggere la matrice + un ciclo for per leggere il vettore, qualcosa del tipo:

    codice:
    void confrontamatrice(int tavolo[N], int antipatie[M][2], int risultato[N][3]){
         
    int i, j, k;
         
         
              for(i = 0; i <= 6; i++){
                    for(j = 0; j <= 1; j++){
                          for( k = 0; k <= 11; k++){
    Ma quindi non riesco ad andare avanti, ed ogni cosa che ho provato estrae risultati improponibili.. voi come fareste? Mi ci sto disperando ç_ç

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Qualcosa del genere

    codice:
    int confrontamatrice(int L[], int A[][2], int R[][3])
    {
    	int d, p, t, v1, v2;
    
    	for(d=t=0; d<M; d++)
    	{
    		v1 = A[d][0];
    		v2 = A[d][1];
    
    		for(p=0; p<N-1; p++)
    			if(L[p]==v1 && L[p+1]==v2)
    			{
    				R[t][0] = p;
    				R[t][1] = v1;
    				R[t][2] = v2;
    				t++;
    			}
        }
    
    	return(t);
     }
    
    int main(){
        
        int L[N] = {4, 18, 1, 12, 8, 10, 7, 16, 5, 9, 20, 15};
        int A[M][2] = {{12, 8}, {20, 9}, {9, 7}, {6, 17}, {4, 15}, {3, 16}, {10, 8}};
        int R[N][3];
    	int d, trovate;
    
        trovate = confrontamatrice(L, A, R);
    
    	printf("Coppie trovate: %d\n", trovate);
        for(d=0; d<trovate; d++)
    		printf("Pos: %d (%d, %d)\n", R[d][0], R[d][1], R[d][2]);
    
    	return 0;
    }
    ... la posizione e' base 0 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    2
    Mmm intanto grazie per l'aiuto!

    Comunque, ho provato come hai fatto te, ma mi stampa solamente la prima coppia, ovvero 12, 8 in posizione 3, mentre le altre le ignora, ad esempio, in posizione 9 c'è la coppia 9 20, che pero sulla matrice è segnata come 20 9, ma ai fine del controllo deve risultare come coppia trovata anche questa, anche se è invertita rispetto ai dati della matrice.


    Tra l'altro ora che vedo la tua funzione è enormemente piu semplice a quelle che ho pensato io (for if e anche switch impilati XD ) semplicemente usando due varibiali che salvano il valore della matrice.. cosa a cui io scioccamente non ho pensato per nulla, ora provo a fare qualcosa a partire dalla tua ottima base e in caso posto il risultato

    EDIT: una cosa, come mai hai messo nel for questo?

    for(d=t=0; d<7; d++)

    ovvero, perchè hai messo d=t=0? non bastava d=0?

    EDIT2: ora controlla anche l'inverso, semplicemente inserendo un else if:

    codice:
    else
    			    if(L[p]==v2 && L[p+1]==v1)
    			{
    				R[t][0] = p;
    				R[t][1] = v1;
    				R[t][2] = v2;
    				t++;
    			}
    Grazie mille

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Artius
    Comunque, ho provato come hai fatto te, ma mi stampa solamente la prima coppia, ovvero 12, 8 in posizione 3, mentre le altre le ignora, ad esempio, in posizione 9 c'è la coppia 9 20, che pero sulla matrice è segnata come 20 9, ma ai fine del controllo deve risultare come coppia trovata anche questa, anche se è invertita rispetto ai dati della matrice.
    Non avevi specificato che l'ordine non fosse importante ... avevi detto 12,8 e non ANCHE 8,12 ...


    ovvero, perchè hai messo d=t=0? non bastava d=0?
    Doveva essere azzerata anche la variabile t e l'ho messo lì ...

    EDIT2: ora controlla anche l'inverso, semplicemente inserendo un else if:
    No ... niente else ... basta modificare la if

    codice:
    if((L[p]==v1 && L[p+1]==v2) || (L[p]==v2 && L[p+1]==v1))
    {
        R[t][0] = p;
        R[t][1] = L[p];
        R[t][2] = L[p+1];
        t++;
    }
    Grazie mille
    Di nulla
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.