대학교 1-2/컴프

21 프논이 기말 4번째 문제_2

Launa 2023. 9. 11. 21:33

프논이 기말 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

교수가 다른 방법으로도 풀라 해서 풀었다

확실히 이게 더 깔끔해 보인다

다른 방법으로 푸는건 어렵다

일단 끝낸 과제를 다시 하기도 싫을 뿐더러, 처음에 풀때 한번 생각이 고정되어 버리니 다른 생각을 하기에 유연성이 떨어지기 때문이다