INF1005 Programação I Pontifícia Universidade Católica Departamento de Informática 1
INF1005 Exercício da Editora Pontifícia Universidade Católica Departamento de Informática 2
O Problema Uma editora fornece livros para 20 livrarias, cada uma delas identificadas unicamente por um código inteiro de 1 a 20. Semanalmente, algumas livrarias enviam a editora um ou mais pedidos de fornecimento de livros. Cada livro é identificado por um código inteiro. Para cada pedido, a editora registra cinco informações, a saber: o código da livraria solicitante, o código do livro, a quantidade de exemplares, o número de páginas por exemplar e o tipo de encadernação. Cada pedido gera um custo, calculado utilizando uma fórmula de cálculo, que descrevemos no item Fórmula de Preço. O gasto semanal de uma livraria corresponde a soma dos custos de todos os seus pedidos na semana. O objetivo deste problema é construir um programa que determine o gasto semanal de cada livraria que fez algum pedido na semana. Além disso, devem ser geradas algumas informações secundárias de controle de erros nos pedidos, conforme detalhado no item Relatório de Controle. 3
Custo de exemplar custo = custo de encadernação + 0.01 quantidade de páginas 4
Custo de encadernação D 18.00 25.00 30.00 35.00 45.00 B 22.00 30.00 37.00 42.00 48.00 L 11.00 13.90 17.00 19.35 23.00 I 22.50 31.00 38.00 43.20 48.80 E 22.80 32.00 39.50 44.00 50.00 K 7.00 10.00 14.00 16.00 19.00 P 9.00 13.00 16.00 18.40 21.30 5
Editora #include <stdio.h> int main(void) // le custos de encadernacao por tipo e volume // processa pedidos da semana // mostra na tela tipo de encadernacao mais cara // para livros de 300 a 399 paginas // gera arquivo de custos das livrarias return 0; 6
Pedidos 2 1013 10 120 B 3 2200 21 210 L 19 1456 2 65 I 5 4320 30 205 P 9 1013 10 120 E 5 4444 13 503 K 13 5555 5 342 D 20 1456 12 178 B 3 3321 19 296 E 1 1013 13 120 I 7
Pedidos 20 2200 22 60 K 15 9900 9 439 E 5 4320 18 205 K 17 2100 2 341 D 3 1341 15 94 P 20 8706 10 511 E 15 1119 5 346 K 17 2100 2 341 W 9 1456 11 178 E 10 4320 17 205 I 8
Pedidos 5 2200 12 60 P 4 7766 2 245 L 18 3030 8 164 K 3 4781 16 342 B 5 1013 15 120 P 3 3321 19 296 Y 9
Solução manual... 10
Pseudocódigo #include <stdio.h> int main(void) // ate 10 tipos diferentes de livros // valor = encadernacao + 0.1 * paginas // le custos de encadernacao por tipo e volume // processa pedidos da semana // gerando gastos por livraria no arquivo gastos.txt // e informando na tela pedidos com tipo invalido // mostra na tela tipo de encadernacao mais cara // para livros de 300 a 399 paginas return 0; 11
Custos de encadernação char float D 18.00 25.00 30.00 35.00 45.00 B 22.00 30.00 37.00 42.00 48.00 L 11.00 13.90 17.00 19.35 23.00 I 22.50 31.00 38.00 43.20 48.80 E 22.80 32.00 39.50 44.00 50.00 K 7.00 10.00 14.00 16.00 19.00 P 9.00 13.00 16.00 18.40 21.30 12
#include <stdio.h> int main(void) // ate 10 tipos diferentes de livros float precodeencadernacaoportipoquantidade[10][5]; char tipodeencadernacao[10]; float despesadalivraria[20]; // valor = encadernacao + 0.1 * paginas // le custos de encadernacao por tipo e volume // processa pedidos da semana // gerando gastos por livraria no arquivo gastos.txt // e informando na tela pedidos com tipo invalido // mostra na tela tipo de encadernacao mais cara // para livros de 300 a 399 paginas return 0; 13
#include <stdio.h> int le_precos_encadernacao(char *, float tabela[][5]); void processa_pedidos(int,char *, float tabela[][5]); int main(void) float precodeencadernacaoportipoquantidade[10][5]; char tipodeencadernacao[10]; float despesadalivraria[20]; int numerodetipos; // ate 10 tipos diferentes de livros // valor = encadernacao + 0.1 * paginas // le custos de encadernacao por tipo e volume numerodetipos = le_precos_encadernacao(tipodeencadernacao, precodeencadernacaoportipoquantidade); // processa pedidos da semana // gerando gastos por livraria no arquivo gastos.txt // e informando na tela pedidos com tipo invalido processa_pedidos(numerodetipos, tipodeencadernacao, precodeencadernacaoportipoquantidade); // mostra na tela tipo de encadernacao mais cara // para livros de 300 a 399 paginas return 0; 14
Le preços de encadernação int le_precos_encadernacao(char * tipo, float preco[][5]) FILE *ftabela; int i,j; ftabela = fopen("encadernacao.txt","r"); i=0; while(fscanf(ftabela," %c",&tipo[i])!=eof) for(j=0;j<5;j++) fscanf(ftabela,"%f",&preco[i][j]); i++; fclose(ftabela); return i; 15
Mostra preços de encadernação void mostra_encadernacao(int ntipos, char * tipo, float preco[][5]) int i,j; for(i=0;i<ntipos;i++) printf("\n%c",tipo[i]); for(j=0;j<5;j++) printf("\t%.2f",preco[i][j]); printf("\n\n"); 16
Processar pedido void processa_pedidos(int ntipos, char *tipos, float preco[][5], float *despesa) FILE *fpedidos; int livraria, livro, quantidade, paginas, i; char encadernacao; float despesadopedido, custodoexemplar, custodeencadernacao; for (i=0;i<20;i++) despesa[i] = 0.0; fpedidos = fopen("pedidos.txt","r"); i=0; while(fscanf(fpedidos,"%d%d%d%d %c", &livraria, &livro, &quantidade, &paginas,&encadernacao)==5) custodeencadernacao = custo(encadernacao,quantidade, ntipos, tipos, preco); custodoexemplar = custodeencadernacao + 0.01*paginas; despesadopedido = quantidade*custodoexemplar; despesa[livraria-1] += despesadopedido; fclose(fpedidos); 17
Custo do exemplar float custo(char encadernacao, int quantidade, int ntipos, char * tipo, float preco[][5]) return 0.0; 18