//---------------------------------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_SIZE_FRASE 1024
//---------------------------------------------------------------------------
enum ordenacion{ascendente,descendente};
typedef struct _PALABRA{
char *palabra;
int nVocales;
}PALABRA;
//---------------------------------------------------------------------------
int GetFrase(char *frase)
{
int len;
printf("Introduce una frase: ");
fgets(frase,MAX_SIZE_FRASE,stdin);
len=strlen(frase);
frase[len-1]='\0';
return len;
}
//---------------------------------------------------------------------------
int ContarVocales(char *word)
{
int i,nVocales=0,len;
len=strlen(word);
for(i=0;i<len;i++){
switch(toupper(word[i])){
case 'A': case 'E': case 'I': case 'O': case 'U':
nVocales++;
break;
}
}
return nVocales;
}
//---------------------------------------------------------------------------
void Intercambiar(PALABRA *a,PALABRA *b)
{
PALABRA aux;
memcpy(&aux,a,sizeof(PALABRA));
memcpy(a,b,sizeof(PALABRA));
memcpy(b,&aux,sizeof(PALABRA));
}
//---------------------------------------------------------------------------
void OrdenarPalabras(PALABRA *p,int nPalabras,int orden)
{
int i,j;
PALABRA aux;
for(i=0;i<nPalabras-1;i++){
for(j=i+1;j<nPalabras;j++){
switch(orden){
case ascendente:
if(p[i].nVocales > p[j].nVocales){
Intercambiar(&p[i],&p[j]);
}
break;
case descendente:
if(p[i].nVocales < p[j].nVocales){
Intercambiar(&p[i],&p[j]);
}
break;
}
}
}
}
//---------------------------------------------------------------------------
int ObtenerPalabras(PALABRA **palabras, char *frase, char *token)
{
int nPalabras=0;
char *pAux;
PALABRA *p;
pAux=strtok(frase,token);
p=(PALABRA*)malloc(sizeof(PALABRA));
p[0].palabra=pAux;
p[0].nVocales=ContarVocales(pAux);
nPalabras++;
while(pAux != NULL){
pAux=strtok(NULL,token);
if(pAux != NULL){
nPalabras++;
p=(PALABRA*)realloc(p,sizeof(PALABRA)*nPalabras);
p[nPalabras-1].palabra=pAux;
p[nPalabras-1].nVocales=ContarVocales(pAux);
}
}
*palabras=p;
return nPalabras;
}
//---------------------------------------------------------------------------
void LiberarPalabras(PALABRA *words)
{
if(words != NULL)
free(words);
}
//---------------------------------------------------------------------------
void MostrarPalabras(PALABRA *p,int nPalabras)
{
int i;
for(i=0;i<nPalabras;i++){
printf("%s\n",p[i].palabra);
}
}
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
char frase[MAX_SIZE_FRASE];
PALABRA *p;
unsigned int nPalabras;
//Obtengo la frase
GetFrase(frase);
//Divido la frase en sus palabras y obtengo el numero de vocales en cada una
nPalabras=ObtenerPalabras(&p,frase," ,.-");
//Ordeno por el numero de vocales
OrdenarPalabras(p,nPalabras,descendente);
//Muestro loas palabras ordenadas
MostrarPalabras(p,nPalabras);
//Libero la memoria de las palabras
LiberarPalabras(p);
getchar();
return 0;
}
//---------------------------------------------------------------------------