### Array Representations

Memory Allocations:

Static Memory Allocation -  Static Memory is allocated for declared variables by the compiler during compile time.

Dynamic Memory Allocation - Memory allocation is done at the run time is known as dynamic memory allocation. For Dynamic memory allocation we use malloc function.

Creating a 1D array dynamically:

We first declare a pointer and then use malloc function to create an array in heap. We then assign the values to the dynamic array. After that we can display the dynamic array using loops.

#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p;
int i;

p = (int *)malloc(5 * sizeof(int));
p[0] = 1;
p[1] = 2;
p[2] = 3;
p[3] = 4;
page-7
p[4] = 5;

printf("\n");
for (i = 0; i <=6; i++)
printf("%d ", p[i]);

return 0;
}

Creating a 2D array dynamically:

We first declare a pointer array that is created in the stack and then use malloc function to create 3 different arrays in the heap. After that we can display the dynamic array using loops.

#include <stdio.h>
#include <stdlib.h>
int main()
{
int *A[3];
int i, j;

A[0] = (int *)malloc(4 * sizeof(int));
A[1] = (int *)malloc(4 * sizeof(int));
A[2] = (int *)malloc(4 * sizeof(int));

return 0;
}

Increase array size using pointers:

First we declare two pointers a and b. Then we dynamically create an array of size 5 using malloc function and assign to pointer a. After that we assign values to the array. Now we want to increase the size of the array. So we make another dynamic array of size 10 and assign it to b. Now we make the pointer point to b. Then we free a and make b null.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *a, *b;
int i;
a = (int *)malloc(5 * sizeof(int));
a[0] = 1;
a[1] = 2;
a[2] = 3;
a[3] = 4;
a[4] = 5;

b = (int *)malloc(10 * sizeof(int));

for (i = 0; i < 5; i++)
b[i] = a[i];

free(a);
a = b;
b = NULL;
for (i = 0; i < 5; i++)
printf("%d \n", a[i]);
return 0;
}

1D Array Representation:

Int A[5] = {1,2,3,4,5};
1
2
3
4
5

Add:200  0    1    2    3    4

Address(A[i]) = B + i * w
Here,
i=Index
w=size of data-type

2D Array Representation:

Row Major representation -
Int A[3][4];

 a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23

Converting to row-major :

 a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 23

Address(A[i][j]) = B+ [(i * n) + j] * w
Here,
m=number of rows
n=number of columns
i=row index
j=column index
w=size of data-type

Column Major representation -
Int A[3][4];

 a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23

Converting to column major :

 a00 a10 a20 a01 a11 a21 a02 a12 a22 a03 a13 a23

Address(A[i][j]) = B+ [(j * m) + i] * w
Here,
m=number of rows
n=number of columns
i=row index
j=column index
w=size of data-type

nD Array Representation:

Row Major representation -
Int A[d1][d2][d3][d4]

B + [ (i1*d2*d3*d4) + (i2*d3*d4) + (i3*d4) + i4] * w

Column Major representation -
Int A[d1][d2][d3][d4]

B + [ (i4*d3*d2*d1) + (i3*d2*d1) + (i2*d1) + i1] * w

Question: Given an array A[15][20] with base address 3020 and requires 4 bytes of space. Locate A[12][13] in row and column major order.

Solution :
B=3020 , m=15 , n=20 , i=12 , j=13
Row Major Address (A[12][13]) = B+ [(i * n) + j] * w
= 3020+(12*20+13)*4
= 4032

Column Major Address (A[12][13]) = B+ [(j * m) + i] * w
= 3020+(13*15+12)*4
= 3848

Problem 1: Write a C program to transpose matrices.

#include<iostream>
using namespace std;

int main(){

int A[2][3],B[3][2];

for(int i{0};i<2;i++)
{
for(int j{0};j<3;j++)
{
cout<<"Enter "<<i<<" and "<<j<<" : ";
cin>>A[i][j];
}

for(int i{0};i<2;i++)
{
for(int j{0};j<3;j++)
{
B[j][i]=A[i][j];
}
cout<<endl;
}

for(int i{0};i<3;i++)
{
for(int j{0};j<2;j++)
{
cout<<B[i][j]<<" ";
}
cout<<endl;
}

return 0;
}

Problem 2: Write a C program to multiply two matrices.

#include<iostream>
using namespace std;

int main(){
int r1,r2,c1,c2;

cout<<"Enter number of rows and columns of matrix A : ";
cin>>r1>>c1;

cout<<"------------------------"<<endl;

cout<<"Enter number of rows and columns of matrix B : ";
cin>>r2>>c2;

cout<<"------------------------"<<endl;

if(r2!=c1)
{
cout<<"Multiplication not possible"<<endl;
return 0;
}

int A[r1][c1];
int B[r2][c2];

//storing matrix A
for(int i{0};i<r1;i++)
{
for(int j{0};j<c1;j++)
{
cout<<"Enter matrix A element of row "<<i+1<<" and column "<<j+1<<" : ";
cin>>A[i][j];
}
}

cout<<"------------------------"<<endl;
//storing matrix B
for(int i{0};i<r2;i++)
{
for(int j{0};j<c2;j++)
{
cout<<"Enter matrix B element of row "<<i+1<<" and column "<<j+1<<" : ";
cin>>B[i][j];
}
}

int C[r1][c2];

for(int i{0};i<r1;i++)
{
for(int j{0};j<c2;j++)
{
C[i][j]=0;

for(int k{0};k<c1;k++)
{
C[i][j]+=(A[i][k]*B[k][j]);
}
}
}

cout<<"Matrix multiplication is : "<<endl;
cout<<" ---------------------- "<<endl;
for(int i{0};i<r1;i++)
{
for(int j{0};j<c2;j++)
{
cout<<C[i][j]<<" ";
}
cout<<endl;
}

return 0;
}

Problem 3: Write a C program to reverse the rows of a matrix.

#include<stdio.h>
#define MAX 20
int main(void)
{
int a[MAX][MAX],i,j,m,n,temp,p,q;
printf("Enter the number of rows : ");
scanf("%d",&m);
printf("Enter the number of columns : ");
scanf("%d",&n);

for(i=0; i<m; i++)
{
for(j=0; j<n; j++)
scanf("%d",&a[i][j]);
printf("\n");
}

for(i=0; i<m; i++)
{
for(j=0; j<n; j++)
printf("%4d",a[i][j]);
printf("\n");
}

for(p=0,q=m-1; p<q; p++,q--)
/*Interchange rows p and q*/
for(j=0; j<n; j++)
{
temp=a[p][j];
a[p][j]=a[q][j];
a[q][j]=temp;
}

printf("\n");
for(i=0; i<m; i++)
{
for(j=0; j<n; j++)
printf("%4d",a[i][j]);
printf("\n");
}
return 0;
}

Problem 4: Write a C program to print matrices spiral form.

#include <stdio.h>
#define MAX 20
int main(void)
{
int a[MAX][MAX],i,j,k,m,n,rStart,cStart,rEnd,cEnd;

printf("Enter value of m (rows): ");
scanf("%d", &m);
printf("Enter value of n (columns): ");
scanf("%d", &n);

for(i=0; i<m; i++)
{
for(j=0; j<n; j++)
scanf("%d",&a[i][j]);
printf("\n");
}

for(i=0; i<m; i++)
{
for(j=0; j<n; j++)
printf("%4d", a[i][j]);
printf("\n");
}
printf("\n\n");

for(rStart=0,cStart=0,rEnd=m-1,cEnd=n-1; rStart<=rEnd && cStart<=cEnd; rStart++,cStart++,rEnd--,cEnd--)

{
for(k=cStart; k<=cEnd; k++)
printf("%d* ",a[rStart][k]);
for(k=rStart+1; k<=rEnd; k++)
printf("%d\$ ",a[k][cEnd]);
if(rStart<rEnd)
for(k=cEnd-1; k>=cStart; k--)
printf("%d# ",a[rEnd][k]);
if(cStart<cEnd)
for(k=rEnd-1; k>=rStart+1; k--)
printf("%d& ",a[k][cStart]);
}
return 0;
}

Problem 5: Write a C program to check if the matrix is symmetric or skew symmetric or not.

#include<stdio.h>

int main(){
int A[3][3]{0,1,-2,-1,0,3,2,-3,0};
int B[3][3];
int x=0,y=0;
for(int i{0};i<3;i++)
{
for(int j{0};j<3;j++)
{
B[j][i]=A[i][j];

}
}
for(int i{0};i<3;i++)
{
for(int j{0};j<3;j++)
{
int count=0;
if(A[i][j]!=B[i][j])
x=1;
if (A[i][j] != -B[i][j])
y=1;
}
}
if(x==0)
printf("symmetric");
if(y==0)
printf("skew symmetric");
else
printf("no");
return 0;
}

In the next tutorial we will learn about array abstract data types where we will insert, delete, reverse , merge and do various operations on arrays.