본문 바로가기
지난 학기들의 기록/C 기초

[C실습] 함수예제 - 높은 자릿수, 낮은자릿수부터 변환하기

by 아메리카노와떡볶이 2020. 5. 31.
728x90

이번 포스트에서는 함수 실습 예제를 다룹니다. 문제는 양의 정수를 입력받아서 두 자리수씩 묶어서

아스키코드와 대조하여 문자로 반환하는것입니다. 

먼저 문제에 대한 이해를 하고 그 내용을 바탕으로 코드를 작성하겠습니다. N을 입력받았을때 자릿수를 구해야하고,

자릿수 개수가 홀수인지 짝수인지에 따라 가장 높은 두 자리수출력함수 , 낮은 두 자리수 출력함수를 호출해야합니다.

그리고 그 함수들은 출력숫자를 제외한 나머지 숫자를 반환합니다.

 

예시를 들어보면 12345의 경우 진행과정은

자릿수판별 > 자릿수 5개 (홀수)> 높은 두자릿수 출력함수 실행, 남은 숫자 반환 (반복) > 종료

 

EX1) 12345 > convert_top 실행 > 12 출력 345 반환 > 34 출력 5 반환 > 5출력 0반환 >종료

EX2) 123456 > convert_bottom 실행 > 56출력 1234반환> 34출력 12반환 > 12출력 0반환 > 종료

 

다음과 같은 순서를 따라서 진행될것이고, 출력되기전에 아스키코드표에서 대문자,소문자에 대응되는지 검사하는 과정만 추가해주면 될것입니다.

 

#num_digit 함수 

숫자의 자리수를 반환합니다

입력받은숫자의 자릿수를 구해서 반환합니다. 간단한 논리이므로 설명은 생략하겠습니다.

 

#convert_top 함수

여기서 짚고 넘어갈만한것은 자릿수를 배열에 저장할때 123456 => 1,2,3,4,5,6 으로 저장할것인지 6,5,4,3,2,1 로 저장할 것인지 결정해야하는것입니다. digit함수를 쓸수있기떄문에 k= digit를 하고 k--를 하면 역순으로도 저장할수있고

k=0 부터 저장하면 정순으로도 저장 가능합니다 .

여기서 저는 정순으로 저장하는 것을 채택했습니다. 그 이유는 123456일때 높은 자리수부터 출력하면 12를 출력하고 3456을 반환합니다. 이것은 k=digit 부터 k=0까지 인덱스가 한번에 쭉 연결되기떄문에 ( k=digit-1 ~ k=digit-2 ) + ( k=digit-3~ 0) 훨씬 코드 구현하기가 간단해집니다. 

 

#convert_bottom함수

convert_top 함수와 비교해서 살펴보면 , 조금씩 다른점이 보입니다. 마찬가지로 123456 을 ==> 0번 인덱스부터

6,5,4,3,2,1 로 저장했을때 출력숫자와 반환숫자를 만드는 과정이 조금 다릅니다. 56출력 1234반환 이므로 인덱스가 한번에 이어지지는 않습니다. 

 

#main 함수

#코드 완성본

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#pragma warning(disable:4996)
#include <stdio.h>
/* 17010698 심성엽 */
int convert_top(int N, int digit);
int convert_bottom(int N);
int num_digit(int N);
 
int num_digit(int N) {
   int digit = 0;
   while (N != 0) {
      N = N / 10;
      digit++;
   }
   return digit;
}// 숫자의 자리수 반환함수
 
int convert_top(int N, int digit) { // 숫자와 자리수를 입력받고  높은자리수 부터 반환
   int top_num[100= { 0 };
   int k = 0, a = 0, num1 = 0, num2 = 0, i = 0, p = 0;// digit는 N의 자릿수로, 배열의 크기로도 볼수있음
   while (N != 0) {
      a = N % 10//나머지 저장
      N = N / 10// N을 10으로 나눕니다 
      top_num[k] = a; // 123456 => 배열인덱스 0번부터 6,5,4,3,2,1
      k++;
   }
   for (k = digit-1; k >= digit-2; k--) {
      num1 = num1 * 10 + top_num[k];
   }//num1은 출력파트의 숫자로, 0번인덱스부터 1번인덱스의 값으로 숫자를 만들어야함
 
   //convert_top 함수의 출력파트로  num1에 대응되는 아스키코드가 알파벳소문자나 대문자이면 출력하고
   if (('a' <= num1 && num1 <= 'z'|| 'A' <= num1 && num1 <= 'Z'printf("%c", num1);
   else printf("*");// 그 외 다른 문자에 대응되면 *을 출력합니다.
 
   // 출력파트를 제외한 나머지숫자들을 만듭니다. 인덱스 2번부터 끝까지의 수들로 num2를 만듭니다.
   for (p = k; p >=0 ; p--) {
 
      num2 = num2 * 10 + top_num[p];
   }
    
   return num2;
}
 
int convert_bottom(int N) {
 
   int bottom_num[100= { 0 };
   int digit = 0, k = 0, p = 0, a = 0, b = 0, num1 = 0, num2 = 0;
   while (N != 0) {
      a = N % 10;//나머지를 배열에 저장하기 위한 변수
      N = N / 10// N을 10으로 나누어서 다시 저장합니다
      bottom_num[k] = a;// 배열에 나머지를 저장합니다
      k++;
      digit++;//자릿수 저장을 위한 변수
   }// bottom_num배열에는 123456 ==>0번 인덱스부터 6,5,4,3,2,1
 
   for (int k = 1; k >= 0; k--) {
      num1 = num1 * 10 + bottom_num[k];
   }// 1번 인덱스와 0번인덱스를 이용하여 출력파트 숫자  num1을 만들어줍니다.
 
   if (('a' <= num1 && num1 <= 'z'|| 'A' <= num1 && num1 <= 'Z'printf("%c", num1);
   else printf("*");
   //convert_bottom 함수의 출력파트로 num1이 아스키코드에 대응되는 표에서 알파벳문자이면 알파벳을 출력하고, 아니면 *출력
 
   for (p = digit; p >= 2; p--) {
      num2 = num2 * 10 + bottom_num[p];
   }// 출력파트를 제외한 나머지 반환숫자 num2를 만들어줍니다.
   return num2;// num2를 반환합니다.
}
 
int main() {
 
   int N, digit = 0;
   int top = 0, bottom = 0;
   scanf("%d"&N);
   digit = num_digit(N);// 자릿수구하기
   int num_print = 0;
   if (digit % 2 == 1) num_print = digit / 2 + 1;
   else num_print = digit / 2;
   //총 출력횟수를 구합니다.
 
   if (digit % 2 == 1) { // 자릿수가 홀수라면
      for (int i = 0; i < num_print; i++)
      {
         top = convert_top(N, digit);//top에 반환숫자를 저장하고
         N = top;// 반환숫자로 다시 N을 재설정합니다.
         digit = digit - 2;
      }
   }//홀수일경우 convert_top 함수 실행
 
 
   else {// 자릿수가 짝수라면
      for (int i = 0; i < num_print; i++)
      {
         bottom = convert_bottom(N);
         N = bottom;
 
      }
   }//짝수일경우 convert_bottom 함수 실행
   return 0;
}
cs

 

 

 

728x90

댓글