C++ esercizio con matrici

di il
9 risposte

C++ esercizio con matrici

Salve, potreste dirmi cosa c'è di sbagliato in questo codice? quando lo eseguo mi viene stampato solo il return delle prime due funzioni, ma non la matrice di creaMatrice. Grazie in anticipo

#include<iostream> 
#include <vector>
using namespace std;

/*1. sommaMultipli che riceve una matrice di interi A ed un intero k, e 
restituisce un vettore V il cui i-esimo elemento contiene la somma degli 
elementi multipli di k presenti sulla i-esima colonna di A.*/

vector<int> sommaMultipli (int** A, int k, int r, int c)
{
    vector<int>v(c);
    
    for (int i=0; i<c; i++)
        v[i] = 0;
    
    for (int i=0; i<c; i++)
    {
        int somma = 0;
        for (int j=0; j<r; j++)
            if (A[j][i] % k == 0)
            {
                somma += A[j][i];
                v[i] = somma;
            }
    
    }
   
        
                
      return v;          
    
}

/* 2. verificaMedia che riceve una matrice di interi A avente n righe (con n 
pari) e restituisce true se e solo se nessun elemento nelle prime n/2 righe di 
A ha un valore maggiore della media degli elementi presenti nelle ultime n/2 
righe di A.*/

bool verificaMedia (int** A, int n, int c)
{
    int somma = 0;
    for (int i=(n-1)/2; i<n; i++)
    {
        for(int j=0; j<c; j++)
            somma += A[i][j];
    }
    double media = somma/(n/2 * c);
    
    for(int i=0; i<n; i++)
        for(int j=0; j<c; j++)
            if (A[i][j] > media)
                return false;
    
    return true;
}

/*3. creaMatrice che riceve una matrice di interi A e restituisce una matrice M 
delle stesse dimensioni di A. La iesima riga di M sarà uguale alla i-esima riga
di A se i è pari, mentre sarà uguale all’inverso della i-esima riga di A se i è
dispari.*/

int** creaMatrice (int** A, int r, int c)
{
    int** M = new int*[r];
    for (int i=0; i<r; i++)
        M[r] = new int[c];
        
    for (int i=0; i<r; i++)
    {   for (int j=0; j<c; j++)
            {
                if (i % 2 == 0)
                    M[i][j] = A[i][j];
                else
                    M[i][j] = A[r-i-1][j];
            }
    }        
    return M;
}

/*4. main nel quale si legge una matrice di interi, e si invocano opportunamente
le funzioni definite ai punti 1, 2 e 3.*/

int main()
{
    int** A = new int*[4];
    for (int i=0; i<4; i++)
        A[i] = new int[5];
    
    int y [4][5] = { 
                        {1, 0, 3, 18, 1},
                        {1, 3, 0, 0, 3},
                        {0, 1, 6, 2, 12},
                        {9, 2, 4, 0, 1}
                                            };
    for (int i=0; i<4; i++)
        for(int j=0; j<5; j++)
            A[i][j] = y[i][j];
    
    vector<int>v = {sommaMultipli (A, 3, 4, 5)};
    
    cout << "v = [";
    for (int i=0; i<5; i++)
        cout << v[i] << " ";
    cout << "] " << endl;
    
    cout << verificaMedia (A, 4, 5) << endl;
    
    int** M = new int*[4];
        for(int i=0; i<4; i++)  
            M[i] = new int[5];
    
    M = {creaMatrice (A, 4, 5)};
    cout << "M = [ ";
    for(int i=0; i<4; i++)
    {
        for (int j=0; j<5; j++)
            cout << M[i][j] << " ";
        cout << endl;
    }
    cout << "]";
    
    return 0;
}

9 Risposte

  • Re: C++ esercizio con matrici

    Usa i tag CODE per inserire il codice nel forum o non si capisce nulla.
  • Re: C++ esercizio con matrici

    oregon ha scritto:


    Usa i tag CODE per inserire il codice nel forum o non si capisce nulla.
    fatto, penso che così vada bene
  • Re: C++ esercizio con matrici

    
        int** A = new int*[4];
        for (int i=0; i<4; i++)
            A[i] = new int[5];
        
        int y [4][5] = { 
                            {1, 0, 3, 18, 1},
                            {1, 3, 0, 0, 3},
                            {0, 1, 6, 2, 12},
                            {9, 2, 4, 0, 1}
                                                };
        for (int i=0; i<4; i++)
            for(int j=0; j<5; j++)
                A[i][j] = y[i][j];
    
    Ma perché tutto questo?
  • Re: C++ esercizio con matrici

    In creaMatrice
    
    M[i] = new int[c]; //non M[r] 
    
    Queste new nel main non servono a niente, la memoria viene già allocata nella funzione.
    
        int** M = new int*[4];
            for(int i=0; i<4; i++)  
                M[i] = new int[5];
    
    Aggiustato questo funziona, ma c'è un altro errore logico in creaMatrice.
  • Re: C++ esercizio con matrici

    Weierstrass ha scritto:


    
        int** A = new int*[4];
        for (int i=0; i<4; i++)
            A[i] = new int[5];
        
        int y [4][5] = { 
                            {1, 0, 3, 18, 1},
                            {1, 3, 0, 0, 3},
                            {0, 1, 6, 2, 12},
                            {9, 2, 4, 0, 1}
                                                };
        for (int i=0; i<4; i++)
            for(int j=0; j<5; j++)
                A[i][j] = y[i][j];
    
    Ma perché tutto questo?
    lo avevo fatto per dichiarare la matrice dinamicamente
  • Re: C++ esercizio con matrici

    dialessluca ha scritto:


    Weierstrass ha scritto:


    
        int** A = new int*[4];
        for (int i=0; i<4; i++)
            A[i] = new int[5];
        
        int y [4][5] = { 
                            {1, 0, 3, 18, 1},
                            {1, 3, 0, 0, 3},
                            {0, 1, 6, 2, 12},
                            {9, 2, 4, 0, 1}
                                                };
        for (int i=0; i<4; i++)
            for(int j=0; j<5; j++)
                A[i][j] = y[i][j];
    
    Ma perché tutto questo?
    lo avevo fatto per dichiarare la matrice dinamicamente
    e non puoi farlo così?
    
        int** A    = new int*[4];
              A[0] = new  int[5]{1, 0, 3, 18,  1};    
              A[1] = new  int[5]{1, 3, 0,  0,  3}; 
              A[2] = new  int[5]{0, 1, 6,  2, 12}; 
              A[3] = new  int[5]{9, 2, 4,  0,  1}; 
    
  • Re: C++ esercizio con matrici

    Alexv ha scritto:


    In creaMatrice
    
    M[i] = new int[c]; //non M[r] 
    
    Queste new nel main non servono a niente, la memoria viene già allocata nella funzione.
    
        int** M = new int*[4];
            for(int i=0; i<4; i++)  
                M[i] = new int[5];
    
    Aggiustato questo funziona, ma c'è un altro errore logico in creaMatrice.
    Grazie mille, potrebbe indicarmi l'errore logico, perché in effetti l'output è diverso da ciò che mi aspetto, ma non riesco a sistemare
  • Re: C++ esercizio con matrici

    Weierstrass ha scritto:


    dialessluca ha scritto:


    Weierstrass ha scritto:


    
        int** A = new int*[4];
        for (int i=0; i<4; i++)
            A[i] = new int[5];
        
        int y [4][5] = { 
                            {1, 0, 3, 18, 1},
                            {1, 3, 0, 0, 3},
                            {0, 1, 6, 2, 12},
                            {9, 2, 4, 0, 1}
                                                };
        for (int i=0; i<4; i++)
            for(int j=0; j<5; j++)
                A[i][j] = y[i][j];
    
    Ma perché tutto questo?
    lo avevo fatto per dichiarare la matrice dinamicamente
    e non puoi farlo così?
    
        int** A    = new int*[4];
              A[0] = new  int[5]{1, 0, 3, 18,  1};    
              A[1] = new  int[5]{1, 3, 0,  0,  3}; 
              A[2] = new  int[5]{0, 1, 6,  2, 12}; 
              A[3] = new  int[5]{9, 2, 4,  0,  1}; 
    
    si giusto, sarebbe sicuramente più efficiente, grazie mille
  • Re: C++ esercizio con matrici

    dialessluca ha scritto:


    Alexv ha scritto:


    In creaMatrice
    
    M[i] = new int[c]; //non M[r] 
    
    Queste new nel main non servono a niente, la memoria viene già allocata nella funzione.
    
        int** M = new int*[4];
            for(int i=0; i<4; i++)  
                M[i] = new int[5];
    
    Aggiustato questo funziona, ma c'è un altro errore logico in creaMatrice.
    Grazie mille, potrebbe indicarmi l'errore logico, perché in effetti l'output è diverso da ciò che mi aspetto, ma non riesco a sistemare
    come non detto, ho risolto
Devi accedere o registrarti per scrivere nel forum
9 risposte