Calcolo perimetro matrice

di il
11 risposte

Calcolo perimetro matrice

Ciao a tutti, mi sono appena iscritta!
Apro questa discussione perché devo scrivere un algoritmo che mi permetta di calcolare la somma del perimetro (bordo) di una matrice. Prima di scrivere il codice, ragionando in termini di somma degli indici, sono arrivata alla conclusione che:
- Se i=0, devo sommare gli elementi che hanno j che varia da 0 a dim_col-1. (Se 3x3= 0.0 - 0.1 - 0.2)
- Se i=dim_rig-1, devo sommare gli elementi che hanno j che varia da 0 a dim_col-1. (Se 3x3= 2.0 - 2.1 - 2.2)
- Se i è compreso tra 0 e dim_rig-1, devo sommare gli elementi che hanno j=0 e j=j-1. (Se 3x3= 1.0 e 1.2)
Ho provato a scrivere il codice utilizzando i soliti due for per scorrere gli elementi della matrice. Per verificare invece, queste tre condizioni ho aggiunto tre if, così se verificate, viene aggiornato il contatore somma, ma non funziona.
C'è qualcuno disposto a farmi ragionare? Sto sbattendo la testa sulla tastiera da ieri sera
Grazie mille

11 Risposte

  • Re: Calcolo perimetro matrice

    Vediamo il codice e dicci esattamente cosa vuol dire "non funziona".
  • Re: Calcolo perimetro matrice

    RICORDA: la soluzione PIU' SEMPLICE E' SEMPRE preferibile.

    La matrice ha QUATTRO lati: alto, basso, sinistra, destra.
    Le celle di ogni lato hanno delle coordinate BEN definite.
    QUINDI ti basta scandire le celle dei suddetti lati.

    ATTENZIONE: c'e' un problemino. Devi gestire OPPORTUNAMENTE le celle negli spigoli!!!

    Ragiona usando un banale foglio a quadretti!
  • Re: Calcolo perimetro matrice

    Infatti, proprio perché è meglio scrivere un codice ottimizzato non ho scritto la bozza dell'algoritmo che avevo scritto perché ho intuito che ci sia un modo più leggero per poterlo scrivere. Quindi, ritornando al ragionamento, a prescindere dalla dimensione della matrice, il lato sinistro e destro hanno sempre coordinate [0][j] e [c-1] mentre il lato alto e basso hanno sempre coordinate [0][j] e [r-1][j], con i e j che variano da 0 a r-1 e c-1. Se eseguissi quindi, una semplice somma di questi indici all'interno della variabile sum, aggiungerei i quattro lati sì, ma includerei ogni volta anche i quattro angoli, giusto?
  • Re: Calcolo perimetro matrice

    LASCIA PERDERE il concetto di codice ottimizzato.
    SEMPLICE non e' sinonimo di ottimizzato.
    Per le cose che devi fare deve SOLO essere semplice

    Giusto.
    Ora con qualche neurone in piu' trovi anche la soluzione per gli spigoli
  • Re: Calcolo perimetro matrice

    Quindi, all'interno dei due cicli for la variabile sum sarà data dalla somma dei quattro angoli M[0][0], M[r-1][c-1], M[r-1][0], M[0][c-1] più la somma dei quattro lati compresi tra gli angoli, ossia M[0][j>0 && j<c-1], M[r-1][j>0 && j<c-1] e così via?
  • Re: Calcolo perimetro matrice

    Ti bastano due cicli ...

    In uno esplora tutte le colonne (da 0 a c-1) e sommi le righe 0 e r-1

    In un altro esplori i due lati (esclusi gli angoli già considerati), quindi tutte le righe da 1 a r-2 sommando le colonne 0 e c-1

    Puoi provare a scrivere queste due for così vai avanti?
  • Re: Calcolo perimetro matrice

    
    //Calcolo perimetro di una matrice quadrata
    
    int perimetro(const int M[][MAX],const int n){
    	int somma=0;
    	for(int i=0;i<n;i++){
    		somma=somma+M[i][0]+M[i][n-1];
    	}
    	
    	for(int j=1;j<n-1;j++){
    		somma=somma+M[0][j]+M[n-1][j];
    	}
    	
    	return somma;
    }	
    
    Okay, grazie mille
  • Re: Calcolo perimetro matrice

    E' sbagliato il primo for
  • Re: Calcolo perimetro matrice

    Ok ora va bene.

    Non modificate i post precedenti, che poi passano gli altri e dicono che scrivo cavolate

    Scherzo fate pure
  • Re: Calcolo perimetro matrice

    Ahahahaha non lo faccio più
    Comunque, grazie a tutti per la disponibilità :3
  • Re: Calcolo perimetro matrice

    Un unico appunto (ma è proprio un dettaglio): se n = 1 il risultato è sbagliato. Dovresti fare subito all'inizio
    if(n==1) 
    	return M[0][0];
Devi accedere o registrarti per scrivere nel forum
11 risposte