/* ************************************************************ */ /* Nome do aluno: Danilo R. Vieira Número USP: 5653262 */ /* Curso: Bach. em Oceanografia Data: 05/10/2007 */ /* MAC-115 Introdução à Computação */ /* Exercício Programa número 2 */ /* ************************************************************ */ #include #include /* Cabeçalhos das funções */ double potencia(double x, int n); double valor_vista(double p, double j, int n); double valor_prestacao(double v, double j, int n); int num_prest(double v, double pmax, double j); int main() { /* Declaração de variáveis */ FILE *arqentra, /* representa o arquivo de entrada */ *arqsai; /* representa o arquivo de saida */ int n, /* numero de meses */ np, /* numero de problemas a serem analizados */ i; /* contador */ double v, /* valor à vista */ p, /* valor da parcela */ pmax, /* valor máximo da parcela */ j; /* taxa de juros na forma fracionária */ char codigo; /* codigo da entrada atual */ /* Tenta abrir o arquivo de entrada no modo de leitura, caso */ /* não seja possível, finaliza o programa */ arqentra = fopen("entrada.txt", "r"); if (arqentra == NULL) { printf("ERRO: nao foi possivel abrir arquivo entrada.txt\n"); system("PAUSE"); return 1; } /* Tenta abrir o arquivo de saida no modo de leitura, caso */ /* não seja possível, finaliza o programa */ arqsai = fopen("saida.txt", "w"); if (arqsai == NULL) { printf("ERRO: nao foi possivel criar arquivo saida.txt\n"); system("PAUSE"); return 1; } /* Imprime o cabeçalho do arquivo */ fprintf(arqsai, "*****************************" "*****************************\n" "* Nome do aluno: Danilo R. Vieira " "Numero USP: 5653262 *\n" "*****************************" "*****************************\n\n"); fscanf(arqentra, "%d ", &np); /* Faz a iteração por todos os problemas contidos */ /* no arquivo de entrada */ for (i = 1; i <= np; i++) { fscanf(arqentra, " %c", &codigo); switch (codigo) { case 'v': fscanf(arqentra, "%lf %lf %d", &p, &j, &n); /* Calcula o valor a vista e imprime */ v = valor_vista(p, j/100, n); fprintf(arqsai, "Valor da prestacao: R$ %d,%.2d\n" "Valor da taxa de juros: %.2f%%\n" "Numero de meses: %d\n" "Valor a vista: R$ %d,%.2d\n\n", (int)p,(int)((p-(int)p)*100), j, n, (int)v,(int)((v-(int)v)*100)); break; case 'p': fscanf(arqentra, "%lf %lf %d", &v, &j, &n); /* Calcula o valor da prestacao e imprime */ p = valor_prestacao(v, j/100, n); fprintf(arqsai, "Valor a vista: R$ %d,%.2d\n" "Valor da taxa de juros: %.2f%%\n" "Numero de meses: %d\n" "Valor da prestacao: R$ %d,%.2d\n\n", (int)v,(int)((v-(int)v)*100), j, n, (int)p,(int)((p-(int)p)*100)); break; case 'n': fscanf(arqentra, "%lf %lf %lf", &v, &pmax, &j); /* Calcula, se possivel, o numero de prestacoes e */ /* o valor exato da prestacao e imprime */ fprintf(arqsai, "Valor a vista: R$ %d,%.2d\n" "Valor maximo da prestacao: R$ %d,%.2d\n" "Valor da taxa de juros: %.2f%%\n", (int)v,(int)((v-(int)v)*100), (int)pmax,(int)((pmax-(int)pmax)*100), j); n = num_prest(v, pmax, j/100); if (n > 0) { /* Se o plano de crediario for possível */ p = valor_prestacao(v, j/100, n); fprintf(arqsai, "Numero de meses: %d " "Valor da prestacao: R$ %d,%.2d\n\n", n, (int)p,(int)((p-(int)p)*100)); } else /* Caso contrario */ fprintf(arqsai, "Nao e' possivel realizar esse " "plano de crediario.\n\n"); break; default: printf("Codigo invalido: %c\n", codigo); } } fclose(arqentra); fclose(arqsai); return 0; } /* função potencia(x,n) */ /* Recebe um número real x e um inteiro n>= 0, e devolve o valor */ /* da n-ésima potência de x. */ double potencia(double x, int n) { int cont; /* contador */ double result; /* resultado da potenciação */ result = 1; for (cont = 1; cont <= n; cont++) result = result * x; return result; } /* função valor_vista(p, j, n) */ /* Recebe o valor da prestação p, o valor dos juros j e o número de */ /* prestações n, e devolve o valor à vista correspondente. */ double valor_vista(double p, double j, int n) { return ( (p/j) * (1 + j - (1/potencia(1 + j, n - 1)) ) ); } /* função valor_prestacao(v, j, n) */ /* Recebe a valor à vista v, o valor dos juros j e o número de */ /* prestações n, e devolve a valor da prestação a ser pago. */ double valor_prestacao(double v, double j, int n) { return ( (v * j) / (1 + j - (1/potencia(1 + j, n - 1) ) ) ); } /* função num_prest(v, pmax, j) */ /* Recebe o valor à vista v, o valor máximo a ser pago em cada */ /* prestação pmax e o valor dos juros cobrados j. */ /* Caso seja possível o pagamento do valor a vista v, a função */ /* devolve o número n de prestações. */ int num_prest(double v, double pmax, double j) { int n; /* número de prestações */ n = 1; while ( (v > valor_vista(pmax, j, n)) && (n <= 97) ) n++; if (n > 96) return 0; return n; }