Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <math.h>
- struct lista {
- int info;
- struct lista *prox;
- };
- typedef struct lista Lista;
- struct pilha {
- Lista *topo;
- };
- typedef struct pilha Pilha;
- struct calculadora {
- char formato[21];
- Pilha *p;
- };
- typedef struct calculadora Calculadora;
- Pilha *cria_pilha(void) { /* criando uma pilha */
- Pilha *novo = (Pilha*) malloc(sizeof(Pilha));
- novo -> topo = NULL;
- return novo;
- }
- void push (Pilha *p, int i) { /* inserimos um valor na lista*/
- Lista *novo = (Lista*) malloc(sizeof(Lista));
- novo -> info = i;
- novo -> prox = p -> topo;
- p -> topo = novo;
- }
- int pilha_vazia(Pilha *p) {
- if (p == NULL) return 1;
- else return 0;
- }
- int pop (Pilha *p) { /*retiramos um valor da lista*/
- int i;
- Lista *temp;
- if (pilha_vazia(p)) {
- printf("pilha vazia\n");
- exit(1);
- }
- temp = p-> topo;
- i = temp-> info;
- p -> topo = temp-> prox;
- free(temp);
- return i;
- }
- void pilha_libera (Pilha *p) {
- Lista *q = p-> topo;
- while (q != NULL) {
- Lista *temp = q-> prox;
- free (q);
- q = temp;
- }
- free (q);
- }
- Calculadora *cria_calculadora(char *formato) { /*criamos a calculadora*/
- Calculadora *novo = (Calculadora*) malloc(sizeof(Calculadora));
- strcpy(novo->formato, formato);
- novo -> p = cria_pilha();
- return novo;
- }
- void operando (Calculadora *c, float v) { /* funcao operando */
- push(c->p, v);
- }
- void operador (Calculadora *c, char op) { /* funcao operador */
- float v1, v2, v;
- if (pilha_vazia (c-> p)) v2 = 0.0;
- else v2 = pop(c->p);
- if (pilha_vazia (c-> p)) v1 = 0.0;
- else v1 = pop(c->p);
- float x,y,z;
- switch (op) {
- case '@': v = v1 + v2; printf ("\n O resultado da soma e:"); break;
- case '-': v = v1 - v2; printf ("\n O resultado da subtracao e:"); break;
- case '*': v = v1 * v2; printf ("\n O resultado da multiplicacao e:");break;
- case '/': v = v1 / v2; printf ("\n O resultado da divisao e:");break;
- case '#': v = sqrt (v1+v2); x = sqrt(v1); y = sqrt (v2); z = v1+v2;printf("\nA raiz quadrada de v1 e %.2f\nA raiz quadrada de v2 e %.2f\nO resultado mostra a raiz quadrada de v1 + v2 = %2.f e", x,y,z); break;
- case '^': v = pow(v1,v2); printf("\nv1 elevado a v2 e: ") ;break;
- case 'L': v = log10(v1+v2); x = log10(v1); y = log10(v2); z = v1 + v2; printf("\nLog 10 de v1 e %.2f\nLog 10 de v2 e %.2f\nO resultado de Log 10 de v1 + v2 = %2.f e", x,y,z); break;
- case 'l': v = log (v1+v2); x = log(v1); y = log(v2); z = v1 + v2; printf("\nLog 2 de v1 e %.2f\nLog 2 de v2 e %.2f\nO resultado de Log 2 de v1 + v2 = %2.f e", x,y,z); break;
- case '%': v = (v2*100)/v1; printf(" \n A porcentagem que v2 representa de v1 e: ", v); break;
- case 's': v = sin (v1+v2); x = sin (v1); y = sin(v2); z = v1+v2; printf("\nO sen de v1 e %.2f.\nO seno de v2 e %.2f\n E o seno de v1 + v2 = %.2f e ",x,y,z); break;
- case 'c': v = cos (v1+v2); x = cos (v1); y = cos(v2); z = v1+v2; printf("\nO cosseno de v1 e %.2f.\nO cosseno de v2 e %.2f\n E o cosseno de v1 + v2 = %.2f e ",x,y,z); break;
- case 't': v = tan (v1+v2); x = tan (v1); y = tan(v2); z = v1+v2; printf("\nA tangente de v1 e %.2f.\nA tangente de v2 e %.2f\n E a tangente de v1 + v2 = %.2f e ",x,y,z); break;
- }
- push(c-> p, v);
- printf(" %.2f\n", v);
- }
- void calc_libera (Calculadora *c) {
- pilha_libera (c-> p);
- free (c);
- }
- int main(void) {
- char c;
- float v;
- Calculadora *calc;
- printf ("Bem vindo a Calculadora, esta faz as seguintes operacoes: \nsoma (@) subtracao (-) multiplicacao (*) divisao (/)\nraiz quadrada(#) Exponenciacao(^) Log10(L) Log2(l)\nseno(s) cosseno(c) tangente(t)\n As operacoes #, L, l, s, c, s, apresentarao os resultados para v1, v2 e v1+v2.\n(O resultado que sera usado pela calculadora para fazer a proxima conta sera o \nresultado de v1+v2).\n Para sair: q > [enter].\nDigite v1: ");
- calc = cria_calculadora("%.2f\n");
- do {
- scanf("%c", &c);
- if (c == '@' || c == '-' || c == '*' || c == '/' || c == '#' || c == '^' || c == 'L' || c == '%' || c == 'l' || c == 's' || c == 'c' || c == 't') {
- printf("voce digitou operador %c\n", c);
- operador(calc, c);
- }
- else ungetc (c, stdin);
- if (scanf("%f", &v) == 1) {
- operando(calc, v);
- printf("voce digitou valor %.2f\n", v);
- }
- } while (c!= 'q');
- printf("libera calculadora\n");
- calc_libera(calc);
- return 0;
- }
Add Comment
Please, Sign In to add comment