반응형

Problem 3: 주어진 희소행열을 표현하기 위한 적합한 자료구조를 기술하고 행열 내 모든 값의 합을 구하는 독립된 함수를 작성하시오.

1. 정수값을 입력 받아 희소행렬의 크기를 결정

2. 주어진 행렬내 원소의 약 10% 이하가 0이 아닌 값으로 임의 수를 생성 하여 대입

//h.h




int** insertRand(int** Matrix, int m);
int* NoDupRand(int* rand_num, int n);
int** createMatrix(int m, int n);
void printMatrix(int** Matrix, int m);
void showPercent(int** matrix, int m1);
void SumMatrix(int** matrix, int SparesMatrix_row);
//f.c


#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<unistd.h>
#include"h.h"

void SumMatrix(int** matrix, int SparesMatrix_row) {

	int m1, sum, size;
	sum = 0;
	size = SparesMatrix_row;
	//matrix[] 갯수
	for (m1 = 0; m1 < size; m1++) {
		sum += matrix[m1][2];
	}
	printf("==================\n");
	printf("sum is %d\n", sum);
	printf("==================\n");
}

void showPercent(int** matrix, int matrix_size) {
	int spares_size = matrix_size;
	spares_size -= matrix[matrix_size - 1][3];
	matrix_size /= 10;
	float percent;

	percent =((float)spares_size / (float)matrix_size);
	//행렬안에 값이 0인 경우를 빼줌
	printf("Percent : %0.3f%%\n", percent);
	printf("==================\n");

}

void printMatrix(int** Matrix, int m) {
	int m1, n1;
	for (m1 = 0; m1 < m; m1++) {
		for (n1 = 0; n1 < 3; n1++) {
			if (n1 == 2) {
				printf("|%4d|\n", Matrix[m1][n1]);
			}
			else
				printf("|%4d ", Matrix[m1][n1]);
		}
	}
}
//중복되지 않는 랜덤값을 가져오기위해
int* NoDupRand(int* rand_num, int n) {
	int index1, index2, i, temp;
	srand(time(NULL));

	//n번
	for (i = 0; i < n; i++) {
		rand_num[i] = i;
	}
	//섞기 n/2번
	for (i = 0; i < (n / 2); i++) {
		index1 = rand() % n;
		index2 = i;
		temp = rand_num[index1];
		rand_num[index1] = rand_num[index2];
		rand_num[index2] = temp;
	}
	return rand_num;
}
//(m x n) matrix
int** insertRand(int** Matrix, int m) {
	int m1, n1;
	int count;
	int* NoDupRand_m;
	int* NoDupRand_n;

	NoDupRand_m = (int*)malloc(sizeof(int) * m);
	NoDupRand_n = (int*)malloc(sizeof(int) * m);

	NoDupRand_m = NoDupRand(NoDupRand_m, m);
	sleep(1);
	NoDupRand_n = NoDupRand(NoDupRand_n, m);
	//원소를 넣을 (행,열)위치 생성
	for (m1 = 0; m1 < m; m1++) {
		//행(0~m-1) 열(0~n-1) 위치 저장
		//랜덤값 중복체크를 하면 시간, 공간복잡도가 늘어남으로
		//행과 열이 겹치는 경우
		//    행 열 값  행 열값
		//ex) [1][1][] [1][1][]
		Matrix[m1][0] = NoDupRand_m[m1];
		Matrix[m1][1] = NoDupRand_n[m1];
	}
	/*   0  1   3
	  0 [1][1][값1]
	  1 [1][1][값2]
	  .
	  .
	  n [n][m][ ]

	  위와 같은 경우 발생가능
	  */
	  //배열에 n까지 값을 저장하고 섞음으로 랜덤값 중복체크보다 시간 줄임

	  //0이 아닌 원소가 10%라고 가정하고 만든행렬이므로
	count = 0;
	for (m1 = 0; m1 < m; m1++) {
		Matrix[m1][2] = rand() % 10;
		//printf("[%d][3] = %d\n", m1, Matrix[m1][2]);
		if (Matrix[m1][2] == 0) {
			count++;
		}
	}
	//행열값
	//[][][0]
	//0값이 들어간 경우가 발생하는경우를 만들어줫으므로
	//값이 0인 (행,열)의 갯수를 셈
	Matrix[m-1][3] = count;
	return Matrix;
}


int** createMatrix(int m, int n){
	int** matrix;
	int m1;
	//10%이하여야하므로
	m1 = (m * n) / 10;

	matrix = (int**)malloc(sizeof(int*) * m1);
	for (int m2 = 0; m2 < (m1 - 1); m2++) {
		//행, 열, 값 3개
		matrix[m2] = (int*)malloc(sizeof(int) * 3);
	}
		//0갯수 저장
		matrix[(m1-1)] = (int*)malloc(sizeof(int) * 4);



	return matrix;
}
//m.c


#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<unistd.h>
#include"h.h"

void main() {
	//mxn 행렬
	int m, n;
	int Msize;
	int** spares_matrix;
	float percent;

	printf("희소 행렬 크기 입력(m, n값): ");
	scanf("%d %d", &m, &n);

	printf("\n");

	Msize = (m * n / 10);
	//희소행렬의 0이 아닌값만 저장할 행렬
	//10%이하 여야함
	spares_matrix = createMatrix(m, n);
	spares_matrix = insertRand(spares_matrix, Msize);
	printf("    행    열    값\n");
	printf("------------------\n");
	printMatrix(spares_matrix, Msize);
	//희소 행열의 덧셈 결과 비교 출력, 0이 아닌 비율 출력
	SumMatrix(spares_matrix, Msize);
	showPercent(spares_matrix, Msize);

	printf("program End!\n(by32153682이창민)\n");
	printf("==================\n");
}

 

//makefile

app:m.o f.o
	gcc -o app m.o f.o

m.o: h.h m.c
	gcc -c m.c

f.o:h.h f.c
	gcc -c f.c

 

 

 

Problem 4: Infix 표현을 Postfix로 변환시키는 프로그램을 설계하고 구현하시오.

//toPostfix.h



//toPostfix by 이창민
/*
   *Stack
  중위표기수식만큼 크기 할당(괄호 빼고)
  (괄호 빼고 => 괄호 스택에 넣어 판단)

  *Infix_to_Postfix
  피연산자의 순서는 동일, 연산자들의 순서만다름
  즉, 연산자만 스택에 저장됨

  1. 피연산자를 만나면 그대로출력
  2. 연산자를 만나면 스택에 저장
  3. 스택에 있는 연산자보다 낮은순위의 연산자가 나오면 출력
  4. 왼쪽괄호는 연산자 우선순위가 가장 낮다고 판단
  5. 오른쪽 괄호를 만나면 출력(왼쪽괄호빼고)
 */

#include<stdio.h>

typedef struct{
	char* stack_data;
	int top;
}Stack;

void infix_to_postfix(Stack* s, char* exp);
void create(Stack* s, int exp_size);
int is_full(Stack* s, int exp_size);
void push(Stack* s, char data, int exp_size);
int is_empty(Stack* s);
char pop(Stack* s);
char peek(Stack* s);
void stack_free(Stack* s);
int size_nums(char* exp);
void checking(char* exp);
int order(char op);
//InfixToPostfix.c



#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"toPostfix.h"
int order(char op) {
	switch (op) {
	case '(': case')':
		return 0;
	case '+': case '-':
		return 1;
	case '*': case '/':
		return 2;
	default:
		return -1;
	}
}

void checking(char* exp) {
	char ch;
	char check;
	int i;
	int size = strlen(exp);
	Stack test;

	create(&test, size);

	for (i = 0; i < size; i++) {
		ch = exp[i];

		switch (ch) {
		case '(':
			push(&test, ch, size);
			break;
		case ')':
			check = pop(&test);
			if (check == 'f') {
				printf("error!! \")\" checking failed.\n");
				exit(1);
			}
			break;
		}
	}
}

void infix_to_postfix(Stack* s, char* exp) {
	char ch, op, result;
	int expSize;
	expSize = strlen(exp);
	for (int i = 0; i < expSize; i++) {
		ch = exp[i];
		switch (ch) {
		case '+': case '-': case '*': case '/': {
			//스택이 비어있지 않고 스택의 연산자보다 낮은 우선순위일때 pop
			if (!is_empty(s) && order(ch) <= order(peek(s))) {
				printf("%c", pop(s));
			}
			push(s, ch, expSize);//push ch 스택에
			break;
		}
		//왼쪽 괄호를 만나면 스택에 저장
		case '(': {
			push(s, ch, expSize);
			break;
		}
		//왼쪽 괄호가 나올때까지 출력
		case ')': {
			result = pop(s);
			while (result != '(') {
				printf("%c", result);
				result = pop(s);
			}
			break;
		}
		default: {
			printf("%c", ch);
			break; }

		}
	}
	while (!is_empty(s)) {
		printf("%c", pop(s));
	}
}

 

//size.c


#include<stdio.h>
#include<string.h>
#include"toPostfix.h"

int size_nums(char* exp) {
	int count = 0;
	int size = strlen(exp);
	for (int i = 0; i < size; i++) {
		char data = exp[i];

		switch (data) {
		case '(': case ')':
			count++;
			break;
		}
	}

	return size = size - count;

}

 

//stack.c



#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"toPostfix.h"
//스택 생성
void create(Stack* s, int exp_size) {
	s->stack_data = (char*)malloc(exp_size);
	s->top = -1;
}

//스택이 비었는지 확인
int is_empty(Stack* s) {
	return (s->top == -1);
}

int is_full(Stack* s, int exp_size) {
	return (s->top == (exp_size - 1));
}

void push(Stack* s, char data, int exp_size) {
	int top = s->top;
	if (is_full(s, exp_size)) {
		printf("stack is full!\n");
	}
	else {
		s->stack_data[++(s->top)] = data;
	}
}

char pop(Stack* s) {
	int top;
	if (is_empty(s)) {
		printf("stack is empty!\n");
		return 'f';
	}
	else {
		top = s->top;
		(s->top)--;
		return s->stack_data[top];
	}
}

char peek(Stack* s) {
	if (is_empty(s)) {
	}
	else {
		return s->stack_data[s->top];
	}
}

void stack_free(Stack* s) {
	free(s->stack_data);
}

 

//testing.c


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"toPostfix.h"

int main(int argc, char* argv[]){
	if(argc==1){
		printf("USEAGE : \"expression\" \"expression\"...\n");exit(1);
	}
	char* exp;
	int exp_size;
	Stack s;
	for (int i = 1; i < argc; i++) {
		exp = argv[i];
		printf("before : %s\n",exp);
		//괄호 이상여부 체크
		checking(exp);
		exp_size = size_nums(exp);
		create(&s, exp_size);
		printf("after : ");
		infix_to_postfix(&s, exp);
		printf("\n");
		stack_free(&s);
	}

	printf("\n");
	printf("Program End!\n");

	return 0;
}

 

//makefile

head = toPostfix.h
objects = testing.o InfixToPostfix.o size.o stack.o
files = InfixToPostfix.c size.c stack.c

app : $(head) $(objects)
	gcc -o app $(objects) 
testing.o : $(head) $(files)
	gcc -c testing.c
InfixToPostfix.o : $(head) InfixToPostfix.c
	gcc -c InfixToPostfix.c
size.o : $(head) size.c
	gcc -c size.c
stack.o : $(head) stack.c
	gcc -c stack.c
728x90
반응형
블로그 이미지

아상관없어

,
반응형
//BinaryTreeNode.c

#include "h.h"

/*BIANRY TREE*/
//////////////////////////////////////////////////////////////////////////////////
/*
   트리를 생성하는 함수
   => postfix 배열을 인자로 받은 뒤(postfix배열은 infix를 postfix로 바꾼 문자열)
   stack 배열에 값을 넣어주고
   연산자이면 자식노드를 생성후 오른쪽 자식노드부터 pop하여 값삽입
   피연산자이면 자식노드를 생성하지 않고 pop하여 값만 삽입
   */
/*ABOUT CREATE*/	
//============================================================================

void insertData(BinaryTreeNode* node, char value){
	node->data = value;
	//printf("insert data : %c\n", node->data);
	node->right = NULL;
	node->left = NULL;
}

BinaryTreeNode* createRight(BinaryTreeNode* parent){
	BinaryTreeNode* RightChild = (BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));
	parent->right = RightChild;
	RightChild->right = NULL;
	RightChild->left = NULL;
	return RightChild;
}

BinaryTreeNode* createLeft(BinaryTreeNode* parent){
        BinaryTreeNode* LeftChild = (BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));
        parent->left = LeftChild;
	LeftChild->right = NULL;
	LeftChild->left = NULL;
	return LeftChild;
 }


void createExpTree(Stack* s, BinaryTreeNode* root){
	//postfix의마지막값은 root
	//ex) a*b+c => ab*c+ 여기서 +가 루트가 됨
	int ch;
	if(s->top > -1){
		ch = peek(s);
		if((ch != '*') && (ch != '/') && (ch != '-') && (ch != '+')){
			insertData(root, pop(s));	
		}
		//연산자 일때
		//연산자노드는 무조건 두개의 자식 노드를 가지게됨
		else{
			//연산자 삽입후 
			insertData(root, pop(s));
			createExpTree(s, createRight(root));
			createExpTree(s, createLeft(root));
		}
	}
}


//==================================================================================

/*ABOUT TRAVERSE*/
//====================================================================================

void inorder(BinaryTreeNode* ROOT){
	if(ROOT != NULL){
		inorder(ROOT->left);
		printf("%c",ROOT->data);
		inorder(ROOT->right);
	}
}

void preorder(BinaryTreeNode* ROOT){
	if(ROOT != NULL){
		printf("%c", ROOT->data);
		preorder(ROOT->left);
		preorder(ROOT->right);
	}
}		

void postorder(BinaryTreeNode* ROOT){
	if(ROOT != NULL){
		postorder(ROOT->left);
		postorder(ROOT->right);
		printf("%c", ROOT->data);
	}
}

void levelorder(BinaryTreeNode* ROOT){
	QueueType q;
	init_queue(&q);
	if(ROOT == NULL)
		return ;
		
	enqueue(&q, ROOT);
	while(!isempty(&q)){
		ROOT = dequeue(&q);
		printf("%c", ROOT->data);
		if(ROOT->left)
			enqueue(&q, ROOT->left);
		if(ROOT->right)
			enqueue(&q, ROOT->right);
	}
}
	


//====================================================================================

//////////////////////////////////////////////////////////////////////////////////////////
//main.c

#include "h.h"


/*
   post스택을 사용하여 후위표기식으로 바꾸어 postfix배열에 저장한다.
   그리고 하나씩 pop하여 트리에 값을 넣는다.
   */

void main(int argc, char* argv[]){
	int i;
	int size;
	char* infix;
	char* postfix;
	Stack post;
	BinaryTreeNode* ROOT = (BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));

	for(i = 1; i<argc; i++){
		infix = argv[i];

		size = size_nums(infix);
		create(&post, size);
		//스택 생성
		postfix = (char*)malloc(size);

		infix_to_postfix(&post, infix, postfix);
		printf("infix to postfix\n");
		for(int j =0; j<size;j++){
			printf("%c",postfix[j]);
		}
		printf("\n");
		Stack s;
		(&s)->stack_data = postfix;
		(&s)->top = size -1;
		createExpTree(&s, ROOT);

		printf("in : ");
		inorder(ROOT);
		printf("\n");
		printf("pre : ");
		preorder(ROOT);
		printf("\n");
		printf("post : ");
		postorder(ROOT);
		printf("\n");
		printf("level : ");
		levelorder(ROOT);
		printf("\n");
		free(postfix);
	}
}
//Queue.c


#include "h.h"

// 오류 함수
void error(char* message)
{
	fprintf(stderr, "%s\n", message);
	exit(1);
}
//공백 상태 검출 함수
void init_queue(QueueType* q)
{
	q->front = q->rear = 0;
}

//공백 상태 검출 함수
int isempty(QueueType* q)
{
	return (q->front == q->rear);
}

//포화 상태 검출 함수
int isfull(QueueType * q)
{
	return ((q->rear + 1) % MAX_QUEUE_SIZE == q->front);
}


//삽입 함수
void enqueue(QueueType * q, element item)
{
	if (isfull(q))
		error("큐가 포화상태입니다");
	q->rear = (q->rear + 1) % MAX_QUEUE_SIZE;
	q->data[q->rear] = item;
}

//삭제 함수
element dequeue(QueueType * q)
{
	if (isempty(q))
		error("큐가 공백상태입니다");
	q->front = (q->front + 1) % MAX_QUEUE_SIZE;
	return q->data[q->front];
}

//삭제함수
element queue_peek(QueueType * q)
{
	if (isempty(q))
		error("큐가 공백상태입니다");
	return q->data[(q->front + 1) % MAX_QUEUE_SIZE];
}
//stack.c


#include "h.h"
//////////////////////////////////////////////////////////////////////////////////////////
/* STACK */
/*
typedef struct {
	char* stack_data;
	int top;
}Stack;
*/

//스택 생성
void create(Stack* s, int exp_size) {
	s->stack_data = (char*)malloc(exp_size);
	s->top = -1;
}

//스택이 비었는지 확인
int is_empty(Stack* s) {
	return (s->top == -1);
}

int is_full(Stack* s, int exp_size) {
	return (s->top == (exp_size - 1));
}

void push(Stack* s, char data, int exp_size) {
	int top = s->top;
	if (is_full(s, exp_size)) {
		printf("stack is full!\n");
		exit(1);
	}
	else {
		s->stack_data[++(s->top)] = data;
	}
}

char pop(Stack* s) {
	int top;
	if (is_empty(s)) {
		printf("stack is empty!\n");
		exit(1);
	}
	else {
		top = s->top;
		(s->top)--;
		return s->stack_data[top];
	}
}

char peek(Stack* s) {
	if (is_empty(s)) {
		printf("stack is empty!\n");
		exit(1);
	}
	else {
		return s->stack_data[s->top];
	}
}

void stack_free(Stack* s) {
	free(s->stack_data);
}

int size_nums(char* exp) {
	int count = 0;
	int size = strlen(exp);
	for (int i = 0; i < size; i++) {
		char data = exp[i];

		switch (data) {
		case '(': case ')':
			count++;
			break;
		}
	}

	return size = size - count;

}

int order(char op) {
	switch (op) {
	case '(': case')':
		return 0;
	case '+': case '-':
		return 1;
	case '*': case '/':
		return 2;
	default:
		return -1;
	}
}

void infix_to_postfix(Stack* s, char* infix, char* postfix) {
	char ch, op, result;
	int expSize;
	expSize = strlen(infix);
	int index = 0;
	for (int i = 0; i < expSize; i++) {
		ch = infix[i];
		switch (ch) {
		case '+': case '-': case '*': case '/': {
			//스택이 비어있지 않고 스택의 연산자보다 낮은 우선순위일때 pop
			if (!is_empty(s) && order(ch) <= order(peek(s))) {
				//printf("%c", pop(s));
				postfix[index++] = pop(s);
			}
			push(s, ch, expSize);//push ch 스택에
			break;
		}
		//왼쪽 괄호를 만나면 스택에 저장
		case '(': {
			push(s, ch, expSize);
			break;
		}
		//왼쪽 괄호가 나올때까지 출력=>to postfix array
		case ')': {
			 result = pop(s);
			while (result != '(') {
				//printf("%c", result);
				postfix[index++] = result;
				result = pop(s);
			}
			break;
		}
		default: {
			postfix[index++] = ch;
			break; }

		}
	}
	while (!is_empty(s)) {
		postfix[index++] = pop(s);
		//printf("%c", pop(s));
	}
}
//STACK
///////////////////////////////////////////////////////////////////////////////////////////////////

//h.h


//이창민
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

/*tree*/
typedef struct BinaryTreeNode{
        char data;
        struct BinaryTreeNode* right;
        struct BinaryTreeNode* left;
}BinaryTreeNode;

/*stack*/
typedef struct {
        char* stack_data;
        int top;
}Stack;

/*queue*/
#define MAX_QUEUE_SIZE 20
typedef BinaryTreeNode * element;
typedef struct { //큐타입
	element data[MAX_QUEUE_SIZE];
	int front, rear;
} QueueType;

/*TREE*/
///////////////////////////////////////////////////////////
void createExpTree(Stack* s, BinaryTreeNode* root);
void insertData(BinaryTreeNode* node, char data);

BinaryTreeNode* createRight(BinaryTreeNode* parent);
BinaryTreeNode* createLeft(BinaryTreeNode* parent);

void inorder(BinaryTreeNode* ROOT);
void preorder(BinaryTreeNode* ROOT);
void postorder(BinaryTreeNode* ROOT);
void levelorder(BinaryTreeNode* ROOT);
////////////////////////////////////////////////////////////

/*STACK*/
//////////////////////////////////////////////////////////////
void create(Stack* s, int exp_size);
int is_empty(Stack* s);
int is_full(Stack* s, int exp_size);
void push(Stack* s, char data, int exp_size);
char pop(Stack* s);
char peek(Stack* s);
void stack_free(Stack* s);
int size_nums(char* exp);
int order(char op);
void infix_to_postfix(Stack* s, char* infix, char* postfix);
////////////////////////////////////////////////////////////////


/*Queue*/
////////////////////////////////////////////////////////////
void error(char* message);
void init_queue(QueueType* q);
int isempty(QueueType* q);
int isfull(QueueType* q);
void queue_print(QueueType* q);
void enqueue(QueueType* q, element item);
element dequeue(QueueType* q);
element queue_peek(QueueType* q);
////////////////////////////////////////////////////////////////

728x90
반응형

'공부 > 자료구조' 카테고리의 다른 글

Stack, Queue 응용  (0) 2021.05.09
탐색트리, 정렬 알고리즘과 계산시간 비교  (0) 2021.05.09
행렬곱  (0) 2021.05.09
다항식 연산  (0) 2021.05.09
Huffman 트리  (0) 2021.05.09
블로그 이미지

아상관없어

,
반응형

<heap.c>

<heap.h>

 

<main.c>

 

<merge.c>

 

<merge.h>

 

<quick.c>

 

<quick.h>

 

 

<결과>

728x90
반응형

'공부 > 자료구조' 카테고리의 다른 글

Stack, Queue 응용  (0) 2021.05.09
연산자 우선순위를 반영하는 산술식의 이진트리 설계와 구현  (0) 2021.05.09
행렬곱  (0) 2021.05.09
다항식 연산  (0) 2021.05.09
Huffman 트리  (0) 2021.05.09
블로그 이미지

아상관없어

,

행렬곱

공부/자료구조 2021. 5. 9. 00:44
반응형
//Fn.c

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include"Fn.h"


void printMatrix(int **Matrix, int m, int n){
	int m1, n1;
	for(m1=0;m1<m;m1++){
		for(n1=0;n1<n;n1++){
			if(n1 == n-1){
				printf("%d\n", Matrix[m1][n1]);
			}
			else
				printf("%d ", Matrix[m1][n1]);
		}
	}
}

//(m x n) matrix
void insertRand(int **Matrix, int m, int n){
	srand(time(NULL));
	int m1, n1;
	for(m1=0;m1<m;m1++){
		for(n1=0;n1<n;n1++){
			Matrix[m1][n1] = rand()%10000;
		}
	}
}

int** createMatrix(int m, int n){
	int **matrix;
	matrix = (int**)malloc(sizeof(int*)*m);
	for(int m1=0;m1<m;m1++){
		matrix[m1] = (int*)malloc(sizeof(int)*n);
	}
	
	return matrix;
}

void freeMatrix(int **matrix, int m, int n){
	int m1, n1;
	//arr[0][] ~~~~~~~~ a[m1][]
	for(m1=0;m1<m;m1++){
		free(matrix[m1]);
	}
	free(matrix);

}
//Fn.h

#include<stdio.h>

int** MultiplyMatrix(int **matrix1, int **matrix2, int m, int n, int q);
void printMatrix(int **Matrix, int m, int n);
void insertRand(int **Matrix, int m, int n);
int** createMatrix(int m, int n);
void freeMatrix(int **matrix, int m, int n);
void freeArr(int *arr);
//MatrixMultiplyTest.c

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include"Fn.h"

void main(){
	//(m x n), (n x q)
	int m, n, q;
	int **Matrix1, **Matrix2, **result;
	clock_t start, end;
	float t;
	//seed
	srand(time(NULL));

	int i, j;
	//(100x100) ~ (599x599)
	for(j=100;j<600;j+=100){
		m = rand()%10 + j;
		n = rand()%10 + j;
		q = rand()%10 + j;
		printf("Matrix1(%dx%d) * Matrix2(%dx%d) \n",m,n,n,q); 
		//5times
		for(i=0;i<5;i++){
			//random m, n, q
			//create Matrix
			Matrix1 = createMatrix(m,n);
			Matrix2 = createMatrix(n,q);
			insertRand(Matrix1, m, n);
			insertRand(Matrix2, n, q);
		
			/*
			//show Matrix
			printf("=Matrix1=\n");
			printMatrix(Matrix1, m, n);
			printf("=Matrix2=\n");
			printMatrix(Matrix2, n, q);
				*/
	
			//start multiply
			start = clock();
			result = MultiplyMatrix(Matrix1, Matrix2, m, n, q);
			end = clock();
			t = (end - start)/CLOCKS_PER_SEC;
	
			/*
			//show MultiplyMatrix
			printf("=result=\n");
			printMatrix(result, m, q);
			*/
	
			//Time
			printf("Time : %.3f sec", t);
		
			freeMatrix(Matrix1, m, n);
			freeMatrix(Matrix2, n, q);
			freeMatrix(result, m, q);
		}
	}
}
//MultiplyMatrix.c

#include<stdio.h>
#include"Fn.h"
//(m x n) (n x q) => (m x q)
int** MultiplyMatrix(int **matrix1, int **matrix2, int m, int n, int q){
	int **result;
	int m1, n1, q1;
	int res;

	for(m1=0; m1<m; m1++){
		for(q1=0;q1<q;q1++){
			res = 0;
			for(n1=0;n1<n;n1++){
				res = res + matrix1[m1][n1]*matrix2[n1][q1];
			}
			result[m1][q1] = res;
		}
	}
	return result;
}

728x90
반응형
블로그 이미지

아상관없어

,
반응형

 

 

728x90
반응형

'공부 > 자료구조' 카테고리의 다른 글

연산자 우선순위를 반영하는 산술식의 이진트리 설계와 구현  (0) 2021.05.09
탐색트리, 정렬 알고리즘과 계산시간 비교  (0) 2021.05.09
행렬곱  (0) 2021.05.09
Huffman 트리  (0) 2021.05.09
정렬하기  (0) 2020.07.17
블로그 이미지

아상관없어

,
반응형

문자열 압축 알고리즘의 설계와 구현

(1) 100 글자 이상이 포함되는 글을 입력받아 Huffman tree를 생성

(2) 입력 받은 글의 Huffman 코드를 출력

(3) 출력된 코드를 입력받아 문자열을 출력

 

728x90
반응형

'공부 > 자료구조' 카테고리의 다른 글

연산자 우선순위를 반영하는 산술식의 이진트리 설계와 구현  (0) 2021.05.09
탐색트리, 정렬 알고리즘과 계산시간 비교  (0) 2021.05.09
행렬곱  (0) 2021.05.09
다항식 연산  (0) 2021.05.09
정렬하기  (0) 2020.07.17
블로그 이미지

아상관없어

,

정렬하기

공부/자료구조 2020. 7. 17. 15:24
반응형

InsertRand.c
Sort.h
Sort.c
Makefile

728x90
반응형
블로그 이미지

아상관없어

,