Buenas a todos, estoy realizando un ejercicio de clase y me he encontrado con un problema. Estoy aquí para ver si me podeis echar un cable.
El ejercicio trata de crear una tabla hash con poblaciones y su número de habitantes. La dificultad reside en que para introducir los nombre y los habitantes tengo que hacerlo todo de seguido y parar al escribir FIN. Por ejempo: Madrid 400 Barcelona 700 FIN
Uso contadores para detectar si hay un espacio y saber a que columna asignarlo, pero algo falla y salen simbolos raros y no coge bien los nombres. Ahí va la parte del código en la que aparece: case 2: printf("Introduzca poblaciones: ");
fflush(stdin);
gets(linea);
cont=0;
c=0;
for(i=0;i<strlen(linea);i++)
{
if (linea[i]!=' ')
{
cadena[c]=linea[i];
c++;
}
else
{
if (cont==0){
//es la ciudad
strcpy(pob,cadena);
cont++;
}
else{
//es el nº de habitantes
habitantes=atoi(cadena);//convertir el string a int
insertar(t,pob,habitantes);
cont=0;
}
if (strcmp(cadena,"FIN")==0)
{
break;
}
strcpy(cadena," ");//inicializar la cadena a la caderna vacia, para obtener la siguiente palabra
c=0;
}
break;
}
La función insertar es esta:
int insertar(tablahash t, char poblacion[30], int habitantes){
int i=hash(poblacion) % TABLA;
while(i<=TABLA){
if(strcmp(t[i].poblacion,"")==0){//si la posicion esta vacia
strcpy(t[i].poblacion, poblacion);
t[i].habitantes=habitantes;
break;
}
else if(strcmp(t[i].poblacion,poblacion)==0){//si ya existe
printf("YA INSERTADO\n");
break;
}
if(strcmp(t[i].poblacion,"")!=0){//si la clave esta ya usada
i=i*i;
}
}
}
¿Alguien podría orientarme o decirme donde esta el fallo?
Gracias de antemano.
Yo hice algo parecido en Java: lo que hice fue un bucle que cogiera una linea de entrada por consola (es decir, que cogiera lo último escrito antes de pulsar ENTER) y que divida la línea en 2 trozos. Compruebas el primer "trozo" para ver que no sea "FIN" y haces con él lo pertinente.
public void run(){
Scanner scanner = new Scanner(System.in);
while(true){
System.out.println("Introduzca el nombre del comando y sus argumentos");
String comando = scanner.nextLine();
String[] comandos = comando.split(" ");
// Si se introduce un enter: return (fin)
if(comando.isEmpty()){
return;
}
Function func = commands.get(comandos[0]);
if (func == null){
System.out.println("Comandos disponibles:");
ArrayList<String> lista = new ArrayList<String>(commands.keySet());
for (String nombre : lista){
System.out.println(nombre);
}
}else{
if(comandos.length == 1){
func.execute();
}else if (comandos.length > 2){
throw new IllegalArgumentException("Numero de argumentos introducidos invalido");
}else
func.execute(comandos[1]);
}
}
}
Sé que seguramente no sepas Java pero quizás te ayude visualizarlo desde otra perspectiva. Al fin y al cabo tu ejercicio se puede hacer en varios lenguajes, por lo que el algoritmo es similar.