SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: badyalberto en Miércoles 8 de Abril de 2009, 18:32

Título: Punteros
Publicado por: badyalberto en Miércoles 8 de Abril de 2009, 18:32
Código: C++
  1.  
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. void ordenar(int n,char cad[50][30]);
  6. void printa (int n,char cad[50][30]);
  7.  
  8. int main()
  9. {
  10.       int n=0;
  11.       char cad[50][30];
  12.      
  13.       puts("Introdueix cadenas(. para terminar):n");
  14.       do
  15.       {
  16.       printf("Cadena %d: ", n+1);
  17.       gets(cad[n]);
  18.       fflush(stdin);
  19.       }while((0!=strcmp(cad[n++],".")) || (n>50));
  20.  
  21.       n--; //elimino la ultima cadena
  22.      
  23.       ordenar(n,cad);
  24.       printa(n,cad);
  25.      
  26. getchar();
  27. getchar();
  28. }
  29. void ordenar(int n,char cad[50][30])
  30. {
  31.      char *temp[30],i,elem;
  32.      
  33.       for(elem=0; elem<n-1; elem++){
  34.              for(i=elem+1; i<n; i++){
  35.                   if(strcmp(cad[elem],cad[i])>0)
  36.                   {
  37.                       *temp=*cad[elem];
  38.                       *cad[elem]=*cad[i];
  39.                       *cad[i]=*temp;
  40.                   }            
  41.              }
  42.       }
  43. }
  44. void printa (int n,char cad[50][30])
  45. {
  46.      int i;
  47.      
  48.       printf("nLes cadenes ordenades alfabeticament son:n");
  49.       for(i=0; i<n; i++){
  50.           printf("nCadena %d: %s", i+1, cad[i]);
  51.       }
  52.  
  53. }
  54.  
  55.  
  56.  

Pq me intercambio la primera letra de las palabras y no la palabra entera ?
Título: Re: Punteros
Publicado por: Eternal Idol en Miércoles 8 de Abril de 2009, 18:58
Depuralo ...
Título: Re: Punteros
Publicado por: fachamix en Miércoles 8 de Abril de 2009, 19:09
Cita de: "badyalberto"
Código: C++
  1.  
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. void ordenar(int n,char cad[50][30]);
  6. void printa (int n,char cad[50][30]);
  7.  
  8. int main()
  9. {
  10.       int n=0;
  11.       char cad[50][30];
  12.      
  13.       puts("Introdueix cadenas(. para terminar):n");
  14.       do
  15.       {
  16.       printf("Cadena %d: ", n+1);
  17.       gets(cad[n]);
  18.       fflush(stdin);
  19.       }while((0!=strcmp(cad[n++],".")) || (n>50)); //ESTA CONDICION ESTA MAL CREO
  20.  
  21.       n--; //elimino la ultima cadena
  22.      
  23.       ordenar(n,cad);
  24.       printa(n,cad);
  25.      
  26. getchar();
  27. getchar();
  28. }
  29. void ordenar(int n,char cad[50][30])
  30. {
  31.      char *temp[30],i,elem;
  32.  
  33.      /* depura esta parte del codigo
  34.          seguila paso a paso y fijate el contenido de lo que te marco */
  35.  
  36.       for(elem=0; elem<n-1; elem++){
  37.              for(i=elem+1; i<n; i++){
  38.                   if(strcmp(cad[elem],cad[i])>0) /*evalua el contenido de esta condicion */
  39.                   {
  40.                       *temp=*cad[elem]; /*fijate el contenido*/
  41.                       *cad[elem]=*cad[i]; /*fijate el contenido*/
  42.                       *cad[i]=*temp; /*fijate el contenido*/
  43.                   }            
  44.              }
  45.       }
  46. }
  47. void printa (int n,char cad[50][30])
  48. {
  49.      int i;
  50.      
  51.       printf("nLes cadenes ordenades alfabeticament son:n");
  52.       for(i=0; i<n; i++){
  53.           printf("nCadena %d: %s", i+1, cad[i]);
  54.       }
  55.  
  56. }
  57.  
  58.  
  59.  

Pq me intercambio la primera letra de las palabras y no la palabra entera ?
Título: Re: Punteros
Publicado por: badyalberto en Miércoles 8 de Abril de 2009, 19:18
Código: C++
  1.  
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. void ordenar(int n,char *cad[50]);
  6. void printa (int n,char *cad[50]);
  7.  
  8. int main()
  9. {
  10.       int n=0;
  11.       char taula[50][30];
  12.       char *cad[50];
  13.          
  14.       puts("Introdueix cadenas(. para terminar):n");
  15.       do
  16.       {
  17.       printf("Cadena %d: ", n+1);
  18.       gets(taula[n]);
  19.       fflush(stdin);
  20.       }while((0!=strcmp(taula[n++],".")) || (n>50));
  21.  
  22.       n--; //elimino la ultima cadena
  23.      
  24.       taula[50][30]=*cad[50];
  25.      
  26.       ordenar(n,cad);
  27.       printa(n,cad);
  28.      
  29. getchar();
  30. getchar();
  31. }
  32. void ordenar(int n,char *cad[50])
  33. {
  34.      char temp[30],i,elem;
  35.      
  36.       for(elem=0; elem<n-1; elem++){
  37.              for(i=elem+1; i<n; i++){
  38.                   if(strcmp(cad[elem], cad[i])>0)
  39.                   {
  40.                      
  41.                       *temp=*cad[elem];
  42.                       *cad[elem]=*cad[i];
  43.                       *cad[i]=*temp;
  44.                   }            
  45.              }
  46.       }
  47. }
  48. void printa (int n,char *cad[50])
  49. {
  50.      int i;
  51.      
  52.       printf("nLes cadenes ordenades alfabeticament son:n");
  53.       for(i=0; i<n; i++){
  54.           printf("nCadena %d: %s", i+1, cad[i]);
  55.       }
  56.  
  57. }
  58.  
  59.  

Las cabeceras estan bien ? pq cuando introduzco las palabras y pongo el . se me cierra :S
el strcpy se puede utilizar asi aunk sean punteros ?
cuando hace el cambio se tendria q hacer asi o con el strcpy ?
Título: Re: Punteros
Publicado por: betopin en Miércoles 8 de Abril de 2009, 20:25
Tu problema esta aca

Código: C
  1. taula[50][30]=*cad[50];
  2.      
  3.       ordenar(n,cad);
  4.       printa(n,cad);
  5.  


En cad, previo a esas lineas no hay nada asi que la asignacion que estas haciendo almacena basura y los punteros que estas manejando en las funciones estan apuntando a arrays inexistentes

Saludos
Título: Re: Punteros
Publicado por: gonza_fs en Sábado 11 de Abril de 2009, 03:35
Hola, bueno, del ultimo codigo que vi, noto varios errores, Usas taula y cad sin inicializar, incluso cad es un puntero a un array, no solo un array. Si creas una estructura asi te conviene hacerle un new primero: char  *cad=new char[30];
Es mas claro de esta manera. Aparte el amigo que escribio antes que yo tiene razon, llamas a los procedimientos sin nada en las estructuras, o sea, sin inicializar.
Aparte en una linea haces taula[50][30]=*cad[30], lo cual te da basura porque el contenido completo de cad esta "vacio".
Tambien vi algo como gets(taula[n]). Esta parte no se realmente como funciona de esta manera, pero se como si taula fuera un arreglo lo cual no es cierto. Aunque el gets te funcione asi, no es claro y creo eso te esta provocando confusiones entre los parametros. Espero te sirve, saludos.