#include <stdio.h>

#define MAXSIZE 10
#define MAXNUM 100

void generateVector(int *v)
{
	int i;

	for(i=0; i<MAXSIZE; i++) {   //indexes in C start on 0.
		v[i] = rand() % MAXNUM; // <--remainder of random value when divided by
	}				 // MAXNUM	
}

void generateMatrix(int m[MAXSIZE][MAXSIZE])  //You need the 2nd dimension specified
{
	int i, j;
    
	for(i=0; i<MAXSIZE; i++) {
		for(j=0;j < MAXSIZE; j++) {
			m[i][j] = rand() % MAXNUM;
		}
	}
}

void printVector(int *v)
{
	int i;

	for(i=0; i<MAXSIZE; i++) {
		printf("%5d", v[i]);   // width of 5 field for each vector value
	}				  // %d means print an int
	printf("\n");
}

void printMatrix(int m[MAXSIZE][MAXSIZE])
{
	int i, j;

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

void vectorSum(int *u, int *v, int *w)
{
	int i;
	for(i=0; i<MAXSIZE; i++) {
        w[i] = u[i] + v[i];
	}
}

int dotProduct(int *u, int *v)
{
	int i,d = 0;
	for(i=0; i<MAXSIZE; i++) {
        d += u[i] * v[i];
	}
	return d;
}

void matrixSum(int u[MAXSIZE][MAXSIZE], int v[MAXSIZE][MAXSIZE], int w[MAXSIZE][MAXSIZE])
{
	int i,j;
	for(i=0; i<MAXSIZE; i++) {
		for(j=0; j<MAXSIZE; j++) {
        	w[i][j] = u[i][j] + v[i][j];
		}
	}
}

void matrixProduct(int u[MAXSIZE][MAXSIZE], int v[MAXSIZE][MAXSIZE], int w[MAXSIZE][MAXSIZE])
{
	int i,j,k;
	for(i=0; i<MAXSIZE; i++) {
		for(j=0; j<MAXSIZE; j++) {
        	w[i][j] = 0;
			for (k=0; k<MAXSIZE; k++) {
				w[i][j] = u[i][k] * v[k][j];
			}
		}
	}
}

int main()
{
	int d;
	int v1[MAXSIZE];
	int v2[MAXSIZE];
	int v3[MAXSIZE];
	int m1[MAXSIZE][MAXSIZE];
	int m2[MAXSIZE][MAXSIZE];
	int m3[MAXSIZE][MAXSIZE];
	int m4[MAXSIZE][MAXSIZE];

	printf("Generating vector 1...\n");
	generateVector(v1);
	printf("Generating vector 2...\n");
	generateVector(v2);

	printf("V1: ");
	printVector(v1);
	printf("V2: ");
	printVector(v2);

	printf("Generating vector 3...\n");
	vectorSum(v1, v2, v3);
	printf("V3: ");
	printVector(v3);
	printf("Generating dot product...\n");
	d = dotProduct(v1, v2);
	printf("DP: %5d\n",d);

	printf("Generating matrix 1...\n");
	generateMatrix(m1);
	printf("Printing the matrix:\n");
	printMatrix(m1);
	printf("Generating matrix 2...\n");
	generateMatrix(m2);
	printf("Printing the matrix:\n");
	printMatrix(m2);

	printf("Generating matrix 3...\n");
	matrixSum(m1, m2, m3);
	printf("M3:\n");
	printMatrix(m3);
	printf("Generating matrix 4...\n");
	matrixProduct(m1, m2, m4);
	printf("M4:\n");
	printMatrix(m4);



	return 0;
}

