본문 바로가기
배운 것들 메모/따라 배우는 C언어

[홍정모의 따라하며 배우는 C언어] 6.15 중첩된 루프들(Nested Loof)

by 야속한 낭만 2024. 10. 20.

 

첫 번째 문제

 

첫 번째 구현 1)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	char c = 65;
	for (int a = 0; a < 5; a++)
	{
		for (int i = 0; i < 11; i++)
		{

			printf("%c ", c);
			c++;
		}
		printf("\\n");
	}

}

 

 

안에 있는 i가 다시 반복될 때, c가 65의 값으로 초기화가 되지 않고, K의 값에서 올라가 보임.

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	for (int a = 0; a < 5; a++)
	{
		char c = 65;
		for (int i = 0; i < 11; i++)
		{

			printf("%c ", c);
			c++;
		}
		printf("\\n");
	}
}

 

그래서 안에 있는 전체 for문을 다시 반복할 때, 처음부터 c가 65로 초기화 되겠끔, 겉 for문에 넣어줬다.

 

 

굳.

 

강의에서의 예시 1)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

#define NUM_ROWS		5
#define FIRST_CHAR	'A'
#define LAST_CHAR		'K'

int main()
{
	int r;
	int c;

	for (r = 0; r < NUM_ROWS; ++r)
	{
		for (c = FIRST_CHAR; c <= LAST_CHAR; ++c)
			printf("%c ", c);
		printf("\\n");
	}

	return 0;
	
}

 

두 번째 문제

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int b = 9;
	for (int a = 0; a < 10; a++)
{
	char c = 65;
	for (int i = 0; i < 10 - b ; i++)
	{
		printf("%c ", c);
		c++;
	}
	b--;
	printf("\\n");
}
}

 

여기서 포인트는 int b = 9를 밖으로 끄집어 내야한다는 점.

안에 있었다가 낭패를 보고 f10으로 하나하나 문제점을 찾았음.

f10 유용하다!

 

강의에서의 예시2)

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

#define NUM_ROWS		10
#define FIRST_CHAR	'A'
//#define LAST_CHAR		'K'

int main()
{
	int r;
	int c;

	for (r = 0; r < NUM_ROWS; ++r)
	{
		for (c = FIRST_CHAR; c <= FIRST_CHAR + r; ++c)
			printf("%c ", c);
		printf("\\n");
	}

	return 0;

}

 

코드가 참 유기적이지 않은가?

조건문에서 따로 무언가를 추가하지 않고,

그대로 있는 식에 조금 수정했다고 결과가 다르게 나온다.

마치 원자재를 추가해서 사지 않고, 집에 있던 원자재로만 재활용해서 쓰는 느낌이다.

예를 들면 아이폰에 있던 칩을 아이패드에 그대로 넣는 느낌.

이런 부분에서 코드의 간결성이나 유지보수가 달라지는구나 싶다.

세 번째 문제

세 번째 구현 3)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	for (int a = 0; a < 10; a++)
	{
		char c = 65 + a;
		for (int i = 0; i < 10 - a; i++)
		{
			printf("%c ", c);
			c++;
		}
		printf("\\n");
	}
}

나도 나름 유기성을 유지하려고 했다.

바로 1로 일정하게 증가하는 a를 통해,

char c의 시작점을 바꾸게 하고,

i < 10 -a를 만들어 최대 출력하는 숫자를 점점 작아지게 했다.

강의에서의 예시3)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

#define NUM_ROWS		12
#define FIRST_CHAR	'A'
//#define LAST_CHAR		'K'

int main()
{
	int r;
	int c;

	for (r = 0; r < NUM_ROWS; ++r)
	{
		for (c = FIRST_CHAR + r; c < FIRST_CHAR + NUM_ROWS ; ++c)
			printf("%c ", c);
		printf("\\n");
	}

	return 0;

}

 

define이 아직 익숙하지가 않아서 해석할 때

조금 헷갈리는데, 아무튼 for문의 조건문에 저렇게 넣는 것이 참 좋네요.

FIRST_CHAR + r을 초기화하면서도 증가하게 끔 만든게 감탄스럽네요.

제 코드는 밖에서 초기화 되게끔 있는데, for문의 의도를 제대로 활용하지 못해서 아쉬울 따름.

 

출처:  홍정모의 따라배우는 C언어

강의 외의 추가된 것들은 책 그리고 인터넷 조사해서 얻었음