c언어 문자와 문자열을 이용하여 여러 가지 문제 풀기(단어 세기, 영상 파일명 자동 생성하기, 한영사전 구현하기, 메시지 암호화 하기, 행맨 게임 만들기)
네 안녕하세요, 이번 포스팅에서는 지금까지 배웠던 문자와 문자열을 이용하여
여러가지 문제들을 풀어보는 시간을 가져보려 합니다.
코딩 공부에서 사실 가장 중요한 요소는 틈틈이 연습을 해서 몸에 익히는 것이 가장 좋기 때문에
이 문제들을 같이 고민하고 풀면서 다 독자분들의 것으로 만드셨으면 좋겠습니다.
그럼 지금부터 시작하도록 하겠습니다.
1. 단어 세기
제일 처음으로 풀어볼 문제는 단어 세기 프로그램을 만드는 것입니다.
일단 단어가 되려면 첫 글자가 알파벳이 되어야 하기 때문에 알파벳인지 아닌지 검사를 해주는 함수가 필요하고,
만일에 첫 글자가 알파벳이라면 단어가 시작한다는 뜻이기 때문에 단어를 세어줘야 합니다.
이 부분은 제가 이전 시간에 포스팅을 했던 문자열 토큰을 분리하는 함수인 strtok()을 사용하면 바로 분리가 가능한데,
이번에는 단어 하나하나를 보면서 판독을 하는 프로그램을 만들어보도록 하겠습니다.
그럼 바로 코드를 작성을 해보도록 하겠습니다.
#include <stdio.h>
#include <ctype.h>
int count_word(char *s);
int main()
{
int wc = count_word("the c book...");
printf("단어의 개수 : %d\n", wc);
return 0;
}
int count_word(char *s)
{
int i, wc = 0, waiting = 1;
for(i = 0; s[i] != '\0'; i++)
{
if(isalpha(s[i]))
{
if(waiting)
{
wc++;
waiting = 0;
}
}
else
{
waiting = 1;
}
}
return wc;
}
이렇게 작성을 해봤습니다.
문자열의 끝이 아닐 경우에 계속 판별이 진행이 되는 코드이고,
문자가 맞다면 문자가 하나 세어지고, 기다리는 것은 세어지지 않습니다.
반대로 문자가 아니라면 문자 대신 기다리는 변수가 세어집니다.
그럼 결과를 보도록 하겠습니다.
단어의 개수 : 3
잘 세어진 것을 확인을 할 수가 있습니다.
2. 영상 파일명 자동 저장하기
이번에는 영상 파일의 이름을 자동으로 저장하는 프로그램을 작성을 해보도록 하겠습니다.
우리가 프로그램을 작성을 하다 보면 파일의 이름을 자동으로 저장을 해야 하는 경우가 생깁니다.
실제로 진짜 프로그램 다운 프로그램, 혹은 웹사이트나 어플 등을 만들 때 수많은 사용자가 해당 프로그램을 써서
기록을 꼭 해야만 합니다.
특히 그러한 것이 가장 잘 일어나는 사례가 영상 처리 관련에서 제일 잘 일어납니다.
컴퓨팅에서 영상은 이미지와 같은 정적 영상, 동영상과 같은 동적 영상들을 통합해 부르는 말인데요,
이들은 계속 새로운 것들이 파생이 되는 프로그램들이 대다수이기 때문에 자동 명칭 지정 및 저장이 필수입니다.
그럼 이를 어떤 식으로 하는 지 한 번 작성을 해보도록 하겠습니다.
#include <stdio.h>
#include <string.h>
int main()
{
char filename[200];
char s[100];
int i;
for(i = 0; i < 6; i++)
{
strcpy(filename, "image");
sprintf(s, "%d", i);
strcat(filename, s);
strcat(filename, ".jpg");
printf("%s\n", filename);
}
return 0;
}
이런 식으로 한 번 작성을 해봤습니다.
파일명은 이미지 파일, 그리고 형식은 jpg이며, 인덱스 번호 6이 되기 전까지 자동 저장을 할 것입니다.
그럼 바로 보여드리도록 하겠습니다.
image0.jpg
image1.jpg
image2.jpg
image3.jpg
image4.jpg
image5.jpg
문제 없이 잘 나온 것을 볼 수 있습니다.
3. 한영 사전 구현하기
이번에는 한영 사전을 구현해보도록 하겠습니다.
영어 단어와 한글 설명이 같이 저장이 되도록 만들어서 구현을 합니다.
그리고 사용자가 단어를 입력하면 일치하는 단어가 있을 시 화면에 출력을 하고,
아니라면 오류 메시지를 출력하고 종료하도록 만들 것입니다.
그리고 이러한 언어 관련, 다시 말해 자연어 처리는 인공지능 관련 분야에서도 계속 연구 중이기 때문에
아직 완전하지가 않습니다.
그래서 이 분야는 여전히 블루오션이며, 실제로 이를 계속 개선하여 사업으로 진행을 해도 될 정도로
되게 매리트가 있는 분야이니, 한 번 보시면 좋을 것 같습니다.
그럼 시작하도록 하겠습니다.
#include <stdio.h>
#include <string.h>
#define WORDS 5
int main()
{
int index, i;
char dic[WORDS][2][30] = {
{"book", "책"},
{"boy", "소년"},
{"computer", "컴퓨터"},
{"language", "언어"},
{"rain", "비"}
};
char word[30];
printf("단어를 입력하세요 : ");
scanf("%s", word);
index = 0;
for(i = 0; i < WORDS; i++)
{
if(strcmp(dic[index][0], word) == 0)
{
printf("%s : %s\n", word, dic[index][1]);
return 0;
}
index++;
}
printf("사전에서 발견되지 않았습니다.\n");
return 0;
}
이렇게 구현을 해봤습니다.
그럼 이제 결과를 보도록 하겠습니다.
// 단어가 사전에 있을 경우
단어를 입력하세요 : boy
boy : 소년
//단어가 사전에 없을 경우
단어를 입력하세요 : mom
사전에서 발견되지 않았습니다.
결과도 잘 나온 것을 확인할 수 있습니다.
4. 메시지 암호화 하기
이번에는 메시지를 암호화 해보도록 하겠습니다.
암호화를 할 때 사용할 기법은 율리우스 카이사르(Julius Caesar, 영어식 : 줄리우스 시저)가 사용했다고 하여 명명된
카이사르 암호(시저 암호)를 이용하여 구현을 할 것입니다.
카이사르 암호가 암호화를 시키는 방식은 평문 문자를 다른 문자와 일대일 대응을 시켜서
하나의 암호문을 만들어 암호화를 시키는 방식입니다.
그래서 카이사르 암호에 대하여 떠올리게 되면 무언가를 돌려갖고 암호화를 시키거나, 복호화를 시키는 것을 떠올리게 되죠.
그럼 지금부터 이와 관련된 코드를 한 번 작성을 해보도록 하겠습니다.
#include <stdio.h>
void encrypt(char cipher[], int shift);
int main()
{
char cipher[50];
int shift = 3;
printf("문자열을 입력하세요 : ");
gets_s(cipher, 50);
encrypt(cipher, shift);
return 0;
}
void encrypt(char cipher[50], int shift)
{
int i = 0;
while(cipher[i] != '\0')
{
if(cipher[i] >= 'A' && cipher[i] <= 'z')
{
cipher[i] += shift;
if(cipher[i] > 'z')
{
cipher[i] -= 26;
}
}
i++;
}
printf("암호화된 문자열 : %s\n", cipher);
}
이렇게 한 번 작성을 해봤습니다.
그럼 결과를 한 번 보도록 하겠습니다.
문자열을 입력하세요 : meet at midnight
암호화된 문자열 : phhw dw plgqljkw
결과도 제대로 나오는 것을 볼 수 있습니다.
5. 행맨 게임 만들기
이번에는 행맨 게임을 만들어보겠습니다.
행맨 게임은 다들 아시다시피 영어권에서 온 단어 맞추기 게임입니다.
단어 맞추기이긴 한데, 약간 스무고개 비슷하죠?
글자를 추측하여 맞추고, 완전한 단어를 맞춘다는 면에서요.
그럼 이걸 한 번 만들어보도록 하겠습니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>
#include <time.h>
int main(void)
{
char ch;
int cnt = 0;
// 등록된 단어 사전
char *dic[] = {"boy", "girl", "happy", "college", "mercy", "mask", "science", "kitten", "saint" };
int word_num = sizeof(dic)/sizeof(char *); // 등록된 단어의 개수
int i;
int select;
char *word;
char *pword;
int len;
srand(time(NULL)); // 난수 시드 조정 및 초기화
select = rand() % word_num; // 임의의 단어 첨자
word = dic[select]; // 임의의 단어 포인터
len = strlen(word); // 단어의 길이
pword = (char *)malloc(len + 1); // 화면에 나타나는 단어 배열
for(i=0; i <len; i++)
{
pword[i] = '_'; // 화면에 나타나는 단어를 _ 로 출력 및 초기화
}
pword[len] = '\0';
printf("<<<< 단어 맞추기 게임 >>>>\n\n");
while (1)
{
printf("맞춰야 할 단어는 다음과 같습니다 : %s\n", pword);
printf("글자를 추측해보세요 :");
scanf("%c", &ch);fflush(stdin); // 문자입력
cnt++; // 시도 횟수 누적
for(i=0; i <len; i++)
{
if(pword[i] == '_' && word[i] == ch) // 입력된 문자가 아직 가려져 있을 경우
{
pword[i] = ch; // 화면에 해당 문자 출력
}
}
for(i=0; i <len; i++)
{
if(pword[i] == '_') // 가려져 있는 문자가 있는 지 여부 판단
{
break;
}
}
if(i == len) // 가려진 문자가 없이 다 맞추었을 경우
{
printf("\n시도 횟수 %d 회 만에 %s 를 맞추었습니다.\n\n", cnt, pword);
return 0;
}
}
return 0;
}
이번에는 조금 어려울 수 있는데,
먼저 맞춰야 할 단어를 ㄷㅇ록된 단어들 안에서 무작위로 선택하여 맞추도록 공백을 띄우고,
맞춘 문자가 있을 경우에 공백 대신 글자로 채워주고,
아닐 경우 스킵을 하는 것입니다.
그럼 결과를 한 번 보도록 하겠습니다.
<<<< 단어 맞추기 게임 >>>>
맞춰야 할 단어는 다음과 같습니다 : ____
글자를 추측해보세요 :m
맞춰야 할 단어는 다음과 같습니다 : ____
글자를 추측해보세요 :g
맞춰야 할 단어는 다음과 같습니다 : g___
글자를 추측해보세요 :i
맞춰야 할 단어는 다음과 같습니다 : gi__
글자를 추측해보세요 :y
맞춰야 할 단어는 다음과 같습니다 : gi__
글자를 추측해보세요 :r
맞춰야 할 단어는 다음과 같습니다 : gir_
글자를 추측해보세요 :l
시도 횟수 6 회 만에 girl 를 맞추었습니다.
이렇게 결과가 나오는 것을 확인할 수 있습니다.
여기까지 문자와 문자열을 이용하여 여러 가지 문제들을 풀어보는 시간을 가져보았는데요,
다음 포스팅부터는 구조체에 대하여 알아보는 시간을 가지도록 하겠습니다.
긴 글 읽어주신 독자분들께 진심으로 감사드립니다~
'c언어' 카테고리의 다른 글
c언어 구조체의 선언, 초기화, 멤버 참조, 이름 없는 구조체에 대하여 알아보기 (0) | 2023.01.15 |
---|---|
c언어 구조체에 대하여 간단히 알아보기 (0) | 2023.01.11 |
c언어 문자열을 여러 개 저장하는 방법에 대하여 알아보기 (0) | 2023.01.06 |
c언어 문자열을 수치로 변환하는 방법 알아보기 (0) | 2022.12.31 |
c언어 문자열 처리 라이브러리에 대하여 알아보기 2(문자열 비교하기, 문자 및 문자열 검색하기, 문자열 토큰 분리하기) (0) | 2022.12.30 |
댓글