4
Context:
I’m trying to develop a code that will be able to remove all vowels aeiou
of any sentence and save the position that the vowel was in the sentence, so that it is possible to reconstruct the phrase again using what was saved as a hypothetical example of "compression/decompression".
Problem: The part of removing vowels is ok, but to put them back is presenting problem with certain words.
Simpler words like macaco
remove vowels and replace them normally, but words like papaia
, that have vowels followed, it returns 'pope', which runs away from the necessary.
An example of proper functioning:
Digite uma frase simples para compressão:warning: this program uses gets(), which is unsafe.
macaco
---------- RESULTADO DA COMPRESSÃO ----------
Sua mensagem comprimida é: mcc
Sua mensagem comprimida tem length: 3
Sua mensagem descomprimida é: [m][a][c][a][c][o]
Sua mensagem descomprimida tem length: 7
A compressão poupou: -1
-------------------------------------------
Program ended with exit code: 0
Example of the mentioned problem:
Digite uma frase simples para compressão:warning: this program uses gets(), which is unsafe.
papaia
---------- RESULTADO DA COMPRESSÃO ----------
Sua mensagem comprimida é: pp
Sua mensagem comprimida tem length: 2
Sua mensagem descomprimida é: [p][a][p][a]
Sua mensagem descomprimida tem length: 7
A compressão poupou: -1
-------------------------------------------
Program ended with exit code: 0
Code:
char vogaisEncontrada[100];
int main()
{
char fraseOriginal[100],
fraseCompactada[100],
fraseDescompactada[100];
int fraseOriginalLen,
fraseFinalLen;
printf("Digite uma frase simples para compressão:");
gets(fraseOriginal);
fraseOriginalLen = strlen(fraseOriginal);
printf("---------- RESULTADO DA COMPRESSÃO ----------");
// COMPACTA //
int c,
cV = 0;
for(c = 0; c <= fraseOriginalLen; c++) {
if(fraseOriginal[c] == 'a') {
vogaisEncontrada[c - cV] = 'a';
cV++;
} else if(fraseOriginal[c] == 'e') {
vogaisEncontrada[c - cV] = 'e';
cV++;
} else if(fraseOriginal[c] == 'i') {
vogaisEncontrada[c - cV] = 'i';
cV++;
} else if(fraseOriginal[c] == 'o') {
vogaisEncontrada[c - cV] = 'o';
cV++;
} else if(fraseOriginal[c] == 'u') {
vogaisEncontrada[c - cV] = 'u';
cV++;
} else if(strlen(&fraseOriginal[c]) > 0) {
vogaisEncontrada[c] = ' ';
fraseCompactada[c - cV] = fraseOriginal[c];
}
}
// COMPACTA //
printf("\nSua mensagem comprimida é: %s", fraseCompactada);
fraseFinalLen = strlen(fraseCompactada);
printf("\nSua mensagem comprimida tem length: %d", fraseFinalLen);
printf("\n\nSua mensagem descomprimida é: %s", fraseDescompactada);
// DESCOMPACTA //
int c1;
for(c1 = 0; c1 <= fraseOriginalLen; c1++) {
if((vogaisEncontrada[c1] == ' ') && (strlen(&fraseCompactada[c1]) > 0)) {
printf("%c", fraseCompactada[c1]);
} else if((strlen(&fraseCompactada[c1]) == 0) && (strlen(&vogaisEncontrada[c1]) > 0) && !(vogaisEncontrada[c1] == ' ')) {
printf("%c", vogaisEncontrada[c1]);
} else if((strlen(&fraseCompactada[c1]) > 0) && !(vogaisEncontrada[c1] == ' ')) {
printf("%c", vogaisEncontrada[c1]);
printf("%c", fraseCompactada[c1]);
}
}
// DESCOMPACTA //
fraseFinalLen = c1;
printf("\nSua mensagem descomprimida tem length: %d\n", fraseFinalLen);
printf("\nA compressão poupou: %d\n", (fraseOriginalLen - fraseFinalLen));
printf("-------------------------------------------\n");
return 0;
}
I believe that the easiest way to solve it is to have two vectors, one of vowels and the other containing the index of these vowels in the original word.
– mercador
@merchant at first I tried this way however I could not assemble the phrase again, because I could not unite the two vectors, in C is more complicated in my current conjuncture..
– Vinicius Lara