-
Notifications
You must be signed in to change notification settings - Fork 0
/
Compactador_descompactador.txt
401 lines (321 loc) · 9.58 KB
/
Compactador_descompactador.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
Compactador e Descompactador de arquivos
==Compactador==
O compactador de arquivos se baseia na simples ideia de ler o arquivo de entrada e susbstituir os dados que mais repetem por um símbolo ou conjunto de símbolos, visando reduzir essas repetições
'''1º Passo:'''
Nesse passo iremos levar em consideração a entrada do nosso compactador. A entrada será um arquivo texto(.txt), onde, dessa forma será necessário conhecimento prévio sobre operações sobre [[Arquvios| arquivos]].
Primeiramente iremos criar uma função "lê arquivo", que é responsável por fazer a leitura do arquivo, colocando seu conteúdo eum um string. Essa função possui os seguinte protótipo:
void learquivo(char *vet,char arqorigem[20])
onde, vet é a string que irá receber o texto, e arqorigem é o caminho do arquvio de origem.
'''2º Passo:'''
A função de compressão é onde reside a "magia" do compactador. Como é feita a compressão?
A ideia de comprimir consiste basicamente em analisar no arquvio os subconjuntos de elementes que se repetem com alguma recorrencia e que possuem tamanho relevante. Ao termino da analise nós substituimos esses subconjuntos por simbolos de menor tamanho que representam cada subconjunto.
Para realizar esse processor iremos criar a função comprime que possui o seguinte protótipo:
void comprime(char *vet, int tam)
onde, vet é a string a ser comprimida, e tam é o número de caracteres de vet.
Para facilitar a constução de seu compactador iremos fornecer a função comprime.
''OBS: A função comprime pode ser feita de outra forma, utilizando outras substituições''
void comprime(char *vet, int tam)
{
int i;
for(i=0;i<tam;i++)
{
if(vet[i]==vet[i+1]&&vet[i]==vet[i+2])
{
int j,q,t;
j=i+2;
q=2;
t=0;
vet[i+1]='¬';
while(vet[i]==vet[j]&&t!=10)
{
vet[j]='¬';
j++;
if(q<10)
{
q++;
}
if(q>=10&&t<10)
{
t++;
}
}
if(q<10)
{
if(q==3)
{
vet[i+1]='©';
vet[i+2]=q+48;
}
if(q==4)
{
vet[i+1]='©';
vet[i+2]=q+48;
}
if(q==5)
{
vet[i+1]='©';
vet[i+2]=q+48;
}
if(q==6)
{
vet[i+1]='©';
vet[i+2]=q+48;
}
if(q==7)
{
vet[i+1]='©';
vet[i+2]=q+48;
}
if(q==8)
{
vet[i+1]='©';
vet[i+2]=q+48;
}
if(q==9)
{
vet[i+1]='©';
vet[i+2]=q+48;
}
}
else if(q>=10&&q<100)
{
vet[i+1]='æ';
vet[i+2]=t+47;
}
i+=t+q-1;
}
else if(vet[i]=='a'&&vet[i+1]=='s')//as
{
vet[i]='¦';
vet[i+1]='¬';
}
else if(vet[i]=='e'&&vet[i+1]=='s')//es
{
vet[i]='¨';
vet[i+1]='¬';
}
else if(vet[i]=='o'&&vet[i+1]=='s')//os
{
vet[i]='®';
vet[i+1]='¬';
}
else if(vet[i]=='u'&&vet[i+1]=='s')//us
{
vet[i]='«';
vet[i+1]='¬';
}
else if(vet[i]=='ã'&&vet[i+1]=='o')//ão
{
vet[i]='Ä';
vet[i+1]='¬';
}
else if(vet[i]=='e'&&vet[i+1]=='m')//em
{
vet[i]='~';
vet[i+1]='¬';
}
else if(vet[i]=='n'&&vet[i+1]=='o')//no
{
vet[i]='^';
vet[i+1]='¬';
}
else if(vet[i]=='n'&&vet[i+1]=='a')//na
{
vet[i]='¿';
vet[i+1]='¬';
}
else if(vet[i]=='a'&&vet[i+1]=='m')//am
{
vet[i]='´';
vet[i+1]='¬';
}
else if(vet[i]=='p'&&vet[i+1]=='a')//pa
{
vet[i]='_';
vet[i+1]='¬';
}
else if(vet[i]=='r'&&vet[i+1]=='a')//ra
{
vet[i]='ª';
vet[i+1]='¬';
}
else if(vet[i]=='d'&&vet[i+1]=='a')//da
{
vet[i]='ƒ';
vet[i+1]='¬';
}
else if(vet[i]=='d'&&vet[i+1]=='e')//de
{
vet[i]='`';
vet[i+1]='¬';
}
else if(vet[i]=='d'&&vet[i+1]=='o')//do
{
vet[i]='§';
vet[i+1]='¬';
}
else if(vet[i]=='q'&&vet[i+1]=='u'&&vet[i+2]=='e')//que
{
vet[i]='1';
vet[i+1]='a';
vet[i+2]='¬';
}
else if(vet[i]=='m'&&vet[i+1]=='e'&&vet[i+2]=='n')//men
{
vet[i]='1';
vet[i+1]='b';
vet[i+2]='¬';
}
else if(vet[i]=='c'&&vet[i+1]=='o'&&vet[i+2]=='m')//com
{
vet[i]='1';
vet[i+1]='c';
vet[i+2]='¬';
}
else if(vet[i]=='i'&&vet[i+1]=='n'&&vet[i+2]=='f')//inf
{
vet[i]='1';
vet[i+1]='d';
vet[i+2]='¬';
}
else if(vet[i]=='p'&&vet[i+1]=='o'&&vet[i+2]=='r')//por
{
vet[i]='1';
vet[i+1]='e';
vet[i+2]='¬';
}
else if(vet[i]=='c'&&vet[i+1]=='a'&&vet[i+2]=='n')//can
{
vet[i]='1';
vet[i+1]='f';
vet[i+2]='¬';
}
else if(vet[i]==' '&&vet[i+1]=='o'&&vet[i+2]=='u')// o
{
vet[i]='1';
vet[i+1]='g';
vet[i+2]='¬';
}
else if(vet[i]=='u'&&vet[i+1]=='m'&&vet[i+2]=='a')//uma
{
vet[i]='1';
vet[i+1]='h';
vet[i+2]='¬';
}
else if(vet[i]==' '&&vet[i+1]=='e'&&vet[i+2]==' ')// e
{
vet[i]='&';
vet[i+1]='¿';
vet[i+2]='¬';
}
else if(vet[i]==' '&&vet[i+1]=='a'&&vet[i+2]==' ')// a
{
vet[i]='&';
vet[i+1]='-';
vet[i+2]='¬';
}
}
}
'''3º Passo: '''
Após comprimir o arquivo devemos armazena-lo. Para isso criaremos a função armazena que grava os dados comprimidos em um arquivo.
Essa função possui o seguinte prtótipo:
void armazena(char *vet, int tam,char arqdestino[20])
onde, vet é há string após o processo de compressão , tam é o tamnho (número de caracteres) e arqdestino é o nome do arquivo de destino.
==Descompactador==
O processo de descompactar em exemplo ao processo de compactar também leva em consideração os simbolos mais repedidos. Entretanto agora ele substitui os elementos do processo de compactação pelos elementos originais dos dados.
'''1º Passo:'''
Primeiramente devemos calcular o tamanho (quantidade de caracteres) da string descompactada, pois será necessário criar uma variavel que contenha o texto que será manipulado no processo de descompactação. Para isso criaremos a função calculavet que tem como retorna o tamnho da string a ser criada. Essa função possui o seguinte protótipo:
int calculavetB(char *vet,int tam)
onde, vet é a string compactada e tam é o tamanho da string descompactada.
'' OBS para calcular o tamnho você deve levar em consideração os simbolos substituídos no texto. Entãp por exemplo ocalculo será realizando da seguinte forma:''
...
int i,tamanhob=0;
for(i=0;i<tam;i++)
{
if(vet[i+1]=='©')
{
tamanhob+=vet[i+2]-48;
}
else if(vet[i+1]=='æ')
{
tamanhob+=10;
tamanhob+=vet[i+2]-48;
}
else if(vet[i]=='¦')
{
tamanhob+=2;
}
else if(vet[i]=='¨')
{
tamanhob+=2;
}
else if(vet[i]=='®')
{
tamanhob+=2;
}
...(e assim por diante)
'''2º Passo:'''
Agora realizaremos processo de descompactação. Para isso devemos primeiramente ler arquivo com a função de leitura(lerarquivo criada anteriormente), e posteriormente criar a função converte(também poderia ser chamada de descompacta) que realiza o processo de converção do texto compactado para o texto "normal".
O protótipo da função segue o seguinte modelo:
void converte(char *vet, char *vetdesc, int tam)
onde, vet é a string que contém o texto compactado, vetdesc é a string que irá receber o texto descompactado, e tam é o número de caracteres de vetdesc( calculado pela função calculavetB).
O funcionamento dessa função se assemelha a função comprime entretanto ela faz o caminho inverso. Ex:
...
for(i=0;i<tam;i++)
{
cont=0;
if(vet[i+1]=='©')
{
cont=vet[i+2]-48;
cont+=-1;
vet[i+1]='¬';
vet[i+2]='¬';
while(cont>0)
{
vetdesc[j]=vet[i];
j++;
cont--;
}
}
else if(vet[i+1]=='æ')
{
cont=vet[i+2]-48;
vet[i+1]='¬';
vet[i+2]='¬';
cont+=9;
while(cont>0)
{
vetdesc[j]=vet[i];
j++;
cont--;
}
}
if(vet[i]=='¦')
{
vetdesc[j]='a';
vetdesc[j+1]='s';
j+=2;
}
...
'''3º Passo:'''
Agora devemos arazenar o arquivo descompactado em um novo arquivo utilizando a função armazena criada anteriormente.
==Interface==
A interface pode ser composta como o seguinte exemplo:
printf("\t\tÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»");
printf("\t\tº \tBem vindo ao Gerds Compressor º");
printf("\t\tº \tEscolha uma das Opções: º");
printf("\t\tº \t1 - Compactar Arquivo º");
printf("\t\tº \t2 - Descompactar Arquivo º");
printf("\t\tº \t3 - Ver Arquivo º");
printf("\t\tº \t4 - Sair º");
printf("\t\tÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ");
Para a primeira opção temos o seguinte submenu:
printf("Digite o nome do arquivo a ser compactado: \n(O arquivo deve estar na mesma pasta que o descompactador)");
printf("Digite o nome do arquivo a ser gerado");
Para a segunda opção temos o seguinte submenu:
printf("Digite o nome do arqorigem a ser descompactado");
printf("Digite o nome do arqorigem a ser gerado");
Para a segunda opção temos o seguinte submenu:
printf ("Digite O para origem e D para destino");
Para essa opção deve ser criada uma função que mostra o conteúdo dos arquivos que foram utilizados na compactação e descompactação.
mostraarquivo(op,arqorigem,arqdestino);