Ordenar matriz alfabeticamente

Iniciado por programacion_c, 23 Abril 2012, 23:06 PM

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

programacion_c

Hola, soy nuevo por aqui y queria hacerles una consulta.

Mi problema es el siguiente : Necesito copiar una cadena de caracteres dada por teclado en un array bidimensional.
Despues ordenar el array alfabeticamente y mostrarla por pantalla. El codigo es el siguiente:

#include <stdio.h>
#include <string.h>
#define Maxstrl 50
#define Maxanzahl 100

int main(){
 
 char x[Maxstrl];
 char str[Maxstrl];
 char M[Maxanzahl][Maxstrl];
 int i,j,min,m,k=0;
 
 for(i=0;i<Maxanzahl;i++){
      for(j=0;j<Maxstrl;j++){
      M[j]= ' ';
      }

}
 
 while(fgets(str,Maxstrl,stdin)!=NULL){
   if(str[strlen(str)-1]=='\n'){
     str[strlen(str)-1]='\0';
     strcpy(M[k],str);
     k++;
   }
}
 for(j=0;j<strlen(str);j++){
      if(strcmp(M[j],M[j+1])>0){
     strcpy(x,M[j]);
     strcpy(M[j+1],M[j]);
     strcpy(M[j+1],x);
   }
 for(i=0;i<strlen(str);i++){
   for(j=0;j<Maxstrl;j++){
     printf("%c\t",M[j]);
   }
   printf("\n");
 }
 return 0;
 
}

Muchas gracias por anticipado

EI: juntando mensajes.

No consigo ordenar bien el array bidimensional y mostrarlo por pantalla. Agradeceria alguna ayuda

s00rk

#1
Al usar una matriz bidimensional quiere decir que para guardar u obtener un dato ocupas indicarle la posicion y a como veo en el primer for solo colocas uno que enrealidad deberia ser

M[i ][j] = ' ';

Bueno ese es el error que veo en todo donde usas M, ya que pues solo le indicas una posicion mas no la segunda.

programacion_c

Cuando he copiado y pegado el codigo, no se como, pero en mi codigo original pone M[j], sin embargo, aqui  no lo pone... Pero ese no es el error, el error lo tiene cuando hago la comparacion, que no la hago bien, pero yo aun no le he visto el fallo...

durasno

Hola! si bien hacer M[j]= ' '; no es el error logico del programa es un error de compilacion. Debe ser como dijo s00rk: M[i ][j] = ' ';

Tenes varios errores en el programa, uno de ellos esta en la condicion de los dos for: j<strlen(str)
Estas utilizando una condicion que no tiene nada que ver con lo que queres hacer. Tanto para ordenar como para imprimir deberias usar:
j<k
ya que k es el contador de tu programa que indica cuantas lineas ingresaste por consola

El algoritmo de ordenamiento esta mal; una pista deberias utilizar dos for

Tambien la impresion esta mal, solo basta con un for, y el formato del printf debe ser %s no %c

Arregla esas cosas si podes sino segui preguntando, Saludos
Ahorrate una pregunta, lee el man

programacion_c

#4
Hola, de nuevo, gracias por tu respuesta.

He corregido algunas cosas y me da un warning :
warning: passing argument 1 of 'strcmp' makes pointer from integer without a cast [enabled by default]
/usr/include/string.h:143:12: note: expected 'const char *' but argument is of type 'char'

Este es el nuevo codigo :

#include <stdio.h>
#include <string.h>
#define Maxstrl 50
#define Maxanzahl 100

int main(){
 
 char x[Maxanzahl][Maxstrl];
 char str[Maxstrl];
 char M[Maxanzahl][Maxstrl];
 int i,j,min,m,k=0;
 
 for(i=0;i<Maxanzahl;i++){
      for(j=0;j<Maxstrl;j++){
      M[j]= ' ';
      }

}
 
 while(fgets(str,Maxstrl,stdin)!=NULL){
   if(str[strlen(str)-1]=='\n'){
     str[strlen(str)-1]='\0';
     strcpy(M[k],str);
     k++;
   }
 }
 
/* for(i=0;i<strlen(str);i++){
   for(j=0;j<Maxstrl;j++){
     printf("%c\t",M[j]);
   }
   printf("\n");
 }*/
 for(j=0;j<k;j++){
   for(m=j+1;m<Maxstrl;m++){
      if(strcmp(M[j][m],M[j][m+1])>0)
     strcpy(x,M[j][m]);
     strcpy(M[j][m],M[j][m+1]);
     strcpy(M[j][m+1],x);
   }
 
 
 
 for(i=0;i<k;i++){
   for(j=0;j<Maxstrl;j++){
     printf("%c\t",M[j]);
   }
   printf("\n");
 }
  return 0;
 
}

Lo que me pide el programa es que imprima la matriz en forma de matriz ordenada alfabteticamente,
La copia de la cadena en la matriz se hace bien no?
La comparacion es la que da el fallo creo

Gracias

EI: juntando mensajes.

Lo he corregido de nuevo, pero sigo dando error

#include <stdio.h>
#include <string.h>
#define Maxstrl 50
#define Maxanzahl 100

int main(){

  char x[Maxanzahl][Maxstrl];
  char str[Maxstrl];
  char M[Maxanzahl][Maxstrl];
  int i,j,min,m,k=0;

  for(i=0;i<Maxanzahl;i++){
       for(j=0;j<Maxstrl;j++){
       M[j]= ' ';
       }

}

  while(fgets(str,Maxstrl,stdin)!=NULL){
    if(str[strlen(str)-1]=='\n'){
      str[strlen(str)-1]='\0';
      strcpy(M[k],str);
      k++;
    }
  }

  for(j=0;j<k;j++){
    for(m=0;m<Maxstrl;m++){
       if(strcmp(M[j][m],M[j][m+1])>0)
      strcpy(x,M[j][m]);
      strcpy(M[j][m],M[j][m+1]);
      strcpy(M[j][m+1],x);
    }



  for(i=0;i<k;i++){
    for(j=0;j<Maxstrl;j++){
      printf("%c\t",M[j]);
    }
    printf("\n");
  }
  return 0;

}

durasno

Lei mejor el comentario de soork y me equivoque en algo, no tenes que usar M[j]= ' '; en todo el programa sino solo en:
for(i=0;i<Maxanzahl;i++){
       for(j=0;j<Maxstrl;j++){
         M[i][j]= ' ';
       }
}


Tambien la impresion esta mal, solo basta con un for, y el formato del printf debe ser %s no %c

Te dejo el codigo funcionando:
#include <stdio.h>
#include <string.h>
#define Maxstrl 50
#define Maxanzahl 100

int main(){

  char x[Maxstrl]; // x no debe ser una matriz sino un array unidimensional
  char str[Maxstrl];
  char M[Maxanzahl][Maxstrl];
  int i,j,min,m,k=0;

  for(i=0;i<Maxanzahl;i++){
       for(j=0;j<Maxstrl;j++){
       M[i][j]= ' ';
       }

}

  while(fgets(str,Maxstrl,stdin)!=NULL){
    if(str[strlen(str)-1]=='\n'){
      str[strlen(str)-1]='\0';
      strcpy(M[k],str);
      k++;
    }
  }

  for(j=0;j<k-1;j++){
    for(m=0;m<k-j-1;m++){
       if(strcmp(M[m],M[m+1])>0){ // faltaba las llaves del if
      strcpy(x,M[m]);
      strcpy(M[m],M[m+1]);
      strcpy(M[m+1],x);
      }
    }
}

// esto tenias q hacer para la impresion
  for(i=0;i<k;i++){
      printf("%s\n",M[i]);
    }

  return 0;

}


Para entender mejor lo que hice en el ordenamiento busca algo como: "metodo de la burbuja en C" en ingles creo q es "booble-sort"

Saludos
Ahorrate una pregunta, lee el man

programacion_c

Muchas gracias, me ha servido de mucho