Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: fernandoprog1 en 9 Junio 2015, 15:44 pm



Título: como ordenar 3 palabras alfabeticamente
Publicado por: fernandoprog1 en 9 Junio 2015, 15:44 pm
/*Este programa escribe dos palabras introducidas por el usuario por orden alfabético.*/

 
Código
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4.  
  5. int main()
  6. {
  7.  
  8. char pal1[20], pal2[20];
  9.  
  10. printf(“escriba una palabra:);
  11. gets(pal1);
  12. printf(“\n Escriba otra palabra:);
  13. gets(pal2);
  14.  
  15. printf(“\n Las palabras ordenadas alfabeticamente son: \n”);
  16.  
  17. if(strcmp (pal1, pal2)<0){
  18. //strcmp compara lexicográficamente dos cadenas.
  19. //si pal1<pal2 devuelve un número negativo.
  20. //si pal1>pal2 devuelve un numero positivo.
  21. //si pal1=pal2 devuelve 0.
  22.  
  23. printf(%s\n”, pal1);
  24. printf(%s\n”, pal2); }
  25.  
  26. else {
  27. printf(%s\n”, pal2);
  28. printf(%s\n”, pal1); }
  29.  
  30. printf(“\n\n”);
  31. system(“PAUSE”);
  32. return 0;
  33. }
  34.  

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


Título: Re: como ordenar 3 palabras alfabeticamente
Publicado por: engel lex en 9 Junio 2015, 15:46 pm
puedes usar cualquier metodo de ordenamiento... te recomiendo ordenamiento por burbuja, seguro en wiki consigues mucha info :P


Título: Re: como ordenar 3 palabras alfabeticamente
Publicado por: fernandoprog1 en 9 Junio 2015, 16:00 pm
que tipo de método puedo aplicar ??


Título: Re: como ordenar 3 palabras alfabeticamente
Publicado por: user-marcos en 9 Junio 2015, 16:22 pm
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
  1. if(pal1[i] > pal2[i])
  2.  


Título: Re: como ordenar 3 palabras alfabeticamente
Publicado por: engel lex en 9 Junio 2015, 17:48 pm
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;

Código
  1.  
  2. int i, j, n;
  3. char palabras[3][20];
  4. char intercambio[20];
  5. /*
  6. aqui el resto del codigo, leer entradas, etc
  7. */
  8. for(i=0;i<3-1;i++)
  9.   for(j=0;j<3-1-i;j++)
  10.   {
  11. n=strcmp (palabras[j], palabras[j+1]);//se comparan
  12. if(n > 0)
  13. {
  14. strcpy (intercambio,palabras[j]);//coloco el valor en un espacio temporal
  15. strcpy (palabras[j],palabras[j+1]);//copio el otro al valor ya salvado
  16. strcpy (palabras[j+1],intercambio);//coloco el primero en el final
  17. }
  18.   }

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
(http://upload.wikimedia.org/wikipedia/commons/0/06/Bubble-sort.gif)


Título: Re: como ordenar 3 palabras alfabeticamente
Publicado por: Regexp en 10 Junio 2015, 01:18 am
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:

Código
  1. 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


Título: Re: como ordenar 3 palabras alfabeticamente
Publicado por: fernandoprog1 en 10 Junio 2015, 01:36 am
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6.  
  7.  
  8. char pal1[20], pal2[20], pal3[20];
  9.  
  10. printf("ingrese una palabra:");
  11. gets(pal1);
  12. printf("ingrese la segunda palabra:");
  13. gets(pal2);
  14. printf("ingrese la tercera palabra:");
  15. gets(pal3);
  16. ("\n Las palabras ordenadas alfabeticamente son: \n");
  17.  
  18. if(strcmp (pal1, pal2)<0)
  19. {
  20.    printf("%s\n", pal1);
  21.    printf("%s\n", pal2);
  22. }
  23. else
  24. {
  25.    printf("%s\n", pal2);
  26.    printf("%s\n", pal1);
  27. }
  28. if(strcmp (pal1, pal3)<0)
  29. {
  30.    printf("%s\n", pal1);
  31.    printf("%s\n", pal3);
  32. }
  33.  
  34. else
  35. {
  36.    printf("%s\n", pal3);
  37.    printf("%s\n", pal1);
  38. }
  39.  
  40. if(strcmp (pal2, pal1)<0)
  41. {
  42.    printf("%s\n", pal2);
  43.    printf("%s\n", pal1);
  44. }
  45.  
  46. else
  47. {
  48.    printf("%s\n", pal1);
  49.    printf("%s\n", pal2);
  50. }
  51.  
  52.  
  53. if(strcmp (pal2, pal3)<0)
  54. {
  55.    printf("%s\n", pal2);
  56.    printf("%s\n", pal3);
  57. }
  58. else
  59.      {
  60.    printf("%s\n", pal3);
  61.    printf("%s\n", pal2);
  62. }
  63.  
  64. if(strcmp (pal3, pal2)<0)
  65. {
  66.    printf("%s\n", pal3);
  67.    printf("%s\n", pal2);
  68. }
  69. else{
  70.    printf("%s\n", pal2);
  71.    printf("%s\n", pal3);
  72. }
  73.  
  74. if(strcmp (pal3, pal1)<0)
  75. {
  76.    printf("%s\n", pal3);
  77.    printf("%s\n", pal1);
  78. }
  79. else{
  80.    printf("%s\n", pal1);
  81.    printf("%s\n", pal3);
  82. }
  83.  
  84. printf("\n\n");
  85.  
  86. system("PAUSE");
  87.  
  88. return 0;
  89. }
  90.  



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


Título: Re: como ordenar 3 palabras alfabeticamente
Publicado por: Regexp en 10 Junio 2015, 02:11 am
¿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


Título: Re: como ordenar 3 palabras alfabeticamente
Publicado por: engel lex en 10 Junio 2015, 02:22 am
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....

Código:
Si(p1>p2 y p2>p3){
  imprimir p1, p2, p3
}
Si(p1>p3 y p3>p2){
  Imprimir p1, p3, p2
}

Etc


Título: Re: como ordenar 3 palabras alfabeticamente
Publicado por: fernandoprog1 en 10 Junio 2015, 02:42 am
si el profesor me dijo que tengo que hacer varios if.


Título: Re: como ordenar 3 palabras alfabeticamente
Publicado por: Regexp en 10 Junio 2015, 03:02 am
Sigo apoyando lo que dice Regexp pero corrijo algo burbuja no es n2, es n! Ya que cada ciclo mayor resuelve uno :p
[...]

Sino mal recuerdo es O(N2), o al menos, en el peor de todos los casos. El caso "medio" es un poco menor, pero para valores muy grandes de N, en una ecuación de segundo grado A*N2+B*N+C puede aproximarse simplemente a N2. Como dirían por ahí, hay infinitos más grandes que otros. http://www.c.conclase.net/orden/?cap=burbuja (http://www.c.conclase.net/orden/?cap=burbuja)

De ser N! sería totalmente imposible de usar :rolleyes:, dado que N! es aún mayor que la exponencial desde un cierto N.

N! >= 2N, para toda N>=4, prueba por inducción

Cuando lo que se busca es que los algoritmos tiendan a tener complejidad logarítmica, dado que

log(N)<=N<=eN, para toda N>=1, prueba por crecimiento y decrecimiento de las funciones.

El caso N2 es especial, para valores pequeños de N, no es problemático... en cuanto crece.. el algoritmo no escala.

En cuanto a hacerlo por condicionales... la mejor manera sería como ha dicho nuestro compañero engel lex, por fuerza bruta, en tal caso para N elementos pueden existir N-1 posibles cadenas que vienen después (o antes, dependiendo de la implementación), y así, al ser sólo 3 cadenas de caracteres, tendrías 3*2*1=3!=6 posibles secuencias de cadenas ordenadas.

Saludos


Título: Re: como ordenar 3 palabras alfabeticamente
Publicado por: engel lex en 10 Junio 2015, 03:39 am
Sorry, tienes razón, confundí conceptos ;)


Título: Re: como ordenar 3 palabras alfabeticamente
Publicado por: engel lex en 11 Junio 2015, 02:15 am
responde por el foro, para eso el tema està abierto -.-

Citar
no entendí que me quisite decir con ese código yo probe con eso pero no puedo hacer andar la comparación entre las 3, me hace solo 2 comparaciones,
puedes ayudarme?

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5.  
  6.  
  7. int main()
  8.  
  9. {
  10.  
  11. char pal1[20], pal2[20], pal3[20];
  12.  
  13. printf("ingrese una palabra:");
  14.  
  15. gets(pal1);
  16.  
  17. printf("ingrese la segunda palabra:");
  18.  
  19. gets(pal2);
  20. printf("ingrese tercera palabra");
  21. gets(pal3);
  22.  
  23. ("\n Las palabras ordenadas alfabeticamente son: \n");
  24.  
  25.  
  26. if(strcmp (pal1,pal3)<0)                  //(pal1, pal2)<0)
  27.  
  28. {
  29.  pal1>pal3 & pal3>pal1;
  30.  printf ("%s\n",pal1, pal3);
  31.  
  32. }
  33.  
  34. else{
  35.    pal3<pal1 & pal1<pal3;
  36.   printf ("%s\n",pal3, pal1);
  37.  
  38. }
  39.  
  40. if(strcmp (pal1,pal2)<0)                  //(pal1, pal2)<0)
  41.  
  42. {
  43.  pal1>pal2 & pal1>pal2;
  44.  printf ("%s\n",pal1, pal2);
  45.  
  46. }
  47.  
  48. else{
  49.    pal2<pal1 & pal1<pal2;
  50.   printf ("%s\n",pal2, pal1);
  51. }
  52.  
  53. return 0;
  54.  
  55. }

cuando dije

Código:
Si(p1>p2 y p2>p3){
  imprimir p1, p2, p3
}

p1 > p2 es una comparación de strings, sería strcmp, "y" es comparador binario y es "&&", dejando el código de esta manera

Código
  1. if(strcmp (pal1, pal2)<0 && strcmp (pal2, pal3)<0){
  2.   printf("%s, %s, %s\n",pal1,pal2,pal3);
  3. }

y claramente los casos no los entendiste...
son 6 posibles casos
Código:
p1>p2>p3
p1>p3>p2
p2>p1>p3
p2>p3>p1
p3>p2>p1
p3>p1>p2

entonces los expreso como
Código:
Si(p1>p2 y p2>p3)
lo que se convierte en código como
Código
  1. if(strcmp(p1,p2)>0 && strcmp(p2,p3)

espero se entienda


Título: Re: como ordenar 3 palabras alfabeticamente
Publicado por: fernandoprog1 en 11 Junio 2015, 19:07 pm
Gracias engel lex, ahora entendí perfectamente! el código que muestro aquie anda perfectamente y compara alfabéticamente 3 palabras, ahora si quiero comprar 4  palabras quedaría algo asi  p1>p2>p3>p4 ????


Código
  1. #include <stdio.h>
  2.  
  3. #include <string.h>
  4.  
  5. #include <stdlib.h>
  6.  
  7.  
  8.  
  9. int main()
  10.  
  11.  
  12.  
  13. {
  14.  
  15.  
  16.  
  17. char pal1[20], pal2[20], pal3[20];
  18.  
  19. printf("\nINGRESE PRIMER PALABRA:  \n");
  20.  
  21. gets(pal1);
  22.  
  23. printf("\nINGRESE SEGUNDA PALABRA:  \n");
  24.  
  25. gets(pal2);
  26.  
  27. printf(" \nINGRESE TERCERA PALABRA:  \n");
  28.  
  29. gets(pal3);
  30.  
  31.  
  32.  
  33. ("\n  LAS PALABRAS ORDENADAS ALFABETICAMENTE SON:  \n");
  34.  
  35.  
  36. printf("\n\n");
  37. if(strcmp (pal1, pal2)<0 && strcmp (pal2, pal3)<0){
  38.  
  39. printf("%s, %s, %s\n",pal1,pal2,pal3);
  40. }
  41. if(strcmp (pal1, pal3)<0 && strcmp (pal3, pal2)<0){
  42.  
  43. printf("%s, %s, %s\n",pal1,pal3,pal2);
  44. }
  45.  
  46. if(strcmp (pal2, pal1)<0 && strcmp (pal1, pal3)<0){
  47.  
  48. printf("%s, %s, %s\n",pal2,pal1,pal3);
  49. }
  50.  
  51. if(strcmp (pal2, pal3)<0 && strcmp (pal3, pal1)<0){
  52.  
  53. printf("%s, %s, %s\n",pal2,pal3,pal1);
  54. }
  55.  
  56. if(strcmp (pal3, pal2)<0 && strcmp (pal2, pal1)<0){
  57.  
  58. printf("%s, %s, %s\n",pal3,pal2,pal1);
  59. }
  60.  
  61. if(strcmp (pal3, pal1)<0 && strcmp (pal1, pal2)<0){
  62.  
  63. printf("%s, %s, %s\n",pal3,pal1,pal2);
  64. }
  65.  
  66.  
  67. return 0;
  68.  
  69.  
  70. }
  71.  


Título: Re: como ordenar 3 palabras alfabeticamente
Publicado por: engel lex en 11 Junio 2015, 21:28 pm
si, sería así siendo ahora 24 casos si no me equivoco


Título: Re: como ordenar 3 palabras alfabeticamente
Publicado por: fernandoprog1 en 11 Junio 2015, 21:50 pm
Gracias engel lex, ahora para no tener que usar tantos if que puedo hacer ?


Título: Re: como ordenar 3 palabras alfabeticamente
Publicado por: engel lex en 11 Junio 2015, 21:52 pm
lee mi segunda respuesta (la que tiene código)


Título: Re: como ordenar 3 palabras alfabeticamente
Publicado por: fernandoprog1 en 12 Junio 2015, 00:43 am
este es el programa que me mostraste engel lex , ahora una ves que me lo compila me pide los 3 datos pero no me muestra nada, por que pasa eso ?


Código
  1.  
  2. #include <stdlib.h>
  3.  
  4. #include <string.h>
  5.  
  6. #include <stdio.h>
  7.  
  8.  
  9. int main()
  10.  
  11. {
  12.  
  13.  
  14.  
  15.  
  16. int i, j, n;
  17.  
  18. char palabras[3][20];
  19. char intercambio[20];
  20.  
  21. printf("ingrese primer palabra");
  22. gets(palabras);
  23. printf("ingrese segunda palabra");
  24. gets(palabras);
  25. printf("ingresse tercera palabra");
  26. gets(palabras);
  27.  
  28.  
  29. for(i=0;i<3-1;i++)
  30.  
  31. for(j=0;j<3-1-i;j++)
  32.  
  33.   {
  34.  
  35. n=strcmp (palabras[j], palabras[j+1]);//se comparan
  36.  
  37. if(n > 0)
  38.  
  39. {
  40.  
  41. strcpy (intercambio,palabras[j]);//coloco el valor en un espacio temporal
  42.  
  43. strcpy (palabras[j],palabras[j+1]);//copio el otro al valor ya salvado
  44.  
  45. strcpy (palabras[j+1],intercambio);//coloco el primero en el final
  46.  
  47. }
  48.  
  49.   }
  50.  
  51. }
  52.  


Título: Re: como ordenar 3 palabras alfabeticamente
Publicado por: тαптяα en 12 Junio 2015, 00:57 am
Te faltan los printfs..

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


Título: Re: como ordenar 3 palabras alfabeticamente
Publicado por: engel lex en 12 Junio 2015, 16:10 pm
reccomiendo revisar un tutorial sobre arrays (o arreglos) en c++

Código
  1. printf("ingrese primer palabra");
  2. gets(palabras[0]);


Título: Re: como ordenar 3 palabras alfabeticamente
Publicado por: fernandoprog1 en 15 Junio 2015, 23:01 pm
engel lex no entiendo donde debería poner el printf  ((Te faltan los printfs..

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


Título: Re: como ordenar 3 palabras alfabeticamente
Publicado por: engel lex en 16 Junio 2015, 00:43 am
el printf con el primer codigo que expuse debe ser

Código
  1. for(j=0;j<3;j++){
  2. printf("%s ",palabras[i]);
  3. }
  4. printf("\n");


Título: Re: como ordenar 3 palabras alfabeticamente
Publicado por: fernandoprog1 en 16 Junio 2015, 17:13 pm
Gracias !  ;)