<ALGORITHM>/NOTE

20210208(월)

CodeGrimie 2021. 2. 8. 17:59

쓰레드 & 리스트 연습

#include <cstdio>
#include <clocale>
#include <thread>
#include <list>

// 

using std::thread;

typedef struct _Book {
    unsigned int code;
    wchar_t name[20];
}Book;

std::list<Book> bookList;

void PushBook()
{
    Book book;
    wprintf(L"책 데이터를 (코드 제목) 순서로 입력하세요.\n");
    wprintf(L"데이터 : ");
    wscanf_s(L"%d %s", &(book.code), book.name, 20);
    bookList.push_back(book);
}

void PopBook()
{
    bookList.pop_front();
}

void PrintBooks()
{
    wprintf(L"  코드 제목 \n");
    for (auto i = bookList.begin(); i != bookList.end(); i++)
    {
        wprintf(L"   %d   %s \n", (*i).code, (*i).name);
    }
    wprintf(L"\n");
}

void mainThread()
{
    unsigned int inputCode = 0;
    while (1)
    {
        wprintf(L"[1 : PUSH] [2 : POP] [3 : PRINT]\n");
        wprintf(L"업무 코드 : ");
        wscanf_s(L"%d", &inputCode);
        wprintf(L"\n");

        switch (inputCode)
        {
        case 1:
        {
            PushBook();
            inputCode = 0;
        }
        break;

        case 2:
        {
            PopBook();
        }
        break;

        case 3:
        {
            PrintBooks();
        }

        break;

        default:
            wprintf(L"정상적이지 않은 업무 코드입니다.\n");
            break;

        }
    }
}

int main()
{
    _wsetlocale(LC_ALL, L"Korean");

    thread THREAD_MAIN(mainThread);
    THREAD_MAIN.join();

    return (0);
}

 

탐색 알고리즘(STL)

 

#include <iostream>
#include <vector>
#include <thread>
#include <string>

using std::thread;
using namespace std;

typedef struct _Fruit {
    string name;
    unsigned int amount;
}Fruit;

vector<Fruit> fruitList;

bool checkFruitStock(Fruit fruit)
{
    for (auto i = fruitList.begin(); i != fruitList.end(); i++)
    {
        if ((*i).name.compare(fruit.name) != 0)
        {
            return (false);
        }
    }
    return (true);
}

void ReceiveFruit()
{
    Fruit fruit;
    cout << "과일 데이터를 (이름 수량) 순서로 입력하세요.\n";
    cout << "과일 이름 : ";
    //getline(cin, fruit.name);
    cin >> fruit.name;
    cout << "과일 수량 : ";
    cin >> fruit.amount;

    vector<Fruit>::iterator it;
    it = find_if(fruitList.begin(), fruitList.end(), checkFruitStock);
    if (it != fruitList.end())
    {
        (*it).amount += fruit.amount;
    }
    else
    {
        fruitList.push_back(fruit);
    }
}

void ReleaseFruit()
{
    Fruit fruit;
    cout << "과일 데이터를 (이름 수량) 순서로 입력하세요.\n";
    cout << "과일 이름 : ";
    //getline(cin, fruit.name);
    cin >> fruit.name;
    cout << "과일 수량 : ";
    cin >> fruit.amount;

    vector<Fruit>::iterator it;
    it = find_if(fruitList.begin(), fruitList.end(), checkFruitStock);
    if (it != fruitList.end())
    {
        (*it).amount -= fruit.amount;
        if ((*it).amount < 0)
        {
            fruitList.erase(it);
        }
    }
}

void PrintFruit()
{
    cout << "과일   수량\n";
    for (auto i = fruitList.begin(); i != fruitList.end(); i++)
    {
        cout << (*i).name << "  " << (*i).amount << "\n";
    }
}

void MainThread()
{
    unsigned int inputCode = 0;
    while (1)
    {
        cout << "[1 : RECEIVE] [2 : RELEASE] [3 : PRINT]\n";
        cout << "업무 코드 : ";
        cin >> inputCode;
        cout << "\n";

        switch (inputCode)
        {
        case 1:
        {
            ReceiveFruit();
            inputCode = 0;
        }
        break;

        case 2:
        {
            ReleaseFruit();
        }
        break;

        case 3:
        {
            PrintFruit();
        }

        break;

        default:
            wprintf(L"정상적이지 않은 업무 코드입니다.\n");
            break;

        }
    }
}

int main()
{

    thread THREAD_MAIN(MainThread);
    THREAD_MAIN.join();

    return (0);
}