Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: RicGeo en 17 Septiembre 2014, 17:55 pm



Título: Duda con uso del "for" para almacenar caracteres y flotantes en "C"
Publicado por: RicGeo en 17 Septiembre 2014, 17:55 pm
Hola amigos de Elhacker.net quisiera su ayuda esta vez con el almacenamiento de caracteres y flotantes en el "for" donde tengo que almacenar varios datos : nombre y codigos .Por ejemplo:
 paloer  234234.56323 2342.563
 loerto   454353.4564 23423.6722
 setra  43534.56754 7864.6573
Código
  1. #include<stdio.h>
  2.  #define MAX 13
  3.  int main(){
  4.  int i,j,k,n;
  5.  double p[MAX][1];
  6.  char nombre[MAX];
  7.  FILE *txt;
  8.  printf("Numero de datos:\n");
  9.   scanf("%d",&n);
  10.  txt=fopen("Lista_datos.txt","r");
  11.  if(!txt)
  12.    printf("Error no existe archivo\n");
  13.  else{
  14.    for(i=0;i<n;i++)
  15.    fscanf(txt,"%s %lf %lf",&nombre[MAX],&p[i][0],&p[i][1]);// Obviamente acá el uso de la lectura de los caracteres está mal usado, aquí es donde quisiera su ayuda
  16.     for(i=0;i<n;i++)
  17.    printf("%s %lf %lf",nombre[i],p[i][0],p[i][1]);
  18.    }
  19.    fclose(txt);
  20.    return 0;}
Quisiera como utilizar o hay un comando especial como poder trabajar con estos caracteres que varian para poder trabajar con estos datos .. agradecería bastante ayuda . Saludos!!!


Título: Re: Duda con uso del "for" para almacenar caracteres y flotantes en "C"
Publicado por: eferion en 17 Septiembre 2014, 18:18 pm
Código
  1. double p[MAX][1];

Esta declaración no tiene demasiado sentido. Si pretendes almacenar dos números en cada posición de "p" tienes que declarar la variable así:
Código
  1. double p[MAX][2];

De esta forma, para cada p dispones de dos espacios, uno para cada numero.

Ahora vamos con las cadenas:

Código
  1. char nombre[MAX];

Esta declaración está mal. Las cadenas de caracteres no se usan exactamente igual que el resto de "tipos nativos". Me explico:

Si intentas almacenar "hola" en C necesitas (al menos) 5 bytes de memoria... si en cambio intentas almacenar "mensaje", la cantidad de memoria requerida asciende a 8 bytes. En cambio, en un int todos los números van a ocupar 4 bytes... ya estés almacenando el 0 o el 5.234.045.

Dicho esto, cada cadena de caracteres es, como su propio nombre indica, una secuencia de tipo "char". Esto quiere decir que "char nombre[MAX]" únicamente te va a permitir almacenar una cadena de caracteres... cuya longitud máxima será MAX-1. Si tu idea es poder almacenar MAX cadenas de caracteres diferentes la declaración debería quedar así:

Código
  1. char nombre[MAX][20];

Esto suponiendo que cada "nombre" no vaya a ocupar más de 19 caracteres.

Si miramos ahora el bucle for, tenemos:

Código
  1. for(i=0;i<n;i++)
  2.    fscanf(txt,"%s %lf %lf",&nombre[MAX],&p[i][0],&p[i][1]);

Esto, como bien has indicado, está mal. Aplicando los cambios que hemos comentado anteriormente, este bucle debería lucir más o menos así:

Código
  1. for(i=0;i<n;i++)
  2.    fscanf(txt,"%s %lf %lf",&nombre[i],&p[i][0],&p[i][1]);

Fíjate que ha desaparecido toda referencia a "MAX", lo cual tiene sentido, ya que intentamos guardar cada nombre en una posición diferente.

Consejos finales:

* Deberías validar que "n" se encuentra dentro del rango [1..13], ya que si te da por poner una cantidad superior vas a escribir en memoria que no te pertenece y eso te va a dar problemas.

* Deberías poner a las variables nombres con significado propio, "p" o "n" no dicen absolutamente nada y eso dificulta la lectura del código.

* Deberías tabular el código con criterio, mejoras la legibilidad del código.

Un saludo.