도형 컨테이너
Coddy C 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 48번째.
챌린지
쉬움도형 그리기(Shape Drawer) 프로젝트의 대미를 장식해 봅시다! 원(Circle)과 사각형(Rectangle)이 섞인 도형 컨테이너를 만들고, 이를 순회하며 전체 면적을 계산해 봄으로써 다형성의 진정한 힘을 증명해 볼 것입니다.
지금까지 만든 모든 것을 바탕으로, 완성된 프로젝트는 다음을 포함하게 됩니다:
shape.h및shape.c: 기본Shape인터페이스와process_shape함수.circle.h및circle.c: 생성자와 면적 계산이 포함된 원(Circle) 구현체.rectangle.h및rectangle.c: 생성자와 면적 계산이 포함된 사각형(Rectangle) 구현체.main.c: 마법이 일어나는 곳입니다. 어떤 도형 타입이든 담을 수 있는Shape*포인터 배열을 만듭니다. 이 배열을 원과 사각형으로 채운 다음, 배열을 루프 돌며 모든 도형의 총 면적을 계산하고 표시합니다.
프로그램은 다음과 같은 입력을 받습니다:
- 생성할 도형의 개수
- 각 도형에 대해: 타입 표시자(원인 경우
c, 사각형인 경우r)와 그 뒤에 따르는 치수
컨테이너의 각 도형에 대해 그리기(draw) 출력을 인쇄하십시오. 모든 도형을 처리한 후, 소수점 둘째 자리까지 Total Area: X.XX 형식으로 총 면적을 인쇄하십시오.
입력이 3이고, 이어서 c 5.0, r 4.0 3.0, c 2.0인 경우의 예시:
Drawing Circle with radius: 5.00
Drawing Rectangle with width: 4.00 and height: 3.00
Drawing Circle with radius: 2.00
Total Area: 103.11입력이 2이고, 이어서 r 6.0 4.0, r 3.0 2.0인 경우의 예시:
Drawing Rectangle with width: 6.00 and height: 4.00
Drawing Rectangle with width: 3.00 and height: 2.00
Total Area: 30.00핵심 통찰은 배열이 Shape* 포인터를 저장한다는 것입니다. 배열은 각 요소가 실제로 원인지 사각형인지 상관하지 않습니다. 각 포인터를 통해 draw와 area를 호출하면, 각 도형이 어떻게 생성되었는지에 따라 올바른 구현이 자동으로 실행됩니다. 이것이 바로 다형성의 작동 방식입니다: 하나의 루프, 하나의 인터페이스, 여러 가지 동작.
배열에 구체적인 도형들의 내장된 Shape 멤버에 대한 포인터를 저장해야 함을 기억하십시오. 원 면적 계산 시 π 값으로 3.14159를 사용하십시오.
중요 — 도형 타입 문자 읽기: scanf("%d", &n)으로 도형의 개수를 읽은 후, 타입 문자를 읽기 위한 각 후속 호출은 입력 버퍼에 남은 줄바꿈 문자를 건너뛰어야 합니다. 이를 위해 형식 문자열에 선행 공백을 사용하십시오:
scanf(" %c", &type); // %c 앞의 공백에 주목하세요선행 공백이 없으면, scanf는 의도한 c나 r 대신 이전 입력에서 남겨진 줄바꿈 문자를 읽게 되어, 도형 타입 확인이 소리 없이 실패하고 아무런 출력도 생성되지 않을 수 있습니다.
직접 해보기
#include <stdio.h>
#include <stdlib.h>
#include "shape.h"
#include "circle.h"
#include "rectangle.h"
int main() {
// TODO: 도형의 개수를 읽어옵니다
// TODO: circles, rectangles, 그리고 Shape* 포인터를 위한 배열을 할당합니다
// TODO: 각 도형을 순회하며 타입과 치수를 읽고,
// 도형을 생성한 뒤 shapes 배열에 해당 도형의 베이스 포인터를 저장합니다
// TODO: shapes 배열을 순회하며 각 도형의 draw를 호출하고,
// 전체 면적을 누적합니다
// TODO: 전체 면적을 다음 형식으로 출력합니다: Total Area: X.XX
// TODO: 할당된 메모리를 해제합니다
return 0;
}