큐(Queue)를 이용한 계산기 프로그램


큐(Queue)를 이용한 계산기 프로그램


이번에는 큐를 이용해서 계산기를 만들어 볼 것이다.
우리가 사용할 함수는 strlen, memset, memcpy, atoi 함수이다.


strlen = 문자열의 길이를 알아내는 함수

memset = 메모리 채우기 함수

memcpy = 메모리 복사 함수

atoi = 문자열을 정수로 변환하는 함수


[프로그래밍/C] - memcpy, memmove, memset 함수 구현

[프로그래밍/C] - strcspn 문자열 중에서 일치되는 첫 문자의 위치 구하기

[프로그래밍/C] - strlen 문자열 길이


이 프로그램은 함수를 헤더파일을 include 해서 만든 프로그램이 아니고 직접 구현해서 만든 프로그램이다.


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <stdio.h>
#define QUEUE_MAX 100
int add(int value);
int delete(int *value);
size_t strlen(const char *s);
void* memset(void *dest, int fillChar, size_t count);
size_t strcspn(const char *stringconst char *strCharSet);
void* memcpy(void *dest, const void *src, size_t count);
int atoi(const char *string);
typedef struct tagQueue
{
    int array[QUEUE_MAX];
    int front;
    int rear;
}QUEUE;
QUEUE q;
main()
{
    char buff[100], tmp[100];
    char *op = "+-*/%";
    int index;
    int value1 = 0, value2 = 0;
 
    q.front = q.rear = 0;
 
    puts("계산식을 1*2처럼 입력하고 엔터키를 치세요.");
    puts("아무것도 입력하지 않으면 계산이 종료됩니다.");
    while (1) {
        printf("계산식 : ");
        gets_s(buff,sizeof(buff));
        if (strlen(buff) == 0break;
        memset(tmp, 0sizeof(tmp));
        index = strcspn(buff, op);
        memcpy(tmp, buff, index);
        value1 = atoi(tmp);
        value2 = atoi(&buff[index + 1]);
 
        switch (buff[index]) {
        case '+': value1 += value2; break;
        case '-': value1 -= value2; break;
        case '*': value1 *= value2; break;
        case '/': value1 /= value2; break;
        case '%': value1 %= value2; break;
        default: puts("잘못된 연산자를 사용하였습니다."); continue;
        }
        if (add(value1) == -1)
            puts("더 이상 저장할 수 없습니다.");
        printf("%s = %d, q.rear = %d \n\n", buff, value1, q.rear);
    }
    value1 = 0;
    while (1) {
        if (delete(&value2) == -1)break;
        value1 += value2;
    }
    printf("계산의 총합은 %d입니다.\n", value1);
}
size_t strlen(const char *s)
{
    size_t count = 0;
    while (*s)
        s++, count++;
    return count;
}
void* memset(void *dest, int fillChar, size_t count)
{
    for (size_t i = 0; i < count; i++)
        *((char*)dest + i) = fillChar;
    return dest;
}
size_t strcspn(const char *stringconst char *strCharSet)
{
    const char *temp;
    size_t n = 0;
    while (*string) {
        temp = strCharSet;
        while (*temp) {
            if (*temp == *string)
                return n;
            temp++;
        }
        n++string++;
    }
    return n;
}
void* memcpy(void *dest, const void *src, size_t count)
{
    for (size_t i = 0; i < count; i++)
        *((char*)dest + i) = *((char*)src + i);
    return dest;
}
int atoi(const char *string)
{
    int tot = 0;
    while (*string) {
        tot = tot * 10 + *string - '0';
        string++;
    }
    return tot;
}
int add(int value)
{
    if (q.rear == QUEUE_MAX) return -1;
    q.array[q.rear++= value;
    return 0;
}
int delete(int *value)
{
    if (q.front == q.rear || q.front == QUEUE_MAX) return -1;
    *value = q.array[q.front++];
    return 0;
}
cs

< 출력 >


일단 소스 설명하기 전에 큐에 대해서 설명을 한다.
큐(Queue)는 FIFO (First - In - First - Out) 이라고도 불리며 가장 먼저 저장한 데이터가 가장 먼저 나오는 구조를 말한다.
F는 Front이고, R은 Rear이다. add할 때 R은 증가하고, delete할 때 F가 증가 된다.



3~4행은 큐에 데이터를 삽입하는 동작을 add라고 하고 데이터를 꺼내오는 동작을 delete라고 한다.

5~9행은 우리가 사용할 함수를 직접 규현을 했다.

10~15행은 큐에 사용될 구조체를 선언했다.

32행에서 tmp 배열을 모두 0으로 초기화를 했다.

33행에서 문자열에서 연산자(+, -, *, /, %)의 위치를 검색한다.

34행에서 buff 배열을 tmp 배열에 index 사이즈 만큼 복사를 한다.

35~36행에서 문자열을 정수형으로 변환을 해준다.

46행에서 연산된 결과값을 큐에 저장하고 add함수가 -1을 반환하면 더 이상 큐에 저장할 수 없는 상태(overflow)이다.

52행에서 저장된 값들을 큐에서 하나씩 꺼내온다. delete 함수가 -1을 반환하면 더 이상 꺼내올 값이 없는 상태(underflow)이다.

108행에서 큐의 front값이 rear의 값과 같거나 QUEUE_MAX라면 더 이상 꺼낼 값이 없는 상태이기 때문에 -1을 반환시킨다.


큐를 이용해서 계산기 프로그램을 만들어 보았다.



[프로그래밍/C] - 스택(Stack)을 이용한 계산기 프로그램

[프로그래밍/C] - 야구 게임

[프로그래밍/C] - 가위바위보 게임

[프로그래밍/C] - 요일 구하기 프로그램

[프로그래밍/C] - 도서관리 프로그램 3번째 완성본






댓글

Designed by JB FACTORY