como ordenar 3 palabras alfabeticamente

Iniciado por fernandoprog1, 9 Junio 2015, 15:44 PM

0 Miembros y 1 Visitante están viendo este tema.

fernandoprog1

/*Este programa escribe dos palabras introducidas por el usuario por orden alfabético.*/


#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int main()
{

char pal1[20], pal2[20];

printf("escriba una palabra: ");
gets(pal1);
printf("\n Escriba otra palabra: ");
gets(pal2);

printf("\n Las palabras ordenadas alfabeticamente son: \n");

if(strcmp (pal1, pal2)<0){
//strcmp compara lexicográficamente dos cadenas.
//si pal1<pal2 devuelve un número negativo.
//si pal1>pal2 devuelve un numero positivo.
//si pal1=pal2 devuelve 0.

printf("%s\n", pal1);
printf("%s\n", pal2); }

else {
printf("%s\n", pal2);
printf("%s\n", pal1); }

printf("\n\n");
system("PAUSE");
return 0;
}


como logro ordenar 3 palabras alfabéticamente nesecito ayuda=)

engel lex

puedes usar cualquier metodo de ordenamiento... te recomiendo ordenamiento por burbuja, seguro en wiki consigues mucha info :P
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

fernandoprog1


user-marcos

Las letras se pueden comparar igual que los números, de hecho son números que corresponden a una tabla ascii.
Por lo tanto puedes comprar letra por letra:
Código (cpp) [Seleccionar]

if(pal1[i] > pal2[i])

engel lex

#4
sería util usar un array para esto, si no, es muy trabajoso


se hace de la siguiente forma, colocaré una sección de codigo sin más, pruebala y si tierre errores corrigela;


int i, j, n;
char palabras[3][20];
char intercambio[20];
/*
aqui el resto del codigo, leer entradas, etc
*/
for(i=0;i<3-1;i++)
  for(j=0;j<3-1-i;j++)
  {
n=strcmp (palabras[j], palabras[j+1]);//se comparan
if(n > 0)
{
strcpy (intercambio,palabras[j]);//coloco el valor en un espacio temporal
strcpy (palabras[j],palabras[j+1]);//copio el otro al valor ya salvado
strcpy (palabras[j+1],intercambio);//coloco el primero en el final
}
  }


el funcionamiento es más o menos esto, si ves el gif hasta el final entiendes el por qué esos 2 ciclos en 3 -1 (largo -1)

de la wiki
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Regexp

#5
Tal como dice engel lex, con cualquier algoritmo de ordenamiento sirve porque las letras están en orden alfabético en la tabla Ascii, en otras palabras 'a' < 'x' y así.

Si quieres verlo con strcmp puedes, dado que n=strcmp( str1, str2 ) devuelve:
n=0, si las cadenas de caracteres son iguales
n>0, si el primer carácter en el que las cadenas son diferentes tiene mayor valor en la tabla ascii en str1
n<0, si el primer carácter en el que las cadenas son diferentes tiene mayor valor en str2

Por ejemplo si str1="abcz"; str2="abcx", el primer caracter en el que difieren es en el 4 (contando desde 1), y como bien sabemos 'z'>'x', entonces strcmp(str1, str2)>0

Un problema interesante es si las cadenas difieren justamente en una mayúscula o minúscula, por ejemplo "ABCD" y "ABCa", te dará un problema, dado que strcmp devolvería negativo, causando que el algoritmo tenga problemas en el ordenamiento.

La solución mas sencilla a esto sería convertir la cadena completa en todo a mayúsculas o todo a minúsculas, recorrer cada letra de cada palabra con la función toupper, o tolower, es decir:

palabras[x][y]=tolower( palabras[x][y] )

De resto te podría recomendar el quick sort, pero a efectos de tres palabras la diferencia en tiempo de ejecución sería mínima, casi imposible de percibir.

También puedes hacer tu función strcmp específica para este problema, no es más que tratar una cadena de caracteres como un numero representado en la base "cantidad de caracteres admitidos en las cadenas", 255 con la tabla Ascii básica o 26 sólo con letras. Cada espacio del arreglo viene siendo la cifra correspondiente, donde str[0] es la cifra de mayor importancia (la primera letra). Viéndolo así, simplemente basta con extrapolar el algoritmo para determinar si un numero es mayor que otro que aprendiste en la escuela a algo un poco más general. Un numero es menor que otro si el primero se encuentra a la izquierda del segundo en la recta numérica.

Espero sea de ayuda.

Saludos
No todo el que deambula está perdido

fernandoprog1

#6

#include <stdio.h>
#include <stdlib.h>

int main()
{


char pal1[20], pal2[20], pal3[20];

printf("ingrese una palabra:");
gets(pal1);
printf("ingrese la segunda palabra:");
gets(pal2);
printf("ingrese la tercera palabra:");
gets(pal3);
("\n Las palabras ordenadas alfabeticamente son: \n");

if(strcmp (pal1, pal2)<0)
{
   printf("%s\n", pal1);
   printf("%s\n", pal2);
}
else
{
   printf("%s\n", pal2);
   printf("%s\n", pal1);
}
if(strcmp (pal1, pal3)<0)
{
   printf("%s\n", pal1);
   printf("%s\n", pal3);
}

else
{
   printf("%s\n", pal3);
   printf("%s\n", pal1);
}

if(strcmp (pal2, pal1)<0)
{
   printf("%s\n", pal2);
   printf("%s\n", pal1);
}

else
{
   printf("%s\n", pal1);
   printf("%s\n", pal2);
}


if(strcmp (pal2, pal3)<0)
{
   printf("%s\n", pal2);
   printf("%s\n", pal3);
}
else
     {
   printf("%s\n", pal3);
   printf("%s\n", pal2);
}

if(strcmp (pal3, pal2)<0)
{
   printf("%s\n", pal3);
   printf("%s\n", pal2);
}
else{
   printf("%s\n", pal2);
   printf("%s\n", pal3);
}

if(strcmp (pal3, pal1)<0)
{
   printf("%s\n", pal3);
   printf("%s\n", pal1);
}
else{
   printf("%s\n", pal1);
   printf("%s\n", pal3);
}

printf("\n\n");

system("PAUSE");

return 0;
}




nesecito hacer las comparaciones alfabéticas de esta manera pero no logro poder hacerla !

Regexp

¿Estás obligado a hacerlo sin arreglos?

Los algoritmos de ordenamiento NO son un problema trivial, han sido estudiados ampliamente y son algo bastante complejos. El algoritmo de burbuja es el más "intuitivo" y sencillo de implementar. Si te fijas, son dos for anidados, cada uno recorre la cantidad de elementos a ordenar, es decir 3x3, conforme el numero de palabras crece digamos a N, la cantidad de iteraciones es N2. Es decir, tendrías que hacer... MUY cuidadosamente 9 condicionales para este caso.

Eso lo convierte en una solución muy tediosa de hacer. No te lo recomiendo. A menos que estés obligado porque así te lo han pedido tus profesores (o así dice el libro/ejercicio), hazlo con arreglos.

Saludos
No todo el que deambula está perdido

engel lex

Sigo apoyando lo que dice Regexp pero corrijo algo burbuja no es n2, es n! Ya que cada ciclo mayor resuelve uno :p

Silo quieres hacer a fuerza bruta, son 6 casos

En pseudo código....

Si(p1>p2 y p2>p3){
  imprimir p1, p2, p3
}
Si(p1>p3 y p3>p2){
  Imprimir p1, p3, p2
}


Etc
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

fernandoprog1

si el profesor me dijo que tengo que hacer varios if.