Seguimos buscando a Arshak. Ayudanos compartiendo!
Encuesta no oficial de docentes
Resultados de la encuesta no oficial de docentes
Probaste el SIGA Helper?

Donar $100 Donar $200 Donar $500 Donar mensualmente


Enviar respuesta 
 
Calificación:
  • 0 votos - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Buscar en el tema
Trabado con un tipo de ejercicios especifico de archivos
Autor Mensaje
nanohueso Sin conexión
Profesor del Modulo A
Thats what she said
*****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 239
Agradecimientos dados: 268
Agradecimientos: 30 en 20 posts
Registro en: Feb 2012
Mensaje: #1
Trabado con un tipo de ejercicios especifico de archivos Ejercicios Informática I (Electrónica)
Hola a todos, no estoy pudiendo resolver los ejercicios que me dan archivos csv ( comma separate value) , esos ejeercicios que tenes que levantar el archivo y dps reodenarlo o algo por el estilo, por ejemplo este final de agosto 2013

https://drive.google.com/file/d/0BztSCom...sp=sharing
O sea , no puedo terminar de descrifrar bien el algoritmo para este tipo de archivos, que me recomiendan? yo pense en levantar byte por byte hasta encontrar una coma y hacer maquina de estados pero la verdad que ya me puse a hacer eso y se vuelve un lio de flags y de ifs por lo que seguramente hay un camino mas facil que lo de levantar byte por byte ...
Alguno tiene resuelto este tipo de ejercicios?

UN saludo a todos y desde ya gracias
28-01-2014 13:18
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
leibniz Sin conexión
Secretario General

*******

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 849
Agradecimientos dados: 46
Agradecimientos: 24 en 17 posts
Registro en: Dec 2012
Mensaje: #2
RE: Trabado con un tipo de ejercicios especifico de archivos
edit: Acabo de ver la imagen que pasaste.

Descomponé en varios pasos para que te sea más fácil (y elegante).

  1. Lectura
  2. Orden
  3. Impresión


1. Lectura.
Creas un elemento. Lees byte por byte en un buffer. La edad en ASCII la pasas a entero mediante la función atoi.
Agregas el nodo a la lista. Y así hasta que termina el archivo. Después cerras el FH.

2. Orden.
Ordenas alfabéticamente comparando los char. Para que quede bien tenés que distinguir entre mayúsculas y minúsculas para saber que comparación hacer. Recordá que 'Nombre' es un puntero a char después de todo. (Lo ideal sería encontrar alguna forma recursiva para ordenar bien ocurrencias como 'Adefesio', 'Alberto' y 'Agustin', pero no te mates.)

3. Impresión
Iteras por la lista y haces un printf. Tomate 10 minutos para aprender como darle buen formato, para quedar bien.

[Imagen: Leibnitz_signature.svg]
(Este mensaje fue modificado por última vez en: 29-01-2014 09:05 por leibniz.)
28-01-2014 17:16
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
luchovl2 Sin conexión
Presidente del CEIT
Dígame, Ingeniero.
********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 1.334
Agradecimientos dados: 24
Agradecimientos: 355 en 323 posts
Registro en: May 2009
Mensaje: #3
RE: Trabado con un tipo de ejercicios especifico de archivos
No estoy seguro de entender tu problema. Tenés dos campos que llenar, y un archivo con datos, supuestamente primero edad y después nombre. Desde el comienzo del archivo, y hasta el final, leés entre comas, convertís la edad a entero, te fijás que tenga sentido (que nadie tenga mil años), y seguís con el nombre. Después se repite.
No me parece complicado.
28-01-2014 18:02
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
nanohueso Sin conexión
Profesor del Modulo A
Thats what she said
*****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 239
Agradecimientos dados: 268
Agradecimientos: 30 en 20 posts
Registro en: Feb 2012
Mensaje: #4
RE: Trabado con un tipo de ejercicios especifico de archivos
Pero como hago para levantar la edad ? ; Osea si yo voy levantando byte por byte, es decir, caracter por caracter , voy a tener que levantar 2 caracteres para poder asi obtener la edad ? A ver , si yo voy levantando caracter x caracter del archivo lo voy a ir guardando en un char, como hago para almacenar la edad ? me esta confundiendo...

saludos
29-01-2014 16:09
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Dios Sin conexión
Presidente del CEIT
.
********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 1.057
Agradecimientos dados: 32
Agradecimientos: 160 en 132 posts
Registro en: Dec 2011
Mensaje: #5
RE: Trabado con un tipo de ejercicios especifico de archivos
¿Tienen alguna restricción específica que les impida utilizar las funciones de manejo de strings? strtok, strcmp, etc. Como veo en el siguiente punto, pueden usar puts() así que supongo que podrán usar fgets() también...

La forma sería:

  1. Por cada línea un fgets().
  2. Separar los campos con strtok, utilizando la coma como separador.
  3. Convertir la edad de ASCII a un tipo numérico
  4. Insertar en la lista.
  5. ¿ListSort se la da por hecha? Porque si es así se puede crear toda la lista y luego ordenarla.

«(…)Se arman paquetes… ¿eh?… tecnológicos… tecnológicos portes de… en donde están… este… interrelacionados con las otras capas.(…)»
(Este mensaje fue modificado por última vez en: 29-01-2014 17:33 por Dios.)
29-01-2014 17:32
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
nanohueso Sin conexión
Profesor del Modulo A
Thats what she said
*****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 239
Agradecimientos dados: 268
Agradecimientos: 30 en 20 posts
Registro en: Feb 2012
Mensaje: #6
RE: Trabado con un tipo de ejercicios especifico de archivos
(29-01-2014 17:32)Dios escribió:  ¿Tienen alguna restricción específica que les impida utilizar las funciones de manejo de strings? strtok, strcmp, etc. Como veo en el siguiente punto, pueden usar puts() así que supongo que podrán usar fgets() también...

La forma sería:

  1. Por cada línea un fgets().
  2. Separar los campos con strtok, utilizando la coma como separador.
  3. Convertir la edad de ASCII a un tipo numérico
  4. Insertar en la lista.
  5. ¿ListSort se la da por hecha? Porque si es así se puede crear toda la lista y luego ordenarla.

como convertis la edad en ASCII a un int ?
listSort es el prototipo de la funcion que hay que hacer
en todos los ejercicios siempre fui usando fread , haran kilombo si uso fgets() ?

Saludos y gracias
29-01-2014 19:38
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Dios Sin conexión
Presidente del CEIT
.
********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 1.057
Agradecimientos dados: 32
Agradecimientos: 160 en 132 posts
Registro en: Dec 2011
Mensaje: #7
RE: Trabado con un tipo de ejercicios especifico de archivos
Para convertir de un string a un int tenés la función


int atoi(char*);




Que se usa, por ejemplo, así:



#include <stdio.h>
#include <stdlib.h>
int main(void) {
char unaCadena = "123";
printf("El valor convertido es: %d.\n", atoi(unaCadena));
}




Con respecto a si te harán quilombo, no lo sé. No soy de electrónica así que ni idea de cómo les dan estos temas. Por eso te preguntaba si tenían alguna restricción, porque en el ejercicio no figura pero quizás es algo "implícito" de la materia.
Hacerlo de a un byte es posible, usando dos iteraciones por línea: una hasta la coma y otra hasta el salto, pero me parece que puede salir un código poco "elegante".

Por ejemplo, para ordenar la lista necesitás comparar strings. Hacerlo "a mano" es posible pero es largo y hay que contemplar varias opciones para que quede del todo bien, en cambio hay una función estándar para eso que es


int strcmp(char* st1, char* st2);




que compara los strings st1 y st2 y devuelve un entero i tal que
  • i<0 si st1<st2
  • i = 0 si st1 == st2
  • i>0 si st1 > st2

¡Aparte acabo de ver que eso es un examen final!

Si lo hacés todo de a un byte no terminás más de escribir la función D:

«(…)Se arman paquetes… ¿eh?… tecnológicos… tecnológicos portes de… en donde están… este… interrelacionados con las otras capas.(…)»
(Este mensaje fue modificado por última vez en: 29-01-2014 20:31 por Dios.)
29-01-2014 20:20
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
leibniz Sin conexión
Secretario General

*******

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 849
Agradecimientos dados: 46
Agradecimientos: 24 en 17 posts
Registro en: Dec 2012
Mensaje: #8
RE: Trabado con un tipo de ejercicios especifico de archivos
(29-01-2014 20:20)Dios escribió:  Por ejemplo, para ordenar la lista necesitás comparar strings. Hacerlo "a mano" es posible pero es largo y hay que contemplar varias opciones para que quede del todo bien, en cambio hay una función estándar para eso que es


int strcmp(char* st1, char* st2);




que compara los strings st1 y st2 y devuelve un entero i tal que
  • i<0 si st1<st2
  • i = 0 si st1 == st2
  • i>0 si st1 > st2


En este caso es conveniente usar 'strcasecmp', que es case-insensitive.

En cuanto a las posibilidades de utilizarlo, siendo ANSI C no creo que te digan nada, mientras hagas el include correcto.
Además se supone que conoces el funciona strcmp porque me parece que en la guía de tps haces una función similar, casera.

[Imagen: Leibnitz_signature.svg]
30-01-2014 14:47
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Dios Sin conexión
Presidente del CEIT
.
********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 1.057
Agradecimientos dados: 32
Agradecimientos: 160 en 132 posts
Registro en: Dec 2011
Mensaje: #9
RE: Trabado con un tipo de ejercicios especifico de archivos
Che, me quedé pensando sobre este ejercicio y realmente lo más simple de todo es usar fscanf, que te deja leer líneas formateadas e ir poniendo los valores donde debe.

Algo así creo que sería


fscanf(stream, "%d,%s\n", &nodo.edad, nodo.Nombre);




No estoy seguro de la sintaxis, hace mucho que no uso C para algo "real", pero podés investigar la parte de entrada formateada: scanf, fscanf, etc, eso te puede resolver la parte de leer el archivo en muy pocas líneas.

«(…)Se arman paquetes… ¿eh?… tecnológicos… tecnológicos portes de… en donde están… este… interrelacionados con las otras capas.(…)»
30-01-2014 14:53
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
luchovl2 Sin conexión
Presidente del CEIT
Dígame, Ingeniero.
********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 1.334
Agradecimientos dados: 24
Agradecimientos: 355 en 323 posts
Registro en: May 2009
Mensaje: #10
RE: Trabado con un tipo de ejercicios especifico de archivos
Muy bueno el strtok(), no lo tenía, o no lo recordaba.
Esa me parece la mejor: la de fgets y strtok, después atoi, etc..

Sin embargo, tené en cuenta que un examen es distinto de hacerlo en casa con la PC y probando si anda o no.
Creo que lo que termina rindiendo es hacerlo de la forma que te salga más fácil. No tiene sentido matarse pensando la forma más elegante si tenés hora y media para hacerlo.
Además, los tipos te corrigen las hojas que les das, o sea, tampoco tienen compilador para ver los errores. Y si lo hacés complicado, se lo complicás también a ellos.
30-01-2014 23:38
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
nanohueso Sin conexión
Profesor del Modulo A
Thats what she said
*****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 239
Agradecimientos dados: 268
Agradecimientos: 30 en 20 posts
Registro en: Feb 2012
Mensaje: #11
RE: Trabado con un tipo de ejercicios especifico de archivos
Este es mi codigo, compilar compila. Yo no se si se hace asi o no pero la verdad es que es largo y complicado , me costo resolverlo, lo hice utilizado la funcion fgets la cual me levanta linea por linea, y dps con muchos if switch while for fui levantando Codigo y Cantidad
PD: Esta todo el codigo comentado en ingles porque estuve preguntando en un foro internacional de programacion en C




#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define PATH "~/Documents/InformaticaI/datos.txt"
#define LEN 1020

typedef struct t_nodo{
char codigo[10];
int cantidad;
struct t_nodo *next;
}NODO;

int levantar_archivo(FILE *,NODO *,NODO *);

int main(void)
{
return 0;
}

int levantar_archivo(FILE *fp ,NODO *aux,NODO *H)
{
fp= fopen(PATH,"r+t");
char s[LEN],buff[5];
int i=0,cantidad_comas=0;

H=NULL;

while(fgets(s,sizeof(s),fp) != NULL) //read line from the file
{

for(i=0; i< (LEN -1);i++) // go along all the string to check if the 3 commas are there
{
switch(s[i])
{
case ',':
cantidad_comas++;
break;
default:
break;
}
}
if(cantidad_comas != 3)
{
return -1;
}
else // once checked, i fill in the struct in order to get it in the list
{
cantidad_comas = 0;
for(i=0;i<10;i++) // the first 10 bytes are for Code
{
aux = (NODO *)malloc(sizeof(NODO));
aux->codigo[i]=s[i];
}
while(cantidad_comas != 3) // between the second and third comma : it corresponds to Quantity
{
for(i=0;i<(LEN-1);i++)
{
switch(s[i])
{
case ',':
cantidad_comas++;
break;
default:
if(cantidad_comas == 2)
{
buff[i]=s[i];
}
break;
}
}
aux->cantidad = atoi(buff);
}
//so now i have aux->codigo and aux->cantidad filled with the file information
/////////////////////// TIme to do construct the list

if( H == NULL) //empty list
{
H=aux;
aux->next = NULL;
}
else
{
NODO *aux_2;
aux_2 = H;
while(aux_2->next != NULL ) // i have to check all along the list there is another struct with the same code
{
if( strcmp(aux_2->codigo,aux->codigo) == 0)
{
aux->cantidad += aux_2->cantidad;
}
aux_2 = aux_2->next;
}
aux->next = H;
H = aux;
}
}
}
}


31-01-2014 00:48
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Dios Sin conexión
Presidente del CEIT
.
********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 1.057
Agradecimientos dados: 32
Agradecimientos: 160 en 132 posts
Registro en: Dec 2011
Mensaje: #12
Re: Trabado con un tipo de ejercicios especifico de archivos
Buscate algo sobre strtok(), que te va a simplificar la parte en que buscás la coma. Es una función con un uso bastante particular, pero no es difícil. Directamente separa el string en pedazos según uno o más separadores, que en tu caso será la coma.
De hecho, para esta clase de cosas creo que te convendría leerte las funciones de la biblioteca string para ver qué te puede servir para ir simplificando. También las entradas formateadas.

«(…)Se arman paquetes… ¿eh?… tecnológicos… tecnológicos portes de… en donde están… este… interrelacionados con las otras capas.(…)»
(Este mensaje fue modificado por última vez en: 31-01-2014 01:23 por Dios.)
31-01-2014 01:18
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
luchovl2 Sin conexión
Presidente del CEIT
Dígame, Ingeniero.
********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 1.334
Agradecimientos dados: 24
Agradecimientos: 355 en 323 posts
Registro en: May 2009
Mensaje: #13
RE: Trabado con un tipo de ejercicios especifico de archivos
El primer for es medio rebuscado. Podés poner:

whlie( s[i] )
{
if( s[i++] == ',')
comas++;
}

Que no hace gran diferencia, pero creo que es más claro.

Y ese es todo el aporte que hago.

Tal vez convendría hacer una función para agregar un nodo a la lista. Tené en cuenta, de nuevo para un examen, que si no tenés tiempo podés poner "agregar_nodo(...)" y después escribir la función, si hay tiempo. Al menos así, se entiende lo que querías hacer.
En general conviene pensar todo funcionalizado.
(Este mensaje fue modificado por última vez en: 01-02-2014 00:39 por luchovl2.)
31-01-2014 02:06
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] luchovl2 recibio 1 Gracias por este post
nanohueso (31-01-2014)
nanohueso Sin conexión
Profesor del Modulo A
Thats what she said
*****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 239
Agradecimientos dados: 268
Agradecimientos: 30 en 20 posts
Registro en: Feb 2012
Mensaje: #14
RE: Trabado con un tipo de ejercicios especifico de archivos
(31-01-2014 01:18)Dios escribió:  Buscate algo sobre strtok(), que te va a simplificar la parte en que buscás la coma. Es una función con un uso bastante particular, pero no es difícil. Directamente separa el string en pedazos según uno o más separadores, que en tu caso será la coma.
De hecho, para esta clase de cosas creo que te convendría leerte las funciones de la biblioteca string para ver qué te puede servir para ir simplificando. También las entradas formateadas.

Si , gracias por el dato , estoy leyendo las funciones de string para asi poder simplificarlo un toque

Un saludo
31-01-2014 12:18
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Dios Sin conexión
Presidente del CEIT
.
********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 1.057
Agradecimientos dados: 32
Agradecimientos: 160 en 132 posts
Registro en: Dec 2011
Mensaje: #15
Re: Trabado con un tipo de ejercicios especifico de archivos
Lucho, la condición de tu while está mal. Avanza mientras no sea el carácter '\0' Y el carácter sea coma. En cuanto encuentre uno que no sea coma se sale del while.

s[i] == ',' tiene que ser la condición de un if interior al while.

«(…)Se arman paquetes… ¿eh?… tecnológicos… tecnológicos portes de… en donde están… este… interrelacionados con las otras capas.(…)»
(Este mensaje fue modificado por última vez en: 31-01-2014 15:01 por Dios.)
31-01-2014 14:59
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Buscar en el tema
Enviar respuesta 




Usuario(s) navegando en este tema: 1 invitado(s)