눈으로 하는 코딩이 아닌! 직접 타이핑하는 코딩은 실력 향상에 엄청난 도움이 됩니다.




안녕하세요~! 정선생이예요. 이번에는 함수 이후에 다뤘어야했던 변수의 유효범위를 알아볼거예요.

제가 작성한 줄 알고 넘어가는 바람에 게시글 순서가 살짝 꼬였네요.. 죄송합니다 ( __ )

일단 이 글은 배열 전에 읽어주시기를 바라고 함수 - 재귀함수 게시글을 보신 후에 보시는 것을 추천드립니다.

이전 게시글 보기 => ( 함수 ) ( 재귀함수 )



변수에 대해서는 두가지 종류가 있어요. 전역 변수와 지역 변수.

함수 외부에 변수를 정의 한 것은 전역 변수, 함수 내부에 변수를 정의 한 것은 지역 변수라고 해요.

글로는 주절주절 쓴 것 밖에 안되니까 바로 예제를 확인해보죠.


#include <stdio.h>
int x = 20;
int main() {
	printf("main block에서의 현재 x의 값 => %d\n", x);
	if(true){
		int x = 5;
		printf("if block에서의 x의 값 => %d\n", x);
	}
        int x = 10;
	printf("main block에서의 현재 x의 값 => %d\n", x);
	return 0;
}

결과값을 보시기 전에 미리 예측 해보고 하시는걸 추천합니다.


결과값을 보셨나요? ' 컴파일러는 각 블록에 있는 변수를 우선적으로 쓰게 된다. '

음.. 말이 어렵나요? 어떠한 변수를 쓰게되면 자신의 블록을 최우선으로 먼저 봅니다. 그런데 자신의 블록에 해당 변수가 없다면 그 상위 블록으로 나가서 확인을 해요.

2번째 줄의 int x = 20; 이 전역변수예요.

전역 변수와 지역 변수 차이점 중 하나가 지역 변수는 처음에 초기화를 해주지 않는다면 쓰레기 값이 생기는 반면, 전역 변수는 처음에 초기화를 해주지 않는다면 보통 0으로 자동 초기화가 됩니다.

int x = 20; 을 int x; 로 바꾸고 실행해보세요.


그리고 다음 예제를 봐보죠.


#include <stdio.h>
int main() {
	if(true){
		int x = 5;
		printf("if block에서의 x의 값 => %d\n", x);
	}
	printf("main block에서의 현재 x의 값 => %d\n", x);
	return 0;
}

아마 printf("main block~~") 줄이 에러가 날꺼예요. 왜냐면 현재 블록에서는 x가 없고, 그 상위 블록에도 x가 없으니까요.

" 아! 지역 변수가 해당 블록을 떠나면 사용 할 수 없구나. "

이해 되시나요?ㅎ



'Programming > C' 카테고리의 다른 글

[C] 배열(Array)  (0) 2018.05.24
[C] 재귀함수(Recursion)  (0) 2018.05.22
[C] 함수  (0) 2018.05.15
[C] 반복문  (0) 2018.05.06
[C] 조건문  (0) 2018.05.04


눈으로 하는 코딩이 아닌! 직접 타이핑하는 코딩은 실력 향상에 엄청난 도움이 됩니다.




안녕하세요~! 정선생이예요. 앞서했던 내용들은 C의 기초였어요. 앞으로는 좀 더 심화된 내용을 다룰꺼예요.

그 심화된 내용의 첫 번째. 바로 배열(Array)입니다.

정말 단순하게 '둘 이상의 변수를 모아둔 것'을 배열이라고 해요. 그런데 변수들과는 다르게 선언법과 접근법이 달라요. 


배열이 왜 필요하게 됐는지가 중요하겠죠?

초등학교로 예를 들어볼게요. 각 학년별 반(class) 인원을 저장하는 변수들이 필요하다고 생각해보죠.


우선 1학년만 10개의 반이 있다고 가정할게요. 

int class101, class102, class103, ...;

선언하는 것도 한세월이 걸리겠네요..

그런데 이걸 한 번에 해결해주는게 배열이예요.


배열의 선언법은 간단합니다.

데이터타입 배열명[배열의길이];

즉, [    int   class1[10];    ]. 

이 말은 다음 그림 예시와 같아요.



간단하게 number[5]는 5개의 방을 가졌고. 0호 방, 1호 방, 2호 방, 3호 방, 4호 방이 있다. 라고 생각하면 더 편합니다.

그런데 이 방은 int형이다.. 정도?

배열은 메모리 주소에 연속되서 적재되요. 적재된다는 얹어진다고 보면 되요.


 메모리 주소

(Byte 단위)

내용 

 1000

number[0] 

 1001

 1002

 1003

 1004

 number[1]

 1005

 1006

 1007


이런식으루요 ㅎㅎ 4바이트인 이유는 int형이기 때문!


배열의 선언만 알아서는 안되겠죠. 초기화를 알아야합니다.

초기화 방법은 다음과 같이 몇가지가 있어요.

 방법 1.

int arr[] = { 1, 2, 3, 4, 5 }; // arr[0]에는 1, arr[1]에는 2, ... , arr[4]에는 5가 차례대로 대입되면서 5개의 길이를 가진 배열임을 알게됨.

 방법 2.

int arr[5] = { 1, 2, 3, 4, 5 }; // 길이가 5인 배열을 만들면서 그 배열 속에 1~5까지 넣음.

 방법 3.

int arr[5]; // 길이가 5인 배열이 만들어짐

int i;  // 반복문을 돌면서 0번~4번 배열에 1, 2, 3, 4, 5를 대입.

for(i = 0; i < 5; i++)

    arr[i] = i + 1;


출력은 각각의 방 번호(인덱스라고 합니다)를 직접적으로 넣으면 됩니다.

[      printf("%d", arr[4]);     ] 처럼 말이죠ㅎㅎ 물론 상수가 넣어져있는 변수에도 가능해요.

[      printf("%d", arr[n]);     ] 처럼요.


주의할 점은 해당 배열의 길이를 넘어서면 안됩니다. 다른 메모리를 건드려 시스템이 맛탱이가 갈수도 있어요 :( 진짜 가장 중요합니다.



초기화 방법에 출력방법까지 알았겠다.. 그렇다면 이제 활용을 해봐야겠죠?

1~10이 저장되어 있는 배열에서 사용자가 입력한 숫자를 찾는 예제가 가장 적합해보여요. 소스를 봐보죠.


#include <stdio.h>

int main() {
    int arr[10] = { 2, 3, 1, 4, 7, 5, 8, 6, 10, 9};
    int n;
    int i;
    scanf("%d", &n);
    for(i = 0; i < 10; i++){
        if(arr[i] == n){
            printf("찾음!\n");
            break;
        }
    }
    if(i == 10)
        printf("못찾음!\n");
    return 0;
}

배열을 초기화 한 후에 입력을 받네요.

i = 0 ~ 9까지 1씩 증가하면서 arr[i]의 값과 n을 비교하네요. 같으면 찾는 값이니 '찾음!'을 출력하고, 아무것도 못 찾고 for문을 빠져나오면 i는 10이겠죠?

그러니 못찾음이 출력되고 끝납니다. ㅎ 이해 되시나요?  ㅎ


" 쌤 그러면 정렬도 가능하겠네요?! "

 => 당연히 가능합니다. 다음 게시글에서 정렬을 다루게 될 예정이예요. 혹여나 못 다루게 되면 그 다음 게시글에 꼭 다룰거예요.



다음으로 다차원 배열이라는게 있어요.

2차원 배열, 3차원 배열이 대표적이고 보통은 2차원 배열까지만 쓰죠.

2차원 배열은 여러개의 1차원 배열이 합쳐진거라고 보면되요.

다시말해서..

int arr[3][5]; 라고 치면은

arr[5] 라는 배열이 3개가 더 있는거예요

즉 다음과 같은 느낌으로 배열이 표현이 되겠죠?


arr[0][0]

arr[0][1]

arr[0][2] 

arr[0][3] 

arr[0][4] 

arr[1][0]

arr[1][1] 

arr[1][2] 

arr[1][3] 

arr[1][4] 

arr[2][0]

arr[2][1]

arr[2][2]

arr[2][3]

arr[2][4] 


행렬로 표현이 된다고도 하죠?

그렇지만 메모리에는 일자로 되있겠죠? 메모리가 행렬처럼 2차원적으로 존재하지는 않으니까요 ㅎ


arr[0][0]

arr[0][1] 

arr[0][2] 

arr[0][3] 

arr[0][4] 

arr[1][0] 

... 

... 

... 

... 

... 

... 

... 

... 

arr[2][4] 


이렇게 저장이됩니다 :) 이건 언제 쓰냐구요?? 음.. 아까 학급에 대한 예를 계속 들어보도록하죠!


각 학년별로 학급은 10개 반이라고 치면,

1학년 10개, 2학년 10개, 3학년 10개, ... , 6학년 10개. 총 60개의 인원 저장 변수가 필요해요.

그렇다면 arr[60]으로 해도 되겠죠?

그치만 조금 더 가독성있게, 보는 사람도 편한 느낌이 들게 정의해보자구요.

arr[6][10];

arr[0][?] 라인은 1학년

arr[1][?] 라인은 2학년

...

arr[5][?] 라인은 6학년.

오히려 접근성이 편하겠죠? 이해하기도 쉽구요.


이차원 배열에 대한 접근이나 초기화는 반복문을 중첩해서 합니다. 다음과 같이요.

#include <stdio.h>

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

" 쌤 아까 메모리에는 일자로 되어있다고 했는데 그러면 1차원 배열로 호출해도 되지 않나요? arr[1][0] 을 arr[10]처럼요!! "

 => 이 질문에 대해서는 다음의 코드를 작성해보도록 하죠!


#include <stdio.h>
int main() {
   int arr[6][10];
   int i, j;
   int num = 1;
   for (i = 0; i < 6; i++) {
      for (j = 0; j < 10; j++)
         arr[i][j] = num++;
   }
   for (i = 0; i < 60; i++) {
	printf("%d ", arr[i]);
   }
   return 0;
}

아마도 결과는 8자리정도 되는 숫자가 일정한 규칙으로 나올꺼예요. 다음처럼ㅎㅎ



결과처럼 나온 이유는, 현재 값이 얹어져있는 메모리 위치를 출력해준거예요. 그리고 일정한 규칙으로 커지고 있어요. 이건 2차원 배열 arr[6][10]에서 10의 숫자를 바꿔보면서 출력하면 제가 어떤 얘기를 하려했는지 알꺼예요. ^.^

그리고 조금 더 자세한 내용은 추후 포인터 부분에서 다룰꺼예요.

지금은 2차원 배열에서는 arr[i][j] 방식으로 출력한다를 꼭 지켜주시구요.



배열에 대한 내용은 앞으로 함수와 배열, 정렬에 대한 기초를 해드리고 배열 내용을 마치려합니다.







게시글을 보시다가 궁금한 내용, 이게 맞나? 하는 내용, 이건 틀렸어!하는 내용들은 과감하게 댓글 달아주시면 감사하겠습니다.


이론적인 내용에 대한 궁금증은 검색을 통해 궁금증을 해결하는 것이 좋아요!!

실습적인 내용에 대한 궁금증은 최대한 생각을 해보고 검색을 하는 것이 좋아요!!

'Programming > C' 카테고리의 다른 글

[C] 변수의 유효범위 ( 미완성 )  (0) 2018.05.29
[C] 재귀함수(Recursion)  (0) 2018.05.22
[C] 함수  (0) 2018.05.15
[C] 반복문  (0) 2018.05.06
[C] 조건문  (0) 2018.05.04


눈으로 하는 코딩이 아닌! 직접 타이핑하는 코딩은 실력 향상에 엄청난 도움이 됩니다.




안녕하세요~! 정선생이예요. 이번에는 재귀함수를 배워볼꺼예요.

일단 재귀함수의 사전적 정의를 봐보죠!! 재귀란, 수학이나 컴퓨터 과학 등에서 자신을 정의할 때 자기 자신을 재참조하는 방법을 뜻한다. (출처바로가기)

음.. 마지막이 중요해요. 자기 자신을 재참조한다. 프로그래밍에서는 자기 자신을 재호출한다. 로 바꿔서 해석할 수 있어요. 이게 뭔소린지 예제소스를 보면서 알아가봐요!!


가장 많은 예시로 사용되는 코드는 계승(Factorial)이예요. 표시는 n! 로 합니다. 자세히 들어가면 수학시간이 되버리니까 구글링으로 정의를 알아보도록해요 ㅎㅎ 자 일단은, 3! = 1 x 2 x 3 이구요. 5! = 1 x 2 x 3 x 4 x 5 가 됩니다.

" 아하! n! 이란 1~n 까지를 곱한거구나. "

이해 가시나요?

1~n까지 1씩 증가하면서 곱한 값을 출력해주는거니까 반복문으로 해결 할 수가 있겠죠?


#include <stdio.h>

int main() {
    int n=10;
    int i, fact=1;
    for(i = 2; i <= n; i++)
        fact = fact * i;
    printf("10! = %d", fact);
    return 0;
}

 출력

10! = 3628800


자 반복문으로 작성했으니 10!을 구하는 함수를 작성해봅시다.

#include <stdio.h>
int fact(int n){
    int i, result;
    result = 1;
    for(i = 2; i <=n) i++)
        result *= i;
    return result;
}

int main() {
    printf("10! = %d", fact(10));
    return 0;
}

이제 이 함수를 재귀함수로 바꿀수가 있는데요. 이게 쉽다고 단정을 짓기도 애매하고, 어렵다고 확정 짓기도 애매합니다.. 


일단 재귀함수란, 자기 자신을 계속 호출하는건데 어떤식으로 호출하는지 코드를 볼게요.

#include <stdio.h>
int fact(int n){
    if(n == 1)
        return 1;
    else
        return n * fact(n-1);
}

int main() {
    printf("10! = %d", fact(10));
    return 0;
}

코드는 생각보다 엄청 간결해졌어요.  fact함수는 매개변수로 정수형 변수 하나를 받네요.

맨 처음은 fact(10)

if에서는 false니까 넘어가겠죠?

그리고 return n * fact(n-1) 을 해주는데 현재 n은 10이죠?

그러면 fact(9)를 호출하겠네요. 그렇다면 return 10 * fact(9)

fact(9)에서는 9 * fact(8)

fact(8)에서는 8 * fact(7)

...

fact(2)에서는 2 * fact(1)

fact(1)에서는 if문의 true가 되니까 1을 리턴합니다.

자 그러면 계산된 값들을 역으로 올라가봅니다.

fact(1)은 1이니까 fact(2)에서는 2 * 1이 되요.

fact(3)에서는 3 * fact(2). 즉 3 * 2 * 1.

fact(4)는 4 * fact(3). 즉 4 * 3 * 2 * 1.

...

fact(9)는 9 * fact(8). 즉 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1.

fact(10)은 10 * fact(9). 



재귀함수는 여러 문제를 봐보면서 어떤 방식으로 동작하는지를 파악해야해요.

코드 자체를 외운다기보다는 공책 펴놓고 거기에서 n이 10일때, 9일때, 8일때, ... 각각의 n에 대해 함수가 어떻게 작동하는지를 디버깅 해보면 이해가 쉽게 될거예요. 컴퓨터 코딩이라고 손코딩이 중요하지 않은 것은 아니예요. 손코딩도 그만큼 중요합니다 ^.^



======================================== 5월 29일에 추가된 내용 ==========================================


현재 제가 작성 한 줄 알고 넘어갔던 변수의 유효범위와 관련된 게시글을 재귀함수 다음으로 읽어주시고 배열 파트로 넘어가시길 권장합니다.

죄송합니다 ( __ )

( 변수의 유효범위 게시글로 바로가기 )




게시글을 보시다가 궁금한 내용, 이게 맞나? 하는 내용, 이건 틀렸어!하는 내용들은 과감하게 댓글 달아주시면 감사하겠습니다.


이론적인 내용에 대한 궁금증은 검색을 통해 궁금증을 해결하는 것이 좋아요!!

실습적인 내용에 대한 궁금증은 최대한 생각을 해보고 검색을 하는 것이 좋아요!!

'Programming > C' 카테고리의 다른 글

[C] 변수의 유효범위 ( 미완성 )  (0) 2018.05.29
[C] 배열(Array)  (0) 2018.05.24
[C] 함수  (0) 2018.05.15
[C] 반복문  (0) 2018.05.06
[C] 조건문  (0) 2018.05.04


눈으로 하는 코딩이 아닌! 직접 타이핑하는 코딩은 실력 향상에 엄청난 도움이 됩니다.




안녕하세요! 정선생이예요. 오늘은 함수에 대해서 알아볼겁니다! 이 함수라는 것은 우리가 앞서서 많이 사용해봤어요.

printf()도 함수고 scanf()도 함수예요. c에서 제공해주는 함수인거죠. 이 외에도 되게 많답니다 :)

함수(Function)는 '첫 번째 집합의 임의의 한 원소를 두 번째 집합의 오직 한 원소에 대응시키는 대응 관계' 라는 수학적인 정의예요. 수학적인 정의도 좋지만 일단 프로그래밍에서의 함수 개념을 알아야겠죠?


독립되어 있는 프로그램의 일부분을 모듈(Module)이라고 해요. 이 모듈을 사용하는 프로그래밍 기법을 모듈러 프로그래밍 이라고하구요.

예를 들어서 블록쌓기를 생각해보시면 좋아요.


어떤 느낌인지 아시겠나요? 이 프로그래밍의 장점이 있어요.

  • 각 모듈들은 독자적으로 개발이 가능하다.
  • 다른 모듈과 독립적으로 변경이 가능하다.
  • 유지 보수가 쉬워진다.
  • 모듈의 재사용이 가능하다.
제가 이걸 왜 말씀드렸냐면, C에서는 모듈이란 개념을 함수랑 동일시한다는 겁니다. 함수(Function)는 특정한 작업을 수행하는 독립적인 부분이예요. 모듈이랑 비슷하죠? :) 함수에는 기본적으로 제공해주는 함수와 사용자가 직접 정의해서 쓰는 사용자 정의 함수가 있어요. 사용자 정의 함수에 대해서만 알아볼거예요.

일단은 함수가 왜 필요한지가 중요하겠죠? 소스코드로 보여드릴게요.
#include <stdio.h>

int main() {
    int i;
    for(i = 0; i < 10; i++)
        printf("*");
    for(i = 0; i < 10; i++)
        printf("*");
    for(i = 0; i < 10; i++)
        printf("*");
    return 0;
}

코드롤 보시면 같은 작업을 3번이나 반복하네요. 중복되는 부분을 하나의 모듈로 빼서 정의하는거예요. 다음과 같이요


#include <stdio.h>
void print_star(){
    int i;
    for(i = 0; i < 10; i++)
        printf("*");
}
int main() {
    int i;
    print_star();
    print_star();
    print_star();
    return 0;
}

어때요 훨씬 더 깔끔해진게 보이나요? ^.^


main문에서 print_star(); 이 구문은 print_star() 함수를 호출한다. 라는 뜻이예요.


함수는 두 가지의 정의를 가질 수 있어요. 위의 코드처럼 선언과 동시에 함수의 내용을 작성하는 방법(무조건 main 함수 위에 있어야해요.) 함수에 대한 정의만 해놓고 main 함숨 아래에다가 함수의 내용을 작성하는 방법이 있어요.

후자의 얘기는 코드로 보여드릴게요

#include <stdio.h>
void print_star(); // 함수 원형(Function prototype)이라고 합니다.
int main() {
    int i;
    print_star();
    print_star();
    print_star();
    return 0;
}
void print_star(){
    int i;
    for(i = 0; i < 10; i++)
        printf("*");
}

이해 되셨나요? :) 


초반에 main 함수에 대한 설명을 드릴때 함수의 구조를 대강 알려드렸는데 여기서 자세하게 말씀드려볼게요.

반환형(Return type), 함수 헤더(Function header), 함수 몸체(Function body)로 구성되어 있어요.


반환형 함수이름(매개변수){

    함수의 내용

}


예시로 봐볼게요. 두 개의 정수를 매개변수로 받아서 두 정수의 합을 구해서 반환해주는 함수를 작성해보죠

#include <stdio.h>
// main함수에서 add(5, 3) 은
//add함수에서 x를 5, y를 3으로 정의하고 사용하겠다.는 뜻
int add(int x, int y){
    int result;
    result = x + y;
    return result;
}
int main() {
    printf("5 + 3 = %d\n", add(5, 3));
    return 0;
}

add라는 함수에서 [    int add(int x, int y)    ] 부분은 함수 헤더라고 하구요 맨 앞에 있는 [   int    ]는 반환형이라고 해요. 그 아래 함수의 내용은 함수 몸체라고 합니다.



반환형의 종류에는 int, long, short, double, float, char, char *, void, ... 등이 있습니다. 변수 선언할 때의 자료형과 비슷하네요 :)



그런데 void라는 반환형은 무엇이냐면, 아무것도 없다는 소리예요. 즉 반환하는 값이 없다. 라는 것이 되겠죠?

그러나 해당 함수를 종료시키려면 return;만 작성시켜주면 되요. 다음과 같이요.

#include <stdio.h>
void print_star(){
    int i;
    for(i = 0; i < 10; i++){
        if(i == 5)
            return ;
        printf("*");
    }
}
int main() {
    print_star();
}

매개변수에는 변수를 넣을수도 있어요. 자료형에 맞는 것을 넣어줘야합니다. int라면 int를 매개변수로, double이라면 double을 매개변수로 넣어줘야합니다.


함수를 작성하다보면 조건을 통해 return이 달라지게끔 하고 싶어요. 최댓값을 출력하는 함수를 작성해보죠.

#include <stdio.h>
int get_max(int x, int y){
    if(x>y) return x;
    else return y;
}
int main() {
    int x, y;
    scanf("%d %d", &x, &y);
    printf("max(%d, %d) => %d\n", x, y, get_max(x, y));
}

해당 예제는 각각의 case마다 return이 꼭 존재해야한다는게 중요한 포인트여서 보여드리는거예요.

if -> return;

else -> return;

이런 방식으로 작성이 되어야해요. 

int fun(){

    if(조건)

        return;

    else if(조건)

        ~~~~

    else

        return ; 

}

이렇게 else if(조건)의 내용에 return이 존재하지 않고 함수가 끝난다면 최소한 컴파일 warning이 뜨고 99%이상으로 컴파일 error가 뜰껍니다.

제가 방금 말씀드렸던 각각의 case마다 return이 존재해야하는 이유인거죠.


이번 게시글에서 준비한 내용은 여기까지입니다. 마지막으로 함수를 사용하는 이유에 대해 정의를 하고 마무리를 짓도록할게요 :) 모두 고생하셨습니다!!

  • 소스 코드의 중복을 없애준다.
    • 한 번 만들어진 함수를 여러 번 호출하여 사용할 수 있다.
  • 한 번 작성된 함수를 다른 프로그램에서도 사용할 수 있다.
  • 복잡한 문제를 단순한 부분으로 분해할 수 있다.


이번 게시글의 문제~!

 문제

정선생은 3가지의 숫자를 입력 받아 중간값을 출력하는 프로그램을 작성하려한다. 중간값을 구하는 함수를 구현하라.

(main함수에는 scanf()와 printf(), 함수를 호출하는 구문만 있어야한다.)

 입력

30 50 40

 출력

40




P.S - 더 자세하게 다뤄야 되는 내용이 있다면 바로바로 추가해서 올리도록할게요.




게시글을 보시다가 궁금한 내용, 이게 맞나? 하는 내용, 이건 틀렸어!하는 내용들은 과감하게 댓글 달아주시면 감사하겠습니다.


이론적인 내용에 대한 궁금증은 검색을 통해 궁금증을 해결하는 것이 좋아요!!

실습적인 내용에 대한 궁금증은 최대한 생각을 해보고 검색을 하는 것이 좋아요!!

'Programming > C' 카테고리의 다른 글

[C] 배열(Array)  (0) 2018.05.24
[C] 재귀함수(Recursion)  (0) 2018.05.22
[C] 반복문  (0) 2018.05.06
[C] 조건문  (0) 2018.05.04
[C] 변수와 형식지정자  (0) 2018.04.30


눈으로 하는 코딩이 아닌! 직접 타이핑하는 코딩은 실력 향상에 엄청난 도움이 됩니다.




안녕하세요! 정선생이예요. 오늘은 반복문에 대해서 알아볼거예요. 조건문과 더불어서 중요한 부분이고 상당히 많이 쓰여요.

표현 방법도 상당히 많아서 모든 부분을 알려드리기는 사실상 불가능하다고 판단해서 교재와 같은 곳에 나온 방법으로만 설명드리려고 해요.

그러면 시작할게요 :)



반복문이 일단 무엇이냐? 반복을 하는 문. 명령문이라고 생각하면 되요.


예제를 통해서 반복문의 필요성을 알아볼까요?

printf("*****\n");
printf("*****\n");
printf("*****\n");
printf("*****\n");
printf("*****\n");


이 문장의 실행 결과는 다음과 같겠죠?

*****

*****

*****

*****

***** 


같은 문장을 5번을 반복해서 썼어요. 제가 다음 할 말 예상 되시나요? :0


반복문이라는 것은 동일한 작업들을 n번 반복해주는 것이구나.

물론 반복문 속에 조건문을 넣어서 동일한 작업들을 하지 못하게 할 수도 있기는 해요.


반복문의 종류에는 크게 3가지가 있어요.

while, do~while, for


종류의 구조를 알아보기 전에 많이 사용하는 반복문 변수가 있어요.

i, j, k 정도?

예전부터 습관처럼 굳어져서 사용하게 된 것 같아요.

흔히 반복문 카운터를 위한 변수라고 보시면 되요.


while문 구조부터 먼저 볼게요.


i를 1로 초기화를 해주고

while(i <= 10)을 만났네요

이 말은 i가 10 이하인 동안 다음 블록 구문을 실행해라.

라는 뜻이예요! 써져 있는 숫자는 프로그램이 실행되는 순서를 쓴거예요

1번으로 i 초기화, 2번으로 조건을 비교해보고 True니까 3번을, 그리고 4번으로 가서 다시 조건 비교하고 5번, ...

이런식으로 반복되는 구조를 가지고 있어요.




다음으로는 do~while 문인데 이것은 일단 한 번 실행해라! 그리고 조건을 비교해라. 인거예요.

do{ ... } 일단은 실행해라.

}while(i < 10);  'i가 10보다 작아?' 그러면 다시 이 블록 구문의 처음으로 돌아가서 실행해라.

이해 되셨나요?

do~while 에서는 while(조건);    ; 꼭 붙여주셔야해요!! :)



마지막으로 반복문 중에 제일 많이 쓰지 않을까 생각되는 for문이예요. 솔직히 저도 for문이 더 편해서 for문을 많이 사용합니다

기본 구조는 아래와 같아요

for(초기값 ; 조건 ; 증감){ ... }

세미콜론을 기준으로 3가지로 나뉘어졌네요.


while문과 비교를 해보면서 보시는게 이해가 좀 빠를꺼예요.


그렇다면 for문을 while문으로, while문을 for문으로 바꿀 수 있겠죠?

당연 do~while도 가능 합니다.


다음으로는 다중 반복문을 알아볼거예요.

반복문 속에 반복문을 넣는 것이죠

보통의 코드는 다음과 같아요



위 코드는 행렬을 생각하시면 편해요.

첫 번째 반복문은 줄 바꿈을 해주네요. ( 행을 표현 ) [ i = 0 ~ 5보다 작은 즉 4까지의 줄바꿈(5번의 줄바꿈) ]

두 번째 반복문은 * 를 출력시켜주네요. ( 열을 표현 ) [ j = 0 ~ 4까지 * 를 출력(5개의 출력) ]

그런데 두 번째 반복문은 첫 번째 반복문의 블록 구조 속에서 실행이 되네요.

이 말은 i = 0 일때 j = 0~4까지 * 출력한 후에 줄 바꾼 다음

i = 1이 되고 j = 0~4까지 * 출력하고 줄 바꾸고 ...

...

i = 4까지해서 다음과 같은 출력이 나오겠네요.

*****

*****

*****

*****

***** 


그렇다면

*****

****

***

**

*

*

**

***

****

*****

이런 출력도 만들 수 있겠죠? 다양하게 출력을 만들수가 있어요. 피라미드, 모래시계, 등등 많은 모양을 만들어 볼 수 있답니다.

반복문과 친해지는(?) 예제들 중 하나죠 ㅎㅎ



오늘 준비한 반복문은 여기까지예요.

생각보다 어렵지는 않아요. 특히나 반복문은 예제들을 많이 풀어보면 풀어볼수록 매력을 느낄 수 있을꺼예요! :)



오늘의 문제!

 문제

정선생은 오늘 배웠던 반복문을 이용하여 직각 삼각형을 만들어 보고 싶어한다. 키보드로 입력 받은 숫자가 변의 길이를 뜻한다.

 입력

3

 출력

 ***

  **

   *

 입력

5

 출력

 *****

  ****

   ***

    **

     *


힌트를 드리자면 반복문의 종료 조건을 입력받은 숫자까지 범위를 설정하면 되겠죠?

for( i = 0; i < n; i++){ .. }


 문제

사용자가 키보드로 숫자 하나를 입력을 하면 1부터 해당된 숫자까지의 홀수들과 합을 더하는 프로그램을 작성하라.

(단, 입력하는 숫자는 10 이상이라고 가정한다. 그 이하를 입력 할 경우는 프로그램을 종료한다.)

(추가로, 그 이하를 입력 할 경우에 대한 조건은 풀어보고 싶은 분들만 하길 바람)

 입력

 15

 출력

1 + 3 + 5 + 7 + 9 + 11 + 13 + 15 = 64

홀수인지 짝수인지를 판별하는 방법 중 하나가 % 연산을 하는 거예요. %연산은 나머지를 구해주거든요

현재 숫자에 % 2 를 했을 때, 1이 나오면 (   ), 0이 나오면 (   ) 겠죠?



반복문 문제는 너무너무 많아요. 응용하기도 쉽고.. 이후에 배우는 내용에서 추가적인 반복문 문제가 많이 나와요! :)






게시글을 보시다가 궁금한 내용, 이게 맞나? 하는 내용, 이건 틀렸어!하는 내용들은 과감하게 댓글 달아주시면 감사하겠습니다.


이론적인 내용에 대한 궁금증은 검색을 통해 궁금증을 해결하는 것이 좋아요!!

실습적인 내용에 대한 궁금증은 최대한 생각을 해보고 검색을 하는 것이 좋아요!!

'Programming > C' 카테고리의 다른 글

[C] 재귀함수(Recursion)  (0) 2018.05.22
[C] 함수  (0) 2018.05.15
[C] 조건문  (0) 2018.05.04
[C] 변수와 형식지정자  (0) 2018.04.30
[C] 기본 입/출력  (0) 2018.04.24

눈으로 하는 코딩이 아닌! 직접 타이핑하는 코딩은 실력 향상에 엄청난 도움이 됩니다.




안녕하세요! 정선생이예요. 오늘은 조건문에 대해서 알아볼거예요.


조건문에 들어가기에 앞서 조건이 무엇인지를 알아봐야겠죠?

조건은 Condition 이라고도 표현을 하구요.

보통 조건에 대한 결과값은 참(True)과 거짓(False)이 나와요.

조건이라는 것 자체는 비교를 한다고 생각하면 되겠죠? 같은지, 다른지, 이상인지, 이하인지, ... 등등

x ( ) y 에 대해서 ( ) 에는 다음과 같은 값들이 들어갈 수 있어요.(써드린게 끝은 아니고 더 있어요)

  1.     <        x가 y보다 작다

  2.     >        x가 y보다 크다

  3.    <=       x가 y보다 작거나 같다.

  4.    >=       x가 y보다 크거나 같다.

  5.     !=       x가 y랑 같지 않다.


이 외에도 몇 가지 더 있답니다. 그러나 이 게시글에서 다루지는 않을거라서 넘어가도록하죠!


조건에 대해서 이해를 하셨다면 조건문으로 넘어가보죠.


조건문의 종류에는 크게 두 가지가 있어요. if와 switch.

if는 만약~라면 이라는 뜻을 가지고 있어요. 사용법은 if(조건){ ... }이예요.

if(10<30) 이라고 작성이 되어있으면 10이 30 미만이면~ 인거겠죠?

조금 더 깊게 가볼까요

int x = 10;
if(x < 30){
    printf("x가 30 미만입니다.\n");
}

정수형 변수 x에 10을 대입해놓고 조건 비교를 하네요

x(현재 10)이 30보다 작습니까? 이 조건이 참(True)이라면 "    x가 30 미만입니다.    " 가 출력이 되겠죠?

조금 더 생각보면 이런 생각을 하게 되요. 조건이 거짓이 되면 30 이상이라는 출력 구문을 만들고 싶다..

이런 생각 들어야해요!!!! 

이럴 때 쓰이는 구문은 if ~ else 구문이예요.

if(조건) { ... }

else { ... }


if에서 쓰이는 else는 '그게 아니면'으로 해석하면 이해하기 쉬워져요

if(조건){ ...1 } // 만약 조건이 참이면 ...1 을 실행하고

else{ ...2 } // 그게 아니면 ...2 를 실행한다.


어때요? 쉽죠? ㅎㅎ


여기에서 또 추가가 될 수 있어요. if문의 최종판??

if(조건){ ...1 }

else if(조건){ ...2}

else{ ... }


어느정도 추리가 가능하시겠죠?!

if(조건) -> 만약 조건이 참이면 1을 실행하고

else if(조건2) -> 그게 아니면서 만약 조건2가 참이면 2를 실행하고

else -> 그것도 아니면 3을 실행한다.


else if(조건)는 여러개가 들어갈 수 있어요. if ~ else if ~ else if ~ ... ~ else ~


아래 코드를 보시고 이해하실 수 있으면 됩니다!!

int x = 10;
if(x < 30){
    printf("x가 30 미만입니다.\n");
}
else if(x < 20){
    printf("x가 20 미만입니다.\n");
}
else{
    printf("x가 30보다 크거나 같습니다.\n");
} 


다음으로 switch 문이 있어요

switch(?){
  case 1:
    ...
    break;
  case 2:
    ...
    break;
  case 3:
    ...
    break;
  ...
  default:
    ...
    break;
}

가 기본 구문이예요. 한 줄씩 해석해봅시다.

switch(?)

왜 ? 로 표시를 했냐면 여기에는 변수 하나가 들어가거든요. 문자형 변수(char)나 정수형 변수(int)가 대표적이예요. 이 외에는 넣어본 기억이 저는 없네요. :(

아까 if문의 예시에서의 변수 x를 넣는다고 가정하고 쭉 설명 드릴게요.

switch(x)가 되겠네요


결국 switch문은 x 변수를 사용해서 case에 맞게 실행을 하겠다. 라는 소리예요

case ?: ... break;

여기에서 사용한 ?는 조건이 들어가요. 보통은 단일 문자, 숫자예요.

일정 범위(<30)는 들어갈 수 없어요! case <30: 이 안된다는 얘기입니다! 문자열의 경우도 들어갈 수 없어요. case == "Jeong"; 도 안됩니다!

이어서 말씀드리면 변수 x가 1이면 case 1: ~ 을 실행하는거예요.


처음보는게 있네요? break;

이 명령어는 지금 하고 있는 블록구문( {, } )을 빠져나간다. 라는 뜻이예요.

[현재는 switch(){ ... break; ... } 이렇게 되어있죠? switch()블록에 쌓여있으니까 이 switch() 구문을 빠져나간다. 라는 소리가 되요.]



프로그램 진행 순서예요! 이해 되셨나요?! :)



자 그렇다면 다시 돌아와서

x가 3이면 case 3: 을 실행해요

case로 작성이 안되어있는 숫자는 default: 구문이 실행이되요. 

x가 4였다면 default로 이동을 하는거죠.

default는 모든 case를 작성하고 맨 마지막에 작성해요. 프로그램의 진행 순서는 순차처리 방식이라고해서 위에서 아래로 이동을 합니다.

그래서 default case에서는 break; 를 생략해도 된답니다! :) default가 마지막에 써있기 때문이예요.



조건문에 대한 설명은 여기서 마치도록 할게요. 다음의 문제를 한 번 풀어보세요~!


 문제 :

정선생은 현재 3과목 점수의 평균을 이용하여 등급을 확인해보고 싶어한다. 다음의 프로그램을 작성하라.

평균이 90점 이상이면 "A", 80점 이상이면 "B", 70점 이상이면 "C", 그 외에는 "F"로 작성한다.


 입력 :

C언어 점수는? 90

JAVA 점수는? 70

HTML 점수는? 90


 출력 :

평균 점수는 83입니다.

따라서 등급은 B입니다.


쌤요!!!! 평균은 실수형인데 어떻게 할까요? 

=> 정수형으로 출력하시면 됩니다. 실수형 타입을 설정 안하셔도 되요. ^^ 데이터 타입에 집중하라는 문제가 아니예요!!!


예시는 다음과 같아요


 문제 :

키보드로 하나의 소문자를 입력 받아서 다음과 같은 출력을 할 수 있도록 한다.

a를 입력하였을 경우 apple, b를 입력하였을 경우 banana, c를 입력하였다면 cherry, 그 외에는 Undefined 를 출력하라.

switch 문을 이용하여 작성한다.

 입력 :

 하나의 문자 입력 : c

 출력 : 

 c로 시작하는 과일 : cherry

 입력 : 

 하나의 문자 입력 : z

 출력 : 

 z로 시작하는 과일 : Undefined


문자 하나를 비교할때는 case 'a': 로 하면 됩니다.

if문에서도 마찬가지예요 if(x == 'a') 이렇게 조건을 걸면 x가 'a'이면~ 이 됩니다. :)





오늘 준비한 내용은 여기까지 입니다. 조건문.. 어떻게보면 쉽고 어떻게보면 어려운 부분이예요~ 조건문만 확실하게 이해하시면 다음에 나올 반복문, 함수 등등 쉽게 다가올겁니다. 화이팅입니다 여러분 ^^7





게시글을 보시다가 궁금한 내용, 이게 맞나? 하는 내용, 이건 틀렸어!하는 내용들은 과감하게 댓글 달아주시면 감사하겠습니다.


이론적인 내용에 대한 궁금증은 검색을 통해 궁금증을 해결하는 것이 좋아요!!

실습적인 내용에 대한 궁금증은 최대한 생각을 해보고 검색을 하는 것이 좋아요!!

'Programming > C' 카테고리의 다른 글

[C] 함수  (0) 2018.05.15
[C] 반복문  (0) 2018.05.06
[C] 변수와 형식지정자  (0) 2018.04.30
[C] 기본 입/출력  (0) 2018.04.24
[C] 기본 구조  (0) 2018.04.19


눈으로 하는 코딩이 아닌! 직접 타이핑하는 코딩은 실력 향상에 엄청난 도움이 됩니다.




안녕하세요! 정선생이예요. 오늘은 변수에 대해서 알아볼까해요. 이전 게시글(이동)에서 아~~주 간단하게 정수형 변수를 선언하는 법을 배웠어요.


다시 한 번 더 설명하자면, 변수란 변하는 수를 뜻하는거예요. 앞서 써본 [    int a    ]를 정수형 변수 a라고 하죠.

변수 선언에는 주의점이 있고, 형식지정자라는게 같이 붙어있어요. 자료형이라고도 하구요. 보통은 자료형이라고 표현을 합니다.

  • 문자형 char
  • 정수형 short, int, long
  • 실수형 float, double
종류를 싹다 써드린 것은 아니고 자주 쓰이는 것을 알려드리는거예요.

정수형과 실수형에는 한 개가 아닌 여러개가 있네요. 메모리에서 차지하는 공간(바이트 수)이 차이점이죠.
차지하는 공간이 클수록 당연히 그 만큼 더 큰 수, 더 세밀한 수를 표현 할 수 있겠죠?

우리는 방금 6개의 형식 지정자를 배웠어요.

그렇다면 변수 선언은 다음과 같이 할 수 있어요.

  • char c;         // 문자형 변수 c 선언
  • short s;        // short 정수형 변수 s 선언
  • int i;            // int 정수형 변수 i 선언
  • long l;         // long 정수형 변수 l 선언
  • float f;         // float 실수형 변수 f 선언
  • double d;    // double 실수형 변수 d 선언
위와 같이 선언을 할 수 있네요. 그렇지만 변수명에는 정말 중요한 제한사항이 있어요.
  1. 다음 키워드는 변수명으로 사용할 수 없다.
  2.  for

    short 

    union 

    inline 

    auto 

    do 

    goto 

    signed 

    unsigned 

    break 

    double 

    if 

    sizeof 

    void 

    case 

    elase 

    int 

    static 

    volatile 

    char 

    enum 

    long 

    struct 

    while 

    const 

    extern 

    register 

    switch 

    continue 

    float 

    return 

    typedef 

    default 

     

     

     

    시작부터 해서는 안될게 많네요.. 그렇지만 이미 우리가 알고 있는 short, void, int, double, long, char, ... 등등 요런건 우리가 다른 의미로 사용하고 있는 것이죠? 이런 부분은 키워드라고해요. 다시말해서 이미 그 기능적 의미가 정해져 있는 c언어의 문법을 구성하는 단어들을 가리켜서 키워드(keyword)라고 해요. 이는 프로그래머가 다른 용도로 사용할 수 없도록 제한되어 있어요. 그래서 변수명으로는 사용 할 수 없답니다.


  3. 공백은 사용이 안된다.
  4. [     int a        b;    ] 이렇게는 사용이 안된다는 소리예요. 대신에 _(언더바)를 사용해서 공백을 표현하죠.
    [     int prime_number;     ]  이런 방식으로^^

  5. 첫 글자에 숫자는 사용해서는 안된다.
  6. [     int 3ab;     ] 이렇게도 사용해서는 안된다는거예요. 첫글자는 무조건 숫자가 아닌 다른 글자!

  7. 대소문자를 구별한다.
  8. [     int abc;     int ABC;    ] 두 개의 변수는 다른 변수예요!!!

  9. 특수문자 사용을 자제하는 것이 좋다.
  10. [     int a@b;   ] 등등. 컴파일러마다 오류가 되고 안되고.. 여튼 사용은 자제하는 것이 좋습니다!
추가적으로 변수명은 전체 코드에서 이 변수가 어떤걸 하는 변수인지 이해하기 쉽게끔 선언해주시는게 좋아요 ^^

자 이제 다음과 같은 코드를 확인해보죠.


#include <stdio.h>

int main() {
	char a;
	short b;
	int c;
	long d;
	float e;
	double f;

	printf("char => %d\n", sizeof(a));
	printf("short => %d\n", sizeof(b));
	printf("int => %d\n", sizeof(c));
	printf("long => %d\n", sizeof(d));
	printf("float => %d\n", sizeof(e));
	printf("double => %d\n", sizeof(f));

	return 0;
}


위와 같은 코드의 결과값은 아래와 '비슷하게' 나올거예요.

왜 '비슷하게' 냐고 했냐면.. 메모리에 얹어지는 사이즈는 시스템마다 다르기때문이예요.



위 코드를 통해 하나를 더 알아낸 키워드가 있어요. sizeof() 라는 것.

sizeof(데이터 타입)이 기본인데, 변수를 집어넣으면 그 변수가 차지하고 있는 바이트 수를 출력해줘요.

만약 형식지정자(데이터 타입이라고 많이 표현해요)를 집어넣게되면 그 데이터 타입의 바이트 수를 출력해줘요.

만약 sizeof(int)를 하면 4가 나와요. int는 4바이트(32비트)이거든요. 

이 부분은 현시점으로는 자세하게 다루지는 않을거예요. 만약 추후에 다루게 될 일이 있으면 문제로 다루게 될 것 같네요 :)



이번에 준비한 내용은 여기까지이고 위의 코드만 직접 타이핑해서 컴파일까지해보는게 이번 게시글의 문제네요ㅎㅎ 모두 고생하셨습니다. ^^7


------------------------------------------------------ 다음의 내용은 18.05.07에 추가된 내용 ------------------------------------------------------


변수의 초기화 라는 것이 있어요. 변수는 어떠한 값을 가지고 있어야 변수로서의 의미를 가질 수 있겠죠?


int a; 라고 하는 것은 우리가 정수형 변수 a를 선언한다. 라고 표현을 하고


int a = 10;  


int a;

a = 10;


위와 같은 것을 변수의 초기화. 라고 해요. 정수형 변수 a를 선언하고, 변수가 가지고 있는 값은 10으로 한다. 이런 뜻이겠죠?

변수는 초기화 값을 정해주지 않으면 이상한 값을 가지고 있어요. 흔히 '쓰레기값' 이라고 해요.

우리는 변수를 꼭 초기화를 해주고 사용을 해야 원하는 값을 얻을 수 있어요.


다음의 코드를 타이핑해서 컴파일을 해보세요. 차이점을 알게 됩니다!

#include <stdio.h>

int main() {
	int a;
	int b = 10;
	printf("a => %d\n", a);
	printf("b => %d\n", b);
	return 0;
}


------------------------------------------------------ 다음의 내용은 18.05.14에 추가된 내용 ------------------------------------------------------


제가 변수만 설명을 드렸고 해당 자료형들의 출력법을 안 알려드렸네요.. 죄송합니다 ( _ _ )


문자의 표현 방식은 다음과 같아요

#include <stdio.h>

int main() {
        char c;
        scanf("%c", &c);
        printf("입력받은 문자는 %c입니다. 아스키 코드로는 %d입니다.\n", c, c);
	return 0;
}

문자는 %c를 이용하고 %d로 출력을하면 아스키 코드 값이 나오네요. %d가 아닌 다른 것도 사용이 가능해요.


정수 표현 방법은 다음과 같아요.

#include <stdio.h>

int main() {
        int a, b, c;
        a = 10;
        b = 0x0A;
        c = 012;
        printf("a => %d", a);
        printf("b => %x or %d", b, b);
        printf("c => %o or %d", c, c);
	return 0;
}

변수의 초기화에서 0x 로 시작하면 16진수를, 0 으로 시작하면 8진수를 저장해요. 각각의 출력은 %x (%X)와 %o 입니다.


실수 표현 방법은 다음과 같아요

#include <stdio.h>

int main() {
        float a;
        double b;
        scanf("%f", &a);
        scanf("%lf", &b);
        printf("a => %f\n", a);
        printf("b => %lf\n", b);
        printf("a => %.2f\n", a);
        printf("b => %.2lf\n", b);
	return 0;
}

float형과 double형은 표현 범위의 차이가 있어요.(바이트 수가 다른 것부터 알 수가 있죠.)

float형은 %f로. double형은 %lf로 표현을 하네요. 각각의 출력과 소숫점을 절삭해버리는 부분까지 확인해보세요 ㅎ


다음은 서식문자(%?)에 대한 종류예요.


 서식문자

출력 대상(자료형) 

출력 형태 

%d 

char, short, int

부호 있는 10진 정수 

%ld 

long 

부호 있는 10진 정수 

%lld 

long long 

부호 있는 10진 정수 

%u 

unsigned int 

부호 없는 10진 정수 

%o 

unsigned int 

부호 없는 8진수 정수 

%x 

unsigned int 

부호 없는 16진 정수 

%f 

float, double 

10진수 방식의 부동소숫점 실수 

%lf 

float, double 

10진수 방식의 부동소숫점 실수 

%e, %E 

float, double 

e 또는 E 방식의 부동소숫점 실수 

 %g, %G

float, double 

값에 따라 %f와 %e 사이에서 선택 

%c 

char, short, int 

값에 대응하는 문자 

%s 

char * 

문자열 

%p 

void * 

포인터의 주소 값


상당히 많은데 이 중에서 짚고 넘어갈 것은 unsigned int 자료형이예요.

이는 음수를 제외한 0~int size*2 입니다. 즉, 4byte int형은 -2,147,483,648~+2,147,483,647 까지가 범위인데,

-2,147,483,648~-1 까지를 표시 안하고 양수로만 표현하겠다.. 즉, 0~(2,147,483,647 + 2,147,483,648) 까지 표시하겠다. 이런 얘기예요.

보편적인 크기일 뿐이예요. :)

원래는 signed int를 사용해도 되고 int를 사용해도 되요. 결국 의미는 같아요. 대부분은 signed를 생략하죠.


%s, %p는 추후에 다룰 내용이라 아~ 이런게 있구나 ^^ 라고만 알고계세요!! ㅎㅎ






게시글을 보시다가 궁금한 내용, 이게 맞나? 하는 내용, 이건 틀렸어!하는 내용들은 과감하게 댓글 달아주시면 감사하겠습니다.


이론적인 내용에 대한 궁금증은 검색을 통해 궁금증을 해결하는 것이 좋아요!!

실습적인 내용에 대한 궁금증은 최대한 생각을 해보고 검색을 하는 것이 좋아요!!

'Programming > C' 카테고리의 다른 글

[C] 함수  (0) 2018.05.15
[C] 반복문  (0) 2018.05.06
[C] 조건문  (0) 2018.05.04
[C] 기본 입/출력  (0) 2018.04.24
[C] 기본 구조  (0) 2018.04.19



눈으로 하는 코딩이 아닌! 직접 타이핑하는 코딩은 실력 향상에 엄청난 도움이 됩니다.




안녕하세요! 정선생이예요. 오늘은 기본 입/출력에 대해서 알아볼건데요.

기본 출력 함수는 printf()를 사용한다고 이전 게시글(이동)에서 배웠어요. 기억 나시나요?^^

기본 입/출력에 대한 소개를 시작할게요.


C에서 기본적인 입/출력을 하려면 파일 상단에 하나를 꼭 적어줘야해요.

저번 [기본 구조]에서도 말씀드렸듯이 #include <stdio.h> 를 꼭!!!!!! 적어줘야합니다

이 헤더 파일에 대해서는 자세히 설명을 안드렸는데요. 추후 함수를 사용하게 될 때 알려드릴게요. 궁금하신 분은 미리 구글링!!!


기본 출력 함수로는 printf() 함수가 있어요.

예시로 보여드리면 다음과 같아요


printf("Hello World!\n");
printf("1+2 = %d", 1+2);

첫 번째 줄은 저번 게시글에서 보여드렸어요! 기억해내셔야합니다!!!!!! ㅎㅎ

\n "이스케이프 시퀀스" 라고 해요.

두 번째 방법은 %? 를 사용하는 "형식 지정자" 라고 해요.

%d10진수 정수를 표현해준다. 라고만 기억하고계세요. 추후 게시글에서 지정자만 따로 골라내서 설명해드릴거예요! :0

두 번째 줄을 이어서 보면 printf("~~~~", 1+2); 이런 방식으로 되어있네요. 

%d 에다가 1+2를 넣어라(대입해라) 라는 소리예요. 잘 모르겠죠? 다음 사진을 한 번 봐볼게요.


1+2는 첫 번째 %d에, 4+5는 두 번째 %d에 대입이 되는 것을 이해하시기만 하면됩니다. 순서대로 형식 지정자에 대입된다. 라고 이해하고 계시면 되요.

그리고 파란색 표시가 된 , 부분도 주의깊게 봐주시구요.


다음으로는 입력 함수인데요.

기본 입력 함수로는 scanf() 함수가 있어요.

scanf()함수는 > 변수 <라고 하는 것이 필요해요. 입력을 받은 것을 저장해줘야하니까요.

예시는 다음과 같아요.


int a;
scanf("%d", &a);

int a;

integer(정수)형 값을 저장하는 'a'라는 이름을 가진 변수를 생성한다. 라는 뜻이예요. 

정수 값을 저장하는 변수인데, 이름이 a다. 보통은 읽히는대로 인트 a 라고 불러요. 

정수말고 다른 것들도 있어요. 이건 다음 형식 지정자를 설명해드릴 때 같이 설명드릴거예요.

scanf("%d', &a);

printf() 함수를 이해하셨다면 어느정도 이해가 되실겁니다. scanf() 함수는 입력을 받는 함수, %d는 정수형 타입의 형식 지정자.

정수를 입력받는구나. 라고 어느정도 감이 오시면되요. 그런데 그 입력 받는걸 어디다 넣느냐? a에다가 넣는다.. 이런 뜻이죠

정리 => 정수 1개를(%d가 한 개니까요) 입력 받은 것을 a에다가 저장해라.


"쌤!! &a는 뭐예요? "

=> 이건 좀 깊은 내용이예요. 추~~~~~후에 알려드릴 포인터 부분에서 자세하게 설명을 해드릴꺼예요. 일단은 무조건적으로 & 를 붙인다고 생각하세요!!


기본적인 입출력 함수의 예를 알려드렸어요


그렇다면 아래와 같은 프로그램을 만들어볼까요?







이번 게시글에서 준비한 내용은 여기까지예요. 고생하셨구요. 그럼 이만! ^^7





게시글을 보시다가 궁금한 내용, 이게 맞나? 하는 내용, 이건 틀렸어!하는 내용들은 과감하게 댓글 달아주시면 감사하겠습니다.


이론적인 내용에 대한 궁금증은 검색을 통해 궁금증을 해결하는 것이 좋아요!!

실습적인 내용에 대한 궁금증은 최대한 생각을 해보고 검색을 하는 것이 좋아요!!

'Programming > C' 카테고리의 다른 글

[C] 함수  (0) 2018.05.15
[C] 반복문  (0) 2018.05.06
[C] 조건문  (0) 2018.05.04
[C] 변수와 형식지정자  (0) 2018.04.30
[C] 기본 구조  (0) 2018.04.19



눈으로 하는 코딩이 아닌! 직접 타이핑하는 코딩은 실력 향상에 엄청난 도움이 됩니다.




안녕하세요! 정선생이예요. 정신없던 한주여서 게시글을 많이 못 올렸네요. 죄송합니다. ( __ )


전반적으로 C나 JAVA는 이후에 배우게 될 조건문이나 반복문의 구조가 비슷합니다. 그래서 C와 JAVA가 겹치는 부분이 많을거예요.


특히나 문제로 나오는 것들은 C를 위한 문제, JAVA를 위한 문제. 나눠서 문제를 제시해드리지는 않을 예정이예요.


Programming 카테고리는 실무적인 것을 배우는게 아니고 기초를 잡아드리기 위함이예요. :)


그럼 기본 구조에 대한 설명을 시작할게요!


C의 기본 구조는 다음과 같아요.


#include <stdio.h>
int main(void){
    printf("Hello World!\n"); // 이건 주석!
    return 0;
}

많은 분들이 프로그래밍을 입문하면 이와 비슷한 코드를 보게되요. Hello World! 를 출력하는 코드를요.


기본적인 구조의 필요이유를 알아봅시다.


#include <stdio.h>

include 는 포함한다. 라는 뜻을 가지고 있어요. stdio는 STanDard Input Output 의 줄임말이예요. c의 표준 입출력을 담당하는 파일이라고 생각하시면 됩니다. 우리가 추후에 쓰게될 printf() 함수나 scanf()함수는 꼭 #include <stdio.h>가 되어있어야합니다 :0 

그리고 보통의 std는 Standard의 줄임말임을 기억하고 계시면 편해요. 


int main(void){ ... }

우리가 흔히 말하는 main함수예요. "아 main함수의 구조가 저렇다면,, 무슨 뜻인지는 모르겠지만 int라는걸 쓰고 함수명을 써주고 괄호 열고 void라는걸 쓰고 괄호 닫고 중괄호 열고 작업을 지시하는 명령어를 쓰고 중괄호를 닫으면 이게 함수의 구조가 되겠구나?! " 라고 생각하셨나요?!!! 엄청 주절주절 쓰기만 했는데, 일단 main함수의 기본 작성법은 알아두셔야합니다!! int main(void){  }가 기본적인 main함수의 구실을 한다는 것.

( 보통은 int main()을 많이 씁니다. void main()을 사용하기도 해요. 추후에 설명드릴게요. )

고놈의 main함수 main함수.. 이게 뭐냐면.. 프로그램을 실행시키면 가장 먼저 실행되는 함수예요.  2012버전 이후로는 t_main()을 대신해서 쓰기도 하던데 이건 제가 더 알아보고 알려드리도록할게요!! :)

"쌤 그러면 (void)는 뭔가요?!"

void란 공허, 아무것도 없는. 이런 뜻으로 사용이되요. void. 즉 아무것도 없다. 라는 뜻인데 보통 우리가 수학에서 함수를 작성할 때는 f(x) = 2x + 1 이런식으로 작성을 하는데, f(x) 이 부분에 집중을 해보시면 x에 어떤 값을 넣을 수 있다. 가 되죠? 그런데 이게 void래. 아무 것도 없대.. 넣을 수 있는 값이 없다. 이렇게 이해하고 계시면 될 것 같아요. 너무 깊게 파고들면 안되요 지금은ㅠㅠ

아차차 그리고 (void)는 ()로 생략해서 쓸수도 있어요. int main()이나 int main(void)나 같은 표현이예요.


printf("Hello World!\n");

앞으로 우리가 사용하게 될 명령어나 변수들은 100에 99는 마지막에 세미콜론( ; )을 !!!!!꼭!!!!! 붙여야해요. 

그렇다면 printf라는 함수가 무엇이냐?!. print 라는 뜻 자체가 출력하다. 라는 뜻을 가지고 있어요. 말그대로 출력을 해주는 명령어와 같은 존재인거예요.

"아. 출력을 해주는 함수가 있다는 것은 입력을 해주는 함수가 있겠구나?!"

맞아요. 이건 다음 게시글에서 알려드리도록 할게요.

그리고 \n. 폰트에 따라서 \n이기도해요. 흔히 역슬래시 n 이라고 합니다. 한국에서는 역슬래시를 별로 안 쓰게되어서 원화표시랑 바꿨다고해요 :0

이 \n은 줄을 바꿔주는 역할을 해요. 여러개 더 있는데 이 것은 추후에 printf 부분에서 쓰이는 문자들을 알려드릴 예정이예요.


return 0;

return이란, 함수의 반환값을 설정해주는 것인데 main함수에서의 return 0;는 정상적으로 프로그램을 종료하겠다. 라는 것과 같아요.



주절주절 말만 길게 설명했지 기본 구조는 상당히 간단해요.

1. 헤더파일을 포함시킨다.

2. 메인 함수의 타입을 지정해주고 시작을 알린다.

3. 메인 함수의 동작내용을 작성한다.

4. 정상적으로 종료했는지를 리턴해준다.

5. 메인 함수의 끝을 알린다.


1 => #include <stdio.h>

2 => int main(void){
3 =>     printf("Hello World\n");

4 =>     return 0;

5 => }


빨갛게 색칠이 된 중괄호가 함수의 시작과 끝을 알려주는 부분이예요.



아래의 결과는 직접 코드를 작성해서 컴파일을 해보세요. 코딩해보시고 구조를 손에 익히고 머릿 속에 익히면 됩니다.







이번 게시글에서 준비한 내용은 여기까지예요. 고생하셨구요. 그럼 이만! ^^7





게시글을 보시다가 궁금한 내용, 이게 맞나? 하는 내용, 이건 틀렸어!하는 내용들은 과감하게 댓글 달아주시면 감사하겠습니다.


이론적인 내용에 대한 궁금증은 검색을 통해 궁금증을 해결하는 것이 좋아요!!

실습적인 내용에 대한 궁금증은 최대한 생각을 해보고 검색을 하는 것이 좋아요!!

'Programming > C' 카테고리의 다른 글

[C] 함수  (0) 2018.05.15
[C] 반복문  (0) 2018.05.06
[C] 조건문  (0) 2018.05.04
[C] 변수와 형식지정자  (0) 2018.04.30
[C] 기본 입/출력  (0) 2018.04.24

+ Recent posts