[문제]
프로그램 사용자로부터 두 점의 x, y 좌표를 입력 받아서, 두 점이 이루는 직사각형의 넓이를 계산하여 출력하는 프로그램을 작성해보자. 단, 좌 하단의 x, y 좌표 값이 우 상단의 x, y좌표 값보다 작아야 한다. 좌 하단의 좌표정보를 먼저 입력 받는 형태로 우 상단의 값이 잘못들어오는 경우
[실행결과]
좌 하단의 x, y 좌표: 2 4
우 상단의 x, y 좌표: 1 6
좌 하단의 x좌표가 우 상단의 x좌표보다 큽니다.
우 상단의 x, y 좌표: 4 2
좌 하단의 y좌표가 우 상단의 y좌표보다 큽니다.
우 상단의 x, y 좌표: 1 2
좌 하단의 x, y좌표가 우 상단의 x, y좌표보다 큽니다.
우 상단의 x, y 좌표: 4 8
두 점이 이루는 직사각형의 넓이는 8입니다.
[코드1]
#include<stdio.h>
int main(void)
{
int l_x, l_y, r_x, r_y;
int Istrue = 1;
printf("좌 하단의 x, y좌표: ");
scanf_s("%d %d", &l_x, &l_y);
while (Istrue)
{
printf("우 상단의 x, y좌표: ");
scanf_s("%d %d", &r_x, &r_y);
if (l_x >= r_x && l_y < r_y)
printf("좌 하단의 x좌표가 우 상단의 x좌표보다 큽니다.\n");
else if (l_y >= r_y && l_x < r_x)
printf("좌 하단의 y좌표가 우 상단의 y좌표보다 큽니다.\n");
else if (l_x >= r_x && l_y >= r_y)
printf("좌 하단의 x, y좌표가 우 상단의 x, y좌표보다 큽니다.\n");
else
Istrue = 0;
}
printf("두 점이 이루는 직사각형의 넓이는 %d입니다.", (r_x - l_x) * (r_y - l_y));
return 0;
}
[코드2]
#include<stdio.h>
typedef struct point
{
int xpos;
int ypos;
}Point;
int IsError(Point* left, Point* right);
int CalArea(Point* left, Point* right);
int main(void)
{
Point leftPo, rightPo;
printf("좌 하단의 x, y 좌표입력: ");
scanf_s("%d %d", &leftPo.xpos, &leftPo.ypos);
while (1)
{
printf("우 상단의 x, y 좌표입력: ");
scanf_s("%d %d", &rightPo.xpos, &rightPo.ypos);
if (!IsError(&leftPo, &rightPo)) break;
}
printf("두 점이 이루는 직사각형의 넓이는 %d입니다.", CalArea(&leftPo, &rightPo));
return 0;
}
int IsError(Point* left, Point* right)
{
int err_x = 0, err_y = 0;
if (left->xpos > right->xpos) err_x = 1; // x좌표 에러
if (left->ypos > right->ypos) err_y = 1; // y좌표 에러
if (err_x + err_y > 0)
{
if (err_x + err_y == 2) printf("좌 하단의 x,y좌표가 우 상단의 x,y좌표보다 큽니다.\n");
else
{
if (err_x == 1) printf("좌 하단의 x좌표가 우 상단의 x좌표보다 큽니다.\n");
if (err_y == 1) printf("좌 하단의 y좌표가 우 상단의 y좌표보다 큽니다.\n");
}
return 1; // 에러 발생
}
return 0; // 에러 없음
}
int CalArea(Point* left, Point* right)
{
return (right->xpos - left->xpos) * (right->ypos - left->ypos);
}
<참고>
윤성우의 열혈 C 프로그래밍