UTNianos

Versión completa: [Pedido] Final Info 1 24/02/15
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola, que tal, alguno que haya rendido esta semana, sabe de los ejercicios que se tomaron el martes en el final de info 1?
La estoy preparando para esta semana que viene, y queria saber bien que tomaron, si volvieron a tomar lo de punteros a función o la teoría también.

Gracias y saludos
Por suerte no tomaron forreadas como puntero a funcion esta vez, fue como siempre toman. Esto me lo paso un amigo, aprobo con 6, ojala tomen asi la fecha que viene, yo tambien rindo ahi
Gracias leme!!! Ahora voy a tratar de hacerlo a ver que sale, esperemos que tomen asi normal
A mi me dieron una paliza, claramente no la prepare tan bien por que la mayoria aprobo. Espero a que alguno suba la resolucion para sacarme algunas dudas, mientras sigo estudiando.
Bueno, despues de como 3hs programando (si ya se, no soy una luz en programacion) pude "resolver" el final, el tema es que no puedo compilarlos por que tengo un lio en la cabeza en como hacer el main para el ejercicio 1 y 2, y en el tercero no puedo terminar de hacerlo andar.


EJ 1-2


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

typedef struct {

char *sx;
int val, code, qtty;
char abc [20];

} ST_DAT;

typedef struct xyz {

ST_DAT *st;
struct xyz *sig, *ant;

} ST_XYZ;


typedef ST_XYZ* stPtr;

void extract (ST_XYZ **P, ST_XYZ **Q, ST_DAT **sp, void *key, int (*pfun)(ST_DAT *, void*));


void extract (ST_XYZ **P, ST_XYZ **Q, ST_DAT **sp, void *key, int (*pfun)(ST_DAT *, void*))
{

stPtr anterior, actual, auxiliar;
int comp;

comp = (*pfun)(*sp,&key); //Busco el nodo en la lista

if((*pfun)(*sp,&key)) //El nodo es el primero de la lista
{
auxiliar = *P; //Guardo el nodo a eliminar
*P = (*P)->sig; //Apunto P al siguiente nodo
(*P)->ant = NULL; //Apunto el anterior a NULL
(*auxiliar).st = *sp; //Guardo el contenido en SP.
free(auxiliar);

}else{ //Sigo buscando

anterior = *P;
actual = (*P)->sig;

while (actual != NULL && !(*pfun)(*sp,&key)) //Me desplazo hasta encontra el nodo o llegar al final de la lista.
{
anterior = actual;
actual = actual->sig;
actual->ant = anterior;

}

if(actual != NULL) //Encontre el nodo, si actual == NULL entonces el nodo no estaba
{
auxiliar = actual;
anterior->sig = actual ->sig;
anterior->sig->ant = anterior;
free (auxiliar);

}else{
sp = NULL; //Como no encontre el nodo en la lista sp = NULL
}
}
}

//LA FUNCION DE COMPARACION RETORNARA 1 CUANDO SX COINCIDA CON EL PARAMETRO KEY DE BUSQUEDA
int compare(ST_DAT *stData, void *key)
{
//Busco en todos los valores
//if(*(int *)key == stData->val ||*(int *)key == stData->code || *(int *)key == stData->qtty || strcmp(*(char*)key,stData->sx) || strcmp(*(char *)key,stData->abc))

if (!strcmp(*(char*)key,stData->sx)) //Casteo KEY como CHAR*, y lo comparo con SX, si son iguales strcmp devuelve cero, entonces uso ! para que se cumpla la condicion.
{
return 1; //Encontre el valor en la estructura
}else{
return 0; //No encontre el valor en la estructura
}
}




Hasta aca el 1 y 2, en el segundo tengo comentado una forma de comparar con cualquier valor en la estructura, estaria correcto de esa forma?

EJ 3


int read_param (char *sFile, char *sSec, char *sPar, char *sRet, int ilen)
{
FILE *fp;
int aux, i;
char *strAux,*strAux2;

fp = fopen (sFile,"r");

if(fp == NULL)
{
printf("Error al abrir el archivo\n");
return (-1);
}else{
while(!feof(fp)) //Mientras no termine el archivo
{
fscanf (fp,"%s",strAux); //Leo una linea del archivo
if(!strcmp(strAux,sSec)) //Si encontre la seccion
{
for(i=0; i<2; i++)
{
*strAux = fscanf(fp,"%s",strAux); //Leo la cadena
*strAux2 = strtok (strAux,"="); //Guardo en strAux2 los caracteres hasta el =
if (!strcmp(strAux2,sPar))
{
*strAux2 = strtok (NULL,"\r"); //Guardo en strAux2 los datos desde el = hasta que termina la linea
if(strlen(strAux2>ilen))
{
fclose(fp);
return (-3);
}else{
sRet = strncpy(sRet,strAux2,ilen);
printf("Parametro: %s\n",sRet);
fclose(fp);
return (strlen(sRet)); //Devuelvo el valor
}

}
}

}else{ //No encontro la seccion
fclose(fp);
return (-2);
}

}
fclose(fp);
}

}



Aca es donde tengo mas inconvenientes, todavia tengo problemas con el manejo de las instrucciones de manejo de archivos y strings, mas que nada en cuando usar el puntero. De todas formas se me complica mucho pensar en como resolver el ejercicio, no encuentro forma mas simple (hacer esto en final me lo imagino imposible). Estoy intentando debuggear un archivo .ini pero no puedo hacer que solo lea el texto como indica el final. Alguien me da una mano viendo los codigos? Mil gracias.
Aca te dejo para el 1 y el 2, lo que hice yo, funciona bien y tiene el main, lo unico que cambie es char *sx por char sx[20] . Porque no sabia bien donde lo tenia que malloquear para que no me tire error, pero bueno es para mostrar mas o menos como lo hice yo. ojala te sirva y cualquier cosa escucho preguntas,sugerecias

Saludos


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


typedef struct hola
{
char sx[20];
int val,code,qtty;
char abc [20];
} ST_DAT;

typedef struct xyz
{
ST_DAT *st;
struct xyz *sig,*ant;
} ST_XYZ;

void agregar (ST_XYZ **pp,ST_XYZ **uu);
void show (ST_XYZ * List);
void extract (ST_XYZ **pp,ST_XYZ **uu,ST_DAT **sp,void *key,int (*pfun) (ST_DAT *,void *));
int pfun (ST_DAT *nodo,void *key);

int main (void)
{

struct ST_XYZ *pp=NULL;
struct ST_XYZ *uu=NULL;
ST_DAT *sp=NULL;
char o='y';

while(o=='y')
{
printf("Agregar nodo\n");
agregar (&pp,&uu);
printf("Si desea agregar otro nodo ingrese 'y'\n");//agrego nodos hasta que me ingresen cualquier letra
scanf(" %c",&o); //solo agrego sx, no todos los campos
}

show(pp); //muestro mi lista
void *key;
key="hola"; //elegi la palabra hola como key arbitrario

int (*pfun2)(ST_DAT *nodo,void *key)=&pfun; //puntero a funcion lo a punto a la funcion

extract (&pp,&uu,&sp,key,pfun2);
show(pp);
printf("%s\n",sp->sx); //muestro el sx, para ver que realmente se copio

return 0; //si no encunetra coincidencia, apunta a NULL
//pero va ahaber SERGMENTATION FAULT POR el printf
}

int pfun (ST_DAT *nodo,void *key)
{
int r;
r=strcmp(nodo->sx,(char*)key);

if(r==0)
{
printf("Hay coincidencia\n");
r=1;
return r;
}
else
{
printf("No hay coincidencia\n");
r=0;
return r;
}

}
void extract (ST_XYZ **pp,ST_XYZ **uu, ST_DAT **sp,void *key,int (*pfun) (ST_DAT *,void *))
{
int flag=0;
*sp=NULL;
ST_XYZ *aux,*aux2;
aux=*pp;


while(aux!=NULL && flag==0)
{
flag=pfun(aux->st,key);

if(flag==1)
{
if(aux==*pp)
{
*sp=aux->st;
aux->sig->ant=NULL;
*pp=aux->sig;
printf("Primer nodo eliminado\n");
aux2=aux;
free(aux2);
}
else
{
*sp=aux->st;
aux->ant->sig=aux->sig;
aux->sig->ant=aux->ant;
printf("Nodo eliminado\n");
aux2=aux;
free(aux2);
}

if(aux==*uu)
{

*sp=aux->st;
*uu=aux->ant;
(*uu)->sig=NULL;
printf("Ultimo nodo eliminado\n");
aux2=aux;
free(aux2);

}

}
aux=aux->sig;
}


}


void agregar (ST_XYZ **pp,ST_XYZ **uu)
{
ST_XYZ *aux;
ST_DAT *nuevo;

aux=*pp;


if(*pp==NULL)
{

*pp= (ST_XYZ *) malloc(sizeof(ST_XYZ));
nuevo= (ST_DAT *) malloc(sizeof(ST_DAT));
(*pp)->st=nuevo;

printf("Agregar sx en el primer nodo\n");
scanf(" %s",&((*pp)->st->sx));
(*pp)->sig=NULL;
(*pp)->ant=NULL;
(*uu)=*pp;

}
else
{
while(aux->sig!=NULL)
{
aux=aux->sig;
}

aux->sig= (ST_XYZ *) malloc(sizeof(ST_XYZ));
nuevo= (ST_DAT *) malloc(sizeof(ST_DAT));

(*uu)=aux->sig;
(*uu)->st=nuevo;
aux->sig=*uu;
(*uu)->ant=aux;
(*uu)->sig=NULL;


printf("Agregar sx en nodo\n");
scanf(" %s",&((*uu)->st->sx));

}


}

void show (ST_XYZ * List)
{

while(List !=NULL)
{


printf("sx: %s\n",(List->st->sx));


List=(List->sig);
}
}

rockstiff, ahi hice el numero 3, te lo paso, al parecer funciona bien, lo unico que lo hice dentro del main por fiaca pero es lo mismo. No supe que era el error de -3, pero lo demas esta andando.

Consultame o decime cualquier cosa, ojala te sirva.Saludos

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int sec_compare(char *t,char *Sec);

int main()
{

char *sPar;
char *sFile;
char *sSec;
char *sRet;
int ilen;
sPar= (char *) malloc (20);
sFile= (char *) malloc (20);
sSec= (char *) malloc (20);
sRet= (char *) malloc (20);

printf("Ingrese archivo\n");
scanf("%s",sFile);
printf("Ingrese Seccion\n");
scanf("%s",sSec);
printf("Ingrese parametro\n");
scanf(" %s",sPar);


FILE *ptr;
char *t=NULL;
t= (char *) malloc (20);
char *l=NULL;
int r;


ptr=fopen(sFile,"r");

if(ptr==NULL)
{
printf("Error al abrir el archivo\n"); //Verifico error de archivo
return (-1);
}
else
{

while(!feof(ptr))
{
fscanf(ptr,"%s",t); //escaneo el archivo y comparo si es seccion valida

if((r=sec_compare(t,sSec))==1)
{
printf("\nSeccion: %s\n",t); // muestro la seccion valida
fscanf(ptr,"%s",t); //escaneo proxima palabra

while(!feof(ptr) && *t!='[' )
{ //si no es seccion ni fin de archivo

l=strtok(t,"="); //Obtengo el nombre del parametro
if(strcmp(l,sPar)==0) //Chequeo si es el mismo que me pasan
{
printf("Parametro:%s\n",l);
printf("Encontrado\n");
l = strtok( NULL, " " ); //Devuelve el valor del parametro
printf("Valor:%s\n",l);
strcpy(sRet,l); //Lo copia en el char* que me dan
ilen=sizeof(sRet); //Calcula lo que ocupa

printf("\nSret %s\n",sRet); //Muestro para verficar
printf("Ilen:%d bytes\n",ilen);
return 0;
}

fscanf(ptr,"%s",t);//Sigue buscando parametros dentro de la seccion
}

}
}
}

return (-2); //No encontro el parametro y seccion buscadas, devuelve error
}



int sec_compare(char *t,char *Sec)
{
int i,j;
i=strlen(t)-1; //Calcula largo del nombre de la seccion ingresado menos 1 para usarlo
j=strlen(Sec); //Calcula largo del nombre de la seccion

if(*t=='[' && *(t+i)==']' && (i-1)==j) //Chequeo que sea una seccion y que al menos
{ //los largos sean iguales
i=1;
j=0;
while(*(t+i)!=']')
{
//Comparo nombres de las secciones
if(*(t+i)==*(Sec+j))
{
return 1;
}

}
}

return 0;
}

(02-03-2015 16:37)lenny33 escribió: [ -> ]rockstiff, ahi hice el numero 3, te lo paso, al parecer funciona bien, lo unico que lo hice dentro del main por fiaca pero es lo mismo. No supe que era el error de -3, pero lo demas esta andando.

Consultame o decime cualquier cosa, ojala te sirva.Saludos

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int sec_compare(char *t,char *Sec);

int main()
{

char *sPar;
char *sFile;
char *sSec;
char *sRet;
int ilen;
sPar= (char *) malloc (20);
sFile= (char *) malloc (20);
sSec= (char *) malloc (20);
sRet= (char *) malloc (20);

printf("Ingrese archivo\n");
scanf("%s",sFile);
printf("Ingrese Seccion\n");
scanf("%s",sSec);
printf("Ingrese parametro\n");
scanf(" %s",sPar);


FILE *ptr;
char *t=NULL;
t= (char *) malloc (20);
char *l=NULL;
int r;


ptr=fopen(sFile,"r");

if(ptr==NULL)
{
printf("Error al abrir el archivo\n"); //Verifico error de archivo
return (-1);
}
else
{

while(!feof(ptr))
{
fscanf(ptr,"%s",t); //escaneo el archivo y comparo si es seccion valida

if((r=sec_compare(t,sSec))==1)
{
printf("\nSeccion: %s\n",t); // muestro la seccion valida
fscanf(ptr,"%s",t); //escaneo proxima palabra

while(!feof(ptr) && *t!='[' )
{ //si no es seccion ni fin de archivo

l=strtok(t,"="); //Obtengo el nombre del parametro
if(strcmp(l,sPar)==0) //Chequeo si es el mismo que me pasan
{
printf("Parametro:%s\n",l);
printf("Encontrado\n");
l = strtok( NULL, " " ); //Devuelve el valor del parametro
printf("Valor:%s\n",l);
strcpy(sRet,l); //Lo copia en el char* que me dan
ilen=sizeof(sRet); //Calcula lo que ocupa

printf("\nSret %s\n",sRet); //Muestro para verficar
printf("Ilen:%d bytes\n",ilen);
return 0;
}

fscanf(ptr,"%s",t);//Sigue buscando parametros dentro de la seccion
}

}
}
}

return (-2); //No encontro el parametro y seccion buscadas, devuelve error
}



int sec_compare(char *t,char *Sec)
{
int i,j;
i=strlen(t)-1; //Calcula largo del nombre de la seccion ingresado menos 1 para usarlo
j=strlen(Sec); //Calcula largo del nombre de la seccion

if(*t=='[' && *(t+i)==']' && (i-1)==j) //Chequeo que sea una seccion y que al menos
{ //los largos sean iguales
i=1;
j=0;
while(*(t+i)!=']')
{
//Comparo nombres de las secciones
if(*(t+i)==*(Sec+j))
{
return 1;
}

}
}

return 0;
}


Venia bien encaminado, por lo pronto fallaba en asignarle memoria a los char* y en identificar bien las secciones. Ya de ahi pude hacer bien el tema de separar los parametros aunque tomando el archivo literal de "1 seccion, 3 parametros" y repetir.

Son estos detalles los que me preocupan, como en un par de finales hay que interpretar cadenas de cierta forma especifica y ahi es donde fallo mas que nada creo.

Gracias!
URLs de referencia