ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C언어로 별찍기
    C언어/C언어 예제 2020. 7. 10. 07:27

    작년에 컴퓨터 시작할 때 쯤 적은 글인데 블로그에서 많은 분들이 찾는 글이라서...

     

    내용이 미흡해 해석을 따로 달아두려고 했는데, 아무리 써도 글이 좀 난해해 간단한 팁으로 대체합니다.

     

    그냥 간단히 아래 코드들 실행하면서 어떻게 돌아가는지 잘 모르겠다 싶으면

     

    for문 안에서 변화하는 숫자들을 출력해서 관찰하시면 직관적으로 쉽게 아실 수 있어요.

     

    예를 들어 아래 코드들은 대부분 for 안의 변수 i 혹은 j를 찍어보면 됩니다.


    Q. 예제에 있는 모양대로 별을 만드세요.

    예제 1

    5 입력시

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

     

    1번 코드

     

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    
    int main(void)
    {
      int star = 0;
      int type = 0;
      printf("별을 만듭니다. 별의 높이를 입력해주세요. : ");
      scanf("%d", &star);
    
        for (int i = 1; i <= star; i++){ //입력받은 높이 숫자만큼 줄을 만드는 식
          for (int j = 1; j <= i; j++){  
         //j의 범위가 i가 늘어남에 따라 같이 늘어나서 세로줄 늘어날 때 별도 하나씩 늘어남 
            printf("* ");
            }
          printf("\n");
        }
    }

     

    예제 2

    5 입력시

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

     

    2번 표현식 - 1

     

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    
    int main(void)
    {
      int star = 0;
      int type = 0;
      printf("별을 만듭니다. 별의 높이를 입력해주세요. : ");
      scanf("%d", &star);
    
      for (int i = star; i > 0; i--){ // i를 입력한 수에서 -1이 되면서 한줄씩 세로줄을 생성
        for (int j = 1; j <= i; j++){ 
         // j의 범위는 i를 따라 세로줄이 늘어날때마다 -1이 되면서
         // 별도 세로줄이 늘때마다 -1이 됨
          printf("* ");
          }
        printf("\n");
      }
    }

     

     

    2번 표현식 - 2

     

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    
    int main(void)
    {
      int star = 0;
      int type = 0;
      printf("별을 만듭니다. 별의 높이를 입력해주세요. : ");
      scanf("%d", &star);
    
      for (int i = 0; i < star; i++){  // i의 범위를 입력한 수로 제한. +1을 하며 세로줄을 생성.
        for (int j = star; j > i; j--){
        //j는 입력한 숫자에서 시작해서 세로줄이 늘어날때마다 범위가 점차 줄어듬.
        //j는 한번 루프를 돌때 입력한 숫자로 시작하지만 i의 수가 증가하면서 별을 찍을 수 있는
        //숫자가 점차 줄어듦.
          printf("* ");
          }
        printf("\n");
      }
    }

     

    예제 3

    5 입력시

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

     

    3번 표현식 - 1

     

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    
    int main(void)
    {
      int star = 0;
      int type = 0;
      printf("별을 만듭니다. 별의 높이를 입력해주세요. : ");
      scanf("%d", &star);
    
      int l = 0; // 임의의 변수
        for (int i = star*2; i > star; i--){ 
        // 가장 최상위 for문
        // 해당 for문은 입력수*2에서 시작해서 점차 1씩 차감해서
        // 입력된 숫자에 도달하면 세로줄 생성 끝
          for (int j = 1; j < i-star; j++){
          // 공백은 세로줄이 생길때마다 한개씩 줄어들어야 함
          // j의 범위는 i(star*2)-star를 하면서 최상위 for문을 따라 공백을 한개씩 덜 찍게 됨
            printf(" ");
          }
          for (int k = 0; k <= l*2; k++){
          // 위는 공백에 대한 식이고 이제 공백문에 이어 별표를 찍는 식
          // 별표는 공백과 달리 1,3,5,7,9식으로 늘어야 됨
          // 그런데 최상위 for문의 i는 감소하기 때문에 임의의 변수를 하나 만들어줌
          // 이 변수는 for문이 한번 돌때마다 1씩 증가함
          // 그래서 k는 0에서 시작해서 임의의 변수 l*2가 되면서 1,3,5,7,9식으로 별 늘어남
            printf("*");
          }
          l++; // 임의의 변수 +1 증가
          printf("\n");
          }
    }

     

    3번 표현식 - 2

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    
    int main(void)
    {
      int star = 0;
      int type = 0;
      printf("별을 만듭니다. 별의 높이를 입력해주세요. : ");
      scanf("%d", &star);
    
       for (int i = 0; i < star; i++){
       // 최상위 for문은 star 범위 안에서 세로줄을 새로 생성한다.
          for (int j = star-1; j > i ; j--){
          // 공백은 최상위 for문이 증가하는 것과 달리 감소해야 함
          // 공백은 입력한 수- 1 에서 시작해서 세로줄이 생성될 때마다 숫자가 -1이 됨
          // j의 범위는 i가 커짐에 따라 매번 줄이 생성될 때 줄어들어서 공백도 한줄씩 줄어듬.
            printf(" "); 
          }
          for (int k = 0; k <= i*2; k++){
          // 별표는 최상위 for문을 따라서 증가할 수 있게 범위가 설정되어있고
          // 0에서 시작되어 1,3,5,7,9 식으로 올라가야하기 때문에 i*2를 범위로 설정해줌
          // 새로운 세로줄이 생길 때마다 별이 증가됨
            printf("*");
          }
          printf("\n");
          }
    }

     

     

    *** 위 예시에서 알 수 있는 것들 ***

     

    1. 일반적으로 하위 for문은 상위 for에 종속 될 수 밖에 없다.

       하위 for문은 매번 실행될 때마다 초기화되서 시작하기 때문에

       새로 실행시 최상위 for문의 변수가 있어야만 하위 for문에 변화를 줄 수 있기 때문이다.

     

    2. 1번 예제같이 최상위 for과 하위 for문이 같이 증가한다면 큰 문제 없이 최상위 for문이 증가함에 따라

       하위 for도 같이 증가해주면 된다.

     

    3. 2번,3번 예제처럼 최상위 for문이 증가시 하위 for이 감소하게 만드려면

       최상위 for문과 하위 for문이 반대가 되야 한다.

     

    4. 최상위 for문이 0에서 1씩 증가하면 하위 for문은 입력한 수에서 -1이 감소해야하고

       최상위  for문이 입력한 수에서 -1씩 감소하면 for문은 반대로 1씩 증가해야 한다.

     

    5. 최상위 for문은 어느쪽이든 전체 식을 이끌어나갈 수 있다. 왜냐면 하위for문은 항상 최상위 for문을 따라야 하기 때문. 최상위 for문은 세로줄을 생성하면 하위 for문은 최상위 for문에 맞춰 범위를 조절해서 찍을 수 있는 별의 갯수를 조절해야 한다.

Designed by Tistory.