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 0Explanation / 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;
}
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.