Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
5.7 kB
1
Indexable
Never
// Course: Advanced C programming
// exercise 2, question 1
// file name: ex2_q1.c

// --------------------------- //
//
//	Assigned by:
//		Student1_Full_Name #ID
//		Student2_Full_Name #ID
//
// --------------------------- //

// --------------------------------------- //
// Include and definition package section:
// --------------------------------------- //
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define scanf_s scanf
#define ROWS 4
#define COLS 4
// --------------------------------------- //
// Types declration section:
// --------------------------------------- //
typedef struct fraction
{
	int num, numerator, denominator;
} fraction;
// --------------------------------------- //
// Functions declration section:
// --------------------------------------- //

fraction** createMatrix(int rows, int cols);
fraction** matrixAverageNeighbor(int A[][COLS], int rows, int cols);
fraction neighborFractionAverage(int A[][COLS], int i, int j, int rows, int cols);
void printMatrix(fraction** B, int rows, int cols);
void freeMatrix(fraction** B, int rows);
fraction doubleToFraction(double num);
// --------------------------------------- //
// Main section:
// --------------------------------------- //
int main()
{
	fraction** B;
	int A[ROWS][COLS] = {
		{5, 12, 6, 8},
		{4, 7, 0, 9},
		{13, 20, 8, 2},
		{18, 0, 2, 6}
	};

	// Start Program:
	printf("Start Program\n");

	// call functions:
	B = matrixAverageNeighbor(A, ROWS, COLS);

	// write output:
	printf("Output:\n");
	printMatrix(B, ROWS, COLS);

	// free matrix:
	freeMatrix(B, ROWS);

	return 0;
}
// --------------------------- //

/// <summary>
/// This code required one extra important function.
/// Think hard about what it should be.
/// </summary>
/// <params>You decide</params>
/// <returns>You decide</returns>
fraction doubleToFraction(double num)
{
	fraction result;
	int currnum = (int)num, gcd;
	double denominator = num - currnum;
	int a = 10, b = (denominator * 10), temp;
	while (b != 0)
	{
		temp = b;
		b = a % b;
		a = temp;
	}
	gcd = a;
	result.num = currnum;
	result.numerator = (denominator * 10) / gcd;
	result.denominator = 10 / gcd;
	return result;
}


//}
/// <summary>
/// This function allocate a dynamic matrix from type fraction.
/// </summary>
/// <param>int rows - the number of rows in the matrix</param>
/// <param>int cols - the number of colums in the matrix</param>
/// <returns>allocated empty matrix B from type fraction</returns>
fraction** createMatrix(int rows, int cols) //3 4
{
	int i;
	fraction** mat = NULL;
	mat = (fraction**)calloc(rows, sizeof(fraction*));
	for (i = 0; i < rows; i++)
	{
		mat[i] = (fraction*)calloc(cols, sizeof(fraction));
	}
	return mat;
}

// --------------------------- //

/// <summary>
/// The function receives a static matrix 
/// and for each cell in the matrix calculates 
/// the average of its neighbors.  
/// </summary>
/// <param>int A[][COLS] - the static matrix</param>
/// <param>int rows - the number of rows in the matrix</param>
/// <param>int cols - the number of colums in the matrix</param>
/// <returns>matrix B from type fraction</returns>
fraction** matrixAverageNeighbor(int A[][COLS], int rows, int cols)
{
	fraction** B = createMatrix(rows, cols);
	int i, j;
	for (i = 0; i < rows; i++) {
		for (j = 0; j < cols; j++) {
			B[i][j] = neighborFractionAverage(A, i, j, rows, cols);
		}
	}
	return B;

}
// --------------------------- //

/// <summary>
/// The function receives a static matrix, and a cell value,
/// and calculates the average of its neighbors.  
/// </summary>
/// <param>int A[][COLS] - the static matrix</param>
/// <param>int i - the cell row number in matrix</param>
/// <param>int j - the cell colum number in the matrix</param>
/// <param>int rows - the number of rows in the matrix</param>
/// <param>int cols - the number of colums in the matrix</param>
/// <returns>value from type fraction</returns>
fraction neighborFractionAverage(int A[][COLS], int i, int j, int rows, int cols)
{
	int sum = 0, count = 0, r, c;
	double resultdouble;
	fraction result;
	for (r = i - 1; r <= i + 1; r++) {
		for (c = j - 1; c <= j + 1; c++) {
			if (r >= 0 && r < rows && c >= 0 && c < cols && !(r == i && c == j)) {
				sum += A[r][c];
				count++;
			}
		}
	}
	resultdouble = (double)sum / count;
	result = doubleToFraction(resultdouble);
	return result;
}
	// --------------------------- //


	/// <summary>
	/// The function receives a dynamic matrix from type fraction,
	/// and print the matrix as double varibles.  
	/// </summary>
	/// <param>fraction** B - the dynamic matrix</param>
	/// <param>int rows - the number of rows in the matrix</param>
	/// <param>int cols - the number of colums in the matrix</param>
	/// <returns>None</returns>
	void printMatrix(fraction * *B, int rows, int cols)
	{
		int i, j;
		for ( i = 0; i < rows; i++)
		{
			for (j = 0; j < cols; j++)
			{
				(double)B[i][j].numerator / B[i][j].denominator;
				printf("%d %d/%-3d ", B[i][j].num,B[i][j].numerator,B[i][j].denominator);
			}
			printf("\n");
		}
	}

// --------------------------- //


/// <summary>
/// The function receives a dynamic matrix from type fraction,
/// and free all allocated memory.  
/// </summary>
/// <param>fraction** B - the dynamic matrix</param>
/// <param>int rows - the number of rows in the matrix</param>
/// <returns>None</returns>
void freeMatrix(fraction** B, int rows)
{
	int i;
	for (i=0; i < rows; i++)
	{
		free(B[i]);
	}
	free(B);
}