Stampare sottomatrici di una matrice

di il
3 risposte

Stampare sottomatrici di una matrice

Salve a tutti sono alle prese con un esercizio che chiede di stampare le sottomatrici 2x2 presenti in una matrice di dimensione a scelta dell'utente,e queste sottomatrici non devono essere sovrapposte. Ho provato a mettere il cout della matrice direttamente all'interno del sottoprogramma in modo da semplificare un po i processi ma il codice non stampa la somma delle sottomatrici ma dei numeri enormi come per esempio 2130201392193.

Vi allego il codice e sarei curioso di sapere l'errore dell'ultimo sottoprogramma dove è..CIaooo!

#include <iostream>
#include <stdlib.h>

using namespace std;

void Leggi (int  *,int ,int);
void Stampa (int *,int , int);
void Sottomatrici2x2 (int *,int,int );

int main()
{
	int r,c;
	do {
	cout<<"Salve utente,inserire le righe della matrice";
	cin>>r;
	cout<<"Inserire il numero di colonne";
	cin>>c;
	if (c==0 || c<0 || r<0 || r==0)
	{cout<<"Dimensioni errate";}
	} while (c==0 || c<0 || r<0 || r==0);                      //chiusura del ciclo while che si ripete fin quando non sono
	int m[r][c];                                         // inserite le giuste dimensioni per la matrice.
	Leggi (&m[0][0],r,c);
	Stampa (&m[0][0],r,c);
    Sottomatrici2x2 (&m[0][0],r,c);
}

void Leggi(int *m,int r,int c)
{
	int i,j;
	for (i=0;i<r;i++)
	{
		for (j=0;j<c;j++)
		{
			cout<<"Inserire l'elemento di posto["<<i<<"]["<<j<<"]";
			cin>>*(m + i*r + j);
		}
	}
}

void Stampa(int *m,int r,int c)
{
	cout<<"La matrice inserita e' ..";
	int i,j;
	for (i=0;i<r;i++)
	{
		cout<<"\n ";
		for (j=0;j<c;j++)
		{
			cout<<" "<<*(m + i*r + j);
		}
    }
}

void Sottomatrici2x2 (int *m,int r,int c )
{
    int r1;
	r1=r/2;
	int c1;
	c1=c/2;
	int m2[r1][c1];
	int I=0;int J=0;
    for (int i=0;i<r;i=i+2)
    {
        for (int j=0;j<c;j=j+2)
        {
            m2[I][J] = (*(m + i*c + j)) + (*(m + i*(c+1) + j))+(*(m + (i+1)*c + j)) + (*(m + (i+1)*c + j+1));
            J++;
        }
      I++;
    }
    cout<<"la matrice inserita e'... ";
    for (int x=0;x<I;x++)
    {
        cout<<"\n ";
        for (int y=0;y<J;y++)
        {
            cout<<m2[x][y];
        }
    }
}

3 Risposte

  • Re: Stampare sottomatrici di una matrice

    J lo devi inizializzare a 0 ogni volta che riparti con l'analisi di una riga
       for (int i=0;i<r;i=i+2)
        {
            J=0; // <<<<-----
            for (int j=0;j<c;j=j+2)
            {
                m2[I][J] = (*(m + i*c + j)) + (*(m + i*(c+1) + j))+(*(m + (i+1)*c + j)) + (*(m + (i+1)*c + j+1));
                J++;
            }
          I++;
        }
    Non so se questo risolva il problema; se non dovesse essere la soluzione ti suggerisco di semplificare il problema e di caricare in m2[][] non una somma ma il valore della casella in alto a sinistra di ciascuna sottomatrice 2x2, così da verificare se ti stai posizionando correttamente. Per velocizzare il debug: commenta il caricamento manuale della matrice e crea da programma una matrice ad es. 10x10 con valori crescenti da 0 a 99...
  • Re: Stampare sottomatrici di una matrice

    candaluar ha scritto:


    J lo devi inizializzare a 0 ogni volta che riparti con l'analisi di una riga
       for (int i=0;i<r;i=i+2)
        {
            J=0; // <<<<-----
            for (int j=0;j<c;j=j+2)
            {
                m2[I][J] = (*(m + i*c + j)) + (*(m + i*(c+1) + j))+(*(m + (i+1)*c + j)) + (*(m + (i+1)*c + j+1));
                J++;
            }
          I++;
        }
    Non so se questo risolva il problema; se non dovesse essere la soluzione ti suggerisco di semplificare il problema e di caricare in m2[][] non una somma ma il valore della casella in alto a sinistra di ciascuna sottomatrice 2x2, così da verificare se ti stai posizionando correttamente. Per velocizzare il debug: commenta il caricamento manuale della matrice e crea da programma una matrice ad es. 10x10 con valori crescenti da 0 a 99...

    Grazie della risposta ma non ho capito cosa vorresti fare quando dici "il valore della casella in alto a sinistra di ciascuna sottomatrice 2x2" ?
  • Re: Stampare sottomatrici di una matrice

    In m2[][] metti sono uno dei corrispettivi valori della matrice principale (per semplicità prendevo quello nella posizione relativa [0][0]) e non la somma dei 4 valori, così puoi verificare se stai andando a "pescare" correttamente dalla matrice principale.
Devi accedere o registrarti per scrivere nel forum
3 risposte