Esercizio matrici

di il
4 risposte

Esercizio matrici

Salve, potreste dirmi cosa c'è di sbagliato in questo esercizio?
quando eseguo il programma mi viene stampato solo il return delle prime due funzioni, e non la matrice finale...
#include <iostream>
#include <vector>
using namespace std;

/*1. 'controllaColonne' che riceve una matrice A, e restituisce true se tutte le
sue colonne hanno la stessa somma, e false altrimenti.*/

bool controllaColonne (int** A, int r, int c)
{
    
    int valore = 0;
    for(int j=0; j<c; j++)
    {
        int somma = 0;
        valore += A[0][c];
        
        for(int i=1; i<r; i++)
               somma += A[i][c]; 
                
        if (somma != valore)
            return false;
    }
    
    return true;
            
}

/*2. 'estraiVettore' che riceve una matrice di interi A, e restituisce un 
vettore V contenente i valori minimi presenti sulle diverse righe di A. */

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


/* costruisciMatrice' che riceve una matrice A ed un intero k, e restituisce 
una matrice M. Il parametro k può assumere i valori 0 o 1: se k vale 0 la 
matrice M conterrà le colonne di A di indice pari, mentre se k vale 1 la matrice
M conterrà le colonne di A di indice dispari.*/

int** costruisciMatrice(int** A, int r, int c, bool k)
{
    int** M = new int*[r];
    int colonne;
    if (k == 0)
        colonne = (c/2)+1;
    else
        colonne = c/2;
    
    for(int i=0; i<r; i++)
        M[r] = new int[colonne];
    
    for(int i=0; i<r; i++)
        for(int j=0; j<colonne; j++)
            {
                if (k==0 && (j % 2 == 0))
                    M[i][j] = A[i][j];
                    
                else
                    if(k==1 && (j % 2 != 0))
                        M[i][j] = A[i][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*[5];
    A[0] = new int[5]{2, 3, 0, 2, 1};
    A[1] = new int[5]{1, 0, -3, 7, 1};
    A[2] = new int[5]{1, 3, 0, 0, 3};
    A[3] = new int[5]{0, -1, 6, -2, 1};
    A[4] = new int[5]{3, 2, 4, 0, 1};
    
    cout << controllaColonne(A, 5, 5) << endl;
    
    vector<int> v = estraiVettore(A, 5, 5);
    cout << "v = [ ";
    for (int i=0; i<5; i++)
        cout << v[i] << " ";
    cout << "]" << endl;
    
    int** M = costruisciMatrice(A, 5, 5, 0);
    for (int i=0; i<5; i++)
    {
        for (int j=0; j<5; j++)
            cout << M[i][j] << " ";
        cout << "\t";
    }
    
    return 0;
    
}

4 Risposte

  • Re: Esercizio matrici

    La prima funzione è errata
    
    bool controllaColonne (int** A, int r, int c)
    {
        int i, j, somma, valore = 0;
        
        for(i=0; i<r; i++)
            valore += A[i][0];
     
        for(j=1; j<c; j++){
            somma = 0;
            for(i=0; i<r; i++)
                somma += A[i][j];
                    
            if (somma != valore)
                return false;
        }
        
        return true;
    }
    
    
        int** A = new int*[5];
        A[0] = new int[5]{2,  3,  0,  2, 1};
        A[1] = new int[5]{1,  0, -3,  7, 1};
        A[2] = new int[5]{1,  3,  0,  0, 3};
        A[3] = new int[5]{0, -1,  6, -2, 1};
        A[4] = new int[5]{3,  2,  4,  0, 1};
        
        cout << boolalpha << controllaColonne(A, 5, 5) << endl; // true
    
    
        int** A = new int*[5];
        A[0] = new int[5]{2,  3,  0,  2, 0};
        A[1] = new int[5]{1,  0, -3,  7, 1};
        A[2] = new int[5]{1,  3,  0,  0, 3};
        A[3] = new int[5]{0, -1,  6, -2, 1};
        A[4] = new int[5]{3,  2,  4,  0, 1};
        
        cout << boolalpha << controllaColonne(A, 5, 5) << endl; // false
    
  • Re: Esercizio matrici

    Weierstrass ha scritto:


    La prima funzione è errata
    
    bool controllaColonne (int** A, int r, int c)
    {
        int i, j, somma, valore = 0;
        
        for(i=0; i<r; i++)
            valore += A[i][0];
     
        for(j=1; j<c; j++){
            somma = 0;
            for(i=0; i<r; i++)
                somma += A[i][j];
                    
            if (somma != valore)
                return false;
        }
        
        return true;
    }
    
    
        int** A = new int*[5];
        A[0] = new int[5]{2,  3,  0,  2, 1};
        A[1] = new int[5]{1,  0, -3,  7, 1};
        A[2] = new int[5]{1,  3,  0,  0, 3};
        A[3] = new int[5]{0, -1,  6, -2, 1};
        A[4] = new int[5]{3,  2,  4,  0, 1};
        
        cout << boolalpha << controllaColonne(A, 5, 5) << endl; // true
    
    
        int** A = new int*[5];
        A[0] = new int[5]{2,  3,  0,  2, 0};
        A[1] = new int[5]{1,  0, -3,  7, 1};
        A[2] = new int[5]{1,  3,  0,  0, 3};
        A[3] = new int[5]{0, -1,  6, -2, 1};
        A[4] = new int[5]{3,  2,  4,  0, 1};
        
        cout << boolalpha << controllaColonne(A, 5, 5) << endl; // false
    

    grazie, invece per la terza funzione?
  • Re: Esercizio matrici

    
        for(int i=0; i<r; i++)
            M[r] = new int[colonne];
    
    Segmentation fault perché lasci dei puntatori a zero che poi utilizzi nelle istruzioni successive. Correggi
  • Re: Esercizio matrici

    Weierstrass ha scritto:


    
        for(int i=0; i<r; i++)
            M[r] = new int[colonne];
    
    Segmentation fault perché lasci dei puntatori a zero che poi utilizzi nelle istruzioni successive. Correggi
    perfetto, grazie mille
Devi accedere o registrarti per scrivere nel forum
4 risposte