You are on page 1of 3

1 /*

2 Trabalho Interdisciplinar 1/2010


3 PUC Minas - Sistemas de Informacao
4 Terceiro Periodo
5
6 Tema: Estudo teórico da compressão de dados e implementacao da codificacao Run Lenght - RLE - C/C++
7
8 Componentes:
9 -Daniel Max da Costa
10 -José Ricardo Jamal Junior
11 -Leonardo Lacerda dos Santos
12 -Luiz Henrique Diniz Sousa
13 -Mauriston Santos
14 */
15
16 #include <conio.h>
17 #include <iostream>
18
19
20 using namespace std;
21
22 void GeraMassaDeDados();
23 void ListaMassaDeDados();
24 void Distribui(long fator);
25 void Intercala(long fator);
26 void Compressao();
27
28 int main()
29 {
30 system ("color 1F");
31 char op;
32 int tamanho,fator,contador;
33 contador = 0;
34 do
35 {
36 system("cls");
37 printf("---Compressao de Dados---\n\n");
38 printf("\n1 - Gerar Massa de Dados");
39 printf("\n2 - Lista Massa de Dados");
40 printf("\n3 - Ordernar Massa de Dados");
41 printf("\n4 - Comprimir Massa de Dados");
42 printf("\n5 - Creditos");
43 printf("\n0 - Sair");
44 printf("\n\nDigite a operacao desejada: ");
45
46 op=getche();
47
48 switch (op)
49 {
50 case '1':
51 {
52 if (contador == 0)
53 {
54 GeraMassaDeDados();
55 contador = 1;
56 }
57 system("PAUSE");
58 break;
59 }
60
61 case '2':
62 {
63 if (contador == 1)
64 {
65 ListaMassaDeDados();
66 contador = 2;
67 }
68 else
69 {
70 printf("\n\nE preciso gerar a massa de dados\n\n");
71 }
72 system("PAUSE");
73 break;
74 }
75
76 case '3':
77 {
78 if (contador == 1 || contador == 2)
79 {
80 fator = 1;
81 while (fator < 100000)
82 {
83 Distribui(fator);
84 Intercala(fator);
85 fator *= 2;
86 }
87 contador = 3;
88 }
89 else
90 {
91 printf("\n\nE preciso gerar a massa de dados\n\n");
92 }
93 system("PAUSE");
94 break;
95 }
96
97 case '4':
98 {
99 if(contador == 3)
100 {
101 Compressao();
102 contador = 0;
103 }
104 else
105 {
106 printf("\n\nE preciso gerar e ordenar a massa de dados\n\n");
107 }
108 system("PAUSE");
109 break;
110 }
111
112 case '5':
113 {
114 system ("cls");
115 printf("PUC Minas - Betim - Sistemas de Informacao\n\n");
116 printf("Trabalho Interdisciplinar\n\n");
117 printf("\nImplementacao da codificacao Run Lenght - RLE - C/C++");
118 printf("\n\nTerceiro Periodo");
119 printf("\n-Daniel Max da Costa");
120 printf("\n-Jose Ricardo Jamal Junior");
121 printf("\n-Leonardo Lacerda dos Santos");
122 printf("\n-Luiz Henrique Diniz Sousa");
123 printf("\n-Mauriston Santos\n\n");
124
125 system("PAUSE");
126 break;
127 }
128
129 }
130 }while(op!='0');
131
132 cout << "\n\n";
133
134 system("PAUSE");
135 return 0;
136 } //Fim Int Main
137
138
139 // Gera Massa de Dados
140 void GeraMassaDeDados()
141 {
142 FILE *arq;
143
144 arq = fopen ("MassaDeDados.dat", "wb");
145 srand (time(NULL));
146
147 int n, i;
148
149 system("cls");
150 printf("----Gerar Massa de Dados----");
151
152 for (i = 0; i < 100000; i++)
153 {
154 n = rand()%10;
155 fwrite (&n, sizeof(int), 1, arq);
156 }
157 fclose(arq);
158
159 printf("\n\nGeracao concluida com sucesso!\n\n");
160 printf("Foram gerados 1000000 numeros!\n\n");
161 }
162
163 void ListaMassaDeDados(){
164 FILE *arq;
165 int n;
166
167 arq = fopen ("MassaDeDados.dat", "rb");
168 while (fread (&n, sizeof(int), 1, arq ) )
169 printf("%d\t", n);
170 fclose(arq);
171
172 //Calcular o Tamanho do Arquivo
173
174 long num_reg;
175 FILE *original;
176 if ((original = fopen( "MassaDeDados.dat", "rb" )) == NULL )
177 printf( "Erro na abertura do arquivo de dados\n" );
178 fseek(original, 0L, SEEK_END);
179 num_reg = ftell (original) / sizeof(int);
180 _fcloseall( );
181
182 printf("\n\nListagem executada com sucesso!\n\n");
183 cout << num_reg;
184 printf(" numeros foram lidos!\n\n");
185 }
186
187 void Distribui(long fator)
188 {
189 int massaDados; long lidos; FILE *original, *a, *b;
190
191 if ((original = fopen( "MassaDeDados.dat", "r+b" )) == NULL )
192 printf( "Erro na abertura do arquivo dado\n" );
193
194 if ( (a = fopen( "a", "wb" )) == NULL )
195 printf( "Erro na abertura do arquivo a \n" );
196
197 if( (b = fopen( "b", "wb" )) == NULL )
198 printf( "Erro na abertura do arquivo b \n" );
199
200 while (! feof(original))
201 {
202 lidos = 0;
203 while ( (lidos++ < fator) && (fread(&massaDados, sizeof(int), 1, original)) )
204 fwrite(&massaDados, sizeof(int), 1, a);
205 lidos = 0;
206 while ( (lidos++ < fator) && (fread(&massaDados, sizeof( int), 1, original)))
207 fwrite(&massaDados, sizeof(int), 1, b);
208 }
209 _fcloseall( );
210 }
211
212 void Intercala(long fator)
213 {
214 FILE *original; FILE *a; FILE *b;
215 int massaDados1, massaDados2;
216 long i, reg_lido_a = fator, reg_lido_b = fator;
217
218 if ((original = fopen( "MassaDeDados.dat", "r+b" )) == NULL )
219 printf( "Erro na abertura do arquivo MassaDeDados\n" );
220 if( (a = fopen( "a", "rb" )) == NULL )
221 printf( "Erro na abertura do arquivo a \n" );
222 if ( (b = fopen( "b", "rb" )) == NULL )
223 printf( "Erro na abertura do arquivo b \n" );
224
225 fread(&massaDados1, sizeof(int), 1, a);
226 fread(&massaDados2, sizeof(int), 1, b);
227
228 while ( !feof(a) && !feof(b) )
229 {
230 while (reg_lido_a && reg_lido_b)
231 {
232 if (massaDados1 < massaDados2)
233 {
234 reg_lido_a--;
235 fwrite(&massaDados1, sizeof(int), 1, original);
236 fread(&massaDados1, sizeof(int), 1, a);
237 if (feof(a))
238 break;
239 }
240 else
241 {
242 reg_lido_b--;
243 fwrite(&massaDados2, sizeof(int), 1, original);
244 fread(&massaDados2, sizeof(int), 1, b);
245 if (feof(b))
246 break;
247 }
248 }
249 for (i = 0; (i < reg_lido_a) && !feof(a); i++)
250 {
251 fwrite(&massaDados1, sizeof(int), 1, original);
252 fread(&massaDados1, sizeof(int), 1, a);
253 }
254 for (i = 0; (i < reg_lido_b) && !feof(b); i++)
255 {
256 fwrite(&massaDados2, sizeof(int), 1, original);
257 fread(&massaDados2, sizeof(int), 1, b);
258 }
259 reg_lido_a = reg_lido_b = fator;
260
261 } //Fim do While
262
263 if ( feof(a) && !feof(b) )
264 do
265 {
266 fwrite(&massaDados2, sizeof(int), 1, original);
267 }while (fread(&massaDados2, sizeof(int), 1, b));
268
269 if ( !feof(a) && feof(b))
270 do
271 {
272 fwrite(&massaDados1, sizeof(int), 1, original);
273 } while (fread(&massaDados1, sizeof(int), 1, a));
274
275 _fcloseall( );
276
277 system("cls");
278 printf("----- Ordencao ------");
279 printf("\n\nOrdencao executada com sucesso!\n\n");
280
281 } // fim Intercala
282
283 void Compressao()
284 {
285 int i=0,j,l,count[100000]={0};
286 FILE *arq;
287
288 int str[100000];
289
290 arq = fopen("MassaDeDados.dat","rb");
291 while (fread(&str[i],sizeof(int),1,arq))
292 i++;
293
294 fclose(arq);
295
296 l = 100000;
297
298 system("cls");
299 printf("-----Compressao dos Dados-----");
300 printf("\n\tNumeracao Inicial: \n\n");
301 system ("pause");
302
303 for (i=0;i<l;i++)
304 cout << str[i]<<"\t";
305
306 system("cls");
307
308 printf("-----Compressao dos Dados-----");
309 printf("\n\nResultado da compressao de 100.000 numeros aleatorios:\n\n");
310
311 //Gera novo Arquivo.dat
312 arq = fopen("MassaDeDadosPress.dat","wb");
313
314 for(i=0;i< l;i*=1)
315 {
316 j = 0;
317 count[i] = 1;
318 do
319 {
320 j++;
321 if(str[i+j] == str[i]){
322 count[i]++;
323 }
324 }while(str[i+j]==str[i]);
325 printf(" $%d ",count[i]);
326 fwrite(&count[i], sizeof(int), 1, arq); //quantidade de vezes que o numero aparece
327 printf(".");
328 cout << str[i];
329 fwrite(&str[i], sizeof(int), 1, arq); //numero repetido.
330 i += count[i];
331 printf("\n");
332 }
333
334 _fcloseall( );
335 }//Fim da Função Compressao
336

You might also like