Codice errato

« Older   Newer »
 
  Share  
.
  1.     Like  
     
    .
    Avatar

    Register

    Group
    Member
    Posts
    82
    Reputation
    0

    Status
    Offline
    #include <stdio.h>
    #include <stdlib.h>

    #define MAXDIM 100

    typedef struct matrice_t {
    int* array;
    int row_count;
    int column_count;
    } matrice;

    //Funzioni di accesso alla matrice
    void LeggereRiga(matrice m, int row_index, int **out);
    void LeggereColonna(matrice m, int column_index, int **out);
    int LeggereValore(matrice m, int row_index, int column_index);
    void ScrivereRiga(matrice m, const int *row, int row_index);
    void ScrivereColonna(matrice m, const int *column, int column_index);
    void ScrivereValore(matrice m, int value, int row_index, int column_index);

    //Altre operazioni presenti all'interno della matrice
    matrice sommaMatrici(matrice a, matrice b);
    matrice prodottoScalareMatrice(matrice mat, int scalare);
    matrice calcolaTrasposta(matrice mat);
    matrice prodottoMatrici(matrice a, matrice b);

    //Funzioni per test
    void stampaValori(matrice m);
    matrice inserimentoValori(matrice m);
    int leggereNumero(int limInf, int limSup);
    matrice caricaMatrice();

    int main(void) {
    matrice a; // matrice di numeri interi - matrice
    matrice b; // matrice di numeri interi - matrice
    matrice somma; //matrice somma di a e b - matrice
    matrice prodotto; // matrice prodotto tra a e b - matrice
    int scalare; //numero intero da moltiplicare ad a - numero intero
    printf("Caricamento della prima matrice: \n");
    a = caricaMatrice();
    printf("Caricamento della seconda matrice: \n");
    b = caricaMatrice();
    printf("Matrici inserite: \n");
    printf("\tA\n");
    stampaValori(a);
    printf("\tB\n");
    stampaValori(b);
    printf("Trasposta della matrice di A\n");
    stampaValori(calcolaTrasposta(a));
    printf("Inserisci un numero per il prodotto scalare -> ");
    scanf("%d", &scalare);
    printf("Matrice tra A e B per scalare:\n");
    stampaValori(prodottoScalareMatrice(a, scalare));
    printf("Calcolo somma tra A e B\n");
    somma = sommaMatrici(a, b);
    if ((readlines(somma) == -1) && (leggereColonne(somma) == -1)) {
    printf(
    "Non è possibile calcolare la somma, in quanto A e B non sono dello stesso tipo.\n");
    }
    else {
    printf("Somma della matrice: \n");
    stampaValori(somma);
    }
    printf("Calcola il prodotto tra A e B\n");
    prodotto = prodottoMatrici(a, b);
    if ((leggereRighe(prodotto) == -1) && (leggereColonne(prodotto) == -1)) {
    printf(
    "Non è possibile calcolare la somma, in quanto A e B non sono compatibili.\n");
    }
    else {
    printf("Prodotto della matrice: \n");
    stampaValori(prodotto);
    }

    system("pause");
    return 0;
    }

    /*
    * Nome: leggereRighe
    * Descrizione: La funzione restituisce il numero di righe della matrice
    * INPUT: mat - Matrice di dimensione nxm di cui leggere il numero delle righe , n>1 , m>1 - matrice
    * OUTPUT: r - numero di righe della matrice mat - numero naturale - >0
    */

    void LeggereRiga(matrice m, int row_index, int **out) {
    if (row_index > m.row_count)
    return;
    *out = malloc( sizeof(int) * m.column_count);
    int base_index = row_index * m.column_count;
    int i = 0;
    while (i < m.column_count) {
    *out[i] = m.array[i + base_index];
    ++i;
    }
    }

    /*
    * Nome: leggereColonne
    * Descrizione: La funzione restituisce il numero di colonne della matrice
    * INPUT: mat - Matrice di dimensione nxm di cui leggere il numero delle colone , n>1 , m>1 - matrice
    * OUTPUT: c - numero di colonne della matrice mat - numero naturale - >0
    */
    void leggereColonna(matrice m, int column_index, int **out) {
    if (column_index > m.column_count)
    return;
    *out = malloc( sizeof(int) * m.row_count);
    int i = 0;
    while (i < m.column_count) {
    *out[i] = m.array[column_index + (i * m.column_count)];
    ++i;
    }
    }

    /*
    * Nome: leggereValore
    * Descrizione: La funzione restituisce un valore della matrice
    * INPUT: mat - Matrice di dimensione nxm di cui leggere un valore , n>1 , m>1 - matrice
    * r - Numero di riga da cui leggere il valore - numero naturale - >0
    * c - Numero di colonna da cui leggere il valore - numero naturale - >0
    * OUTPUT: valore - Valore che si trova nella r-esima riga e c-esima colonna del campo valori di mat - numero intero
    * LAVORO: i - Posizione nel campo di valori di mat - numero intero - >=0 && < n*m
    */
    int LeggereValore(matrice m, int row_index, int column_index) {
    if (row_index * m.column_count + column_index >= m.row_count * m.column_count)
    return -1;
    return m.array[row_index * m.column_count + column_index];
    }

    /*
    * Nome: scrivereRighe
    * Descrizione: Modifica il numero delle righe della matrice
    * INPUT: mat - Matrice di dimensione nxm di cui scrivere il numero delle righe, n>1 , m>1 - matrice
    * r - Numero di righe da inserire nel campo righe della matrice mat - numero naturale - >0
    * OUTPUT: mat - Matrice di dimensione rxm con il campo righe modificato, r>1 , m>1 - tebella
    */
    void ScrivereRiga(matrice m, const int * row, int row_index) {
    if (row_index > m.row_count + 1) {
    return;
    }
    int i, padding;
    if (row_index == m.row_count + 1) {
    ++m.row_count;
    m.array = realloc(m.array, m.row_count * m.column_count);
    }
    padding = row_index * m.column_count;
    i = 0;
    while (i < m.column_count) {
    m.array[i + padding] = row[i];
    ++i;
    }
    }

    /*
    * Nome: scrivereColonne
    * Descrizione: Modifica il numero delle colonne della matrice
    * INPUT: mat - Matrice di dimensione nxm di cui scrivere il numero delle colonne, n>1, m>1 - matrice
    * c - Numero di colonne da inserire nel campo colonne della matrice mat - numero naturale - >0
    * OUTPUT: mat -Matrice di dimensione nxc con il numero di colonne modificato, n>1, c>1 - tebella
    */
    void ScrivereColonna(matrice m, const int *column, int column_index) {
    if (column_index > m.column_count + 1) {
    return;
    }
    int i;
    if (column_index == m.column_count + 1) {
    ++m.column_count;
    m.array = realloc(m.array, m.row_count * m.column_count);
    i = m.row_count*m.column_count-2;
    int curr_row=m.row_count-1;
    int quantity_shifted = 0;
    while(i>column_index){
    if(quantity_shifted==m.column_count-1){
    --i;
    quantity_shifted = 0;
    ++curr_row;
    }
    int other_pos = column_index-(m.row_count-curr_row);
    m.array[i] = m.array[other_pos];
    --i;
    ++quantity_shifted;
    }
    }
    i = 0;
    while (i < m.row_count) {
    m.array[i * m.column_count + column_index] = column[i];
    ++i;
    }
    }

    /*
    * Nome: scrivereValore
    * Descrizione: La funzione scrive un valore all'interno di una matrice in una specifica posizione
    * INPUT: mat - Matrice di dimensione nxm su cui scrivere un valore, n>1, m>1 - matrice
    * r - Numero di riga su cui scrivere il valore - numero naturale - >0
    * c - Numero di colonna su cui scrivere il valore - numero naturale - >0
    * valore : Valore da inserire nella r-esima riga e c-esima colonna della riga nel campo valori di mat - numero intero
    * OUTPUT: mat - Matrice con il valore nella r-esima riga e c-esima colonna del campo valori modificato, dimensione nxm, n>1, m>1 - matrice
    * LAVORO: i - Posizione nel campo di valori di mat - numero intero - >=0 && < n*m
    */
    void ScrivereValore(matrice m, int value, int row_index, int column_index) {
    if (row_index * m.column_count + column_index >= m.row_count * m.column_count)
    return;
    m.array[row_index * m.column_count + column_index] = value;
    }

    /*
    * Nome: sommaMatrici
    * Descrizione: La funzione calcola, se possibile, la matrice derivata dalla somma di due matrici dello stesso tipo
    * INPUT: a - Matrice di dimensione nxm , n>1, m>1. Da sommare alla matrice b - matrice
    * b - Matrice di dimensione nxm , n>1, m>1. Da sommare alla matrice b - matrice
    * OUTPUT: s - Matrice derivata dalla somma di a e b, dimensione nxm ,n>1, m>1 (dimensione -1x-1 in caso di errore) - matrice
    * LAVORO: i - Indice per scandire le righe di mat e le colonne delle matrici a,b,s - numero intero - <=n
    * j - Indice per scandire le colonne di mat e le righe delle matrici a,b,s - numero intero - <=n
    */
    matrice sommaMatrici(matrice a, matrice b) {
    matrice s;
    s.valori = malloc(sizeof(int) * MAXDIM);
    int i;
    int j;
    if ((leggereRighe(a) == leggereRighe(b))
    && (leggereColonne(a) == leggereColonne(b))) {
    s = scrivereRighe(s, leggereRighe(a));
    s = scrivereColonne(s, leggereColonne(a));
    i = 1;
    while (i <= leggereRighe(a)) {
    j = 1;
    while (j <= leggereColonne(a)) {
    s = scrivereValore(s, i, j,
    leggereValore(a, i, j) + leggereValore(b, i, j));
    j++;
    }
    i++;
    }
    }
    else {
    s = scrivereRighe(s, -1);
    s = scrivereColonne(s, -1);
    }
    return s;
    }

    /*
    * Nome: prodottoScalareMatrice
    * Descrizione: La funzione calcola il prodotto scalare tra la matrice e un numero
    * INPUT: mat - Matrice di dimensione nxm di cui calcolare il prodotto scalare, n>1, m>1 - matrice
    * scalare - Valore da moltiplicare a mat - numero intero - /
    * OUTPUT: p - Matrice risultato del prodotto di mat per scalare, dimensione nxm, n>1, m>1 - matrice
    * LAVORO: i - Indice per scandire le righe di mat e p- numero intero - <=n
    * j - Indice per scandire le colonne di mat e p - numero intero - <=m
    */
    matrice prodottoScalareMatrice(matrice mat, int scalare) {
    matrice p;
    p.valori = malloc(sizeof(int) * MAXDIM);
    int i;
    int j;
    p = scrivereRighe(p, leggereRighe(mat));
    p = scrivereColonne(p, leggereColonne(mat));
    i = 1;
    while (i <= leggereRighe(mat)) {
    j = 1;
    while (j <= leggereColonne(mat)) {
    p = scrivereValore(p, i, j, leggereValore(mat, i, j) * scalare);
    j++;
    }
    i++;
    }
    return p;
    }

    /*
    * Nome: calcolaTrasporta
    * Descrizione: La funzione calcola la matrice trasporta di una matrice
    * INPUT: mat - Matrice di dimensione nxm di cui calcolare la trasposta, n>1, m>1 - matrice
    * OUTPUT: t - Matrice trasposta della matrice mat di dimensione mxn, m>1, n>1 - matrice
    * LAVORO: i - Indice per scandire le righe di mat e le colonne di t - numero intero - <=n
    * j - Indice per scandire le colonne di mat e le righe di t - numero intero - <=m
    */
    matrice calcolaTrasposta(matrice mat) {
    matrice t;
    t.valori = malloc(sizeof(int) * MAXDIM);
    int i;
    int j;
    t = scrivereRighe(t, leggereColonne(mat));
    t = scrivereColonne(t, leggereRighe(mat));
    i = 1;
    while (i <= leggereRighe(mat)) {
    j = 1;
    while (j <= leggereColonne(mat)) {
    t = scrivereValore(t, j, i, leggereValore(mat, i, j));
    j++;
    }
    i++;
    }
    return t;
    }

    /*
    *
    * Nome: prodottoMatrici
    * Descrizione: La funzione calcola, se possibile, la matrice derivata dal prodotto di due matrici "compatibili" (le colonne della prima sono uguali alle righe della seconda)
    * INPUT: a - Matrice di dimensione nxm , n>1, m>1. Da moltiplicare alla matrice b - matrice
    * b - Matrice di dimensione nxm , n>1, m>1. Da moltiplicare alla matrice b - matrice
    * OUTPUT: p - Matrice derivata dal prodotto tra a e b, dimensione nxp , n>1, m>1 (dimensione -1x-1 in caso di errore) - matrice
    * LAVORO: i - Indice per scandire le righe - numero intero - <=n
    * j - Indice per scandire le colonne - numero intero - <=n
    * k - Indice utilizzato per il prodotto riga per colonna - numero intero - <=m
    *
    */

    matrice prodottoMatrici(matrice a, matrice b) {
    matrice p;
    p.valori = malloc(sizeof(int) * MAXDIM);
    int i;
    int j;
    int k;
    if (leggereColonne(a) == leggereRighe(b)) {
    p = scrivereRighe(p, leggereRighe(a));
    p = scrivereColonne(p, leggereColonne(b));
    i = 1;
    while (i <= leggereRighe(a)) {
    j = 1;
    while (j <= leggereColonne(p)) {
    p = scrivereValore(p, i, j, 0);
    k = 1;
    while (k <= leggereRighe(b)) {
    p = ScrivereValore(p, i, j,
    leggereValore(p, i, j)
    + (leggereValore(a, i, k)
    * leggereValore(b, k, j)));
    k++;
    }
    j++;
    }
    i++;
    }
    }
    else {
    p = scrivereRighe(p, -1);
    p = scrivereColonne(p, -1);
    }
    return p;
    }

    /*
    * Nome: stampaValori
    * Descrizione: Stampa a schermo tutti i valori presenti in una matrice
    * INPUT: mat - matrice di cui stampare tutti gli elementi dimensione nxm, n>1, m>1 - matrice
    * OUTPUT: /
    * LAVORO: i: contatore delle righe della matrice mat - numero naturale - >0
    * j: contatore delle colonne della matrice mat - numero naturale - >0
    */
    void stampaValori(matrice mat) {
    int i;
    int j;
    i = 1;
    while (i <= leggereRighe(mat)) {
    j = 1;
    while (j <= leggereColonne(mat)) {
    printf("%d\t", leggereValore(mat, i, j));
    j++;
    }
    i++;
    printf("\n");
    }
    return;
    }

    /*
    * Nome: InserimentoValori
    * Descrizione: Consente l'inserimento dei valori all'intero della matrice
    * INPUT: mat - matrice di cui inserire gli elementi, dimensione nxm, n>1, m>1 - matrice
    * OUTPUT: mat - matrice con gli elementi inseriti, dimensione nxm, n>1, m>1 - matrice
    * LAVORO: i: contatore delle righe della matrice mat - numero naturale - >0
    * j: contatore delle colonne della matrice mat - numero naturale - >0
    * valore: valore da stampare a schermo - numero intero
    */
    matrice inserimentoValori(matrice mat) {
    int i;
    int j;
    int valore;
    i = 1;
    while (i <= leggereRighe(mat)) {
    j = 1;
    while (j <= leggereColonne(mat)) {
    printf("Inserisci elemento in riga %d e colonna %d :", i, j);
    scanf("%d", &valore);
    mat = scrivereValore(mat, i, j, valore);
    j++;
    }
    i++;
    }
    return mat;
    }

    /*
    * Nome: CaricaMatrice
    * Descrizione: Questa funzione consente di caricare un intera matrice
    * INPUT : /
    * OUTPUT : mat - Matrice di numeri interi i cui valori sono stati caricati - matrice
    * LAVORO: righe - Numero di righe della matrice - numero naturale - 0<r<maxdim
    * colonne - Numero di colonne della matrice - numero naturale - 0<c<maxdim
    */
    matrice caricaMatrice() {
    matrice mat;
    mat.valori = malloc(sizeof(int) * MAXDIM);
    int righe;
    int colonne;
    do
    {
    printf("La matrice può avere al massimo: %d elementi\n", MAXDIM);
    printf("Inserisci il numero delle righe:\n");
    righe = leggereNumero(1, MAXDIM);
    printf("Inserisci il numero delle colonne: \n");
    colonne = leggereNumero(1, MAXDIM);
    } while ((righe * colonne) > MAXDIM);
    mat = scrivereRighe(mat, righe);
    mat = scrivereColonne(mat, colonne);
    printf("Inserisci i valori: \n");
    mat = inserimentoValori(mat);
    return mat;
    }

    /*
    * Nome: LeggereNumero
    * Descrizione: Consente l'inserimento di un numero compreso in un certo intervallo
    * INPUT: limInf - Limite inferiore dell'intervallo - numero intero
    * limSup - Limite superiore dell'intervallo - numero intero
    * OUTPUT: n - valore letto da tastiera compreso nell'intervallo - numero intero - limInf<=n<=limSup
    */
    int leggereNumero(int limInf, int limSup) {
    int n;
    do {
    printf("Inserisci un numero compreso tra %d e %d : -> ", limInf, limSup);
    scanf("%d", &n);
    } while (n < limInf || n > limSup);
    return n;
    }
     
    .
0 replies since 6/1/2022, 12:57   18 views
  Share  
.