마음만은 새내기

항상 초심을 잃지 않고 생활하겠습니다~!

2019 수업 노트

2019-1학기 수업 노트 (자료구조 1 실습, 2019.03.12.)

동동매니저 2019. 3. 19. 21:36

「2019학년도 1학기」 ///

by. 동동매니저 >_<


일자 : 2019년 03월 12일 (화)

과목 : 자료구조 1 실습

담당 교수님 : SCH 성낙준 교수님


실습 내용을 요약해보면?

C언어 복습 2주차(?)


오늘 실습한 문제!!

▶ 문제 1

data.txt 파일에 구구단 1단부터 9단까지 출력 후, 이를 다시 읽어서 화면에 출력하시오.

(테두리 포함!!)

★ 입력 예시 (stdin)

없음

★ 출력 예시 (data.txt)

1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
1 * 4 = 4
1 * 5 = 5
1 * 6 = 6
1 * 7 = 7
1 * 8 = 8
1 * 9 = 9
2 * 1 = 2
...

★ 출력 예시 (stdout)

<< 1 단 입니다 >>
-------------
| 1 * 1 = 1 |
| 1 * 2 = 2 |
| 1 * 3 = 3 |
| 1 * 4 = 4 |
| 1 * 5 = 5 |
| 1 * 6 = 6 |
| 1 * 7 = 7 |
| 1 * 8 = 8 |
| 1 * 9 = 9 |
-------------

<< 2 단 입니다 >>
-------------
| 2 * 1 = 2 |
| 2 * 2 = 4 |
| 2 * 3 = 6 |
...



▶ 문제 2

data.txt 파일에서 두 행렬을 입력 받고, 더하는 프로그램을 작성하기오.

(행렬의 저장 방식은 자유!!)

★ 입력 예시 (data.txt)

A 3 3
5 1 2
12 56 32
10 2 8
B 3 3
2 78 92
98 573 30
0 1 2

★ 출력 예시 (stdout)

A 배열 =
5 1 2
12 56 32
10 2 8
B 배열 =
2 78 92
98 573 30
0 1 2
A + B 배열 =
7 79 94
110 629 62
10 3 10


문제를 풀어보면? (소스 코드)

★ 문제 1

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

#define GUGUDAN 9 // 구구단의 상한 지정 (최대 9단)
#define MAX_LINE_LENGTH 32 // 한 줄의 최대 문자 수

int main(void){
	int i,j; // 반복문 제어 변수
	char buffer[MAX_LINE_LENGTH]; // 문자열 저장 버퍼
	FILE *fp=fopen("data.txt","w"); // 파일을 쓰기 모드로 열기
	for(i=1;i<=GUGUDAN;i++) for(j=1;j<=GUGUDAN;j++) fprintf(fp,"%d * %d = %2d\n",i,j,i*j); // 반복문을 통해 파일에 구구단 데이터를 출력
	fclose(fp); // 파일 닫기
	fp=fopen("data.txt","r"); // 파일을 읽기 모드로 열기
	for(i=1;i<=GUGUDAN;i++){ // 9번 반복 (1단~9단)
		printf("<< %d 단 입니다 >>\n",i); // 현재의 단 출력
		puts(" --------------"); // 테두리 출력 1
		for(j=0;j<GUGUDAN;j++){ // 9번 반복 (*1~*9)
			fgets(buffer,MAX_LINE_LENGTH,fp); // 파일에서 한 줄을 읽어서 버퍼에 저장
			buffer[strlen(buffer)-1]='\0'; // 버퍼의 마지막 줄 바꿈 문자 제거
			printf(" | %s |\n",buffer); // 읽은 줄을 화면에 출력
		}
		puts(" --------------\n"); // 테두리 출력 2
	}
	fclose(fp); // 파일 닫기
	return 0; // 프로그램 종료
}

★ 문제 2

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

#define MAX_NAME_LENGTH 16 // 행렬의 이름의 최대 길이

// 행렬 구조체 정의
typedef struct{
	char name[MAX_NAME_LENGTH];
	int rows,cols;
	int **matrix;
}Matrix;

void readMatrix(Matrix*); // 행렬을 읽는 함수
void sumMatrix(Matrix,Matrix,Matrix*); // 두 행렬을 합하는 함수
void printMatrix(Matrix); // 행렬을 출력하는 함수

FILE *fp=NULL; // 파일 포인터 선언

int main(void){
	// A, B : 합쳐질 두 행렬
	// sum : 합쳐진 행렬
	Matrix A,B,sum;
	fp=fopen("data.txt","r"); // 읽기 모드로 파일 열기
	if(fp==NULL){ // 만약 파일 포인터가 NULL이면... 오류 출력 후 종료
		puts("파일 열기 에러");
		return 0;
	}
	readMatrix(&A); // 행렬 A를 읽음
	readMatrix(&B); // 행렬 B를 읽음
	sumMatrix(A,B,&sum); // 두 행렬을 합해서 sum에 저장
	printMatrix(A); // 행렬 A를 출력
	printMatrix(B); // 행렬 B를 출력
	printMatrix(sum); // 합쳐진 행렬을 출력
	fclose(fp); // 파일 닫기
	return 0; // 프로그램 종료
}

// 행렬을 읽는 함수로, 매개 인수로 구조체의 포인터를 받아서 저장
void readMatrix(Matrix *M){
	int i,j; // 반복문 제어 변수
	fscanf(fp,"%s %d %d",M->name,&M->rows,&M->cols); // 행렬의 이름 및 크기를 입력 받음
	M->matrix=(int**)calloc(M->rows,sizeof(int*)); // 동적 메모리 할당 (행)
	for(i=0;i<M->rows;i++){ // 행의 개수만큼 반복
		M->matrix[i]=(int*)calloc(M->cols,sizeof(int)); // 동적 메모리 할당 (열)
		for(j=0;j<M->cols;j++) fscanf(fp,"%d",&M->matrix[i][j]); // 열의 개수만큼 반복, 데이터를 입력 받음
	}
}

// 두 행렬을 합하는 함수로, 매개 인수로 두 행렬과 sum 행렬의 포인터를 넘겨 받고, sum 행렬에 저장
void sumMatrix(Matrix A,Matrix B,Matrix *sum){
	int rows=A.rows<B.rows?A.rows:B.rows; // 행렬의 행
	int cols=A.cols<B.cols?A.cols:B.cols; // 행렬의 열
	int i,j; // 반복문 제어 변수
	sprintf(sum->name,"%s + %s",A.name,B.name); // sum 행렬의 이름 설정
	sum->rows=rows; // sum 행렬의 행의 개수 설정
	sum->cols=cols; // sum 행렬의 열의 개수 설정
	sum->matrix=(int**)calloc(rows,sizeof(int*)); // 동적 메모리 할당 (행)
	for(i=0;i<rows;i++){ // 행의 개수만큼 반복
		sum->matrix[i]=(int*)calloc(cols,sizeof(int)); // 동적 메모리 할당 (열)
		for(j=0;j<cols;j++) sum->matrix[i][j]=A.matrix[i][j]+B.matrix[i][j]; // 열의 개수만큼 반복, 두 행렬을 합함
	}
}

// 행렬을 화면에 출력하는 함수로, 출력할 행렬을 매개 인수로 전달 받음.
void printMatrix(Matrix M){
	int i,j; // 반복문 제어 변수
	printf("%s 배열 =\n",M.name); // 행렬의 이름 출력
	for(i=0;i<M.rows;i++){ // 행의 개수만큼 반복
		for(j=0;j<M.cols;j++) printf("%4d",M.matrix[i][j]); // 열의 개수만큼 반복, 데이터 출력
		puts(""); // 빈 줄 출력
	}
}

수업을 듣고 나서 느낀 점!!

특히 2번 문제에서, 행렬의 구현 방법을 고민하다가,

구조체를 사용하기로 결정하고, 구조체에 행, 열, 데이터, 이름을 넣기로 하였음.

하지만, 막상 구현을 하려고 하니 어려웠고, 그래도 열심히 해서 해결~!

(아직 초반이라서 C언어 복습 문제인 듯 하네요...)


기타 참고 사항!!

▶ 앞으로는 매주 Report가 주어지기에, 이 과목의 수업 노트는 최소 1주일이 지나야 할 것 같아요 ㅠ.ㅠ