일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Bandit
- C++ 언어 # 핵심 정리
- C언어 #부록
- C++ 언어 # 핵심정리
- HTML #핵심정리
- C언어 # 핵심 정리
- Hacking #Baic
- shell_script
- C언어 #핵심정리
- C언어 # 부록
- MySQL #핵심정리
- PHP #핵심정리
- C++ 언어 #핵심정리
- Today
- Total
cCcode
C Language [핵심정리] - 24 본문
1. 회문 판별과 N-gram
지금까지 배운 문자열을 이용해 회문 판별과, N-gram을 만들어보겠습니다.
회문은 유전자 염기서열 분석에, N-gram은 빅데이터 분석, 검색엔진등에 자주 사용됩니다.
1) 회문 판단 프로그램
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
int main()
{
printf("-- Input Checking Program --\n\n");
char word[30] = {'\0',};
int word_length = 0;
bool is_analyze = true;
printf("INPUT : ");
scanf_s("%s", &word, (unsigned char)sizeof(word));
word_length = (int)strlen(word);
for (int i = 0; i < word_length / 2; i++)
{
if (word[i] != word[word_length -1 * (1 + i)])
{
is_analyze = false;
break;
}
}
if (is_analyze == false)
printf("\nRESULT : \"%s\" → This string is not palindrome\n", word);
else printf("\nRESULT : \"%s\" → This string is palindrome\n", word);
return 0;
}
회문(palindrome)은 순서를 거꾸로 읽어도 제대로 읽은 것과 같은 단어와 문장을 말합니다.
이번 예제는 스스로 분석해보길 바라며, 설명은 생략하겠습니다.
2) N-gram
#include <stdio.h>
#include <string.h>
int main()
{
char text[30] = {"cCcode"};
int length;
length = strlen(text);
for (int i = 0; i < length - 1; i++)
printf("%c %c\n", text[i], text[i + 1]);
return 0;
}
* 2 - gram (글자 단위)
N - gram은 문자열에서 N개의 연속된 요소를 추출하는 방법입니다. 즉, 문자열의 처음부터 문자열 끝까지 한 부분씩 이동하며 N개의 글자를 추출합니다. ex) 3 - gram 은 3글자 추출
따라서 각 글자마다(첫글자와 마지막 글자를 제외) 최소 한번 씩은 중복됩니다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
char text[50] = { "this is amazing!" };
char* Ptr = { NULL, };
char* Ptr_Storage[30] = { NULL, };
int Storage_Index = 0;
Ptr = strtok(text, " ");
while (Ptr != NULL)
{
Ptr_Storage[Storage_Index] = Ptr;
Storage_Index += 1; Ptr = strtok(NULL, " ");
}
for (int i = 0; i < Storage_Index - 1; i++)
printf("%s %s\n", Ptr_Storage[i], Ptr_Storage[i + 1]);
return 0;
}
* 2 - gram (단어 단위)
그전에 배운 strtok 함수를 이용해 포인터 변수에 반환된 포인터를 저장하고 두 개씩 연속해서 출력했습니다. 두 개씩 연속해서 출력하는 부분을 제외한 코드는 그전에 설명한 코드와 일맥상통하니 자세한 설명은 하지 않겠습니다.
2. 구조체 사용하기
C언어는 자료를 체계적으로 관리하기 위해 구조체라는 문법을 제공합니다.
구조체는 struct 키워드로 정의합니다.
구조체는 정의만 해서 사용할 수 없고 ○ struct 구조체명 변수명; 형태로 구조체변수를 선언해 사용해야합니다.
구조체는 보통 main 함수 밖에 정의합니다 왜냐? main함수 안에 구조체를 정의하면 해당 함수 안에서만 구조체를 사용할 수 있기 때문이죠. 그리고 구조체 멤버에 접근해 값을 수정할 때는 . 을 사용합니다. 다만 여기서 주의해야 할 점은 일반적인 경우에는 바로 p1.age = 18; 과 같은 형태로 수정해주시면 되지만 문자 배열의 경우 = (할당연산자)를 사용할 수 없기에strcpy 함수를 사용해 값을 수정해야 한다는 점입니다.
이처럼 매번 구조체를 사용할 때마다 변수를 선언하려면 여간 귀찮은게 아니겠죠. 특히 저같이 귀차니즘이 많은 사람이라면 특히 그래서 저희는 구조체를 정의하는 동시에 변수를 선언하는 방법을 알아볼게요.
그전까지 저희는 }; 이렇게 닫는 중괄호와 세미콜론 사이를 비워두었는데요. 그렇기 때문에 따로 변수를 선언해줘야하는 거 였습니다.
결과 역시 동일합니다. 단지 변수를 선언하는 위치만 바뀌었을 뿐인데 오히려 결과가 달라지면 이상한거겠죠..? 다만, 여기서 주의 깊게 봐야할 것 또한 변수의 선언위치입니다. 전에는 main 함수안에 선언되었던게 main 함수 밖으로 나왔죠? 이렇게 어떤 함수에도 속해있지 않은 변수를 전역변수라고 합니다. 여기서 한마디 덧붙이자면 어떤 함수에 속해있는 변수는 지역변수라고 하죠. 그럼 이제 전역변수가 지역변수의 차이점을 간단히 보여드리겠습니다.
제가 만든 프로그램의 일부입니다. 아까 설명드린대로 지역변수는 main 함수 즉, 선언한 함수 내에서만 쓸 수 있기에 외부 함수 judgement에서 f1(구조체 변수)를 이용해 구조체에 접근할 수 없는겁니다.
전역변수는 어디에도 속하지 않았기에 모든 곳에서 사용가능합니다. 따라서 main함수 외부 함수인 judegement에서도 f1(구조체 변수)를 이용해 구조체에 접근할 수 있는 것이죠.
#include <stdio.h>
#include <string.h>
struct feeling_measure {
int happy_measure;
int sad_measure;
}f1;
void judegement(void);
int main()
{
// struct feeling_measure f1;
f1.happy_measure = 100;
f1.sad_measure = 0;
printf("++++ feeling judgemet Program ++++\n\n");
printf("happy : %d(Persent)\n", f1.happy_measure);
printf("sad : %d(Persent)\n\n", f1.sad_measure);
judegement();
return 0;
}
void judegement(void)
{
if (f1.happy_measure > f1.sad_measure)
printf("Oh,, you are very positive person. is it right?\n");
else
printf("umm, Don't worry. everything will be good.\n");
}
다른 변수들처럼 구조체 변수 또한 초기화 할 수 있습니다. 구조체 변수를 초기화하려면 구조체 변수를 선언하는 동시에 값을 할당하면 됩니다.
하지만 하나하나 할당해주는 건 너무 불편합니다. 그래서 멤버명과 할당 연산자 없이 값만 , 로 구분하여 나열해도 됩니다. 이 때 구조체 멤버가 선언된 순서대로 넣어야 하고, 각 멤버의 자료형에 맞게 넣는건 당연하겠죠? 그래서 중간에 있는 멤버에만 값을 따로 할당하는 것 또한 불가능합니다.
여러분들이 위의 코드들을 보고 l1 과 l2 즉, 구조체 변수들이 각각 자기만의 구조체를 가지고 있다는 사실을 알아채셨다면 여러분들도 성장하신겁니다.
여러분들의 성장을 축하드리며 오늘은 여기서 마치겠습니다.
'C Language Basic' 카테고리의 다른 글
[부록] 문자열 함수들을 이용한 간단한 프로그램(완성본) (0) | 2021.06.09 |
---|---|
C Language [핵심정리] - 25 (0) | 2021.06.08 |
C Language [핵심정리] - 23 (0) | 2021.06.04 |
C Language [핵심정리] - 22 (0) | 2021.06.02 |
C Language [핵심정리] - 21 (0) | 2021.06.01 |