본문 바로가기

Challenge/SK 뉴스쿨 정보보안과 3기

SK 뉴스쿨 프로그래밍 기초 C언어 (2022.03.25 ~ 04.01)

728x90
반응형

프로그래밍 기초(C언어) 3_28일 과제

 

 

 

 

  1. 첫 번째 빈칸에는 scanf 함수로 입력받은 데이터를 저장할 정수형 변수인 score_kr과 score_math를 선언해준다.
    *주의 할 점은 scanf함수를 사용하기 위해 맨 윗줄에 #define _CRT_SECURE _NO _WARNINGS를 넣어준다. 또한 scanf 함수로 입력을 받을 때는 변수명 앞에 **앰퍼센트(&)**를 붙여줘야 한다.


  2. 두 번째 빈칸에는 scanf 함수를 통해 입력받은 데이터를 출력하기 위해 각각 변수명을 적어준다. 그리고 출력 가독성을 높이기 위해 문자열 끝에 ‘\n’을 넣어준다.

 

 

출력결과:

 

 


 

아래와 같은 결과물이 나오게 코딩하기

 

💡 <결과>

두 숫자를 입력하시오 >> 10.0 3.0

10 / 3 = 3.333

 

 

 

 

  1. 실수형(float)으로 변수 두 개를 선언한다.


  2. scanf함수로 선언한 두 변수를 입력받는다.


  3. 문제에서 두 변수의 소숫점이 버려지게 출력되어야 한다고 적혀있기 때문에 출력서식에 ‘.0’을 붙이고 계산된 결과는 소숫점 3번째 자리까지 출력되게 .3을 붙인다.


출력결과:

 

 


 

 

  • 다음 수식을 연산하시오.
    • 1 + 3 * 5 + 10 / 2

 

풀이: 사칙연산은 곱셈과 나눗셈이 더하기와 빼기보다 더 먼저 계산되어야하기 때문에,

3*5부터 계산되어 15, 그 다음은 10 / 2가 계산되어 5, 따라서 1 + 15 + 5가 되어 정답은 21이다.

 

 

 

 

20 >> 1 + 1 ^ 3 계산

 

 

풀이:

연산자 우선순위에 따라, 1+1이 우선 계산되어 2라는 값이 나오고,

두 번째는 비트 연산자를 사용한 20 >> 2이 우선 계산된다.

계산을 해보면 20의 2진수는 0001 0100이고 오른 쪽으로 2비트 옮기면 0000 0101, 즉 십진수로 5가 된다.

마지막으로는 5 ^ 3이 계산된다.

5의 2진수는 0101, 3의 2진수는0011

0과 1이 서로 다른 값이 나올 때만 1로 계산이 되는 배타적 논리합에 따라 2진수 계산은 0110이 되어 십진수로 6이라는 값이 최종적으로 나오게 된다.

 

 


 

  • 다음 수식의 결과 값과 결과 후 x값은 무엇인가?
    • x = 1일 때 x++ + ++x + x++ =?

 

 

 

풀이:

우선 첫 번째 출력문에서는 x를 1 증가 시켰어도 후위 연산자이기 때문에 1로 출력된다. 하지만 실제 변수 x에 저장되어 있는 값은 2가 된다.

두 번째 출력문에서는 전위 연산자로 x를 1 더했기 때문에 출력문에도 3이 나오고 실제 x의 값도 3이 된다.

마지막 출력문에서는 첫 번째와 마찬가지로 후위 연산자로 증가시켰기 때문에 출력문은 3이 나오지만 최종적으로 x의 값은 4가 되면서 코드 실행이 끝난다.

 

따라서 ‘x++ + ++x + x++ =?’ 식의 정답은 1 + 3 + 4가 되어 7이 된다.

 

 


3월 29일 정리

 

 

문제: ‘1부터 순서대로 더한 숫자가 입력한 숫자 이상인 순간의 숫자를 구하는 프로그램 구현’

 

➡️ <결과>
숫자를 입력하시오 : 20 정답 : 6

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
    int num, cnt = 1, sum = 0;
    
    printf("숫자를 입력하시오 : ");
    scanf("%d", &num);
    while (sum <= num & num != 0)
    {
        cnt++;
        sum += cnt;
    }
    
    printf("정답 : %d", cnt-1);

    return 0;
}

 

 

 

  1. 입력받은 숫자를 저장하는 변수 ‘num’, 1부터 계속해서 증가하면 몇 번째까지 증가했는지를 저장하는 변수’cnt’, 마지막으로 **1부터 입력받은 num의 값 이하까지 계속해서 총 더하면 얼마인지 저장하는 변수 ‘sum’**을 선언해준다.


  2. while 문에 총 더한 값(sum)이 입력받은 숫자(num)보다 작으면 계속해서 프로그램을 반복하라는 조건을 준다. 또한 0이 입력되면 결과값도 0으로 출력되어야 하기 때문에 조건도 num이 0이 아닐 시 while 문이 동작하게 만든다.


  3. cnt의 값을 계속해서 1씩 더해준다.


  4. sum 변수를 코드가 계속해서 돌아갈 때 마다 1씩 올라가는 cnt 변수에 재귀적으로 자기 자신인 sum 값을 계속해서 더해준다.


  5. cnt의 초기값이 1로 설정되어 있기 때문에 결과를 출력할 때는 1을 다시 빼줘서 결과를 출력한다.


출력 결과:

 

 


 

 

구구단 3X3 형태로 출력하기(2중 또는 3중 for문 사용하기)

 

 

#include <stdio.h>

int main(void)
{
    int num = 1;
    for (int i = 0; i <= 2; i++) // 총 세번 반복
    {
        for (int j = 1; j <= 9; j++) // 구구단 곱셈 기준
        {
            for (int k = num; k <= num + 2; k++) //num의 초기값은 1, 조건은 num + 2로 해서 한 줄에 3개씩 출력하기
            {
                printf("%d * %d = %d\t", k, j, k*j); // 구구단 결과 출력
            }
            printf("\n");
        }
        printf("\n"); // 세 단이 끝날 때마다 띄어쓰기
        num += 3; // 단의 기준이 되는 num에 3씩 더해줘서 1, 4, 7로 나누기
    }
    return 0;
}

 

 

  1. num의 초기 값을 1로 설정한다. num 변수는 구구단의 맨 앞에 해당하는 값의 역할을 한다.


  2. 총 3줄의 결과가 나와야 하기 때문에 첫 번째 for 문은 0부터 2까지, 총 3번 걸쳐 실행하게 한다.


  3. 두 번째 for 문은 구구단 곱셈의 기준이 되는 두 번째 숫자의 역할 한다. (1부터 9)


  4. 아까 초기에 설정한 num 값을 세 번째 for 문의 인자에 해당하는 k에 대입하여, 1부터 k + 2 즉 3까지 조건을 설정하여 1단 부터 3단까지 한 줄에 나오게 만든다.


  5. 구구단 결과를 출력한다. 이때 연산이 하나씩 끝날 때 마다 간격을 벌리기 위해 ‘\t’를 사용한다.


  6. 연산이 끝날 때 마다 가독성을 위해 ‘\n’을 출력한다.


  7. 이번엔 3단의 연산이 전체적으로 끝났을 때 마찬가지로 위와같이 가독성을 위해 ‘\n’을 사용한다.


  8. 마지막으로 단의 기준이 되는 num에 3씩 더해줘, 1단에서 3단, 4단에서 6단, 7단에서 9단으로 연산을 나눠준다.


 

출력 결과:

 


 

이외에도 직접 지뢰찾기를 만들어보는 시간도 가졌다.

하루만에 지뢰찾기 게임을 만드느라 진짜 죽는 줄 알았다...

728x90
반응형