본문 바로가기

programming language/C 언어

구조체의 활용 사각형 넓이 둘레 구하기

들어가기에 앞서, 학생정보 시스템을 구현한다고 해보자.

학생이라는 틀이 필요 그 틀 안에는 학번, 이름, 학점 등이 들어가 있을 것이다.

struct student {

int number;

char name [10];

double score;

}; 의 형식으로 구조체를 만들 수 있다. 

따로따로 이름 학번 점수를 조합해서 학생정보를 만들 수 있는데 왜, 구조체를 만들까?

그 답은 관리가 편하다는 이유가 있다.

 

실제로 학생정보 시스템 구현한다고 했을 때 서버를 구축하고 그 안에서 데이터베이스를 만들 것이다.
데이터 베이스는 일반적으로 테이블을 만들어 데이터 관리를 한다.  테이블에는 학번 이름 학점 등 들어가 있고,
실질적으로 프로그래밍 상에서 서버에 접근해서 데이터베이스에서 학번 이름 학점을 일대일 매칭 해서 가져온 후
그다음 프로그래밍 상에서 이러한 구조체를 number , name , score 각각 한 명의 학생에 대해서 이 3가지에 대해 아주 관리하기 효율적이다. 실제로 데이터 뽑아 올려할 때 이렇게(구조체와 서버 DB 테이블과) 일대일 매칭 하면 순식간에 뽑아올 수 있다. 한마디로 데이터 모델링의 전반적인 측면에서 굉장한 이득을 가져온다고 볼 수 있다.

 

<참고>
객체지향에서 클래스로 확장되고, 클래스는 구조체에 비해 조금 더 보완되고 효율적이다고 할 수 있다.


#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>

struct point {        
int x;   
int y;
};  

 

struct rect {     
struct point p1;     좌표평면상에서 사각형은 두 개의 점으로 정의할 수 있음.
struct point p2;
};

// 두 개의 구조체를 정의해줌으로써 문제 풀 수 있는 준비를 한 것임.

int main(void)
{
struct rect r;   
int w, h, area, peri;  //area는 넓이 peri둘레

printf("왼쪽 상단의 좌표를 입력하세요 : ");
scanf("% d % d", &r.p1.x, &r.p1.y);       //왼쪽 위점의 좌표 입력 받음

printf("오른쪽 하단의 좌표를 입력하세요: ");
scanf("% d % d", &r.p2.x, &r.p2.y);

w = abs(r.p2.x - r.p1.x); 
h = abs(r.p2.y - r.p1.y);   //결괏값이 혹시 음수가 나오면 안 되니 abs사용

area = w * h;
peri = 2 * w + 2 * h;

printf("사각형의 넓이는 % d이고, 둘레는 % d입니다.", area, peri);
return 0;
}


struct point {  :  point의 뜻은 좌표평면 상에서 하나의 점을 의미.

 

int x;     하나의 점(point)은 어떤 의미를 가지고 있나? 

int y;     x좌표와 y좌표를 가지고 있음.

struct rect {          rect라는 이름의 구조체를 선언
struct point p1;     좌표평면상에서 사각형은 두 개의 점으로 정의할 수 있음.
struct point p2;     구조체 point의 변수를 p1, p2라고 함
};

 

struct rect r;   : // r이라는 이름의 사각형 하나 만들어줌.(즉, rect구조체의 변수 이름이 r이다.)

struct rect는 사각형의 구조체!이다. 그러므로 struct rect r; 은 r이라는 사각형을 하나 만들었다고 생각 할 수 있다.

r은 struct rect의 변수임. 그러니까 이 사각형 구조체에서 사각형 하나 만들었다라고 할 수 있는 것이다.

 

w = 너비를 의미한다.  x좌표의 차이? 오른쪽 하단의 값이 분명 커서 오른쪽에서 왼쪽 뺌(x2 - x1생각)

abs = abs는 절댓값을 뜻한다. abs로 묶어서 항상 양수. 즉 너비(w)를 구할 수 있도록!

 

&r.p2.x : r이라는 구조체 안의 p2에! p2의 구조체 안의! x에 값을 입력받겠다.

 

내 생각

 우리가 좌표평면상에서 하나의 점을 구상할 때, x좌표와 y좌표로 구성이 되어야 한다.

즉, 하나의 점이라는 틀이 있고 그 안에는 x , y좌표가 있는 것이다. 마치 학생정보시스템을 만들 때,

학생이라는 틀이 있고, 그 안에 학번 학점 이름 등이 있는 것과 같이 말이다.

 

또, 우리가 사각형을 좌표상에서 구상할 때 두 개의 점이 필요하다. 

즉, 사각형이라는 틀 이 있고 그 안에는 두 개의 점이 구성이 돼야 할 것이다. 

그러면 그 두개의 점은? 위에서 설명한 바와 같이 x좌표와 y좌표로 구성이 되야 할 것이다. 

그것이 사각형의 너비와 둘레를 구할 때 두 개의 구조체를 사용하는 이유이다.

 

struct point p1;  : point가 한 점을 의미한다고 했으니 이 문장은 한 점의 이름을 p1이라고 하겠다.라는 문장으로 볼 수 있고, 이 p1안에는 x좌표와 y좌표가 있는 것이다. 

 

scanf(~~&r.p1.x)  : 사각형 r의 첫 번째 점 p1의 x좌표 값을 입력받겠다.


동빈나 유튜브로 개념 복습을 진행하는 중인데, 내 나름대로의 생각을 추가해서 정리를 해보았다. 

부족한 부분은 계속 생각하며 수정을 해나가야 겠다.