Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

COMPLETE THIS PROGRAM IN C USING THE TEMPLATE BELOW: TEMPLATE: #include <stdio.h

ID: 3724177 • Letter: C

Question

COMPLETE THIS PROGRAM IN C USING THE TEMPLATE BELOW:

TEMPLATE:

#include <stdio.h>

#include <stdlib.h>

#include <assert.h>

struct Matrix {

size_t row;

size_t col;

double **data;

};

typedef struct Matrix TMatrix;

/*

* Creates and returns a matrix of size rows x cols

* - rows : (non-negative value) giving the number of rows

* - cols : (non-negative value) giving the number of columns

* If the allocation is not successful, the function should return NULL

* If the allocation is successful, the mat field of the ADT should

* point to an array of pointers (representing the rows) and each pointer

* in that array should point to an array of double representing the values

* in that row.

*/

TMatrix * newMatrix(size_t rows, size_t cols)

{

// TODO

return NULL;

}

/*

* This function is responsible for deallocating the dynamic memory

* currently used by this matrix. Namely, it should deallocate the rows

* and the array of row storage.

*/

void freeMatrix(TMatrix * m)

{

/*

Free the space for a matrix; the number of rows

may be needed if each row is allocated with a

separate malloc/calloc

*/

// TODO

if (m == NULL) /* remember to check m == NULL in every function */

return;

}

/*

* This function takes as input a matrix ADT and reads, from the standard

* input, a collection of row x col doubles representing the content of the

* matrix. Note that the content of the matrix should be given in row-major

* order. Namely, the matrix

* 1 2 3

* 4 5 6

* 7 8 9

* should be conveyed with a white-space separated sequence of 9 numbers:

* 1 2 3 4 5 6 7 8 9

* If the input is malformed, the reading should be interrupted and the

* function shall return the value 0 to report a failed read.

* If the input is well-formed, the reading should complete and the function

* shall return the value 1.

*/

int readMatrix(TMatrix * m)

{

/*

Read in from standard input the elements of a

rows X cols matrix, given row by row, and within

a row in increasing column order

*/

if (m == NULL)

return 0;

// TODO

return 1;

}

/*

* The transposeMatrix function takes as input a matrix ADT m and returns a

* new TMatrix ADT that holds the transpose of m. Transposition should run in

* O(n x m) (where n is the # of rows and m the # of columns).

* If memory allocation for the transpose failed, the routine should return

* a 0x0 matrix ADT.

* Transposition follows the usual mathematical definition of transposition.

*/

TMatrix * transposeMatrix(TMatrix * m)

{

/*

   Allocate and return the address of a matrix that contains

   the element of "a" in transposed order (with rows and columns

   swapped)

*/

// TODO

if (m == NULL)

return NULL;

TMatrix *t = newMatrix(m->col, m->row);

return t;

}

/*

* The printMatrix function takes a matrix ADT as input and produces, on the

* standard output, a representation of the matrix in row-major format. For

* instance, the 3x3 identity matrix should print on 3 lines as:

* 1 0 0

* 0 1 0

* 0 0 1

*/

void printMatrix(TMatrix * m)

{

/*

   Print elements of rows X cols matrix a to standard output,

   one line per row

*/

if (m == NULL)

return;

for (int i = 0; i < m->row; i++) {

for (int j = 0; j < m->col; j++)

printf("%g ", m->data[i][j]);

printf(" ");

}

}

int main()

{

int m = 0, n = 0;

printf("Enter m and n (<= 0 to exit): ");

scanf("%d %d", &m, &n);

while ((m > 0) && (n > 0)) {

TMatrix * a = newMatrix(m, n);

if (a != NULL) {

printf("Enter %dx%d matrix: ", m, n);

if (readMatrix(a)) {

printf("Input matrix: ");

printMatrix(a);

TMatrix *t = transposeMatrix(a);

if (t != NULL) {

printf("Transposed matrix: ");

printMatrix(t);

freeMatrix(t);

printf(" ");

}

} else {

printf("Error while reading the matrix. ");

}

freeMatrix(a);

}

printf("Enter m and n (<= 0 to exit): ");

int res = scanf("%d %d", &m, &n);

if (res != 2)

m = 0;

}

return 0;

}

Exercise 1. Matrix Transposition (50 points) Matrices can be represented in C as two-dimensional arrays, i.e., arrays of arrays. For example, we can declare a 3 × 3 natrix of double-precision real values by double a [4] [3] However, this representation is not flexible if we want to have an abstract data type that can handle matrices of any size. A better approach is to define such an abstract data type as follows 1 struct Matrix f 2size t row; 3 size t col; double **data; 6 7 typedef struct Matrix TMatrix; Where row and col are numerical attributes representing the numbers of rows and columns of the matrix and mat is a double pointer to double to capture the actual matrix values. Namely, data is an array of pointers to arrays of doubles (each nested array representing a row of the matrix. For instance, a 4 × 3 matrix can be pictured as row: 4 col: 3 data Row 3 Row 2 Row 1 Row 0

Explanation / Answer

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

struct Matrix {
   size_t row;
   size_t col;
   double **data;

};

typedef struct Matrix TMatrix;

/*

* Creates and returns a matrix of size rows x cols

* - rows : (non-negative value) giving the number of rows

* - cols : (non-negative value) giving the number of columns

* If the allocation is not successful, the function should return NULL

* If the allocation is successful, the mat field of the ADT should

* point to an array of pointers (representing the rows) and each pointer

* in that array should point to an array of double representing the values

* in that row.

*/

TMatrix * newMatrix(size_t rows, size_t cols)

{

    TMatrix *t=(TMatrix *)malloc(sizeof(TMatrix));
    t->row=rows;
    t->col=cols;
    int i;
    double **arr = (double **)malloc(rows * sizeof(double *));
    for (i=0; i<rows; i++)
         arr[i] = (double *)malloc(cols * sizeof(double));

         t->data=arr;

         if(t!=NULL)
         return t;
         else
         return NULL;

}

/*

* This function is responsible for deallocating the dynamic memory

* currently used by this matrix. Namely, it should deallocate the rows

* and the array of row storage.

*/

void freeMatrix(TMatrix * m)

{
   int i=0;
       for( i = 0; i < m->row; i++)
   {
       free(*(m->data+i));
   }
   free(m->data);
   free(m);


    /*

        Free the space for a matrix; the number of rows

        may be needed if each row is allocated with a

        separate malloc/calloc

    */

    // TODO

    if (m == NULL)     /* remember to check m == NULL in every function */

        return;

}

/*

* This function takes as input a matrix ADT and reads, from the standard

* input, a collection of row x col doubles representing the content of the

* matrix. Note that the content of the matrix should be given in row-major

* order. Namely, the matrix

* 1 2 3

* 4 5 6

* 7 8 9

* should be conveyed with a white-space separated sequence of 9 numbers:

* 1 2 3 4 5 6 7 8 9

* If the input is malformed, the reading should be interrupted and the

* function shall return the value 0 to report a failed read.

* If the input is well-formed, the reading should complete and the function

* shall return the value 1.

*/

int readMatrix(TMatrix * m)

{

    /*

        Read in from standard input the elements of a

        rows X cols matrix, given row by row, and within

        a row in increasing column order

    */

     int i=0,j=0;
     for(i=0;i<m->row;i++)
     {
        for(j=0;j<m->col;j++)
        {
           scanf("%lf",&(m->data[i][j]));
        }
     }

    if (m == NULL)

        return 0;

    // TODO

    return 1;

}

/*

* The transposeMatrix function takes as input a matrix ADT m and returns a

* new TMatrix ADT that holds the transpose of m. Transposition should run in

* O(n x m) (where n is the # of rows and m the # of columns).

* If memory allocation for the transpose failed, the routine should return

* a 0x0 matrix ADT.

* Transposition follows the usual mathematical definition of transposition.

*/

TMatrix * transposeMatrix(TMatrix * m)

{

    /*

       Allocate and return the address of a matrix that contains

       the element of "a" in transposed order (with rows and columns

       swapped)

    */

    // TODO

    if (m == NULL)

        return NULL;

    TMatrix *t = newMatrix(m->col, m->row);
     int i, j;
    for (i = 0; i < m->col; i++)
        for (j = 0; j < m->row; j++)
            t->data[i][j] = m->data[j][i];

    return t;

}

/*

* The printMatrix function takes a matrix ADT as input and produces, on the

* standard output, a representation of the matrix in row-major format. For

* instance, the 3x3 identity matrix should print on 3 lines as:

* 1 0 0

* 0 1 0

* 0 0 1

*/

void printMatrix(TMatrix * m)

{

    /*

       Print elements of rows X cols matrix a to standard output,

       one line per row

    */

    if (m == NULL)

        return;
        int i,j;

    for ( i = 0; i < m->row; i++) {

        for ( j = 0; j < m->col; j++)

            printf("%g ", m->data[i][j]);

        printf(" ");

    }

}

int main()

{

    int     m = 0, n = 0;

    printf("Enter m and n (<= 0 to exit): ");

    scanf("%d %d", &m, &n);

    while ((m > 0) && (n > 0)) {

        TMatrix * a = newMatrix(m, n);

        if (a != NULL) {

            printf("Enter %dx%d matrix: ", m, n);

            if (readMatrix(a)) {

                printf("Input matrix: ");

                printMatrix(a);

                TMatrix *t = transposeMatrix(a);

                if (t != NULL) {

                    printf("Transposed matrix: ");

                    printMatrix(t);

                    freeMatrix(t);

                    printf(" ");

                }

            } else {

                printf("Error while reading the matrix. ");

            }

            freeMatrix(a);

        }

        printf("Enter m and n (<= 0 to exit): ");

        int res = scanf("%d %d", &m, &n);

        if (res != 2)

            m = 0;

    }

    return 0;

}

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote