본문 바로가기

programming study/C

[나도코딩]C 프로그래밍 - 입문부터 게임 개발까지 (2)(2020.12.26)

본 내용은 해당 강의 토대로 작성


경찰서 조서 출력

배운 것을 토대로 범죄자의 신분을 입력 받아, 그것을 출력해본다.

#include <stdio.h>
int main(void)
{
    char name[256];                        //문자열 선언
    printf("이름이 뭐예요?");
    scanf("%s", name, sizeof(name));    //문자열 입력 받기, 256을 넘지 않게 함

    int age;                                //정수 선언
    printf("몇살이에요?");
    scanf("%d", &age);        //정수 앞에는 &붙임

    float weight;                                    //실수 선언
    printf("몸무게는 몇 kg 이예요?");
    scanf("%f" , &weight);                //실수 앞에도 &붙임

    double height;                            //더 긴 실수(double)
    printf("키는 몇 cm 이예요?");
    scanf("%lf" , &height);                //double은 "%lf"

    char what[256];
    printf("무슨 범죄를 저질렀어요?");
    scanf("%s", what, sizeof(what));

    // 조서 내용 출력
    printf("\n\n--- 범죄자 정보 ---\n\n");
    printf(" 이름       : %s\n" , name);
    printf(" 나이       : %d\n" , age);
    printf(" 몸무게      :%.2f\n" , weight);        //소수점 두 번째까지 출력
    printf(" 키          :%.2lf\n" , height);
    printf(" 범죄       : %s\n" , what);

      return 0;
}

명령어의 입,출력은 아래와 같다.

스크린샷 2020-12-26 오전 11.24.36

새로운 파일 생성

#include <stdio.h>
int main(void)
{
    return 0;
}

새로운 파일 생성하면 항상 위의 명령어는 기본적으로 적어야한다. 단, 한 프로젝트에서 함수명이 겹치면 안된다. 저번시간에 함수 main은 이미 사용한 함수명이므로 저번 함수의 이름을 변경한다.

++ 연산

++ 는 변수의 앞과 뒤에 적어주면 1을 더해준다.

#include <stdio.h>
int main(void)
{
int a = 10;
printf("a는 %d\n" , a);     //10 출력
a++;                       //a = 10에서 1을 더해주므로 a = 11
printf("a는 %d\n" , a);     //11 출력
a++;
printf("a는 %d\n" , a);     //12 출력
return 0;  
}

위와 같이, printf 실행 후 a++을 적어주면 1씩 더해준다.

#include <stdio.h>
int main(void)
{
int b = 20;
printf("b는 %d\n" , ++b);	//21 출력
printf("b는 %d\n" , b++);	//21 출력
printf("b는 %d\n" , b);		//22 출력
return 0; 
}

위의 경우에서, ++이 앞에 있으면 printf를 실행하기 전에 +1을 하지만, ++가 뒤에 있으면 printf 실행 후 +1을 한다.

#include <stdio.h>
int main(void)
{
int i = 1;
printf("Hello world %d\n", i++);  
printf("Hello world %d\n", i++);
printf("Hello world %d\n", i++);
printf("Hello world %d\n", i++);
printf("Hello world %d\n", i++);
printf("Hello world %d\n", i++);
printf("Hello world %d\n", i++);
printf("Hello world %d\n", i++);
printf("Hello world %d\n", i++);
printf("Hello world %d\n", i++);
return 0;
}

위 명령어의 출력은 아래와 같다.

이렇게 반복된 작업을 할 때, 반복문을 사용하면 편하다. C의 반복문은 아래와 같다.

  • for
  • while
  • do while

for

for문의 문법은 다음과 같다.

for(선언; 조건; 증감){ 실행할 명령 }

문법대로 위의 Hello World 문은 아래처럼 작성하면 된다.

#include <stdio.h>
int main(void)
{
for (int i = 1; i <= 10; i++) // i는 1이고 10보다 작을 동안 명령을 실행한 뒤 +1을 한다.
{
  printf("Hello World %d\n", i);
}
return 0;
}

while

while문의 문법은 다음과 같다.

변수 선언

while(조건){ 실행할 명령 }

while문은 for문과 달리 변수를 반복문 전에 선언해야한다. 아래처럼 작성한다.

#include <stdio.h>
int main(void)
{
int i = 1;
while (i <= 10)
{
  printf("Hello World %d\n", i);
  i++;
}
return 0;
}

이때, i++printf 에 넣어도 된다.

#include <stdio.h>
int main(void)
{
int i = 1;
while (i <= 10)
{
  printf("Hello World %d\n", i++);
}
return 0;
}

do while

do while문의 문법은 다음과 같다.

변수 선언

do {실행할 명령} while (조건);

do while문 또한 변수를 앞에 선언한다.

#include <stdio.h>
int main(void)
{
int i = 1;
do {
	printf("Hello World %d\n", i++);
} while (i <=10);
return 0;
}

이중 반복문

구구단

반복문을 두 번 사용해서 구구단을 만들 수 있다.

#include <stdio.h>
int main(void)
{
for(int i=2; i <=9; i++)                        //i가 2부터 9까지 1씩 올라가며 전체 반복(단수)
    {
        printf("%d단 계산\n", i);                 //단수 출력
        for(int j = 1 ; j <= 9; j++)            //각 단수에서 1부터 9까지 1씩 올라가며 곱함
        {
            printf(" %d x % d = %d\n", i, j, i*j); // i,j를 넣어서 각 숫자 및 연산 결과 출력
        }
    }
  return 0;
}

위 명령어의 결과의 일부(2단)는 아래와 같다.

스크린샷 2020-12-26 오후 12.36.54

별 그리기

다섯 개의 줄에 별을 하나씩 늘려가며 그리기는 어떻게 할까? 명령어와 출력은 아래와 같다.

#include <stdio.h>
int main(void)
{
for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j <= i; j++)	//별을 출력할 반복문
        {
            printf("*");
        }
        printf("\n");                //한 개의 줄에 별 출력 완료 후 줄바꿈
    }
return 0;
}
*
**
***
****
*****

스크린샷 2020-12-26 오후 1.02.08

반복문에 의하면 ji 반복문 안에서 i보다 작거나 같을 때 * 을 하나 출력하고 1이 더해진다. ji를 넘을 경우에는 j 반복문을 빠져나가서 공백을 출력해 줄바꿈한 뒤, i는 1이 더해진다. 이런 반복이 i 가 5가되면 끝나게 되므로 위의 출력이 나오는 것이다.

거꾸로 별

위와는 다르게 아래처럼 출력하려면 어떻게 할까?

    *
   **
  ***
 ****
*****

명령어는 다음과 같다.

#include <stdio.h>
int main(void)
{
for (int i = 0; i < 5; i++)
    {
        for(int j = i; j < 5 -1; j++) //공백을 출력할 반복문 추가
        {
            printf(" ");
        }
        for (int k =0; k <=i; k++)	//별을 출력할 반복문
        {
            printf("*");
        }
        printf("\n");
    }
return 0;
}

j 는 공백을 출력할 반복문의 변수이다. i 가 2이라면, j도 2일 것이다. 그리고 공백을 한 번 출력하고 1이 더해진다. 4보다 작을 때 까지 명령을 실행하므로 공백을 두 개 출력하고 넘어간다. 그 후에는 위와 같이 별을 출력하는 반복문을 수행하고 공백을 출력한다.

피라미드를 쌓아라

입력한 층수대로 꼭대기에서 아래까지 2씩 커지는 피라미드를 만들어보자.

#include <stdio.h>
int main(void)
{
int floor;
    printf("몇 층으로 쌓겠느냐?");
    scanf("%d" , &floor);            //층수를 floor 변수에 받음
    for (int i=0; i < floor; i++)    //floor의 수만큼 쌓음
    {
        for (int j=i; j < floor-1; j++) //공백을 만드는 반복문
        {
            printf(" ");
        }
        for (int k=0; k < i * 2 + 1; k++) //벽(*)을 쌓는 반복문
        {
            printf("*");
        }
        printf("\n");
    }
  return 0;
}

만들 피라미드는 층이 내려갈 때 마다 2씩 커진다. 즉, 1,3,5,7,9 … 인 수열이다. i = 0 일 때, 벽은 하나를 쌓아야 하고 i = 1일 때, 벽은 셋을 쌓아야 한다. 그리고 k = 0으로 선언되었다. 그러므로 k< i *2+1조건을 주면 된다. 명령문을 실행하고 층수를 10을 준다면, 아래처럼 출력이 된다.

스크린샷 2020-12-26 오후 1.28.37

느낀점

어제처럼 Windows에서만 실행되는 명령어가 없어서 고생은 안 하고 수업을 비교적 잘 따라갈 수 있었다. 코딩을 하며 느끼는 것인데, C는 세미콜론에 정말 민감하다. 꼭 세미콜론을 붙여주자. 반복문을 자세하고 쉽게 배울 수 있어서 이해가 잘 되고 좋았다.