큐(Queue)를 이용한 계산기 프로그램
- 프로그래밍/C/C++
- 2018. 7. 21.
큐(Queue)를 이용한 계산기 프로그램
strlen = 문자열의 길이를 알아내는 함수
memset = 메모리 채우기 함수
memcpy = 메모리 복사 함수
atoi = 문자열을 정수로 변환하는 함수
[프로그래밍/C] - memcpy, memmove, memset 함수 구현
[프로그래밍/C] - strcspn 문자열 중에서 일치되는 첫 문자의 위치 구하기
이 프로그램은 함수를 헤더파일을 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 *string, const 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) == 0) break; memset(tmp, 0, sizeof(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 *string, const 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 |
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)을 이용한 계산기 프로그램