Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Estrarre colonne da array bidimensionale
Forum - C/C++ - Estrarre colonne da array bidimensionale

Avatar
a_butta (Member)
Expert


Messaggi: 578
Iscritto: 16/03/2010

Segnala al moderatore
Postato alle 13:40
Martedì, 03/01/2012
Ciao a tutti.
Ho un problema nello svolgimento di un programma. Ho un array bidimensionale, una matrice NxN quadrata di interi e devo estrarre ogni colonna per sommare i numeri in essa contenuti. Ho una funzione somma che mi prende in input un vettore e me ne restituisce la somma delle componenti:
Codice sorgente - presumibilmente C/C++

  1. int somma(int colonna[]);

.
Il mio problema è appunto come estrarre le colonne dall'array anziché le righe. Infatti se io passo alla funzione i valori in questo modo:
Codice sorgente - presumibilmente C/C++

  1. for (int i=0; i < N; i++) somma(matrice[i]);


ovviamente, come giusto che sia, mi somma le componenti di ogni riga.
Per ovviare senza modificare la matrice facendone la trasposta, l'unica soluzione è passare dai puntatori o c'è qualcos'altro?
Grazie mille in anticipo! :)

PS: ovviamente la funzione somma deve rimanere con quelle caratteristiche come da traccia del problema...

PM
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Up
1
Down
V
Segnala al moderatore
Postato alle 14:53
Martedì, 03/01/2012
Ciao!

Le soluzioni sono molteplici. Io ti suggerisco di dichiarare un tipo apposta per definire un vettore in questo modo:
Codice sorgente - presumibilmente C/C++

  1. typedef int tvet[N][N];



In questo modo, verrà semplificata di molto la dichiarazione delle funzioni.

Un' altra possibile altra soluzione,  è quella di passare il puntatore di un elemento della prima riga.
Per ricavare gli elementi della relativa colonna, basta aggiungere al puntatore il numero di colonne della matrice.
Es.:
Funzione:
Codice sorgente - presumibilmente C++

  1. int somma(int *v, int fine)
  2. {
  3.     int s=0, i=0;
  4.     for (i=0; i<fine; i++)
  5.     {
  6.         s+=v[i*fine];
  7.     }
  8.     return s;
  9. }



Alla chiamata:
Codice sorgente - presumibilmente C/C++

  1. for (int i=0; i<10;i++)
  2.     {
  3.         s+=somma(&v[0][i], 10);
  4.     }


A parte che non ho ben capito la prima soluzione (ma l'ho scartata perchè diciamo esce un po' fuori dalla struttura che il programma dovrebbe avere), ero comunque anche io approdato alla seconda soluzione, in effetti la più logica: se non ho capito male con un puntatore punti alla testa di ogni - a_butta - 03/01/12 21:04
colonna e ti muovi di N passi in N passi ottenendo i successivi elementi... Grazie mille comunque a tutti per la disponibilità :) - a_butta - 03/01/12 21:04
PM
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 14:03
Martedì, 03/01/2012
Se alla funzione somma passi l'array e il numero di colonna, può andare bene?

int somma(matrice[][N], colonna)

??

No perchè la traccia richiede che l'input sia "la colonna", o comunque un puntatore ad essa... Grazie comunque, gentilissimo :) - a_butta - 03/01/12 21:06


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM