[C con Clase] Una pequeña duda con los ficheros

Marcos Collado Martín marquitos.mcm en gmail.com
Mar Abr 24 21:16:32 CEST 2012


Perdonen, no sabía que saldría asi de mal, lo pongo aqui:

http://paste2.org/p/1993316
Y lo que puse debajo es esto:

En la búsqueda binaria, a ver me explico:
Pongo el ejemplo de que tenemos en la variable sup = 10, entonces resuelvo
la ecuación para averiguar n -> n = 0 + (10 - 0) /2 = 5, bien ahora tengo n
= 5, pero resulta que en ese registro no está lo que busco y ese teléfono
es menor que el teléfono que yo he puesto, entonces a inf le daríamos el
valor de n + 1 ( en nuestro caso 6) y vuelvo a pasar por la ecuación y lo
que pasa es que si la hago: n = 6 + ( 10 - 6) / 2 = 5, es otra vez 5 porque
sí sumo y resto el mismo número al final queda el mismo número, no se si me
explico.
Ahora si el telefono de ese registro es mayor que el que he puesto yo sería
sup = n -1, hay si cambía ya el resultado de la ecuación.

Espero que alguien sepa si es así porque es así ( y me lo explique si es
posible) o si esta mal como pienso yo.

Un saludo y gracias :)

El 24 de abril de 2012 21:14, Marcos Collado Martín <marquitos.mcm en gmail.com
> escribió:

> Hola, bueno estuve leyendo el cursillo de los ficheros ya que no tenía
> mucha idea de estos y ví un algoritmo al que no le veia mucho sentido, o es
> que lo veo mal ( que seguramente que sea eso): esta en este tema:
> http://c.conclase.net/ficheros/index.php?cap=007#inicio en el ejemplo que
> viene abajo del todo.
> En esta función:
>
> // Lee el registro desde el fichero de datos con el teléfono dadovoid Leer(FILE <http://c.conclase.net/librerias/?ansitip=FILE> *fa, stRegistro &reg, char *telefono)
> {
>    FILE <http://c.conclase.net/librerias/?ansitip=FILE> *fi;
>    stIndice ind;
>    long inf, sup, n, nRegs;
>
>    fi = fopen <http://c.conclase.net/librerias/?ansifun=fopen>("indices.ind", "rb");
>    fseek <http://c.conclase.net/librerias/?ansifun=fseek>(fi, 0, SEEK_END <http://c.conclase.net/librerias/?ansimac=SEEK_END>);
>    nRegs = ftell <http://c.conclase.net/librerias/?ansifun=ftell>(fi)/sizeof(stIndice);
>    // Búsqueda binaria:
>    inf = 0;
>    sup = nRegs-1;
>    do {
>       n = inf+(sup-inf)/2;
>       fseek <http://c.conclase.net/librerias/?ansifun=fseek>(fi, n*sizeof(stIndice), SEEK_SET <http://c.conclase.net/librerias/?ansimac=SEEK_SET>);
>       fread <http://c.conclase.net/librerias/?ansifun=fread>(&ind, sizeof(stIndice), 1, fi);
>       if(strcmp <http://c.conclase.net/librerias/?ansifun=strcmp>(ind.telefono, telefono) < 0) inf = n+1;
>       else sup = n-1;
>    } while(inf <= sup && strcmp <http://c.conclase.net/librerias/?ansifun=strcmp>(ind.telefono, telefono));
>    // Si se encontró el teléfono, lee el registro, si no muestra mensaje.
>    if(!strcmp <http://c.conclase.net/librerias/?ansifun=strcmp>(ind.telefono, telefono)) {
>       fseek <http://c.conclase.net/librerias/?ansifun=fseek>(fa, ind.indice*sizeof(stRegistro), SEEK_SET <http://c.conclase.net/librerias/?ansimac=SEEK_SET>);
>       fread <http://c.conclase.net/librerias/?ansifun=fread>(&reg, sizeof(stRegistro), 1, fa);
>    }
>    else {
>       reg.valido = 'N';
>       printf <http://c.conclase.net/librerias/?ansifun=printf>("Registro no encontrado\n");
>    }
>    fclose <http://c.conclase.net/librerias/?ansifun=fclose>(fi);
> }
>
>
> En la búsqueda binaria, a ver me explico:
> Pongo el ejemplo de que tenemos en la variable sup = 10, entonces resuelvo
> la ecuación para averiguar n -> n = 0 + (10 - 0) /2 = 5, bien ahora tengo n
> = 5, pero resulta que en ese registro no está lo que busco y ese teléfono
> es menor que el teléfono que yo he puesto, entonces a inf le daríamos el
> valor de n + 1 ( en nuestro caso 6) y vuelvo a pasar por la ecuación y lo
> que pasa es que si la hago: n = 6 + ( 10 - 6) / 2 = 5, es otra vez 5 porque
> sí sumo y resto el mismo número al final queda el mismo número, no se si me
> explico.
> Ahora si el telefono de ese registro es mayor que el que he puesto yo
> sería sup = n -1, hay si cambía ya el resultado de la ecuación.
>
> Espero que alguien sepa si es así porque es así ( y me lo explique si es
> posible) o si esta mal como pienso yo.
>
> Un saludo y gracias :)
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20120424/2a5c4294/attachment.html>


Más información sobre la lista de distribución Cconclase