21 프논이 기말 4번째 문제_2
마친가지로 4-1의 코드를 사용해야 한다
내 코드는 다음과 같다
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
|
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void changeToDigitEncode(char s[], char e[])
{
int i, j;
for (i = 0, j = 0; s[i] != '\0'; i++)
{
if (s[i] >= 'A' && s[i] <= 'I')
{
e[j] = s[i] - 'A' + '1';
j++;// e 배열의 다음 위치로 이동
}
else if (s[i] >= 'J' && s[i] <= 'S')
{
e[j] = '1';
j++;// e 배열의 다음 위치로 이동
e[j] = s[i] - 'J' + '0';
j++;// e 배열의 다음 위치로 이동
}
else if (s[i] >= 'T' && s[i] <= 'Z')
{
e[j] = '2';
j++;
e[j] = s[i] - 'T' + '0';
j++;
}
}
e[j] = '\0';
return;
}
int main(void) {
char sentence[20];
char encoded[40];
scanf("%s", sentence);
changeToDigitEncode(sentence, encoded);
printf("%s", encoded);
return 0;
}
|
cs |
코딩을 하면서 의문점이 생겼는데 첫번째는
e[j] = s[i] - 'J' + '0';에서 보다싶이 왜 +'0'을 하냐는 것이였다
내 생각으로서는,예를들어 J의 경우 'J'-'J'에서 이미 0이 되는데 왜 +'0'을 하는지 의문이였다
두번째로는 저 코드는 예를 들어 26의 경우는 e[0]에 2를 e[1]에 6을 이런식으로 십의 자리와 일의 자리를 각각 e라는 배열에 할당하는 코드인데 왜 한 배열 내에 26 이것이 안되는지 의문이였다
이 점이 이해가 안되서 알아보니,
먼저 1번은 'J'-'J'에서 나오는 0은 아스키코드의 0값이다.하지만 우리가 출력해야 하는건 문자'0'이므로 0을 더해주는 것이다.0,1..은 그 상태에 해당하는 아스키코드를 출력한다.다시한번 말하지만 배열 e는 char타입이고 거기에 들어가는건 숫자가 아닌 문자이며 0과 '0'은 다른 것이다2번은 1번과 기반하는 내용이 같다문자열은 한칸에 한 글자밖에 안들어간다int 형이였다면 e[0]=26이 가능한데 e는 char타입이니 '문자'가 들어가야 한다.<<사실 e가 char타입인거 까먹었다예를들어 26은 '2'와 '6'이 합쳐진 거니까 e[0]에 2가 e[1]에 6이 들어가는 것이다아 문자랑 숫자랑 너무 햇갈린다...
참고로 교수님이 푸신 코드를 보니까 더 좋은 방법이 있었다
예를 들어 L 경우는 십의 자리가 1 일의 자리가 2인데 이것은 12을 10으로 나눈 나머지가 2이고 몫이 1인것이다
이를 이용하면 됬었다
23.09.18 추가
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
|
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void changeToDigitEncode(char s[], char e[])
{
int i, j = 0;
int score;
for (i = 0; s[i] != '\0'; i++)
{
score = s[i] - 64;
if (score >= 10)
{
e[j] = score / 10 + '0';
j++;
e[j] = (score % 10) + '0';
j++;
}
else
e[j++] = score + '0';
}
e[j] = '\0';
return;
}
int main(void) {
char sentence[20];
char encoded[40];
scanf("%s", sentence);
changeToDigitEncode(sentence, encoded);
printf("%s", encoded);
return 0;
}
|
cs |
교수가 다른 방법으로도 풀라 해서 풀었다
확실히 이게 더 깔끔해 보인다
다른 방법으로 푸는건 어렵다
일단 끝낸 과제를 다시 하기도 싫을 뿐더러, 처음에 풀때 한번 생각이 고정되어 버리니 다른 생각을 하기에 유연성이 떨어지기 때문이다