#include <stdio.h> #include <stdlib.h> #include <string.h> #include "listas.h" #include "leituras.h" #define NOME_MAX 40 typedef struct { char nome[NOME_MAX+1]; double val; } Var; void erro(const char *mnsg) { puts(mnsg); exit(EXIT_FAILURE); } Var *procura(Lista *vars, const char *nome) { Var *var; for(var = Linicio(vars); var != 0; var = Lavanca(vars)) if(strcmp(var->nome, nome) == 0) return var; return 0; } void listar(Lista *vars, double ultimo) { Var *var; printf("Variaveis:\n"); for(var = Linicio(vars); var != 0; var = Lavanca(vars)) printf("%s = %g\n", var->nome, var->val); printf("ultimo = %g\n", ultimo); } static void atribuicao(Lista *vars) { Var *var; char nome[NOME_MAX]; LEcadeia("Nome: ", nome, NOME_MAX); if((var = procura(vars, nome)) != 0) var->val = LEdouble("Valor: "); else { if((var = malloc(sizeof(*var))) == 0) erro("Nao ha' memo'ria!"); strcpy(var->nome, nome); var->val = LEdouble("Valor: "); if(LinsereInicio(vars, var) == 0) erro("Erro inserindo!"); } } static void adicao(Lista *vars, double *ultimo) { Var *var1, *var2; char nome1[NOME_MAX], nome2[NOME_MAX]; LEcadeia("Primeira: ", nome1, NOME_MAX); if((var1 = procura(vars, nome1)) == 0) { fprintf(stderr, "\"%s\" nao existe!\n", nome1); return; } LEcadeia("Segunda: ", nome2, NOME_MAX); if((var2 = procura(vars, nome2)) == 0) { fprintf(stderr, "\"%s\" nao existe!\n", nome2); return; } printf("%s + %s = %g + %g = %g\n", nome1, nome2, var1->val, var2->val, *ultimo = var1->val + var2->val); } static void subtraccao(Lista *vars, double *ultimo) { Var *var1, *var2; char nome1[NOME_MAX], nome2[NOME_MAX]; LEcadeia("Primeira: ", nome1, NOME_MAX); if((var1 = procura(vars, nome1)) == 0) { fprintf(stderr, "\"%s\" nao existe!\n", nome1); return; } LEcadeia("Segunda: ", nome2, NOME_MAX); if((var2 = procura(vars, nome2)) == 0) { fprintf(stderr, "\"%s\" nao existe!\n", nome2); return; } printf("%s - %s = %g - %g = %g\n", nome1, nome2, var1->val, var2->val, *ultimo = var1->val - var2->val); } static void multiplicacao(Lista *vars, double *ultimo) { Var *var1, *var2; char nome1[NOME_MAX], nome2[NOME_MAX]; LEcadeia("Primeira: ", nome1, NOME_MAX); if((var1 = procura(vars, nome1)) == 0) { fprintf(stderr, "\"%s\" nao existe!\n", nome1); return; } LEcadeia("Segunda: ", nome2, NOME_MAX); if((var2 = procura(vars, nome2)) == 0) { fprintf(stderr, "\"%s\" nao existe!\n", nome2); return; } printf("%s x %s = %g x %g = %g\n", nome1, nome2, var1->val, var2->val, *ultimo = var1->val * var2->val); } static void divisao(Lista *vars, double *ultimo) { Var *var1, *var2; char nome1[NOME_MAX], nome2[NOME_MAX]; LEcadeia("Primeira: ", nome1, NOME_MAX); if((var1 = procura(vars, nome1)) == 0) { fprintf(stderr, "\"%s\" nao existe!\n", nome1); return; } LEcadeia("Segunda: ", nome2, NOME_MAX); if((var2 = procura(vars, nome2)) == 0) { fprintf(stderr, "\"%s\" nao existe!\n", nome2); return; } if(var2->val == 0) { fprintf(stderr, "Divisao por zero!\n"); return; } printf("%s / %s = %g / %g = %g\n", nome1, nome2, var1->val, var2->val, *ultimo = var1->val / var2->val); } static void guardar(Lista *vars, double val) { Var *var; char nome[NOME_MAX]; LEcadeia("Nome: ", nome, NOME_MAX); if((var = procura(vars, nome)) != 0) var->val = val; else { if((var = malloc(sizeof(*var))) == 0) erro("Nao ha' memo'ria!"); strcpy(var->nome, nome); var->val = val; if(LinsereInicio(vars, var) == 0) erro("Erro inserindo!"); } } int main(void) { Lista *vars; int opcao; double ultimo = 0.0; if((vars = Lcria()) == 0) erro("Nao ha' memo'ria!"); do { /* Perguntar opcao ao utilizador: */ printf("\n" "1 - Atribuir valor\n" "2 - Soma\n" "3 - Subtraccao\n" "4 - Multiplicacao\n" "5 - Divisao\n" "6 - Guarda ultimo\n" "7 - Mostrar variaveis\n" "0 - Sair\n\n"); switch(opcao = LEvalor("Opcao: [%d a %d] ", 0, 7)) { case 1: atribuicao(vars); break; case 2: adicao(vars, &ultimo); break; case 3: subtraccao(vars, &ultimo); break; case 4: multiplicacao(vars, &ultimo); break; case 5: divisao(vars, &ultimo); break; case 6: guardar(vars, ultimo); break; case 7: listar(vars, ultimo); break; case 0: break; default: /* Aqui nunca se pode chegar! */ break; } } while(opcao != 0); Ldestroi(vars); return EXIT_SUCCESS; }