2중 반복문을 통한 모양만들기

skyju·2022년 2월 5일
0

C

목록 보기
1/5

아래와 같은 모양 만들기

o-----o
|     |
|     |
|     |
o-----o

우선 필요한 요소들을
전역, 정적, 상수로 선언해준다

  • 데이터와 로직의 분리
    : 유지 보수가 쉬워지고, 가독성은 올라간다. 모양을 바꾸고 싶을 때 변수 값만 바꾸어 주면 됨
  • static(정적) 변수
    : 프로그램이 종료되기 전까지 메모리가 소멸되지 않는 변수
    : 빠르게 접근 가능하며 함수를 벗어나도 사라지지 않고 유지
    : 초기화 할때 반드시 상수로 초기화, 하지 않으면 디폴트 0으로 자동 초기화 된다.
  • 정적 전역변수를 사용하면 현재 파일에서만 효력을 끼치는 변수가 된다. 같은 모양으로 다른 파일들을 생성하고 컴파일할때 현재 파일 범위 내에서만 변수가 유효하도록 구현
  • 상수? 위의 요소는 실행중 변하지 않을 값이기 때문에!
  • 포인터나 배열을 사용하지 않은 이유는 가독성 중심이기 때문에

주요 골자를 요약
1. 사각형이므로 너비, 높이로 간단한 2중 반복문 구조를 먼저작성

funtion1

2. 행 번호, 너비 높이를 받아 한 행씩 출력하는 함수를 만듦
이 함수는 행 번호와 높이를 가지고 첫줄, 중간줄, 마지막 줄을 판별
판별 후 각 경우에 맞춰 너비와 상수3가지를 보냄

print_row

3. 너비와 상수 3가지를 가지고 출력을 함

print_line

너비(width)과 높이(height) 개념을 통한 2중 반복문 구조를 작성한다.
첫 함수에는 너비와 높이의 크기가 매개변수로 들어온다.
반복문 구조 안에서 한 줄씩 출력할 것이기 때문에
현재 행을 나타내는 h_index를 변수로 선언해주었다.

void	function1(int width, int height)
{
	int	h_index;
	if (width <= 0 || height <= 0)
	{
		return ;
	}
	h_index = 0;
	while (h_index < height)
	{
		print_row(h_index, height, width);
		h_index++;
	}
}

한줄씩 출력하는 함수를 작성한다
매개변수는 다음과같다

  • h_index : 현재 행번호
  • height : 높이 값
  • width : 넓이 값
    h_index에 따라 시작 행, 끝행, 나머지 경우의 3가지로 나뉘며
    행 번호가 정해진 후 이므로,
    print_line으로 (넓이, 왼쪽 첫번째, 가운데 채울 내용, 오른쪽 끝) 순으로 매개변수를 전달시킨다.
void	print_row(int h_index, int height, int width)
{
	if (h_index == 0)
	{
		print_line(width, g_top_left_p, g_top_bottom_line, g_top_right_p);
	}
	else if (h_index == height - 1)
	{
		print_line(width, g_bottom_left_p, g_top_bottom_line, g_bottom_right_p);
	}
	else
	{
		print_line(width, g_left_right_line, g_space, g_left_right_line);
	}
}

전달받은 내용을 토대로 한줄 씩 출력하기 위해서
현재 열을 나타내는 w_index를 변수로 선언해준다.
width만큼 반복문을 돌리며 전달 받은 사항을 토대로 출력해준다.

void	print_line(int width, char left_point, char line, char right_point)
{
	int	w_index;
	w_index = 0;
	while (w_index < width)
	{
		if (w_index == 0)
		{
			ft_putchar(left_point);
		}
		else if (w_index == width - 1)
		{
			ft_putchar(right_point);
		}
		else
		{
			ft_putchar(line);
		}
		w_index++;
	}
	ft_putchar('\n');
}
profile
https://github.com/skyju

0개의 댓글