viernes, 7 de noviembre de 2008

Problema 4.3

.
Enunciado
Una disquería quiere sacar estadísticas de las ventas de discos. Para ello requiere un programa que procese sus planillas de ventas mensuales, las cuales tienen la siguiente información.



Esta planilla está ordenada por código de disco y luego por día. Los días que no se registraron ventas de determinado disco no aparecen en la planilla. En el ejemplo vemos que el disco 1 solo se vendió los días 1, 2 y 6.

Se pide:

1 - Desarrollar un programa que procese la información de las planillas correspondientes a los meses 3, 5 y 8, e imprima (para cada uno de estos meses) el siguiente listado:



2 - Al finalizar el proceso (la emisión de los listados) el programa debe informar el total de productos vendidos (en general) durante los tres meses (la sumatoria de CDs+DVDs+CAS de todos los discos de todos los meses procesados).


A continuación veremos el código del programa C que resuelve el problema planteado.

discos.c
(este código no esta probado)
   1:
2:#include<stdio.h>
3:
4:void imprimirTitulos(int mes)
5:{
6: printf("Mes: %d\n", mes);
7: printf("Cod. Disco, ");
8: printf("Tot. Inidades, ");
9: printf("CD, ");
10: printf("DVD, ");
11: printf("CAS, ");
12:}
13:
14:void procesarSecuencia(int dia, int u
15: , long *secMax,long *secDiaDesde
16: , long *secDiaAnt,long *secCont)
17:{
18: if (u > *secMax)
19: {
20: if ((*secDiaAnt) + 1 == dia)
21: {
22: *secDiaDesde = dia;
23: *secMax = u;
24: (*secCont)++;
25: }
26: else
27: {
28: *secMax = u;
29: *secCont = 1;
30: *secDiaAnt = dia;
31: *secDiaDesde = dia;
32: }
33: }
34: else
35: {
36: *secMax = u;
37: *secCont = 1;
38: *secDiaAnt = dia;
39: *secDiaDesde = dia;
40: }
41:}
42:
43:void procesarMaxAscenso(long secCont,long secDiaDesde
44: ,long *maxCont
45: ,long*maxDiaDesde)
46:{
47: if( secCont > *maxCont )
48: {
49: *maxCont = secCont;
50: *maxDiaDesde = secDiaDesde;
51: }
52:}
53:
54:long procesarPlanilla(int mes)
55:{
56: long cod,dia,cd,dvd,cas;
57: int codAnt;
58: long secDiaDesde, secDiaAnt;
59: long secCont,secMax;
60: long maxSecCont, maxSecDiaDesde;
61: long totC, totD, totS;
62: long maxDias, maxDiscos, maxDiaDesde, totPlanilla;
63: long u, totU;
64:
65: // imprimo los titulos
66: imprimirTitulos(mes);
67:
68: // -- inicializar --
69: maxDias = 0;
70: totPlanilla = 0;
71: // -- /inicializar --
72:
73: // leo la primer fila
74: scanf("%ld %ld %ld %ld %ld"
75: , &cod, &dia, &cd, &dvd, &cas);
76:
77: while( cod != -1 )
78: {
79: // -- cabDisco --
80: codAnt = cod;
81: totC=0;
82: totD=0;
83: totS=0;
84: secDiaAnt = -10;
85: secMax = 0;
86: maxSecCont = 0;
87: maxSecDiaDesde = -10;
88: // -- /cabDisco --
89:
90: while( cod == codAnt )
91: {
92: // -- proceso --
93: totC+=cd;
94: totD+=dvd;
95: totS+=cas;
96: u=cd+dvd+cas;
97:
98: procesarSecuencia(dia,u,&secMax
99: ,&secDiaDesde
100: ,&secDiaAnt
101: ,&secCont);
102: procesarMaxAscenso(secCont
103: ,secDiaDesde
104: ,&maxSecCont
105: ,&maxSecDiaDesde);
106: // -- /proceso --
107:
108: // leo la proxima fila
109: scanf("%d %d %d %d %d"
110: , &cod, &dia, &cd, &dvd, &cas);
111: }
112:
113: // -- finDisco --
114: totU = totC+totD+totS;
115: totPlanilla+=totU;
116:
117: // imprimo fila del listado
118: printf("%f " ,totC*100/totU);
119: printf("%f " ,totD*100/totU);
120: printf("%f\n",totS*100/totU);
121:
122: if( maxSecCont > maxDias )
123: {
124: maxDias=maxSecCont;
125: maxDiscos=codAnt;
126: maxDiaDesde = maxSecDiaDesde;
127: }
128:
129: // -- /finDisco --
130: }
131:
132: // -- resultados --
133: printf("Disco MDAC: %ld\n",maxDiscos);
134: printf("Dia Desde: %ld\n",maxDiaDesde);
135: printf("Dia Hasta: %ld\n",maxDiaDesde+maxDias-1);
136: // -- /resultados --
137:
138: return totPlanilla;
139:}
140:
141:void main()
142:{
143: long tot;
144: tot+=procesarPlanilla(2);
145: tot+=procesarPlanilla(5);
146: tot+=procesarPlanilla(8);
147: printf("Total de Unidades Vendidas: %ld\n",tot);
148:}
149:



.

No hay comentarios: