2차과제의 2번문제는 단어장을 만드는 프로그램입니다.
밑 3가지 규칙을 따라야합니다.
1. 알파벳 순서로 정렬(단어를 삽입할때마다 정렬해야할듯?)
2. 짧은 단어가 먼저(문자열 길이를 비교해야할듯?)
3. 대소문자 구별x(문자비교 함수 써야할듯?)
위 코드는 3가지 명령어가 있어야하는데요,
단어를 넣고싶을 때는 INSERT (단어) (100개가 넘어가거나, 중복시에는 저장하지 않을것)
단어를 찾고싶을 때는 FIND (단어) (단어가 없다면 NOT FOUND출력)
끝내고 싶을 때는 END
를 입력하면 됩니다.
저의 문제 접근방식입니다.
1. END를 받을경우에는 메모리해제와 함께 프로그램을 종료시킬것.
2. INSERT를 받을경우에는 입력받은 단어를 word라는 문자열에 저장해두고, word의 처음과 끝을 *(data+index++)에 저장을 시켰습니다.
저장 받을경우에 대소문자 구분없이 입력받은 단어와 전에 입력받은 단어가 같을경우에 저장하지 못하게 _stricmp를 사용해서 저장을 못하게 시켰고, 저장 받은 데이터들을 사전식으로 정렬을 시켰습니다.
3. FIND를 받을경우에는 전에 있었던 단어가 있는경우에는 find_num라는 상수를 사용해서 그 단어의 인덱스를 나타냈습니다.
전에 없던 단어인 경우에는 Not Found를 출력시켰습니다.
#include<iostream>
#include<string>
using namespace std;
int main()
{
int index = 0;
char** data;
char* change_data;//문자열 교환할 배열
data = new char* [100];
for (int i = 0; i < 100; i++)
{
*(data + i) = new char[256];
}//메모리할당
string command, word;//명령과 단어
for (int i = 0;i<99; i++) {
bool find_result = false;
cin >> command;
if (command == "END")
{
for (int i = 0; i < 100; i++)
{
delete[] * (data + i);
}
delete[] data; //메모리해제
exit(1);
}//END를 받을경우
else
cin >> word;
if (command == "INSERT") //INSERT를 받을경우
{
copy(word.begin(), word.end(), *(data+index++));//입력받은 word를 포인터로 복사
*(*(data+i)+(word.size())) = 0;//복사한 포인터의 끝을 NULL로 설정
for (int test = 0; test < i; test++)
{
if (_stricmp(*(data+i), *(data+test))==0)//입력받은 단어가 전에 받은 단어와 같을경우
{
i--;
for (int j = 0; j - 1 < i; j++)
{
cout << j << "." << *(data+j) << endl;
}
cin >> command>>*(data+i+1);
i++;
}
}
for (int step = 0; step < i; step++)//사전식 정렬
{
for (int j = 0; j < i - step; j++)
{
if (_stricmp(*(data + j), *(data + j + 1)) > 0)//대소문자 구분없이 비교
{
change_data = *(data + j + 1);
*(data + j + 1) = *(data + j);
*(data + j) = change_data;
}
else if (_stricmp(*(data + j), *(data + j + 1)) == 0)
i--;
}
}
for (int j = 0; j-1 < i; j++)
{
cout << j << "." << *(data + j) << endl;
}
}
else if (command == "FIND")//FIND를 받을경우
{
for (int find_num = 0;find_num<i; find_num++)
{
if (*(data+find_num) == word)//전에 있던 단어일경우 bool상수를 true로 전환
{
cout << find_num << "." << *(data + find_num) << endl;
find_result = true;
i--;
}
}
if (find_result == false) {
cout << "Not Found" << endl;
i--;
}
}
}
}
이렇게 코드가 완성되었습니다.
밑 사진은 코드 실행 예시입니다.
제 생각에서 이번코드에서 중요했던것은
1. string함수 중에서 copy함수를 사용하여 data의 index를 갖고놀았던 것.
2. 사전식배열
3. string함수 중에서 _stricmp로 대소문자 구별없이 중복처리 후, 단어를 입력받은것입니다.
이번문제를 풀면서 느낀점은
2차과제는 문제가 총 9개였는데, 2번문제에서 3일을 사용했습니다.(과제제출기간 약 1달)
_stricmp함수를 빨리 알았다면 어땠을까 싶기도 하네요 ㅠㅠ
1학년때는 헤더파일에서 제공하는 함수사용에 제한을 받아서 그런거 같기도 하네요(군대도 갔다왔고)
앞으로 헤더파일에서 제공하는 여러 함수들을 사용해보면서 어떤 함수인지 알아가면 좋을것 같습니다.
#이 문제의 출처는 kw대학교 컴퓨터정보공학부 2021년 1학기 객체지향 프로그래밍 과제 문제입니다.
2-4 9*9행렬을 3*3곱하기로 나눠서 연산 (0) | 2021.07.29 |
---|---|
2-3 함수포인터 void(*fp)() 사용 (0) | 2021.07.20 |
2-1 2차원배열의 행정렬 (0) | 2021.07.14 |
1-8 뱀게임 (0) | 2021.07.13 |
1-7 1차나 상수식을 검증하는 프로그램 (0) | 2021.07.12 |
댓글 영역