C++ esercizio con matrici

di Anonimizzato31801 il
9 risposte
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

  • Usa i tag CODE per inserire il codice nel forum o non si capisce nulla.
  • oregon ha scritto:


    Usa i tag CODE per inserire il codice nel forum o non si capisce nulla.
    fatto, penso che così vada bene
  • 
        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?
  • 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.
  • 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
  • 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}; 
    
  • 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
  • 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
  • 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