• Martes 21 de Mayo de 2024, 04:18

Autor Tema:  Strings  (Leído 3121 veces)

franc

  • Miembro MUY activo
  • ***
  • Mensajes: 157
    • Ver Perfil
Strings
« en: Martes 13 de Enero de 2004, 20:49 »
0
¿ Alguien podria decirme porque no funciona este codigo ?

Se supone que el programa coge 5 palabras introducidas por el usuario y las ordena de mayor a menor ( por orden de numero de letras  ).

Código: Text
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <string.h>
  4. #define n 5
  5.  
  6. void main()
  7. {
  8.  
  9. char *palabras[n], *aux;
  10. int i,j;
  11.  
  12.  
  13. for(i=0;i<=n-1;i++)
  14. {
  15.  
  16. printf("Introduce la palabra Nº%d: ",i+1);
  17. scanf("%s",palabras[i]);
  18.  
  19. }
  20.      for( i=0; i<n-1; i++ )
  21.           for( j=0; j<n; j++ )
  22.         if (strcmp(palabras[i], palabras[j])>0)
  23.                   {
  24.     aux = palabras[i];
  25.     palabras[i] = palabras[j];
  26.     palabras[j] = aux;
  27.                   }
  28.      printf( "Lista ordenada:\n" );
  29.      for( i=0; i<n; i++ )
  30.    printf( "  %s.\n", palabras[i] );
  31. }
  32.  
  33.  
  34.  
  35.  
  36.  


Muchas gracias !

plaf

  • Miembro activo
  • **
  • Mensajes: 57
    • Ver Perfil
Re: Strings
« Respuesta #1 en: Martes 13 de Enero de 2004, 22:35 »
0
xq palabras es un puntero apuntando a cualquier parte, tienes q reservarle memoria antes del scanf() o si no estaras tratando de escribir en lugares posiblemente prohibidos

y pues es raro tu sistema xq ordenas todo varias veces, seria mas eficiente intercambiar la p x p[j] cuando p<p[j] y despues partir revisando desde donde estas en adelante... pero lo tuyo tb funciona, eso si q con i<n o i<=n-1, no i<n-1 :P

Código: Text
  1.  
  2. #include &#60;stdio.h&#62;
  3. #include &#60;stdlib.h&#62;
  4. #define n 5
  5.  
  6. int main()
  7. {
  8.  
  9.     char *palabras[n], *aux;
  10.     int i,j;
  11.  
  12.     for(i=0;i&#60;n;i++)
  13.     {
  14.   printf(&#34;Introduce la palabra Nº%d: &#34;,i+1);
  15.   palabras[i] = (char *) malloc(23);
  16.   scanf(&#34;%s&#34;,palabras[i]);
  17.     }
  18.  
  19.     for( i=0; i&#60;n; i++ )
  20.   for( j=i; j&#60;n; j++ )
  21.    if (strcmp(palabras[i], palabras[j])&#60;0)
  22.    {
  23.     aux = palabras[i];
  24.     palabras[i] = palabras[j];
  25.     palabras[j] = aux;
  26.    }
  27.  
  28.     printf( &#34;Lista ordenada:&#092;n&#34; );
  29.     for( i=0; i&#60;n; i++ )
  30.     printf( &#34;  %s.&#092;n&#34;, palabras[i] );
  31. }
  32.  
  33.  

franc

  • Miembro MUY activo
  • ***
  • Mensajes: 157
    • Ver Perfil
Re: Strings
« Respuesta #2 en: Martes 13 de Enero de 2004, 22:44 »
0
oye pero me acavo de dar cuenta que de la forma que he planteado el programa no resuelve el problema.

La idea es que ordene de mayor a menor las palabras.

Es decir: autobus > cuatro > tres > por > tu > b

de la forma que esta planteado ordena por orden de la "primera" letra.


Hay una funcion para que comprube letra por letra ?

Gracias

GhostGirl

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Strings
« Respuesta #3 en: Miércoles 14 de Enero de 2004, 01:47 »
0
Hola!!!
La función que estás usando strcmp() también funciona con cadenas de caracteres, no sólo compara letras.

Prueba usándola con la cadena entera ;)

Saludos

--

plaf

  • Miembro activo
  • **
  • Mensajes: 57
    • Ver Perfil
Re: Strings
« Respuesta #4 en: Miércoles 14 de Enero de 2004, 03:19 »
0
autobus > cuatro > tres > por > tu > b
o sea q ordene solo segun el largo? entonces usa
if(strlen(palabra) > strlen(palabra[j]))
eso si quieres ordenar SOLO por el largo, si ademas quieres ordenar alfabeticamente entonces primero ordenas por largo, y despues con el mismo sistema q antes alfabeticamente, pero solo cambiando si tambien son del mismo largo

carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Re: Strings
« Respuesta #5 en: Viernes 16 de Enero de 2004, 17:26 »
0
PLAF: sigues cometiendo el mismo error que habeis cometido todos excepto Ghostgirl.
Para comprobar la largura de las palabras se utiliza la fución int strlen(char *) de la librería string.h.  Como vereis recibe un apuntador a char (la primera posición del string, el propio nombre del string al fin y al cabo).
Como ejemplo os pongo lo siguiente:
Código: Text
  1. char a={&#34;hola&#34;};
  2. int longitud;
  3.  
  4. longitud=strlen(a); //devuelve un 4 (h-o-l-a)
  5. longitud=strlen(a[1]); //devuelve 3 (o-l-a)
  6. longitud=strlen(a[3]); //devuelve 1 (a)
  7.  
Si lo que se busca es ordenar en orden alfabético la cosa puede complicarse un montón, de verdad... Habría que ir mirando letra a letra cada palabra y comparla con el resto, si hay dos palabras que empiezan igual habría que comparar sus dos segundas letras...  Un lio.   También se puede utilizar la función strcmp(char *) que compara cadena de caracteres, CADENAS ENTERAS, igual que antes habrá que pasarle la primera posición del string.
Creo que hay una serie de algoritmos que permiten la ordenación alfabética de una manera mecánica... Creo que uno es el método de la burbuja, el método quick short...
Pero ya os adelanto que la tarea es complicada.
Un saludo
No hay tonto más molesto que el ingenioso.

plaf

  • Miembro activo
  • **
  • Mensajes: 57
    • Ver Perfil
Re: Strings
« Respuesta #6 en: Viernes 16 de Enero de 2004, 20:46 »
0
carmamezo, no compliques las cosas, y fijate bien en el codigo y explicacion q pusieron. cuando dice "palabra" eso es un puntero a un string completo, o bueno, al primer caracter. palabra es un arreglo de n punteros. y lo q piden aca es ordenar las palabras por su largo, asi q con el codigo q puse al principio pero cambiando el strcmp() por los strlen() como puse en el otro mensaje esta bien. y lo que dices del "lio" q hay q hacer para comparar 2 strings es justamente lo q hace strcmp()

Código: Text
  1.  
  2. #include &#60;stdio.h&#62;
  3. #include &#60;stdlib.h&#62;
  4. #include &#60;string.h&#62;
  5.  
  6. #define n 5
  7.  
  8. int main()
  9. {
  10.  
  11. char *palabras[n], *aux;
  12. int i,j;
  13.  
  14. for(i=0;i&#60;n;i++)
  15. {
  16.  printf(&#34;Introduce la palabra Nº%d: &#34;,i+1);
  17.  palabras[i] = (char *) malloc(23);
  18.  scanf(&#34;%s&#34;,palabras[i]);
  19. }
  20.  
  21. for( i=0; i&#60;n; i++ )
  22.  for( j=i; j&#60;n; j++ )
  23.   if (strlen(palabras[i]) &#60; strlen(palabras[j]))
  24.   {
  25.    aux = palabras[i];
  26.    palabras[i] = palabras[j];
  27.    palabras[j] = aux;
  28.   }
  29.  
  30. for( i=0; i&#60;n; i++ )
  31.  for( j=i; j&#60;n; j++ )
  32.   if (strcmp(palabras[i], palabras[j])&#62;0 && strlen(palabras[i])==strlen(palabras[j]))
  33.   {
  34.    aux = palabras[i];
  35.    palabras[i] = palabras[j];
  36.    palabras[j] = aux;
  37.   }
  38.  
  39. printf( &#34;Lista ordenada:&#092;n&#34; );
  40. for( i=0; i&#60;n; i++ )
  41. printf( &#34;  %s.&#092;n&#34;, palabras[i] );
  42. }
  43.  
  44.  
esto las deja de mayor a menor largo y las q tengan el mismo largo quedan en orden alfabetico
autobus > cuatro > ocho > tres > dos > por > tu > a > b > z

carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Re: Strings
« Respuesta #7 en: Domingo 18 de Enero de 2004, 00:09 »
0
El lio no es la comparación, ya mencioné que se puede usar la función strcmp, lo complicado es la ordenación en si.  Imagina que en vez de mostrarlos debieras recoger 100 strings de un fichero, ordenarlos y volver a guardarlos ordenados, sin el manejo de listas, pilas y colas la cosa es complicada, la verdad, incluso con manejo de listas es complicado.
PLAF Tienes razón, no leí el código con la suficiente atención SORRY  :whistling:
Un saludo.
No hay tonto más molesto que el ingenioso.