/
loop.c
290 lines (242 loc) · 6.09 KB
/
loop.c
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
/*
*
* Date: 02/10/2015
*
* Description: Função que contem o loop principal do programa Polish Calculator
*
* Authors: name: Allan Ribeiro da Costa
* uri: https://github.com/allan074
* e-mail: <email>
*
* name: Marcos Vinicius Volpato
* uri: https://github.com/marcosvolpato
* e-mail: volpatomv@gmail.com
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "pilhaNum.h"
#include "loop.h"
#include "faz_calculo.h"
#define MAX_LENTH 200
#define RUN_CODES 0
void exibeHeader();
void exibeHelp();
void tiraEspaco(char str[]);
int loop(){
//inicia a pilha usada pelo programa
pilha *p = inicia();
char g_char[MAX_LENTH];
//exibe o cabeçalho do programa
if(!RUN_CODES)
exibeHeader();
//loop principal
while(1){
gets(g_char);
if(strlen(g_char) > 1)
tiraEspaco(g_char);
//define a saida do programa
char sair_s[] = "s";
char sair_S[] = "S";
if(!strcmp(g_char, sair_S) || !strcmp(g_char, sair_s))
return 1;
//define a entrada em help
char help_h[] = "h";
char help_H[] = "H";
if(!strcmp(g_char, help_h) || !strcmp(g_char, help_H)){
if(!RUN_CODES)
exibeHelp();
fflush(stdin);
continue;
}
//entra na função que trata cada char da string informada pelo usuario
int erro = calcular(g_char, p);
if(erro == 1){
if(!RUN_CODES){
exibeHeader();
printf("\nErro! Para fazer um calculo, inicie com E\n");
}
}
}
return 1;
}
//função que exibe o cabeçalho
void exibeHeader(){
system("cls");
printf("\n\n>> POLISH CALCULATOR <<\n");
printf(" > Opcoes <\n\n");
printf("Sair: S\n");
printf("Help: h\n");
printf("\nDigite uma expressao:\n");
}
//função que exibe o help
void exibeHelp(){
system("cls");
printf("\n\n>> POLISH CALCULATOR <<\n");
printf(" > HELP <\n\n");
printf("Clear: C\n\n");
printf("Operacoes:\n");
printf("'+': soma\n");
printf("'-': subtracao\n");
printf("'*': multiplicacao\n");
printf("'/': divisao\n");
printf("'!': fatorial\n");
printf("'^': potencia\n");
printf("\n\n");
printf("Obs: Use E para indicar a entrada de um numero\n\n");
printf("Obs: Apenas inteiros positivos sao permitidos,\n");
printf(" por tanto, nao use numeros negativos ou de ponto flutuante\n\n");
printf("Exemplo de expressao( ex: E 9 0 E 2 0 E 1 5 E 1 3 - * E 5 + / )\n");
printf("\nNas divisoes o dividendo vem primeiro e o divisor depois\n");
printf("Ex: \"e34e2/\" o resultado eh 17\n\n");
printf("Na subtracao o numero a ser subtraido vem depois\n");
printf("Ex: \"e34e20-\" o resultado eh 14\n\n");
printf("pressione enter para voltar:\n");
fflush(stdin);
char tecla;
//tecla = getchar();
scanf("%c",&tecla);
system("cls");
exibeHeader();
}
//recebe um char e retorna verdadeiro se esse charfor um numero
int isNum(char c){
return(c > 47 && c < 58);
}
//recebe um char e retorna verdadeiro se esse char for E maiusculo ou minusculo
int isEnter(char c){
return(c == 'e' || c == 'E');
}
//recebe um char e retorna verdadeiro se esse char for C maiusculo ou minusculo
int isClear(char c){
return(c == 'c' || c == 'C');
}
//recebe um char e retorna verdadeiro se esse char for V maiusculo ou minusculo
int isConsulta(char c){
return(c == 'v' || c == 'V');
}
//aqui recebe uma string e são tratados todos os chars para o proposito do programa
int calcular(char g_char[], pilha *p){
if( isEnter(g_char[0]) || !isEmpty(p)){
int i = 0;
while(g_char[i] != '\0'){
//insere o estado dos calculos
if(!isClear(g_char[i]) && !isConsulta(g_char[i])){
if(isEmpty(p))
printf("- ");
consulta_inversa(p);
printf("\n");
}
//se for numero insere na pilha
if(isNum(g_char[i])){
insertNum(p, g_char[i] - 48);
//se o char anterior tbm for numero faz calculo para fazer dos 2 um numero
if(isNum(g_char[i-1] )|| isEnter(g_char[i-1]))
faz_calculo(p);
else{
clear_calc(p);
if(!RUN_CODES){
exibeHeader();
printf("\nErro! Voce deve usar necessariamente \'E\' para informar a entrada de um numero\n");
}
}
i++;
continue;
}
//se for um E insere 0 na pilha
if(isEnter(g_char[i])){
insertNum(p, 0);
i++;
continue;
}
//se for '-' faz uma subtração
if(g_char[i] == '-'){
faz_sub(p);
i++;
continue;
}
//se for '+' faz uma adição
if(g_char[i] == '+'){
faz_soma(p);
i++;
continue;
}
//se for '/' faz uma divisão
if(g_char[i] == '/'){
faz_div(p);
i++;
continue;
}
//se for '*' faz uma multiplicação
if(g_char[i] == '*'){
faz_mult(p);
i++;
continue;
}
//se for '^' faz uma potencia
if(g_char[i] == '^'){
faz_pow(p);
i++;
continue;
}
//se for '!' faz um fatorial
if(g_char[i] == '!'){
faz_fatorial(p);
i++;
continue;
}
//se for C limpa a pilha
if(isClear(g_char[i])){
clear_calc(p);
if(!RUN_CODES){
exibeHeader();
printf("\nPilha Vazia\n");
}
i++;
continue;
}
//se for V faz uma consulta na pilha
if(isConsulta(g_char[i]) && strlen(g_char) == 1){
if(!RUN_CODES)
consulta(p);
i++;
}
}
if(!isConsulta(g_char[i-1]))
//consulta que exibe a pilha ao contrario
consulta_inversa(p);
if(!RUN_CODES)
printf("\n");
return 0;
}else{
//se o char indice 0 for V exibe a consulta
if(isConsulta(g_char[0]))
if(!RUN_CODES)
consulta(p);
else{
//se o char indice 0 for C limpa a pilha
if(isClear(g_char[0]))
clear_calc(p);
else
return 1;
}
}
}
void tiraEspaco(char str[]){
char * c = (char *) malloc(strlen(str)*sizeof(char));
int i = 0, j = 0;
char * aux;
aux = c;
while(str[i] != '\0'){
if(str[i] != ' ' && str[i] != '\0' ){
c[j] = str[i];
j++;
}
i++;
}
c[j] = '\0';
strcpy(str, c);
free(aux);
}