<ALGORITHM>/NOTE
20210203(수)
CodeGrimie
2021. 2. 3. 17:54
구조체 복습
#include <cstdio>
#include <cstring>
#include <clocale>
typedef struct {
wchar_t name[20];
wchar_t address[100];
unsigned int age;
} Person;
void PersonSwap(Person* a, Person* b)
{
Person temp = *a;
*a = *b;
*b = temp;
}
int main()
{
Person GildongHong;
wcscpy(GildongHong.name, L"홍길동");
wcscpy(GildongHong.name, L"서울시 관악구 조원중앙로");
GildongHong.age = 18;
Person* He = &GildongHong;
wprintf(L"%s", *(He).name);
wprintf(L"%s", He->name);
return (0);
}
큐와 구조체를 사용한 예시
#include <cstdio>
#include <clocale>
#include <ctime>
#include <cstdlib>
#include <queue>
#define USE_ARRAY 1
typedef struct {
int a;
int b;
int c;
int d;
}Node;
const static unsigned int NODE_SIZE = 5;
#if (USE_ARRAY)
Node nodeArray[NODE_SIZE];
int front = -1;
int end = -1;
int length = 0;
bool IsEmpty()
{
if (front == -1 && end == -1)
return true;
else
return false;
}
void Enqueue(Node value)
{
//queue is full
if ((end + 1) % NODE_SIZE == front)
printf("Queue is full \n");
else
{
//first element inserted
if (front == -1)
front = 0;
//insert element at rear
end = (end + 1) % NODE_SIZE;
nodeArray[end] = value;
length++;
}
}
void Dequeue()
{
if (IsEmpty())
printf("Queue is empty\n");
else
{
//only one element
if (front == end)
front = end = -1;
else
front = (front + 1) % NODE_SIZE;
length--;
}
}
#else
std::queue<Node> nodeQueue;
#endif
bool CompareNode(Node& a, Node& b)
{
if (a.a != b.a)
return (false);
if (a.b != b.b)
return (false);
if (a.c != b.c)
return (false);
if (a.d != b.d)
return (false);
return (true);
}
void PrintNode(Node node)
{
printf("{ %d, %d, %d, %d }", node.a, node.b, node.c, node.d);
}
int main()
{
_wsetlocale(LC_ALL, L"Korean");
srand(time(nullptr));
for (int i = 0; i < NODE_SIZE; i++)
{
Node temp;
temp.a = rand() % 10;
temp.b = rand() % 10;
temp.c = rand() % 10;
temp.d = rand() % 10;
#if (USE_ARRAY)
Enqueue(temp);
#else
nodeQueue.push(temp);
#endif
}
while (1)
{
#if (USE_ARRAY)
if (IsEmpty())
{
break;
}
#else
if (nodeQueue.empty())
{
break;
}
#endif
Node playerAnswer = { 0 };
wprintf(L"플레이어 값 : ");
scanf_s("%d %d %d %d", &playerAnswer.a, &playerAnswer.b, &playerAnswer.c, &playerAnswer.d);
#if (USE_ARRAY)
if (!CompareNode(nodeArray[front], playerAnswer))
#else
if (!CompareNode(nodeQueue.front(), playerAnswer))
#endif
{
printf("> FAILED\n");
printf("CPU NODE : ");
#if (USE_ARRAY)
PrintNode(nodeArray[front]);
#else
PrintNode(nodeQueue.front());
#endif
printf("\n");
printf("PLAYER NODE : ");
PrintNode(playerAnswer);
printf("\n");
}
else
{
printf("> SUCCESS\n");
printf("CPU NODE : ");
#if (USE_ARRAY)
PrintNode(nodeArray[front]);
#else
PrintNode(nodeQueue.front());
#endif
printf("\n");
printf("PLAYER NODE : ");
PrintNode(playerAnswer);
printf("\n");
}
#if (USE_ARRAY)
Dequeue();
printf("REMAIN QUEUE : %d\n", length);
#else
nodeQueue.pop();
printf("REMAIN QUEUE : %d\n", nodeQueue.size());
#endif
}
return (0);
}
쓰레드(Thread)
#include <cstdio>
#include <ctime>
#include <clocale>
#include <thread>
#include "Windows.h"
#define FRAME 60
#define FPS (1000/60)
using std::thread;
void func1(int cycle)
{
for (int i = 0; i < cycle; i++)
{
wprintf(L"쓰레드 1 동작 중..\n");
Sleep(1000);
}
}
void func2()
{
for (int i = 0; i < 10; i++)
{
wprintf(L"쓰레드 2 동작 중..\n");
Sleep(1000);
}
}
void func3()
{
for (int i = 0; i < 10; i++)
{
wprintf(L"쓰레드 3 동작 중..\n");
Sleep(1000);
}
}
int main()
{
_wsetlocale(LC_ALL, L"Korean");
thread t1(func1, 10);
thread t2(func2);
thread t3(func3);
t1.join();
t2.join();
t3.join();
return (0);
}
쓰레드를 이용한 큐 게임
#include <cstdio>
#include <clocale>
#include <ctime>
#include <cstdlib>
#include <queue>
#include <thread>
#include "Windows.h"
using std::thread;
#define FRAME 60
#define FPS (1000/60)
#define SECOND 1000
typedef struct {
int a;
int b;
int c;
int d;
}Node;
const static unsigned int NODE_SIZE = 5;
std::queue<Node> nodeQueue;
Node aiAnswer = { 0 };
bool CompareNode(Node& a, Node& b)
{
if (a.a != b.a)
return (false);
if (a.b != b.b)
return (false);
if (a.c != b.c)
return (false);
if (a.d != b.d)
return (false);
return (true);
}
void PrintNode(Node node)
{
printf("{ %d, %d, %d, %d }", node.a, node.b, node.c, node.d);
}
void ThreadEnqueue()
{
while (1)
{
Node temp;
temp.a = rand() % 10;
temp.b = rand() % 10;
temp.c = rand() % 10;
temp.d = rand() % 10;
nodeQueue.push(temp);
wprintf(L"CPU QUEUE: %d %d %d %d\n", nodeQueue.back().a, nodeQueue.back().b, nodeQueue.back().c, nodeQueue.back().d);
Sleep(1.5f * SECOND);
}
}
void ThreadInput()
{
while (1)
{
Node temp;
temp.a = rand() % 10;
temp.b = rand() % 10;
temp.c = rand() % 10;
temp.d = rand() % 10;
aiAnswer = temp;
wprintf(L"CPU NODE : %d %d %d %d\n", aiAnswer.a, aiAnswer.b, aiAnswer.c, aiAnswer.d);
Sleep(2 * SECOND);
}
}
void ThreadRoop()
{
while (1)
{
if (nodeQueue.empty())
{
break;
}
wprintf(L"############\n");
if (!CompareNode(nodeQueue.front(), aiAnswer))
{
printf("> FAILED\n");
printf("CPU QUEUE : ");
PrintNode(nodeQueue.front());
printf("\n");
printf("CPU NODE : ");
PrintNode(aiAnswer);
printf("\n");
}
else
{
printf("> SUCCESS\n");
printf("CPU QUEUE : ");
PrintNode(nodeQueue.front());
printf("\n");
printf("CPU NODE : ");
PrintNode(aiAnswer);
printf("\n");
}
nodeQueue.pop();
printf("REMAIN QUEUE : %d\n", nodeQueue.size());
wprintf(L"############\n");
Sleep(2 * SECOND);
}
}
int main()
{
_wsetlocale(LC_ALL, L"Korean");
time_t startTime = time(nullptr);
srand((int)startTime);
thread enqueueThread(ThreadEnqueue);
thread roopThread(ThreadRoop);
thread inputThread(ThreadInput);
enqueueThread.join();
inputThread.join();
roopThread.join();
return (0);
}
쓰레드를 사용한 토이 프로젝트
#include <cstdio>
#include <clocale>
#include <ctime>
#include <cstdlib>
#include <thread>
#include "Windows.h"
using std::thread;
#define FRAME 60
#define FPS (1000/60)
#define SECOND 1000
typedef struct {
wchar_t name[20];
int hp;
int attack;
}Actor;
static bool isSimulationRunning = true;
static unsigned int roundCount = 0;
const static wchar_t ACTOR_NAME_ARRAY[5][20] = {
L"당나귀",
L"쿼카",
L"고양이",
L"토끼",
L"햄스터"
};
Actor Player = { (wchar_t)nullptr, 0, 0 };
Actor Monster = { (wchar_t)nullptr, 0, 0 };
void SetActor(Actor& actor)
{
wcscpy_s(actor.name, ACTOR_NAME_ARRAY[rand() % 5]);
actor.hp = (rand() % 5 + 1) * 100;
actor.attack = (rand() % 5 + 1) * 10;
}
void ThreadAttack()
{
while (isSimulationRunning)
{
wprintf(L"□□□□□□□□□□□□□□□□□□\n");
wprintf(L" ROUND %d\n", roundCount);
wprintf(L"NAME : %s %s\n", Player.name, Monster.name);
wprintf(L"HP : %d %d\n", Player.hp, Monster.hp);
wprintf(L"ATTACK : %d %d\n", Player.hp, Monster.hp);
bool isFront = (rand() % 2);
if (isFront)
{
wprintf(L"[몬스터 선공]\n");
Player.hp -= Monster.attack;
wprintf(L"\'%s\'가 \'%s\'에게 \'%d\'만큼 데미지를 가했다.\n", Monster.name, Player.name, Monster.attack);
Monster.hp -= Player.attack;
wprintf(L"\'%s\'가 \'%s\'에게 \'%d\'만큼 데미지를 가했다.\n", Player.name, Monster.name, Monster.attack);
}
else
{
wprintf(L"[플레이어 선공]\n");
Monster.hp -= Player.attack;
wprintf(L"\'%s\'가 \'%s\'에게 \'%d\'만큼 데미지를 가했다.\n", Monster.name, Player.name, Monster.attack);
Player.hp -= Monster.attack;
wprintf(L"\'%s\'가 \'%s\'에게 \'%d\'만큼 데미지를 가했다.\n", Player.name, Monster.name, Monster.attack);
}
if (Player.hp <= 0 || Monster.hp <= 0)
{
isSimulationRunning = false;
wprintf(L"□□□□□□□□□□□□□□□□□□\n");
if (Player.hp > Monster.hp)
{
wprintf(L"플레이어가 승리했습니다.\n");
}
else if (Player.hp < Monster.hp)
{
wprintf(L"몬스터가 승리했습니다.\n");
}
else
{
wprintf(L"무승부입니다.\n");
}
}
roundCount++;
Sleep(SECOND);
}
}
int main()
{
_wsetlocale(LC_ALL, L"Korean");
srand((unsigned int)time(nullptr));
SetActor(Player);
SetActor(Monster);
thread attackThread(ThreadAttack);
attackThread.join();
return (0);
}
리스트 예시
#include <cstdio>
#include <list>
using namespace std;
int main()
{
list<int> a;
a.push_back(0);
a.push_back(1);
a.push_front(2);
a.push_front(3);
list<int>::iterator index = a.begin();
a.insert(index, 4);
for (auto i = a.begin(); i != a.end(); i++)
{
printf("%d ", *i);
}
return (0);
}
리스트를 사용한 도서 관리 프로그램
#include <cstdio>
#include <clocale>
#include <list>
using namespace std;
enum class BOOK_TYPE {
MODERN = 1,
FANTASY,
HISTORY,
CHILDREN
};
typedef struct {
BOOK_TYPE type;
wchar_t title[20];
}Book;
char todo = 0;
int main()
{
_wsetlocale(LC_ALL, L"Korean");
list<Book>bookList;
while (1)
{
wprintf(L"< 현재 책 목록 >\n");
for (auto i = bookList.begin(); i != bookList.end(); i++)
{
wchar_t bookType[20];
switch ((*i).type)
{
case BOOK_TYPE::MODERN:
wcscpy_s(bookType, L"현대문학");
break;
case BOOK_TYPE::FANTASY:
wcscpy_s(bookType, L"판타지");
break;
case BOOK_TYPE::HISTORY:
wcscpy_s(bookType, L"역사");
break;
case BOOK_TYPE::CHILDREN:
wcscpy_s(bookType, L"아동문학");
break;
default:
wcscpy_s(bookType, L"잘못된 책 코드입니다.");
break;
}
wprintf(L"[%s : %s]\n", bookType, (*i).title);
}
wprintf(L"\n");
wprintf(L"A : 도서추가 D : 도서제거\n");
wprintf(L"업무 선택 : ");
todo = 0;
scanf_s("%c", &todo, sizeof(todo));
Book temp;
wprintf(L"책을 입력하세요 : ");
wscanf_s(L"%d %s", &(temp.type), temp.title, sizeof(temp.title));
wprintf(L"\n");
if (todo == 'A' || todo == 'a')
{
list<Book>::iterator index = bookList.begin();
for (index = bookList.begin(); index != bookList.end(); index++)
{
if ((*index).type == temp.type)
{
bookList.insert(index, temp);
break;
}
}
if (index == bookList.end())
{
bookList.push_back(temp);
}
}
else
{
list<Book>::iterator index = bookList.begin();
for (index = bookList.begin(); index != bookList.end(); index++)
{
if ((*index).type == temp.type)
{
bookList.erase(index);
break;
}
}
}
}
return (0);
}