이번 포스트에서는 함수 실습 예제를 다룹니다. 문제는 양의 정수를 입력받아서 두 자리수씩 묶어서
아스키코드와 대조하여 문자로 반환하는것입니다.
먼저 문제에 대한 이해를 하고 그 내용을 바탕으로 코드를 작성하겠습니다. 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 |
'지난 학기들의 기록 > C 기초' 카테고리의 다른 글
[C실습] 배열예제 -초를 입력받고 그 후의 시,분,초 구하기 (0) | 2020.06.02 |
---|---|
[C실습] 함수 예제 - 시저암호화 및 복호화(Caesar cipher,카이사르 암호)+수정(파이썬코드 추가) (1) | 2020.06.01 |
[C실습] 배열 예제- 배열의 원소 중복 검사하기 (0) | 2020.05.31 |
[C실습] 배열 예제- 홀수와 짝수로 구분해서 정렬하기 (0) | 2020.05.31 |
[C실습] 배열 유형 분석 2- N개의 정수배열에서 M개의 칸씩 위치옮기기 (0) | 2020.05.31 |
댓글