Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Problemi generici sulle matrici.

    Ho da risolvere alcuni esercizi di programmazione banale sulle matrici. In realtà io uso FORTRAN, ma penso che il discorso possa valere per un linguaggio in generale, poiché è un problema, a mio avviso, che riguarda i cicli.

    Dunque, ho problemi ogni qualvolta mi trovo a che fare con la gestione, per matrici, di sommatorie, produttorie, di righe specifiche e colonne specifiche. Rientrano in questa categoria problemi del tipo:

    "Dato un array bidimensionale di interi calcolare la sommatoria degli elementi di ciascuna riga e la produttoria degli elementi in ciascuna colonna";

    Ma anche problemi del tipo:

    "Dato un array bidimensionale di interi trovare il valore massimo e quello minimo per ogni riga."

    In realtà quello che mi riesce difficile (anzi, che non mi riesce affatto) è l' "isolamento" di specifiche parti della matrice (righe, colonne, diagonali), per poi poter eventualmente fare sommatorie, produttorie, stabilire quale sia il minimo, massimo elemento, di una riga, colonna o diagonale, stabilire quante volte in una singola parte di matrice sia contenuto un dato numero, etc.

    Io penso che per rendere il codice più snello il problema si debba affrontare con cicli annidati, e non magari facendo singole produttorie, singole sommatorie, per ogni riga (non sarebbe molto rigoroso come "stile", oltre che faticoso).

    Chi mi aiuta?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Chi mi aiuta?
    Vorrei ... ma la domanda qual e'?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Io tentavo di chiedere un "modo di ragionare" basato sui cicli per problemi tutti simili tra loro, e riguardanti la trattazione di parti di matrici (righe, colonne, diagonali, "V", etc.).

    Mi rendo conto di non aver scritto niente di concreto

    E' meglio secondo me postare vari esercizi, premettendo che come si può intuire il mio livello è quello che è. Magari rispondendo agli esercizi, mi viene anche chiarito "il modo di ragionare" che è alla base. Per l'approccio che ho avuto io alla programmazione, spesso basta un caso chiave che la mente si apre per particolari "orizzonti".

    Ecco, dunque, alcuni esercizi. Ne posto molti, ma penso che la loro risoluzione abbia un unico schema di fondo. Ovviamente chiedo a chi mi aiuterà di sceglierne anche solo uno, magari quello più "complicato" (per risolvere da me, basandomi su quello, i rimanenti).

    "Dato un array bidimensionale di interi calcolare la sommatoria degli elementi di ciascuna riga e la produttoria degli elementi in ciascuna colonna";

    "Dato un array bidimensionale di interi trovare il valore massimo e quello minimo per ogni riga."

    "data una matrice con degli elementi uguali a 0, dire qual è la colonna che ha più zeri; dire inoltre qual è la riga che ne ha di più"

    "Fare la somma degli elementi delle diagonali delle matrici, e dire quale delle due somme sia maggiore dell'altra".

    Grazie in anticipo a chiunque mi risponderà.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Beh, mi sa che il tuo problema non abbia a che fare con la programmazione.

    Semmai hai difficolta' a trattare le matrici.

    Se identifichi le righe con il primo indice e le colonne con il secondo

    matrice[r][c]

    se devi esaminare/gestire gli elementi di una riga, dovrai mantenere costante il primo indice e variare il secondo ... per la riga 2 (tenendo presente che e' la terza dato che il C usa gli indici base 0), dovrai esaminare gli elementi da matrice[2][0] a matrice[2][c-1]

    se devi esaminare/gestire gli elementi di una colonna, dovrai mantenere costante il secondo indice e variare il primo ... per la colonna 3 dovrai esaminare gli elementi da matrice[0][3] a matrice[r-1][3]

    per la diagonale principale di una matrice quadrata, i valori degli indici dovranno essere uguali e quindi matrice[i][i] con i che va da 0 a m-1 se m e' la dimensione

    e cosi' via ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    se devi esaminare/gestire gli elementi di una riga, dovrai mantenere costante il primo indice e variare il secondo ... per la riga 2 (tenendo presente che e' la terza dato che il C usa gli indici base 0), dovrai esaminare gli elementi da matrice[2][0] a matrice[2][c-1]
    E se devo fare questo per tutte le righe, tutte le colonne?
    Possibile che devo fare tanti cicli per quante siano le righe e colonne di cui fare sommatorie, produttorie, etc.?

    Io so che un buon programma non deve avere numeri "fissi": se io costruisco un programma facendo, ad esempio cinque sommatorie perchè la mia matrice ha cinque righe, e quindi le implemento facendo ricorso a cinque cicli e a cinque variabili "sommatoria", tale programma risulta essere poi "particolare" cioè adatto solo per matrici di cinque righe.

    Capisci qual è il problema? Se ho capito bene quanto suggerisci, io dovrei fare un ciclo per la prima riga, uno per la seconda, etc. Mentre io cercavo una procedura più "snella", ottenuta magari annidando cicli, che però mi consentisse di ottenere i risultati che volevo ottenere io.

    Il problema, ora che me lo fai notare, non si pone quando magari considero le diagonali di una matrice quadrata, oppure quando considero righe o colonne già specificate. In tal caso mi basta annidare due cicli DO (che esistono anche in C, mi pare). Il problema però si pone quando devo fare qualcosa su tutte le righe, tutte le colonne, e per ogni singola riga, ogni singola colonna, per poi confrontarle.

    Ora che ci penso mi vengono in mente le subroutine. Però anche lì, con il variare delle dimensioni della matrice, dovrei fare più chiamate per una singola subroutine di calcolo della sommatoria. Quindi non so se vada proprio bene usarle.

    In FORTRAN i vettori hanno posizioni da 1 a n (e non come in C, dove le posizioni vanno da 0 a n-1). Quindi parliamo pure come magnamo

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da turtle87
    E se devo fare questo per tutte le righe, tutte le colonne?...
    Allora userai due cicli (come faresti anche in qualsiasi linguaggio) con il valore finale variabile ... qualcosa come

    codice:
    for(r=0; r<maxrighe; r++)
       for(c=0; c<maxcolonne; c++)
    Non vedo il problema ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Il problema in me sorge quando si deve continuare. Come faresti a tenere un indice costante? come faresti ad esempio a scrivere le somme delle varie righe e a tenerle separate, utilizzando quel ciclo che hai "iniziato" tu?

  8. #8
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    utilizzi un array della dimensione delle righe in cui metterai tutte le sommatorie, in posizione 0 la sommatoria della riga 0, e via discorrendo.. Lo stesso per le colonne e per qualsiasi operazione tu debba fare..

    supponendo tu abbia un array delle sommatorie di dimensione maxrighe

    codice:
    for(r=0; r<maxrighe; r++)
       for(c=0; c<maxcolonne; c++)
            vettoreSomma[r]+=matrice[r][c];
    alla fine ti troverai in ogni posizione del vettore la sommatoria della riga relativa..

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da turtle87
    come faresti ad esempio a scrivere le somme delle varie righe e a tenerle separate, utilizzando quel ciclo che hai "iniziato" tu?
    Come faresti "sulla carta" una cosa del genere? Come lo risolveresti "senza computer"?

    Se vuoi conservare dei valori che rappresentano le righe, questo vuol dire, senza pensarci tanto, che devi avere un "vettore di somme" grande quante sono le righe che hai nell'array ...
    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 © 2024 vBulletin Solutions, Inc. All rights reserved.