ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C언어로 숫자 입력받아 정사각형 모양으로 숫자를 출력
    C언어/C언어 예제 2020. 7. 9. 05:31

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

     

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

     

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

     

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

     

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


    Q. 일정 숫자를 입력받아서 정사각형모양으로 숫자를 출력하세요.

    1번 예시

    3 입력시

    1  2  3
    4  5  6
    7  8  9

    4 입력시

    1  2  3  4
    5  6  7  8
     9 10 11 12

     

    코드 1-1

     

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    
    int main(void)
    {
      int num;
      printf("숫자를 넣어주세요 : ");
      scanf("%d", &num); // 입력값 받는 함수
    
      for (int i = 1; i <= num*num; i++) // 1~num(입력받은 숫자)까지 번호를 쭉 출력하는 수 for문
      {
        if (i % num == 0) 
        // 출력중인 숫자가 입력된 숫자의 배수일 경우 if문으로 연결
        {
          printf("%d", i);
          // 입력한 숫자의 배수일 경우 가로줄 출력 숫자의 마지막 수 출력.
          printf("\n");
          // 공백 입력
        }
        else
        {
          printf("%d ", i); // 출력중인 숫자가 입력된 숫자의 배수가 아닐 때 바로 출력
        }
      }
    }
    
    

     

     

    코드 1-2

     

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    
    int main(void)
    {
      int num = 0; // 입력값을 받은 변수
      int num2 = 1; // 계산에 도움을 줄 임의의 변수
      printf("숫자를 넣어주세요 : ");
      scanf("%d", &num); // 입력값 받는 함수
      for (int i = 1; i <= num*num; i+=num) 
      // 1~num(입력받은 숫자)까지 번호를 쭉 출력하는 수 for문. i에는 num을 더해줘서 매번 새로운
      // 줄이 시작될때마다 입력한 숫자만큼 더한 상태로 전 줄에 숫자를 이어서 출력할 수 있게 한다.
      {
        for (int j = i; j <= num*num2; j++)
        // 가로 줄을 담당하는 for문. 가로 숫자 출력시 1씩 증가함.
        // 가로줄의 범위는 임의의 변수*입력한수로 지정하여 매번 세로줄이 생길때마다
        // (임의의변수*입력한수)-(i값)만큼 가로 숫자를 출력해준다.
        {
          printf("%3d", j);
        }
        printf("\n");
        num2++; //가로줄의 숫자 출력을 돕기 위한 임의의 변수
      }
    }

     

     

    코드 1-3

     

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    
    int main(void)
    {
      int num1 = 1; //인쇄를 도와줄 변수
      int num2 = 0; //입력된 숫자를 저장할 변수 
      printf("숫자를 넣어주세요 : ");
      scanf("%d", &num2); // 입력값 받는 함수
      for (int i = 0; i < num2; i++)
      // 사각형의 세로줄 갯수(입력한 숫자만큼의 범위)를 결정하는 for문
      {
        for (int j = 0; j < num2; j++){
          // 사각형의 가로줄 갯수(입력한 숫자만큼의 범위)를 결정하는 for문
          printf("%3d", num1++);
          // 인쇄될때마다 1씩 증가하여 최종적으로 매번 1씩 숫자를 갱신하면서 찍어준다.
        }
        printf("\n");
      }
    }

     

    2번 예시

    4 입력시

    1  2  3  4
    1  2  3  4
    1  2  3  4
    1  2  3  4

    5 입력시

    1  2  3  4  5
    1  2  3  4  5
    1  2  3  4  5
    1  2  3  4  5

     

    코드 2-1

     

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    
    int main(void)
    {
      int num;
      printf("숫자를 넣어주세요 : ");
      scanf("%d", &num);  // 숫자 입력받는 부분
    
      for (int i = 0; i < num; i++) // 정사각형에서 세로 길이를 담당. 입력한 숫자만큼의 세로줄을 인쇄
      {                             // i는 반복할 때마다 1씩 추가되며 입력한 숫자에 도달할때까지 인쇄
        for (int j = 0; j < num; j++) // 정사각형에서 가로 길이 담당. 입력한 숫자만큼의 가로줄을 인쇄
        {                             // j는 반복할 때마다 1씩 추가되며 입력한 숫자에 도달할때까지 인쇄
          printf("%d", j+1);          // 5를 입력하고 j인쇄시, 1~5가 가로 한줄로 출력
        }
        printf("\n");                 // i가 한줄을 인쇄하고 j가 1~5를 인쇄하고 한칸 띄어쓰기
      }
    }

     

    3번 예시

    4 입력시

    1  1  1  1
    2  2  2  2
    3  3  3  3
    4  4  4  4

    5 입력시

    1  1  1  1  1
    2  2  2  2  2
    3  3  3  3  3
    4  4  4  4  4
    5  5  5  5  5

     

    코드 3-1

     

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    
    int main(void)
    {
      int num;
      printf("숫자를 넣어주세요 : ");
      scanf("%d", &num);    // 숫자 입력부
    
      for (int i = 0; i < num; i++) //정사각형에서 세로를 담당. 입력한 숫자만큼 세로줄을 출력.
      {                             // i는 반복할 때마다 1씩 추가되며 입력한 숫자에 도달할때까지 인쇄
        for (int j = 0; j < num; j++) // 정사각형에서 가로 길이 담당. 입력한 숫자만큼의 가로줄을 인쇄
        {                             // j는 반복할 때마다 1씩 추가되며 입력한 숫자에 도달할때까지 인쇄
          printf("%d", i+1);          // 5를 입력하고 i인쇄시, 1만 가로 한줄로 출력.
        }                             // 그 다음은 2가 가로 한줄로 출력.
        printf("\n");                 // i가 한줄을 인쇄하고 j가 1~5를 인쇄하고 한칸 띄어쓰기
      }
    }

     

    4번 예시

    4 입력시

    1   5   9   13
    2   6  10  14
    3   7  11  15
    4   8  12  16

    5 입력시

    1   6   11  16  21
    2   7   12  17  22
    3   8   13  18  23
    4   9   14  19  24
    5  10   15  20  25

     

    코드 4-1

     

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    
    int main(void)
    {
      int num;
      printf("숫자를 넣어주세요 : ");
      scanf("%d", &num);            //숫자 입력부
    
      for (int i = 1; i <= num; i++)  //정사각형 세로를 담당. 입력한 숫자만큼 세로줄 출력
      {                               //5를 입력할 경우 세로로 5줄을 출력
        for (int j = i; j <= num*num; j=j+num) //정사각형 가로를 담당. 입력한 숫자만큼 가로 숫자 출력
        {                               //여기서 중요한건 j의 초기값이 i라는 것과 J의 범위, j가 증가값
          printf("%d ", j);             //J를 인쇄하면 1에서 입력된 숫자만큼 증가된 값이 가로로 출력
        }                               //5를 입력할 경우 1 6 11 16 21 이렇게 된다.
        printf("\n");
      }
    }

     

    5번 예시

    4 입력시

    1   2   3   4
    2   4   6   8
    3   6   9  12
    4   8  12  16

     

    코드 5-1

     

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    
    int main(void)
    {
      int num; // 사용자 입력값에 대한 변수 num
      printf("숫자를 넣어주세요 : ");
      scanf("%d", &num); // 변수 num 받는 함수
    
      for (int i = 1; i <= num; i++){ // 입력한 값만큼 세로줄을 만드는 for문
        for (int j = i; j < i*num; j=j+i){
        // 새로운줄마다 1씩 증가한 숫자로 시작해야해서 j에 i대입해줌
        // j의 범위는 i*num을 해줌
        // j는 매 가로숫자 출력시 첫번째 숫자의 배수를 나타내야해서 j+i 해줌
          printf("%3d", j);
        }
        printf("\n");
      }
    }
    

     

    6번 예시

    4 입력시

    1   2   3   4
    4   3   2   1
    1   2   3   4
    4   3   2   1

     

    코드 6-1

     

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    
    int main()
    {
      int num = 0; // 사용자 입력값 받는 변수 num
      printf("숫자를 넣어주세요 : ");
      scanf("%d", &num); // 입력값 받는 함수
      
      if (num%2 != 0){  //입력된 숫자가 홀수일 경우
        for (int i = 0; i < num/2+1; i++){
        // for문이 1번 실행될 때 2줄의 세로줄이 출력되므로 원하는 숫자를 출력하고 싶으면
        // 입력된 숫자를 절반으로 나누고 +1한만큼 세로줄을 출력한다.
          for (int j = 0; j < num; j++){ // 0에서 시작해서 가로로 +1된 숫자가 출력된다.
            printf("%3d", j+1); // 0에서 시작하기 때문에 +1을 한 상태에서 인쇄
          }
          if (i == num/2){
          // for문이 1번 실행될 때 2줄의 세로줄(정순, 역순)이 한번에 출력되므로
          // 최종적으로 홀수번 출력되려면 중간에 한번 끊어줘야 한다.
          // 그래서 num/2+1 번째 줄이 출력되는 중간에 끊어주기 위해 num/2를 해준다.
            break;
          }
          printf("\n");
          for (int k = num; k > 0; k--){
          // for문은 num에서 시작해서 가로로 -1된 숫자가 출력된다.
            printf("%3d", k);
          }
          printf("\n");
        }
      }
      else {  //입력된 숫자가 짝수일 경우
        for (int i = 0; i < num/2; i++){
        // for문이 1번 실행될 때 2줄의 세로줄이 출력되므로 원하는 숫자가 출력되고 싶으면
        // num의 절반만 인쇄되어야 한다.
          for (int j = 0; j < num; j++){ // 0에서 시작해서 +1씩 증가된 숫자가 출력된다.
            printf("%3d", j+1);
          }
          printf("\n");
        for (int k = num; k > 0; k--){ //num에서 시작해서 -1씩 감소된 숫자가 출력된다.
            printf("%3d", k);
          }
          printf("\n");
        }
      }
      }

     

    코드 6-2

     

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    
    int main()
    {
      int num; // 사용자 입력 값을 받는 변수 num
      printf("숫자를 넣어주세요 : ");
      scanf("%d", &num); // 입력값 num을 받는 함수
    
        for (int i = 0; i < num; i++) {
            if (i % 2) {  // 짝수 줄 판별
                for (int j = num; j > 0; j--) printf("%3d", j);
                // 짝수줄의 경우 역순으로 가로로 숫자 출력시 -1이 되어야 함
                // 변수가 num으로 시작해서 -1씩 내려가면서 출력하는 방식
            } else {         // 홀수 줄 판별
                for (int j = 0; j < num; j++) printf("%3d", j+1);
                // 홀수줄의 경우 순차적으로 가로로 숫자 출력시 +1이 되어야 함
                // 변수가 0으로 시작해서 num까지 +1씩 올라가면서 출력하는 방식
            }
            printf("\n");
        }
        return 0;
    }

     

     

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

    1. 2중 for문을 통해 출력해줄 때 첫 번째 for문은 세로줄을 담당함, 두 번째 for문은 가로줄의 담당함.

     

    2. 2중 for문에서 첫번째 for문의 변수 i를 인쇄시 가로줄이 1,1,1,1,1 같이 같은 숫자가 가로로 출력된다.

     

    3. 2중 for문에서 두번째 for문의 변수 j를 인쇄시 가로줄이 1,2,3,4,5 같이 순차적인 숫자가 가로로 출력된다.

     

    4. 4번 예시는 1~25를 순서대로 세로로 출력한 것 같지만,

    실제로는 가로로 한줄씩 1, 6, 11, 16, 21 / 2, 7, 12, 17, 22 이런식으로 출력한 것.

Designed by Tistory.