반응형

알고리즘 공부를 시작하다보면 가장 먼저 마주하는 용어가 '시간 복잡도' 입니다. 이 시간복잡도가 어떤 꼴로 나오냐에 따라 알고리즘의 좋고나쁨을 알 수 있기 때문입니다.

 

우리 모두 수학을 싫어하는건 알지만 그래프를 하나 보도록 하겠습니다.

시간복잡도 그래프

너무 잘 나와있어서 설명이 필요없는 그래프긴 하나, 살펴보겠습니다.

X축은 Example Scale이라 보시면 되겠습니다. 얼마나 많은 양을 처리해야하는지인데요. Y축을 보면 그 양을 처리하는데 걸리는 시간이 나와있습니다.


더보기

어? 그러면 똑같은 문제의 양이 주어졌어도 푸는데 걸리는 시간이 짧을수록 좋겠네?

맞습니다. 위 그래프에 따르면 지수 함수에 가까워질 때 비효율적이고  로그 함수에 가까워질 때 효율적임을 보입니다.


더보기

그러면 어떤 이유에서 각각의 알고리즘의 꼴이 지수함수가 되고 로그함수가 되는거죠?

이 질문에 대한 설명을 위해 오늘 처음으로 만나볼 알고리즘은 '거품 정렬 (Bubble Sort)' 입니다.

왜 이름이 거품 정렬이냐면 정렬을 위해 숫자들이 바쁘게 움직이며 자리를 찾아가는 모습이  비눗방울이 날아다니는것 같다해서 붙여진 이름입니다. 

거품 정렬 <출처 - 👨🏻‍💻 Tech Interview (gyoogle.dev) 김규석님>

저는 봐도 잘 와닿진 않는데, 암튼 그렇게 이름이 붙여졌답니다.

거품 정렬은 가장 간단한 알고리즘입니다. 이 알고리즘은 주어진 데이터들을 짝지어서 모두 한번씩 비교를 해서 크고작음을 판단합니다. 여기까지만 읽어봐도 거품 정렬이 비효율적이구나라는 것이 느껴지실겁니다. 

만약 방대한 데이터를 다루게 될 때, 거품 정렬을 쓴다면 언제 그걸 다 일일이 비교하며 정렬해갈까요.

 

그래서 거품 정렬은 현업에서는 절대 안씁니다. 그러면 거품 정렬에 대한 시간복잡도 형태를 구해보도록 하겠습니다.

1부터 10까지 무작위로 나열된 데이터가 주어졌다고 생각합시다. 이를 오름차순 정렬하려고 해요. 만약 거품 정렬을 적용한다면  왼쪽에서 오른쪽으로 진행하면  내 오른쪽에 있는 숫자가 나보다 작다! 하면 자리를 바꿉니다.  이걸 오른쪽 끝까지 도달할 때까지 계속 반복하구요. 다시 왼쪽에서부터 시작해서 정렬을 또 반복합니다.

 

그러면 3 1 5 7 9 10 6 2 4 8 이라는 데이터에서 좀 더 우리가 진행해보면

3 1 5 7 9 6 10 2 4 8

3 1 5 7 9 6 2 10 4 8

3 1 5 7 9 6 2 4 10 8

3 1 5 7 9 6 2 4 8 10  으로 됩니다.  그러면 이제 다시 3으로 돌아가서 또 정렬을 반복하는겁니다.

 

즉, 데이터의 개수가 N개라 할 때 한번의 반복이 끝나더라도 또 N-1.. N-2... N-3... N-4...  마지막 1번의 반복.  이렇게가야 1 2 3 4 5 6 7 8 9 10 으로 정렬이 완성될 것입니다.

그림판 크기가 작아서 여기선 7개의 데이터 (민트색) 까지만 그려놨는데요. 7개의 데이터들이 자기 자신을 제외한 남은 데이터 모두와 비교분석을 하는데까지 걸리는 횟수는 총 21번입니다. 즉,  N(N-1)/2의 공식이 나오게 됩니다. N에다가 7을 넣으면  7개의 데이터를 분석하는데 걸린 횟수가 21. 라고 나오는거죠.

 

즉, 데이터 개수에 '제곱' 꼴이 되는 것입니다. 따라서 거품 정렬의 시간복잡도는 N^2입니다.

  Best Average Worst
1. Bubble Sort (New!) N^2 N^2 N^2

 

그러면 이제 소스코드를 한번 보겠습니다.

정렬된 모습 (거품 정렬) / 사용 언어 : C

// # 0. Bubble Sort

#include <stdio.h>  // 사용 언어 : C


int main()

{
	int i,j,change;
	int num[10] = {3,9,1,4,10,7,8,2,5,6};
	
	for (i=0; i<10; i++)
	{
		for (j=0; j<i; j++)
		{
			if (num[i]<num[j])
			{
				change = num[i];
				num[i] = num[j];
				num[j] = change;
			}
		}
	}
	
	for (i=0; i<10; i++)
	{
		printf("%d ",num[i]);
	}
	
	
	return 0;
}

눈여겨 볼 점은 이중 for문과 if함수 블록에 있는 Swap구문입니다.

 

1) Outer Loop의 for문은 데이터가 총 10개이므로 10번 반복을 한다고 보시면 되구요.

2) Inner Loop의 for문은 두 수를 묶어서 비교를 해가는 것이므로 조건식을 j<i라고 해두었습니다.

 

i = 0인 경우엔 두 숫자가 아니므로 실행이 안되고,  i=1인 경우엔 j=0이 실행됩니다. 그러면 

num[i]는 -> num[1] / num[j]는 -> num[0]가 되니까  num[i]<num[j]인 경우는  왼쪽에 있는 숫자가 오른쪽에 있는 숫자보다 클 경우를 의미합니다.

 

즉, 오름차순 정렬을 원할 경우 num[i]<num[j]에 해당하는 애들을 swap시켜라! 라는 겁니다.

swap을 시키기 위해서는 두 수도 있지만 이 두 수를 swap시켜줄 매개체가 필요합니다. 그게 change 변수입니다.

change = num[i];
num[i] = num[j];
num[j] = change;

swap구문의 가장 기초적인 틀입니다. 어려울게 없이 매개체를 이용해서 두 수의 자리를 바꿔준 것입니다.

반응형
반응형

printf("Welcome, Let's C Language.");  // 초등학생도 쉽게 이해시켜주는 C언어 글을 포스팅합니다.

 

안녕하세요. 비전공자 출신 SW Test 엔지니어 Crush on Study입니다. 

이번 글에서는 조건에 따라 다른 화면을 출력시킬 수 있도록 해주는 '조건문'에 대해 배워보겠습니다.

 

Q. 먼저 이전 시간에 배운 내용을 잠깐 복습해봅시다.

A. 1) Switch문에 대해 배웠습니다.

- Switch문은 트리거를 생성하여 어떤 값을 입력하냐에 따라 다른 결과를 출력할 수 있도록 생성한 문법입니다.

if문과 비슷한 개념이지만 여러개의 다중조건을 처리하고자할 때는 Switch문이 코드도 좀 더 깔끔한 느낌입니다.

통상적으로는 if문을 많이 쓰긴하나, switch문도 알아둘 필요가 있겠습니다.

2) default와 break문에 대해 배웠습니다.

- default는 if문으로 치면 else와 동일합니다.  if / else if가  case 1 , case 2, ..... 같은거고 그 이외의 조건에 해당하는 값을 입력했을 때는 default 구문이 실행되도록 합니다. 

break문은 switch에 있어서 가장 중요한 문법인데요. 각 case마다 break를 아래에 적어주지않으면 그 다음 case들도 모두 실행이 됩니다. 

 

딱 보고 기억 나는게 없다. 하면 바로 이 전글을 참고하세요.

https://crush-on-study.tistory.com/213

 

[C언어] #6. Switch / case문법

printf("Welcome, Let's C Language."); // 초등학생도 쉽게 이해시켜주는 C언어 글을 포스팅합니다. 안녕하세요. 비전공자 출신 SW Test 엔지니어 Crush on Study입니다. 이번 글에서는 조건에 따라 다른 화면을..

crush-on-study.tistory.com

 

오늘 해볼 것은 배열입니다.

배열이 왜 필요하냐?

우리는 어떤 변수를 선언하기 위해서는 다음과 같은 작업을 거칩니다.

int a=1;
int b=2;
int c=3;
int d=4;
.
.

몇개 안되는 변수면 이정도 수고는 그래요. 할만 합니다. 근데? 변수가 수백개는 된다면?? 아니 수십만개?

그때도 일일이 변수를 선언한다면 손가락 깨질겁니다. 그런 것을 방지하고자 나온게 배열입니다.

1차원 배열

// # 7. 1차원 배열 & 2차원 배열 강의


// 1차원 배열
#include <stdio.h>

int main()
{
    int num[10] = {1,2,3,4,5,6,7,8,9,10};

    for (int i=0; i<10; i++)
    {
        printf("%d , ",num[i]);
    }
    return 0;
}

보시면 10개의 변수를 'num'이라는 함수에 넣었습니다. 그리고 num 옆에 대괄호 표시로 변수의 개수를 적어두었습니다.

이 의미는 num 함수에 현재 10개의 변수가 담겨져 있다! 라는겁니다. 어떤가요? 확실히 일일이 선언하는 것보다 깔끔하고 짧습니다. 이렇게 배열을 선언한 것을 출력하기 위해서는 이제 아래 printf문에 적은 것처럼 num[i] 을 적어줘야 합니다.

 

여기서 주목해볼 것은 for문에 적힌 식들입니다. 보시면 저는 변수 i를 0에서부터 시작하고 9까지만 출력되게 하였습니다. 근데 num[10]에 담은 것은 1부터 10까지인데 뭔가 1씩 차이가 나는게 아닌가? 싶을겁니다.

아래를 봅시다.

1. 배열
배열은 위에서 변수들을 저장해놓는 기능을 한다했는데요. 좀 더 자세히 말하면 변수들의 '아파트' 같은 개념이라 보시면 됩니다. 변수 0,1,2,3,4,5,6,7,8,9들이 num 아파트에 입주를 했다 보시면 됩니다.  즉, 같은 아파트 내에 있어도 상세주소는 다른거죠. num아파트 101호, 102호, 201호,.... 이런식으로 말이죠.

변수와 주소값을 출력

직접 출력을 해봤습니다. 1이라는 친구는 0000002ffa1ff600이라는 주소에서 살고있군요.

그 외에도 다른 친구들도 제각각의 주소를 할당받았습니다. 맨 뒤에 00 04 08 0c 10 ~ 이런식으로 증가하는거보니까

int형으로 받아서 그런지 4byte씩 늘어나는게 보입니다.

제가 변수는 1부터 10으로 설정을 했지만, 배열 인덱스의 시작은 0부터 시작합니다. 따라서, 변수 1이 살고있는 인덱스는 0층, 2는 1층.... 이런식으로 진행됩니다.

문자 배열

문자의 배열도 똑같습니다. char는 1byte니까  주소값도 1씩만 늘어나는게 보입니다. 

근데 char의 경우는 앞에서도 말했지만 문자 딱 하나씩만 받기때문에  배열에다가 ' ' 작은따옴표를 해줘야하는데요.

그럼 일일이 저렇게하지말고 한번에 적는건 안되나요? 라는 의문이 들겁니다. 당연히 가능하지만 문자열을 적고자할 때는 'Null 포인트'에 대해 고려하고 있어야 합니다.

문자열 Null 메모리

바로 저부분 \0입니다. 이는 절대문자 '0'을 의미하는게 아니라 아스키코드 상 문자열의 종료를 의미하고 있습니다.

따라서 문자열을 배열로 입력받고자 할 때는 글자 수 크기에다가 항상 1만큼 더해준 값을 고려해야한다는 점.

이게 중요한 포인트입니다.

 

마지막으로 2차원 배열을 보겠습니다.

2차원 배열도 별거없습니다. 막연하게 행은 가로, 열은 세로~ 이렇게 외워도 되지만요.

num[i][j]에서 j는 배열 하나에 몇 개의 원소가 들어가 있고! 라는 의미구요. i는 그 배열이 몇 개이다! 라는 의미라고 받아들이셔도 도움이 될 듯 합니다.

제가 약간 테트리스마냥 해놔서 이해가 안될 수 있는데 아래에 좀 더 쉽게 표현해보았습니다.  num[3][4]에 저장된 숫자들을 적어놓고 [1][2]에 해당하는 번호를 출력해보았습니다.

7이 나온 이유를 봅시다.

위에서 말한것에 따르면 하나의 배열에 4개의 원소가 담겨있다라는 뜻이고, 그 배열이 총 3개있다! 입니다.

따라서 num[1][2]를 해석하고자할 때는 뒤에 [2]부터 보면 됩니다. 배열의 인덱스는 0부터 시작하니까, 2는 세번째 원소에 해당합니다.

그러면 5,7,11로 추려지네요. 그다음 보니까 [1]이 있습니다. 즉 1은 두번째 배열을 의미합니다.

따라서 [4,6,7,8] 배열을 의미하므로 num[1][2]는 7이 됩니다. 이해 되죠?

반응형
반응형

printf("Welcome, Let's C Language.");  // 초등학생도 쉽게 이해시켜주는 C언어 글을 포스팅합니다.

 

안녕하세요. 비전공자 출신 SW Test 엔지니어 Crush on Study입니다. 

이번 글에서는 조건에 따라 다른 화면을 출력시킬 수 있도록 해주는 '조건문'에 대해 배워보겠습니다.

 

Q. 먼저 이전 시간에 배운 내용을 잠깐 복습해봅시다.

A. 1) while문에 대해 배웠습니다.

- while문은 for문과 마찬가지로 반복문 유형 중 하나입니다. 다만, for문의 구조는 옆에 초기값 선언, 조건식, 증감식을 한번에 적어줬다면 while문은 위에 초기값 선언, while 옆에 조건식 선언, while 몸통에 증감식 선언. 이런 식으로 나눠서 구조를 짜야했었습니다. 

2) do while문에 대해 배웠습니다.

- do while문은 while문과 차이점이 있습니다.

while do while
조건을 먼저 확인하고 수행을 결정한다.
조건이 충족되지 않는다면 프로그램 종료.
먼저 임시로 수행을 1번 한 뒤에, 조건을 확인한다.
만약 조건이 일치하지 않으면 1번 출력으로 끝.

 

딱 보고 기억 나는게 없다. 하면 바로 이 전글을 참고하세요.

https://crush-on-study.tistory.com/212

 

[C언어] #5. while 반복문과 do ~ while 반복문

printf("Welcome, Let's C Language."); // 초등학생도 쉽게 이해시켜주는 C언어 글을 포스팅합니다. 안녕하세요. 비전공자 출신 SW Test 엔지니어 Crush on Study입니다. 이번 글에서는 조건에 따라 다른 화면을..

crush-on-study.tistory.com

switch 구문 강의 소스코드

// #6. switch 구문 강의

#include <stdio.h>

int main()
{
    int choice;

    printf("Welcome to choice game.\n");
    printf("Let's choice the number : ");
    scanf_s("%d",&choice);

    switch (choice)
    {
   		 case 1:
    	{
        printf("you choice no.1\n");
        break;
   		 }
    
    	case 2:
   		 {
        printf("you choice no.2\n");
        break;
   		 }
    
   		 default:
         {
        printf("you choice another.\n");
        break;
        }
    }

    return 0;
}

오늘할 것은 switch구문입니다. 제가 이거 배울 때 딱, 생각난게  "아, 이거 가지고 밸런스 게임 만들어야겠다 ㅋㅋㅋㅋㅋ" 였습니다. ㅋ  일단 구조들을 먼저 살펴봅시다. 처음보는게 있네요. default입니다.

1. Switch 구문
Switch는 if문과 비슷해보이지만, 트리거를 통해 수행된다는 점에서 차이가 있습니다. Switch의 구조는 위에서 변수 초기화와 printf, scanf를 통해 입력을 받을 준비를 먼저 해놓는걸 시작으로 합니다.

그 아래에 Switch를 적는데요. 옆에다 우리가 scanf로 받은 choice를 트리거로 해둡니다. 
만약 1을 입력했으면 "You choice no.1" 이라는 구문이 나오겠죠? 코드보시면 눈치를 채셨겠지만 1,2를 제외한 다른 값을 입력했을 때는 default 구문이 실행됩니다.

다른거 하나 만들어서 해본 결과입니다. 2를 누르면 case 2만 실행이 됩니다. 근데 왜 구문마다 break를 해야할까요?

만약 break를 적지않는다면 아래와 같은 결과가 나옵니다.

저는 수달이 좋다고 3번을 찍었는데 break가 없어서 3번 아래 구문도 함께 실행이 되어버렸습니다. 따라서 Switch구문을 사용할 때는 각 case마다 break를 적어주는게 중요한 포인트라 할 수 있습니다.

반응형
반응형

printf("Welcome, Let's C Language.");  // 초등학생도 쉽게 이해시켜주는 C언어 글을 포스팅합니다.

 

안녕하세요. 비전공자 출신 SW Test 엔지니어 Crush on Study입니다. 

이번 글에서는 조건에 따라 다른 화면을 출력시킬 수 있도록 해주는 '조건문'에 대해 배워보겠습니다.

 

Q. 먼저 이전 시간에 배운 내용을 잠깐 복습해봅시다.

A. 1) for문에 대해 배웠습니다.

- 프로그램이 어떤 특정 트리거에 의해서만 수행되는걸 원할 때 우리는 조건문을 통해 구현하기로 했습니다. if와 else if는 선언할 때, 옆에 조건식을 함께 적어준 다음  조건이 맞을 때, 수행할 구문을 아래 적어놔주었습니다. else는 '이 밖의 모든 것' 이라는 의미로 if와 else if에서 지정한 조건 이외의 모든 경우에 해당할 때  수행할 구문을 적어줍니다.

따라서, else는 조건식을 따로 적지 않는다고 배웠습니다.

 

2) 증감 연산자에 대해 배웠습니다.

- 조건문을 구현하고자 할 때, 항상 따라붙는 연산자들입니다. == 는 동치를 !=는 불일치를 &&는 AND를 ||는 OR을 의미합니다. 추가로 산술 연산자 중에서도 조금 생소한 개념인 %에 대해 배웠습니다. %는 나눗셈을 할 때, 몫이 아닌 나머지 값만을 출력하고자 할 때 사용합니다. 보통 %은 홀수,짝수를 구분하고자 할 때 자주 사용합니다.

 

딱 보고 기억 나는게 없다. 하면 바로 이 전글을 참고하세요.

https://crush-on-study.tistory.com/210?category=1002287 

 

[C언어] #4. 반복문 for문과 이중 for문

printf("Welcome, Let's C Language."); // 초등학생도 쉽게 이해시켜주는 C언어 글을 포스팅합니다. 안녕하세요. 비전공자 출신 SW Test 엔지니어 Crush on Study입니다. 이번 글에서는 조건에 따라 다른 화면을..

crush-on-study.tistory.com

while문 강의 소스코드

// #5. while문 강의
#include <stdio.h>

int main()
{
    int i=1;

    while(i<=10)
    {
        printf("[%d] Hello, friend? can you give me money?\n",i);
        i++;    

        if (i>10)
        {
            break;
        }
    }


    return 0;
}

여러분. 10번 찍어 안넘어 가는 나무가 되는 사람이 되십쇼. 

아무튼, 이번 while문 역시 for문과 똑같은 기능을 하는 반복문입니다.  기능은 같으나 구조가 조금 차이가 있어요.

 

for문 같은 경우는  for 옆에 셋팅을 한번에 넣는다면  while은 다릅니다.

1) 일단 초기값은 while문 위에다 먼저 선언을 해줍니다.

2) 조건식만 while문 옆에다 적어줍니다.

3) 증감식을 while문 안에다 적어줍니다.

 

이 구조만 지키시면 while문 뚝딱입니다.

 

자, 근데 처음보는 명령어가 하나 보이네요. 바로 break문입니다.

사실 여기 소스코드에서는 조건식 범위 안에서만 반복수행되기 때문에 이를 다 마치면 자동으로 종료가 됩니다. 그래서 break문을 사용할 필요는 없는데, 설명을 위해 첨가했습니다.

1. break
이름 그대로 브레이크를 걸다. 멈추다. 그런 의미입니다. 만약 i=1로 하고 조건을 i<=10으로 했다해도, 여러분들이 마음이 바뀌어서 5까지만 출력하면 프로그램을 종료하게 만들고 싶다. 하시면 break문을 쓰면 됩니다.

break문

바로 이런 식으로 걸어주면 while 조건식에서는 10까지 반복수행해라! 했어도 i==5를 마주할 때 종료해버립니다.

 

자, 근데 do~while문을 설명하기에 앞서 while문의 실행구조를 마지막으로 살펴보고자 합니다.

while문의 실행 구조를 알아보자

이런 식으로 조건을 수정했어요. 그러면 상식 상 printf에 들어있는 문구는 실행이 되지 않을 것입니다. 그리고 역시 예상대로 결과값에는 아무것도 출력되지 않은 채 끝났습니다.

왜냐하면 while문은 먼저 조건부터 확인을 한다음에 실행을 하기 때문인데요. do~while문은 이것의 반대입니다. 먼저 실행을 한 다음 조건을 확인합니다.

2. do ~ while문
좀 더 자세히 말하자면 do~while문은 '기미상궁' 같은 문법이다! 라고 보시면 됩니다. 조건을 확인하기 전에 일단 한번은 임의로 수행을 합니다. 그 후, 조건을 확인한 뒤 조건에 맞는다면 다시 수행을 반복합니다. 하지만 한번 임의로 수행한 뒤에 '어? 맛이 별론데?' 하면 이제 뒤에는 수행이 안됩니다.

Visual Studio Code가 좋은게 이렇게 do를 적고 중괄호 { 를 타이핑하면 저렇게 구조를 한번에 보여줍니다. 

보시는 바와 같이 do { }에다가는 실행할 코드를 적구요.  while의 소괄호 ( )에다가는 조건식만 적어주면 됩니다.

아, 바로 위에 코드 사진에 stdio.h 헤더파일을 선언 안했었네요. ㅈㅅㅈㅅ 아무튼 이런식으로 코드를 작성해본 뒤에 돌려보면?

결과값

짜잔. 일단 수행 한번은 무조건 합니다. 이게 do~while문과 while문의 차이입니다.

 

퀴즈

Q1. while문을 이용하여 1에서부터 100까지 자연수들의 합을 구하는 프로그램을 작성해주세요.

반응형
반응형

printf("Welcome, Let's C Language.");  // 초등학생도 쉽게 이해시켜주는 C언어 글을 포스팅합니다.

 

안녕하세요. 비전공자 출신 SW Test 엔지니어 Crush on Study입니다. 

이번 글에서는 조건에 따라 다른 화면을 출력시킬 수 있도록 해주는 '조건문'에 대해 배워보겠습니다.

 

Q. 먼저 이전 시간에 배운 내용을 잠깐 복습해봅시다.

A. 1) 조건문 if / else / else if에 대해 배웠습니다.

- 프로그램이 어떤 특정 트리거에 의해서만 수행되는걸 원할 때 우리는 조건문을 통해 구현하기로 했습니다. if와 else if는 선언할 때, 옆에 조건식을 함께 적어준 다음  조건이 맞을 때, 수행할 구문을 아래 적어놔주었습니다. else는 '이 밖의 모든 것' 이라는 의미로 if와 else if에서 지정한 조건 이외의 모든 경우에 해당할 때  수행할 구문을 적어줍니다.

따라서, else는 조건식을 따로 적지 않는다고 배웠습니다.

 

2) 논리 연산자에 대해 배웠습니다.

- 조건문을 구현하고자 할 때, 항상 따라붙는 연산자들입니다. == 는 동치를 !=는 불일치를 &&는 AND를 ||는 OR을 의미합니다. 추가로 산술 연산자 중에서도 조금 생소한 개념인 %에 대해 배웠습니다. %는 나눗셈을 할 때, 몫이 아닌 나머지 값만을 출력하고자 할 때 사용합니다. 보통 %은 홀수,짝수를 구분하고자 할 때 자주 사용합니다.

 

딱 보고 기억 나는게 없다. 하면 바로 이 전글을 참고하세요.

https://crush-on-study.tistory.com/209

 

[C언어] #3. 조건문 if , else if , else / 논리 연산자

printf("Welcome, Let's C Language."); // 초등학생도 쉽게 이해시켜주는 C언어 글을 포스팅합니다. 안녕하세요. 비전공자 출신 SW Test 엔지니어 Crush on Study입니다. 이번 글에서는 조건에 따라 다른 화면을..

crush-on-study.tistory.com

3중 for 반복문

// # 4. 반복문 강의입니다.

#include <stdio.h>

int main()
{
    int x,y,z;

    for (x=1; x<=5; x++)
    {
        for (y=1; y<x; y++)
        {
            for (z=1; z<y; z++)
            {
                printf("z's %d, ",z);
            }
            printf("\n");
            printf("y's %d -> ",y);
        }
        printf("\n");
        printf("------- x's %d ------- ",x);
    }
    return 0;
}

자, 갑자기 뭔가 괴랄해졌습니다. 이게... 이게 대체 뭐야!! 하겠지만. 그 누구보다도 for문을 쉽게 설명해드리겠습니다.

 

일단 우리가 직장에 다니고 있다 생각합시다. 월~금까지는 대부분의 직장인분들이 근무를 할겁니다.

즉, 5일간은 동일한 업무시간을 갖는다고 가정할 때, 이를 C언어로 표현한다면

printf("월요일입니다. 일 합시다.");
printf("화요일입니다. 일 합시다.");
printf("수요일입니다. 일 합시다.");
printf("목요일입니다. 일 합시다.");
printf("금요일입니다. 일 합시다.");

이렇게 나타낼 것입니다. 아, 근데 365일로 늘어난다하면 printf문을 365번이나 받아 적어야 합니다. 여간 귀찮은 일이 아닙니다. 그래서 등장한게 반복문입니다. 제목에 적은 바와 같이 반복문은 크게 3가지 유형으로 자주 쓰는데요.

 

첫번째로 볼 것이 for문입니다.

1. for문
for문의 구조를 먼저 봅시다. 제가 소스코드에 적은 내용을 보면요. for 옆에 여러가지 식들이 보입니다. 하나하나 구조를 살펴보겠습니다.

for ( 변수 초기값 선언, 변수에 대한 조건식, 변수의 증감식)
이런 식으로 나와있는데요. 제 소스코드를 보면 앞에서 x,y,z라는 정수형 자료타입의 변수들을 선언해 놨습니다.
그리고 제일 먼저 x의 초기값을 1이라고 정해놨습니다.

그러면 이제 x는 1을 시작점으로 해서 몇번까지 반복할 것인가? 를 추가로 정해줘야 합니다.  이게 변수에 대한 조건식입니다.
보시면 저는 1을 시작으로 해서 5까지의 범위 조건을 지정해놨습니다. 그러면 이제 1에서부터 5까지의 범위가 결정이 되었으니 어떤식으로 증감을 줄 것인지 고려해야 합니다.

저는 x를 1씩 증가시키기 위해서 x++ 라고 설정을 했습니다. 

* 주의해야할 점. for문에서 구조를 짤 때, 초기값 선언과 조건식은 쓰고나서 세미콜론 ; 을 적어줘야 합니다. 하지만 증감식의 경우는 세미콜론을 찍어주지 않습니다.

 

** ++라는 것은 증감 연산자의 한 종류입니다. 제가 미처 설명을 안한 부분인데 잠깐 이 의미를 보고자 합니다.

x = x+1;

위의 소스코드를 봅시다. 제가 x = x+1; 이라고 적었습니다. 근데 수학을 한번이라도 접하신 분들은 이게 맞는 식이에요? 라는 의문을 가질 것입니다.  예. 적어도 프로그래밍에서는 위의 식은 성립합니다.

x = x+1를 설명하기 위한 그림

프로그래밍에서는 일반적으로  '오른쪽에서 왼쪽으로 읽는다.' 라고 생각하셔도 됩니다. 즉, x = x+1라는 것은

오른쪽에 있는 x+1를  왼쪽에 있는 x라는 박스에 넣는다. 라고 생각하시면 됩니다. 자, 그럼 간단한 소스코드를 한번 짜보겠습니다.

x = x+1를 설명하기 위한 소스코드
결과값

저는 x에다가 5라는 값을 입력했습니다. 그 후, x의 값을 출력하기 전에  x = x+1을 적어두었습니다.

그래서 x = 5가  처음에 오른쪽에 있는 x + 1의 x에 들어갔습니다. 그 후, 오른쪽의 x+1을  왼쪽에 x라는 박스에다 집어 넣었습니다. 그래서 값이 6으로 나온 것입니다.

이처럼 변수의 값이 1씩 증가하는 식인 x=x+1을 보다 간단히 표현한 것이 x++입니다. ++는 1씩 증가해라. 라는 의미인데요. 그러면 눈치 빠르신 분들은 --는 당연히 1씩 감소해라! 라는 연산자임을 알게 됩니다.

 

자, 그러면

for (int i =1; i<=5; i++)
{
	printf("%d ",i);
 }
 
 return 0;

이 소스코드를 출력하면 1 2 3 4 5로 출력됨을 알 수 있습니다. 그럼 이중 for문은 뭘까요?

2중 for문을 설명하기 위한 그림

바로 이 그림을 보면 이해가 됩니다. 

x는 제가 소스코드를 작성할 때, 제일 먼저 구현한 첫번째 for문의 변수입니다. 1부터 시작한다할 때 쭉 값이 이어질텐데요. 이제 바로 아래에 y변수에 대한 for문을 입력했고 조건식에 y<x라고 적어두었습니다.

 

이 경우는 x=1일 경우 y는 0만이 해당됩니다. 근데, 제 소스코드를 보시면 y변수의 시작점을 1이라 잡았습니다.

즉, x=1만 출력되고 그 아래 y는 출력되지 않습니다.

 

그러면 x=2일 경우를 봅시다. x=2로 넘어갈 때, y<x에 맞는 값은 y=1입니다. 따라서, y=1까지만 출력됩니다.

그러면 x=3일 때는요? y<x 조건식에 따르면 y=1,2가 해당됩니다. 따라서 y=1, y=2까지만 출력됩니다.

마찬가지로 x=4라면 y=1,2,3이 해당 될 것입니다.  3중, 4중이 되어도 동일한 규칙이 적용될 것입니다.

마치 고등학교 때 배운 수열같은 개념이죠.

 

조건식을 꼭 y<x로 안해도 됩니다. y<=x라고 하면

 

x=1 , y=1

x=2, y=1,2

x=3, y=1,2,3

 

이런 식으로 출력이 되겠군요.

 

 

퀴즈

Q1. 다음 아래와 같은 결과값을 출력하는 소스코드를 작성해보세요. (이중 for문으로 구현할 것)

반응형
반응형

printf("Welcome, Let's C Language.");  // 초등학생도 쉽게 이해시켜주는 C언어 글을 포스팅합니다.

 

안녕하세요. 비전공자 출신 SW Test 엔지니어 Crush on Study입니다. 

이번 글에서는 조건에 따라 다른 화면을 출력시킬 수 있도록 해주는 '조건문'에 대해 배워보겠습니다.

 

Q. 먼저 이전 시간에 배운 내용을 잠깐 복습해봅시다.

A. 1) 주석처리에 대해 배웠습니다.

- 주석은 컴파일할 때 처리되지 않는 부분으로 100이면 100이 주석을 통해 소스코드에 대한 설명란으로 활용하고 있다 했습니다. 

 

2) \n (개행)에 대해 배웠습니다.

printf("안녕하세요. 저는 Crush on Study입니다.\n");
printf("잘 부탁드립니다.");

이런 소스코드가 주어졌을 때, 출력되는 예상 값은 

안녕하세요. 저는 Crush on Study입니다.

잘 부탁드립니다.

여야 합니다.  왜냐? \n이 적혀있기 때문입니다.

 

* 배열에 대해서도 간단히 짚어봤지만 배열은 패스하도록 하겠습니다. 추후에 자세히 다룰겁니다.

 

3) %s 형식지정자에 대해 배웠습니다.

- %c는 문자 하나만을 주고받는 형식지정자지만 %s는 문자 하나뿐만 아니라 문자열도 주고받는 형식지정자라 하였습니다. 따라서, %s가 %c보다 더 널리쓰인다고까지 배웠습니다. 그리고 이에 대응하는 자료형 타입은 char입니다.

 

 

딱 보고 기억 나는게 없다. 하면 바로 이 전글을 참고하세요.

https://crush-on-study.tistory.com/208

 

[C언어] #2. 주석 처리와 신상 정보 프로그램 구현하기

printf("Welcome, Let's C Language."); // 초등학생도 쉽게 이해시켜주는 C언어 글을 포스팅합니다. 안녕하세요. 비전공자 출신 SW Test 엔지니어 Crush on Study입니다. 이번 글에서는 주석 처리에 대한 소개와..

crush-on-study.tistory.com

조건문 소스코드

// # 3. 조건문 강의입니다. 

#include <stdio.h>

int main()
{   
    int choice=1;
    printf("Welcome to True or no.\n");
    printf("Let's check your truth.\n");

    printf("Are you MoSol? : ");
    scanf_s("%d",&choice);

    if (choice==1)
    {
        printf("Yes i respect you. wish your happy Mosol Life.\n");
        return 0;
    }

    else
    {
        printf("ok, you just Mosol.\n");
        return 0;
    }

	return 0;
}

소스코드들을 하나씩 살펴보겠습니다. 이제 대충 틀은 잡힙니다. printf, scanf_s를 사용하기 위해 전처리구문에 선언한 stdio.h 헤더파일. 그 후, 함수를 실행할 공간인 main함수를 잡고, 그 안에 소스코드를 입력하는 것이였죠.

근데 오늘 새로운 개념을 보게 되었습니다.

1. if
어원 그대로 if는 '만약에' 라는 뜻을 담고 있습니다. 공교롭게도 지금 태연 만약에 듣는 중인데 개띵곡이니까 들으러가십시오.
아무튼 if를 선언하면 옆에다가 이제 조건식을 적어줘야 합니다. 

직관적으로 봐도 if (choice==1) 의 구문을 보면 1을 선택할 때, 아래 { } 사이에 적힌 코드가 실행되도록 하는 것 같습니다. 그렇죠? 만약 위에서 choice로 1번을 입력받았다면, Yes i respect you. wish your happy Mosol Life.
이 문구가 출력될 것입니다.

자, 근데 바로 아래에 else 라는 명령어가 보입니다. 새로 보는 애군요. 근데 얘는 if처럼 옆에 따로 조건식이 없습니다. 

2. else
자, else의 뜻은 if에서 적은 조건문을 제외한 나머지에 해당하는 경우에 else의 몸통 {   } 안에 들은 내용을 수행해라. 이겁니다. 만약 위 소스코드에서 choice == 1이 아닌 0,2,27427,16,-273,...... 이런 값들을 적었다면 if 구문에 있는 애들은 수행을 안하고 else 구문에 있는 애들을 수행합니다.

출력 화면

네, 1이 아닌 다른 값을 아무거나 넣었더니 저보고 모솔이랍니다. 근데 저 결혼했는데 ㅋ.ㅋ

추가로 여기 소스코드엔 없지만 else if도 한번 보겠습니다.

else if는 옆에 조건식이 적혀있습니다. 어려운 개념은 아닙니다. if 조건식 이외에도 추가로 적어줄 조건문이 있다면 else if를 여러번 반복해서 써도 됩니다. 혹은 그냥 else 생략하고 if (조건식1) , if (조건식2) , if(조건식3)....  else  이런식으로 해도 됩니다.

 

근데 여러분. 만약 조건이 많은 프로그램을 구현해야할 경우, if 노가다를 하는게 여간 귀찮은게 아닙니다. 실행속도를 고려할 때도 그렇구요. 그래서 오늘 추가로 공부해볼 개념이 '논리 연산자'입니다.

 

우리가 보통 수학 공부할 때,  + - * / 같은 사칙연산을 마주한적이 많을거에요. 이런 사칙연산자를 '산술 연산자' 라고 합니다. 계산에 관련된 연산자입니다.  논리 연산자는 위의 소스코드에서도 잠깐 봤겠지만 '==' 같은 등호를 논리연산자라 합니다. 

즉, A == B 라는 말은 A와 B가 같다는 말입니다. 

 

Q. =랑 다른가요?

A. 같습니다. 근데 뒤에 나올 논리연산자들을 보면 다 기호가 1쌍(2개씩)을 이루고 있어서 그냥 ==로 똑같이 1쌍으로 통일하자~ 라는 의미에서 같게 적용된거라 보시면 됩니다.

  의미 예시
1. == 일치한다. A==B
A랑 B가 같다.
2. != 일치하지 않는다. A!=B
A랑 B가 다르다.
3. && AND 연산자. 앞의 조건식, 뒤의 조건식 둘다 만족해야 한다. A==1 && B ==5
A가 1, B가 5인 경우에만 구문을 실행해라.
4. || OR 연산자. 앞의 조건식 혹은 뒤의 조건식 둘 중 하나만 만족해도 된다. A == 1 || B == 5
A가 1이거나 B가 5면 구문을 실행해라.
이 경우는 둘다 1,5여도 실행한다.
5. %  (산술 연산자) 나머지 값만 보여준다. C = 5;  printf("%d",C%4);
출력값은 1. 왜냐? 5를 4로 나눴을 때 나머지 값은 1이니까.
6. >= , <= 크거나 같다. 혹은 작거나 같다. A>=B
A가 B보다 크거나 같으면 구문을 실행해라.

 

 

퀴즈

Q1. 소개팅을 나가려 한다. 근데 남자분의 키가 적어도 여자분의 키보다 컸으면 좋겠다. 여자분의 키가 163cm일 때, 남자분과의 매칭이 성사될 수 있도록 남자분의 키를 조건식을 사용해서 코드를 짜봐라. (if/else문과 논리연산자)

반응형
반응형

printf("Welcome, Let's C Language.");  // 초등학생도 쉽게 이해시켜주는 C언어 글을 포스팅합니다.

 

안녕하세요. 비전공자 출신 SW Test 엔지니어 Crush on Study입니다. 

이번 글에서는 주석 처리에 대한 소개와 #0,#1에서 다뤘던 내용들을 복습하고자 하는 차원에서 소스코드를 하나 만들어보고자 합니다.

 

Q. 먼저 이전 시간에 배운 내용을 잠깐 복습해봅시다.

A. 1) scanf에 대해 배웠습니다.

- 함수가 어떤 값을 출력한다면 반대로 입력을 받을 수 있는 기능도 있을겁니다. 입력을 받는 기능을 하는 명령어가 scanf입니다. 현재는 표준이 scanf_s로 되었고 이는 '버퍼 오버플로우' 라는 현상을 막기 위해 개정되었습니다. 

 

2) 자료형 타입에 대해 배웠습니다.

- int , double, float , unsigned (자료형 타입) 등등에 대해 배웠습니다. 각각의 자료형 타입은 표현할 수 있는 범위와 메모리 크기에서도 각자 다른 값을 갖습니다.

 

 

딱 보고 기억 나는게 없다. 하면 바로 이 전글을 참고하세요. (설마 아직까진 쉬운데 까먹으셨을까??)

https://crush-on-study.tistory.com/207

 

[C언어] #1. 자료형 타입과 scanf 함수에 대하여

printf("Welcome, Let's C Language."); // 초등학생도 쉽게 이해시켜주는 C언어 글을 포스팅합니다. 안녕하세요. 비전공자 출신 SW Test 엔지니어 Crush on Study입니다. 이번 글에서는 자료형 타입에 대한 소개..

crush-on-study.tistory.com

주석 처리 설명을 위한 소스코드

반응형
// 야, 이것도 출력해봐 컴퓨터야 ㅋㅋ
// 아니, 못해? 이걸 출력못해??????????? 

#include <stdio.h>

int main()
{   
    int tall;

	printf("How much your tall? : ");
    scanf_s("%d",&tall);

    printf("Your tall is %d",tall);

	return 0;
}

이전 시간에 짜놨던 소스코드에서 // 라는 걸 이용해서  제가 이상한 문구를 적었습니다. 하지만 이를 실행하면 제가 깝쭉거린 대사는 출력되지 않습니다. 그게 바로 // 때문인데요. 이걸 바로 '주석' 이라고 합니다.

주석은 프로그래밍을 하는데 있어서 구독자, 코워커에 대한 배려라고 할 수 있습니다. 또한, 자기 자신을 위한 것이기도 합니다. 

코드에 대한 설명을 할 때 주로 쓰는데요.  한줄로 설명할꺼면 //을   여러줄로 설명할꺼면 /* */로 하면 됩니다.

주석 2

이렇게 해도 초록색으로 칠해진게 보입니다. 초록색으로 칠해진 부분은 출력에 영향을 전혀 주지 않는다! 라고 이해하시면 되겠습니다.

 

자, 그러면 지금까지 배운걸 토대로 우리 인생의 첫 프로그램을 짜보도록 합시다.

소스코드의 목적은  1. 이름  / 2. 키  / 3. 몸무게    이 3개의 정보를 입력받아서 출력하고자 합니다.

소스 코드 하나하나씩 살펴보겠습니다. 거의 다 챕터0, 챕터1에서 배웠던 내용이고 2가지 정도만 새로 보이는 개념이네요. [ ] 랑 \n (역슬래시 n) 인데요. 일단 이거 제쳐두고 우리가 먼저 아는 것들부터 봅시다.

1. 변수를 먼저 선언했습니다.
키랑 몸무게 그리고 이름을 입력받고자 했습니다. 그렇기 때문에 가장 먼저 이들을 선언해줬습니다. 
2. printf & scanf_s를 통해 키,몸무게,이름을 입력받고 출력하였습니다.
각각의 자료형 변수 타입에 해당하는. 그러니까 int -> %d / float -> %f / char -> %s를 매칭시켜줬습니다.
%d,%f는 앞에서도 배운 내용이니까 익숙하실텐데 %s는 처음보는 것일겁니다.
char 자료형은 크게 2가지 형식지정자와 매칭이 됩니다. %c랑 %s인데요.
c의 경우는 '문자 하나'만을 받을 때 쓰는거고 s의 경우는 '문자 하나 뿐만 아니라 여러 문자들'까지 받을 때 씁니다.

* 보시면 char에다가 값을 선언해준게 "Crush"입니다. 만약 %c라고 했다면 앞에 C 하나만 출력이 됩니다. 왜냐? c라는 형식지정자는 문자 하나만을 입력받는다 했으니까 제일 앞에있는 C만 출력되겠죠. 이해되셨나요?
그래서 사실, c를 쓸 일은 거의 없습니다. 웬만하면 s 형식지정자를 사용하도록 합시다.

** char를 선언하고 printf마냥  문장 혹은 단어를 출력하기 위해서는 " " 큰따옴표를 이용해야 합니다. 작은따옴표해도 되긴해요.
3. ,tall  / ,weight / ,name이 뭐지?
printf를 출력할 때, 입력받은 값을 출력하기 위해선 위 코드에 나온 것처럼 큰따옴표 뒤에 (, 함수명)을 적어줘야 합니다. 

 

* 그럼 이제 안배운 내용을 한번 봅시다. 

1) [ ]가 뭐에요? 

- 아직 완전 기초단계임에도 불구하고 배열 개념을 불가피하게 쓰게 된 점이 죄송스럽지만 뒤에 굉장히 자세히 설명해드릴테니 오늘은 개념만 간단히 설명드릴게요.

이 괄호를 C언어에서는 배열(array)이라고 부릅니다. 예를 들어서요.

int a = 1;
int b = 2;
int c = 3;
int d = 4;
int e = 5;

이렇게 있다고 합시다. 변수 5개의 값들을 일일이 지정해줬는데요. 여간 귀찮은 일이 아닙니다. 그래서 이걸 간단히 표현하고자 생각한게 배열입니다. 변수 5개를 한 곳에 담아두자는 의미에서

int arr[5] = {1,2,3,4,5};

라고 표현을 합니다. arr은 함수의 이름입니다. 그리고 [5]는 arr라는 배열함수가 5개의 칸을 할당받았다. 라는 겁니다.

그리고 그 5개의 칸에는 각각 1,2,3,4,5라는 값이 저장되어있다. 라고 보시면 됩니다.

 

Q. 그러면 [ ]라고 비워둔 이유는 뭔가요?

A. 비워도 됩니다. 단, arr[]={1,2,3,4,5}; 이런 식으로 배열함수에 무슨 값들이 저장되어있는지 적어줘야합니다. 

그러면 굳이 [5]라고 적지않아도  "아, 값이 5개가 있으니까 5칸이겠구나." 라고 인식을 합니다.

그래서 "Crush"를 썼을 때, 굳이 [6]이라고 적지 않은 것입니다.

 

Q. 왜 [5]가 아니라 [6]인가요?

A. 자, 여기서 더 깊게 들어가면 여러분들 C언어 흥미 잃어버립니다. 그러니까 이 부분은 다음에 배열 제대로 배울 때 언급하겠습니다.

 

 

2) \n가 뭐에요?

출력값 화면

\n을 쓰면 출력을 할 때, 저런 식으로 Enter (개행)가 적용된 상태로 출력이 됩니다. 만약 \n을 안하면 Enter가 적용되지 않고 쭉 한 줄로 이어진 출력값을 마주하게 됩니다.

\n은 가독성을 위해 꼭 필요한 개념이므로 앞으로 자주 쓰게 될 것입니다.

반응형
반응형

printf("Welcome, Let's C Language.");  // 초등학생도 쉽게 이해시켜주는 C언어 글을 포스팅합니다.

 

안녕하세요. 비전공자 출신 SW Test 엔지니어 Crush on Study입니다. 

이번 글에서는 자료형 타입에 대한 소개와 scanf함수에 대해 설명하고자 합니다.

 

Q. 먼저 이전 시간에 배운 내용을 잠깐 복습해봅시다.

A. 1) 전처리구문과 헤더파일에 대해 배웠습니다.

- 전처리구문은 main함수 및 그 외의 함수들을 실행하기전에 먼저 컴퓨터가 인식하고 가야할 것들을 가리킵니다.

- 헤더파일은 함수를 선언하기 위한 기본적인 라이브러리들을 의미하며, 이는 사용자의 입맛에 따라 커스텀을 할 수도 있습니다. 이 때, 커스텀한 헤더파일은 " "로 표기하며, 기본 헤더파일은 < >로 표기합니다.

 

2) int main()와 printf , return에 대해 배웠습니다.

- int는 함수의 자료형 타입 / main은 함수의 이름 / ()는 매개변수 (여기선 비어있으므로 =void)의 자리임을 알게 되었습니다. 그리고 printf란 뒤에 나온 문장들을 화면에 출력시켜달라는 명령어임을 배웠습니다.

return은 함수의 자료형 타입이 void가 아닌 다른 자료형 타입이 선언되었을 경우 적어주는 함수의 '마침표' 같은 기능을 함을 배웠습니다.

 

 

딱 보고 기억 나는게 없다. 하면 바로 이 전글을 참고하세요. (설마 까먹으셨을까?)

https://crush-on-study.tistory.com/206

 

[C언어] #0. C언어를 왜 배워야 하는가? / "Hello World"

printf("Welcome, Let's C Language."); // 초등학생도 쉽게 이해시켜주는 C언어 글을 포스팅합니다. 안녕하세요. 비전공자 출신 SW Test 엔지니어 Crush on Study입니다. 오늘부터 티스토리에서도 C언어를 포스팅

crush-on-study.tistory.com

#1. 두번째 강의 소스코드

반응형
#include <stdio.h>

int main()
{   
    int tall;

	printf("How much your tall? : ");
    scanf_s("%d",&tall);

    printf("Your tall is %d",tall);

	return 0;
}

우리가 가장 먼저 볼 소스코드는 int tall;입니다.

int tall;
1. int tall; : ?? 이게 뭘 의미하나요? 이거는 tall이라는 함수를 int라는 자료형 타입으로 선언을 하겠다. 라는 의미입니다. tall의 값은 지정되어있진 않지만  일단 우리는 이 소스코드를 통해 tall을 탄생시켰습니다.

나는 값을 넣어주고 싶다. 하시면 int tall = 0; 이런 식으로 넣어도 됩니다. 0이 아니라 무슨 숫자를 넣든 상관없어요.

근데 여기서 주의해야할 점. 바로 int가 가지는 의미와 범위입니다.

앞에서 #0번 C언어 글에서 적었지만 int는 정수를 의미하는 integer의 약자입니다. 즉, 소수는 허용되지 않습니다. -200, 0, 26 같은 음의 숫자, 0 , 양의 숫자만 인정됩니다.  그리고 이 정수가 가지는 범위는 한정되어 있습니다.

자료형 변수의 메모리 크기 & 범위

위의 표를 봅시다. int가 가지는 범위는 -2147483648 ~ +2147483647 이라 나왔습니다. 만약 여러분들이 int tall에다가 집어넣은 값이 2147483647로 끝부분의 범위에서 +1만 더해주면요.

쓰레기 값

이런 결과값이 출력이 됩니다. 음? 2147483648를 입력했는데 왜 다른 값이?? 그야 int가 가지는 범위를 초과한 값을 입력했기 때문에 이상한 결과가 나온 겁니다. 우리는 이걸 '쓰레기 값'이라고 부릅니다. 

그럼 이걸 수정하려면 더 큰 범위를 가지는 자료형 변수로 수정해서 선언해야겠죠? float도 있고 long long도 있네요.

근데 이 둘을 보면 둘 다 범위는 int보다 큰데 메모리 크기에서 차이가 보입니다. float는 4byte고 long long은 8byte네요. 그러면 인간적으로 메모리를 덜 잡아먹는 자료형 변수를 사용하는게 효율적인 프로그램이 될 것입니다.

 

따라서 우리는 float를 사용해서 다시 소스코드를 고쳐보고 동일한 값을 넣어보도록 하겠습니다.

#include <stdio.h>

int main()
{   
    float tall;

	printf("How much your tall? : ");
    scanf_s("%f",&tall);

    printf("Your tall is %d",tall);

	return 0;
}

오 이제 원하는 값대로 나오네요. 그쵸? float가 실수형 타입이다보니 뒤에 소수점까지 나오긴했지만 그래도 입력한 값이랑 똑같이 나왔습니다.

 

* char같은 문자형 타입을 제외하곤 정수&실수에서는 'unsigned (자료형 타입)' 이라는 선언을 심심찮게 볼 수 있습니다. 이 의미는 음의 숫자를 제외하고 그 만큼을 양의 숫자의 바운더리에 추가해라! 라는 뜻입니다.

쉽게 말하자면 -10~10이라는 범위를 가진다는 aaa 라는 자료형 타입이 있다 하겠습니다. 이 때, unsigned aaa 라고 선언하면 범위는 0~20이 됩니다. 

 

 

추가로 볼 개념은 scanf입니다.

scanf
1. 버퍼 오버플로우 : 소스코드를 보시다 문득 의문이 드신게 있을 겁니다. 이번 글의 제목. 그리고 이 테이블에서의 제목은
scanf인데 왜? 소스코드에선 scanf_s를?? 적었을까요? 

일부 IDE (통합개발환경 툴)에서는 scanf를 적을 시, 컴파일 에러가 나는 경우가 있습니다. scanf 함수는 형식지정자에 맞춰서 값을 입력받고 이를 할당된 메모리 주소에 값을 넣습니다. 이 입력 인자로 받은 주소에 값을 저장하는 과정에서 할당된 메모리의 크기를 벗어날 위험이 있습니다. 이걸 바로 "버퍼 오버플로우"라 합니다. 현재는 scanf대신 scanf_s를 표준으로 삼곤 하는데 가끔은 scanf해도 에러가 안나는 버전이 있기도 합니다.
2. 형식지정자? : 위에서 빨갛게 칠한 단어. 형식지정자란 뭘까요? 소스코드를 보시면 int형 타입의 함수값을 입력받을 때는
scanf_s(%d")를  float형 타입의 함수값을 입력받을 때는 scanf_s(%f")를 선언해줬습니다.
즉, 형식지정자란 값을 입력받거나 출력할 때, 자료형 타입에 대응되는 '약속'들을 의미합니다. 이 부분이 C언어에서 몇 안되는 외울거리들 중 하나입니다. 여러번 복습하고 직접 코드를 짜보면서  표를 보지않고도 쓸 수 있도록 합시다.
3. 메모리 주소 : scanf_s에서 형식지정자를 정하고 뒤에 '&' 라는 기호를 적었습니다.  &라는 기호를 앰퍼샌드라고 부르는데요. C언어에서 &는 함수에 대한 메모리 주소를 호출하는데 사용합니다. 만약 scanf_s를 쓸 때, &를 적지 않으면 컴파일 에러는 뜨지 않으나 실행이 안되는 현상을 마주하게 됩니다. 까먹지 말고 꼭 표기합시다. 저도 가끔씩 까먹어요 ㅋㅋㅋ 

 

#define _CRT_SECURE_NO_WARNINGS

- 아, 나는 scanf_s 쓰기 싫다. 뭐하러 두 문자 더 추가해줘야하냐? scanf할랭!! 하시는 분들을 위한 전처리구문입니다.

위 전처리구문을 소스코드 제일 위에다 선언해주시면 scanf함수에 대한 에러를 무시하고 사용할 수 있게 해줍니다.

근데 코딩테스트 같은거 볼 때 그냥 scanf_s가 표준이니까 귀찮더라도 이거 씁시다 ㅎㅎ

 

 

복습

Q1. scanf_s 함수를 통해서 본인의 키랑 몸무게를 출력해보세요. 이 때, 키는 정수형 자료로  몸무게는 실수형 자료로 선언하세요.

Q2. 오늘 배웠던 자료형 타입의 표에서 가장 작은 메모리 크기를 가지는 자료형 타입은 무엇인가요?

반응형

+ Recent posts