Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Texto Parte II PDF
Texto Parte II PDF
INDICE GENERAL
1
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
2
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
A diferencia de una variable normal (estática) que hace referencia directa al valor que
almacena, una variable puntero almacena la dirección de memoria del valor en la memoria,
es decir, realiza una referencia indirecta a los valores en la memoria. Los punteros sirven para
expresar direcciones de memoria y permiten modificar el contenido de la memoria a la que apuntan.
Cuando se trabaja con punteros son frecuentes los errores debidos a la creación de punteros
que apuntan a alguna parte inesperada, produciéndose una violación de memoria. Por lo
tanto, debe ponerse la máxima atención para que esto no ocurra, inicializando
adecuadamente cada uno de los punteros que utilicemos.
Para el trabajo o procesamiento de punteros existe dos operados especiales que permiten el
acceso a los valores almacenados en la memoria y la utilización de la dirección de memoria
donde se encuentran los valores.
3
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
Por ejemplo:
&p da como resultado la dirección de memoria de la variable p.
El resultado del operador ‘&’ se debe almacenar en una variable puntero o en una función
de salida.
Es un operador unitario que se aplica a un puntero. Dada una expresión de tipo puntero p, la
expresión ‘*p’ permite trabajar con la variable u objeto al que apunta p.
Por ejemplo:
El siguiente programa muestra el efecto resultante del uso de los operadores de dirección y
de indirección.
#include <stdio.h>
int void main()
{
//declaración de variables estáticas y dinamicas
int a = 5, b, *p;
p = &a; // asigna la dirección de a, a la variable p
// p apunta a la variable entera a
b = *p; // asigna a b el valor de la variable a (contenido de la
//variable p)
printf("en la dirección %.4X está el dato %d\n". p, b);
printf("En la dirección %.4X está el dato %d\n", p, *p);
return 0;
}
Tipo *var_puntero;
Donde Tipo especifica el tipo del objeto apuntado, puede ser cualquier tipo incluyendo
tipos definidos por el usuario y var_puntero es el identificador de la variable puntero.
Por ejemplo:
int a;
int *pt;
a) DIRECCIONES DE MEMORIA.
Por ejemplo:
int a=5,*p;
p=&a;
Sin importar el tipo de objeto al que apunta, a una variable puntero se le puede asignar la
constante NULL, esto significa que se tiene un puntero nulo, es decir, la variable puntero
no apunta a algo específico.
Por ejemplo:
int *pt;
5
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
float *pf;
pt=NULL;
pf=NULL;
En una variable puntero se puede almacenar el valor cero (0) y es equivalente a almacenar
la constante NULL. El almacenamiento del valor 0 es el único permitido de los valores
enteros que se puede almacenar en una variable puntero. El siguiente programa muestra
estas posbles formas de almacenamiento:
#include <stdio.h>
#include <iostream.h>
int a=5,*pt,*pt1,*pt2;
main()
{
pt=&a;
pt1=NULL;
pt2=0;
cout<<"direccion:"<<pt<<"\tvalor:"<<*pt<<endl;
cout<<"direccion:"<<pt1<<endl;
cout<<"direccion:"<<pt2<<endl;
return 0;
}
El trabajo con punteros permite realizar un conjunto de operaciones que exigen mucho
cuidado en la compatibilidad de los objetos a los que apuntan. Se pueden realizar las
siguientes operaciones:
6
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
1.3.1. ASIGNACION.
Dos variables puntero se pueden asignar solo si son punteros al mismo tipo de objeto, es
decir, las dos variables puntero deben ser compatibles.
Por ejemplo:
p=&a;
q=p;
int a=5,*pt;
float *pf;
pt=&a;
pf=pt; // error de incompatibilidad de tipo.
Como ‘pt’ y ‘pf’ son punteros a diferentes tipos de objetos, la asignación de ambas
variables produce un error.
Una Variable puntero, sea cualquiera el objeto al que apunta, se puede asignar con la
constante NULL (puntero nulo).
pt=NULL;
1.3.2. COMPARACION.
Dos variables puntero se pueden comparar solo sin son compatibles, es decir, si ambas
variables apuntan al mismo tipo de objeto. Cuando dos variables puntero se comparan solo
es útil el empleo de los operadores de relación igual que (==) y distinto que (!=), el empleo
de otros operadores no tiene sentido.
7
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
Por ejemplo:
int *p,*q;
…..
if (p==q)
……..
if (p!=q)
…….
Una Variable puntero, sea cualquiera el objeto al que apunta se puede comparar con la
constante NULL (puntero nulo).
if (p==NULL)
……..
if (p!=NULL)
……..
Las únicas operaciones aritméticas permitidas con punteros son el incremento o suma y el
decremento o resta. Tanto el incremento o decremento se realiza únicamente con valores
enteros. Se debe tomar en cuenta que la dirección de memoria almacenada en un puntero
está representada en sistema de numeración hexadecimal.
a) INCREMENTO O SUMA.
8
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
Por ejemplo:
int a=5,*pt;
pt=&a;
pt=pt+1; //pt apunta al en tero siguiente
pt=pt+3; //pt apunta al tercer entero más adelante
NOTA:
la operación de incremento es recomendable realizarla cuando se accede a
los valores de un arreglo unidimensional por medio de las direcciones de
memoria.
El incremento se realiza en sistema de numeración hexadecimal.
a) DECREMENTO O RESTA.
Por ejemplo:
int a=5,*pt;
pt=&a;
pt=pt-1; //pt apunta al entero anterior
pt=pt-3; //pt apunta al tercer entero más atrás
9
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
NOTA:
la operación de decremento es recomendable realizarla cuando se accede a
los valores de un arreglo unidimensional por medio de las direcciones de
memoria.
El decremento se realiza en sistema de numeración hexadecimal.
Existe una relación muy importante entre punteros y arreglos, por lo que es posible acceder
y procesar la información de un arreglo por medio de las direcciones de memoria del
arreglo sin necesidad de emplear la notación de sub índices.
Por ejemplo:
int a[5]={3,6,2,8,1};
int *pt;
pt=a; //pt apunta al primer elemento del arreglo ‘a’
cout<<*pt; //muestra el primer valor del arreglo ‘a’, 3
cout<<*(pt+1); // muestra el segundo valor del arreglo ‘a’, 6
cout<<*(pt+2); // muestra el tercer valor del arreglo ‘a’, 2
cout<<*(pt+3); // muestra el cuarto valor del arreglo ‘a’, 8
cout<<*(pt+4); // muestra el quinto valor del arreglo ‘a’, 1
10
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
#include <iostream.h>
int a[10]={5,2,8,1,4};
int a1[5][10]={{2,4,1},{8,1,3},{3,7,1}};
void imprimir(int x[],int y)
{
cout<<"\n CONTENIDO DEL VECTOR POR MEDIO DE DIR. DE MEMORIA";
int *pt;
pt=x;
int i;
for (i=0;i<y;i++)
cout<<"\nvalor="<<*(pt+i)<<"\tdir. de memoria="<<(pt+i);
}
void impmat(int x[][10],int f,int c)
{
int *pt;
int i,j;
cout<<"\n matriz por medio de dir. de memoria";
pt=x[0];
for (i=0;i<f;i++)
for (j=0;j<c;j++)
cout<<"\n valor="<<*((pt+i*10)+j)<<"\tdir. de memoria="<<((pt+i*10)+j);
}
main()
{
int i;
cout<<"\ncontenido del vector por medio de sub indices";
for (i=0;i<5;i++)
cout<<"\nvalor = " <<a[i];
imprimir(a,5);
impmat(a1,3,3);
int p=5,*pt;
float f=6.9,*pf;
char c='a',*pc;
cout<<"\ntamaño de un entero="<<sizeof(int);
cout<<"\ntamaño de un real="<<sizeof(float);
cout<<"\ntamaño de un caracter="<<sizeof(char);
cout<<"\ntamaño de un entero largo="<<sizeof(long);
cout<<"\ntamaño de un real doble="<<sizeof(double);
11
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
pt=&p;
pf=&f;
pc=&c;
cout<<"\nvalor de p="<<*pt<<"\t dir de memoeria="<<pt;
cout<<"\nvalor de f="<<*pf<<"\t dir de memoeria="<<pf;
cout<<"\nvalor de c="<<*pc<<"\t dir de memoeria="<<&pc;
pt=pt-2;
cout<<"\nnuevo valor de pt ="<<pt;
return 0;
}
NOTA: en el programa ejecutado, por la versión del IDE, el tamaño que ocupa un valor
entero en la memoria es de 2 bytes,.
La función ‘imprimir’ muestra el contenido del vector por medio de las direcciones de
memoria empleando una variable puntero.
Puesto que una cadena de caracteres es un array de caracteres, es correcto pensar que la
teoría expuesta anteriormente, es perfectamente aplicable a cadenas de caracteres.
12
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
char *cadena;
El identificador del array de caracteres es la dirección de comienzo del array y para que una
función manipuladora de una cadena de caracteres pueda saber dónde finaliza dicha cadena,
el compilador añade al final de la cadena el carácter ‘\0’.
#include <stdio.h>
int longcad(char *cad)
{
char *p = cad;
while (*p != '\0')
p++;
return (p - cad);
}
void main ( )
{
char *nombre = "abcd"; //el carácter de terminación '\0' se añade
automáticamente
printf(“\n la longitud de la cadena es: %d \n”,longcad(nombre));
}
El valor (p – cad) devuelto por la función longcad, da la longitud de la cadena. Esta función
realiza las siguientes operaciones:
1. Asigna a p la dirección del primer carácter de la cadena, que coincide con la dirección de
comienzo de la misma, e inicia la ejecución del bucle while.
2. Cuando se ejecuta la condición del bucle while, se compara el carácter *p apuntado por p
con el carácter nulo (\0). Si *p es el carácter nulo el bucle finaliza; si no, se incrementa el
valor de p en una unidad para que apunte al siguiente carácter, y se vuelve a evaluar la
condición.
13
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
Tipo_estructura *puntero;
struct persona
{
int ci;
char nombre[20];
float est;
};
Struct fecha
{
int dia;
int mes;
int anio;
};
El acceso a los miembros o campos de una estructura por medio del puntero se realiza
empleando el operador flecha (->).
Por ejemplo:
#include <iostream.h>
#include <stdlib.h>
14
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
struct fecha
{
int dd;
int mm;
int aa;
};
int main()
{
struct fecha *d;
d=(struct fecha *)malloc(sizeof(struct fecha));
leer(d);
imprimir(d);
return 0;
}
Notar que para usar un puntero se debe solicitar memoria dinámica por medio de la
función ‘malloc’.
15
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
Por ejemplo:
Definición:
Además:
16
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
Estructura de un nodo:
struct Nodo
{
int info;
Nodo *sig;
};
typedef Nodo *NNodo;
ADICION.
Se considera un nodo a insertar, con un puntero que apunte a él, y de una lista, en este
caso puede ser vacía o no vacía:
17
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
ELIMINACION.
RECORRIDO.
El recorrido es el acceso a todos los nodos sin afectar la estructura, se debe emplear una
variable puntero de apoyo ‘pt’.
BUSQUEDA.
struct Nodo
{
int info;
Nodo *sig;
};
typedef Nodo *NNodo;
class listasimple
{
Nodo *raiz;
public:
listasimple();
void crear();
int esvacia();
18
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
void adicion(int);
int eliminar();
NNodo buscar(int);
void recorrido();
};
#include <d:\sis2210a\listas\lisimple.h>
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
//funcion constrauctora asigna NULL a la variable 'raiz'
// crea la lista vacia (raiz=NULL)
listasimple::listasimple()
{
raiz=NULL; //la lista se crea vacia
};
Nodo *pt;
pt=raiz;
int dato;
dato=raiz->info;
raiz=raiz->sig;
free(pt);
return dato;
}
// la funcion buscar verifica si un valor esta o no en la lista
// retorna NULL si el valor no esta den la lista y retorna distinto a NULL
// si el valor esta en la lista.
NNodo listasimple::buscar(int valor)
{
Nodo *pt=raiz;
while (pt!=NULL && valor!=pt->info)
pt=pt->sig;
return pt;
}
//la funcion recorrido accede a todos los nodos de la lista
//con un proposito determinado sin modificar la lista.
void listasimple::recorrido()
{
Nodo *pt=raiz;
cout<<"\nCONTENIDO DE LA LISTA:\n";
while (pt!=NULL)
{
cout<<pt->info<<"--->";
pt=pt->sig;
};
cout<<"null\n";
}
#include <d:\sis2210a\listas\lisimple.cpp>
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
main()
{
listasimple li;
li.crear();
li.adicion(11);
li.adicion(8);
li.adicion(17);
li.recorrido();
20
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
int dat=li.eliminar();
cout<<"\n valor eliminado :"<<dat;
li.recorrido();
return 0;
}
21
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
ARCHIVOS
Todos los programas realizados hasta ahora obtenían los datos necesarios para su ejecución
de la entrada estándar (TECLADO) y visualizaban los resultados en la salida estándar
(PANTALLA). Por otra parte, el programa retiene los datos que manipula mientras esté en
ejecución; es decir, los datos introducidos se pierden cuando el programa finaliza.
La solución para hacer que los datos persistan de una ejecución para otra es almacenarlos
en un fichero o archivo en el disco, en vez de en un array en memoria. Entonces, cada vez
que se ejecute el programa que trabaja con esos datos, podrá leer del archivo los que
necesite y manipularlos. Nosotros procedemos de forma análoga en muchos aspectos de la
vida ordinaria; almacenamos los datos en fichas y guardamos el conjunto de fichas en 1o
que generalmente denominamos fichero o archivo.
2.1. DEFINICION.
22
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
NOMBRE.
EXTENSIÓN.
TAMAÑO.
LOCALIZACION O PATH.
PUNTERO DE LECTURA/ESCRITURA.
23
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
FIN DE ARCHIVO.
Al final del contenido de un archivo existe una marca de finalización EOF (End Of
File) que evita que se afecte otros sectores de memoria que no pertenecen al archivo.
24
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
a) CONSULTAS.
25
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
b) ACTUALIZACION.
Para poder escribir o leer sobre un fichero, primeramente hay que abrirlo. El fichero puede
ser abierto para leer, para escribir o para leer y escribir.
En C y en C++ abrir un fichero significa definir un stream (flujo) que permita el acceso al
fichero en el disco para leer o escribir. La definición del stream supone la definición de un
buffer (memoria intermedia) para conectar el stream con el fichero en el disco. Esto permite
referirse al stream como si fuera el fichero (más adelante veremos que un stream se define
como un puntero a una estructura de tipo FILE).
26
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
Para poder escribir o leer de un archivo, primeramente hay que abrirlo con las funciones
fopen o freopen. El fichero puede ser abierto para leer, para escribir o para leer y escribir.
Para la apertura de un archivo es necesario declarar un puntero a una estructura del tipo
FILE, este puntero se constituye en el stream que se emplea en el programa.
Por ejemplo:
FILE *arch;
fopen(“nombre-archivo”,”modo-aperttura”)
Por ejemplo:
el puntero ‘arch’ captura el resultado de la apertura del archivo ‘medicina.dat’ para el modo
de escritura (w) y en formato binario(b).
Los diferentes modos de apertura de un archivo o fichero son los que se ilustran en la
siguiente tabla:
27
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
La función fopen devuelve un puntero a una estructura de tipo FILE que define, entre otros
datos, el buffer asociado con el fichero abierto. Un puntero nulo indica un error en la
apertura. El puntero devuelto por fopen recibe el nombre de stream y es utilizado por las
funciones estándar de E/S para leer y escribir datos en un archivo. Por esta razon, antes de
invocar a la función fopen hay que definir un puntero que apunte a una estructura de tipo
FILE.
Por ejemplo:
FILE *arch;
arch = fopen("datos", "w");
if (arch== NULL)
printf("Error: el fichero no se puede abrir\n");
28
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
Por ejemplo:
fclose(arch);
El sistema incorpora una marca de fin de archivo EOF automáticamente cuando el archivo
es creado y si se intenta leer un archivo más allá de la marca de fin de archivo, entonces se
activa el indicador de fin de archivo.
La función ‘feof’ determina el estado del indicador de fin de archivo. La función feof
devuelve un valor distinto de 0 cuando se intenta leer un elemento del archivo y nos
encontramos con un eof (end of file - fin de fichero), en caso contrario devuelve un 0.
Por ejemplo:
while (!feof(arch)) // mientras no se llegue al final del archivo ‘arch’
….
29
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
Por ejemplo:
fseek(arch,0,SEEK_END);
Esta instrucción desplaza el puntero de L/E de ‘arch’ 0 bytes a partir del final del
archivo, es decir, lleva el puntero de L/E de ‘arch’ al final del archivo.
Si se desea conocer la posición actual del puntero de L/E del archivo se debe emplear la
función ‘ftell’. El valor o posición que retorna ‘ftell’ es un entero relativo al principio del
archivo.
Por ejemplo:
posi=ftell(arch);
Almacena en la variable ‘posi’ la posición actual del puntero de L/E del archivo
apuntado por arch.
Por ejemplo:
rewind(arch);
fseek(arch,0,SEEK_SET);
Generalmente los pasos 1 y 2 se realizan una vez pero los pasos 3, 4 y 5 se realizan cada
vez que se manipula la información del archivo.
a) CREACIÓN.
31
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
b) ADICION DE REGISTROS.
La adición de registros consiste en aumentar un registro a partir del final del archivo
y se debe considerar las siguientes acciones:
d) BUSQUE DE UN REGISTRO.
e) MODIFICACIÓN DE REGISTROS.
Esta operación se ejecuta muy pocas veces porque la información del registro
desaparece del archivo definitivamente. Regularmente solo se elimina físicamente
los registros que previamente han sido eliminados en forma lógica.
Un registro eliminado en forma lógica (inactivo) se puede restaurar para que este
activo nuevamente, esto significa que se debe almacenar 1 en el campo estado.
33
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
Código
Nombre
Precio
Procedencia
Estado
2. ESQUEMA DE LA CLASE
34
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
3. IMPLEMENTACION.
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
#include <e:/jcbv/materia/sis2210/sis2210prog/archivosc++/farmacia.h>
//CREACION DE UN ARCHIVO
//EL ARCHIVO SE CREA VACIO.
void farmacia::crear()
{
arch=fopen("e:/jcbv/materia/sis2210/sis2210prog/archivosc++/medicina.dat","wb");
if (arch==NULL)
cout<<"\n ERROR EN LA APERTURA DEL ARCHIVO\n";
else
35
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
cout<<"\n ARCHIVO CREADO CON EXITO, FELICIDADES\n";
cout<<"\n presione cualquier tecla para continuar: ";
getch();
}
//ADICION DE REGISTRO.
//ADICIONA UN REGISTRO A PARTIR DEL FINAL DEL ARCHIVO
void farmacia::adicion()
{
producto reg;
arch=fopen("e:/jcbv/materia/sis2210/sis2210prog/archivosc++/medicina.dat","ab+");
if (arch==NULL)
cout<<"\n ERROR EN LA APERTURA DEL ARCHIVO\n";
else
{
clrscr();
cout<<"\n ADICION DE UN REGISTRO EN EL ARCHIVO\n";
cout<<"\n codigo del MEDICAMENTO:";
cin>>reg.cod;
cout<<"\n NOMBRE del MEDICAMENTO:";
cin>>reg.nombre;
cout<<"\n PRECIO del MEDICAMENTO:";
cin>>reg.precio;
cout<<"\n PROCEDENCIA del MEDICAMENTO 0:NACIONAL; 1: IMPORTADO:";
cin>>reg.proced;
reg.estado=1;
fwrite(®,sizeof(struct producto),1,arch);
cout<<"\nregistro grabado con exito\n";
fclose(arch);
getch();
};
}
36
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
cout<<"\n===================================================";
cout<<"\npresione cualquier tecla para continuar:";
getch();
fclose(arch);
};
}
};
cout<<"\n===================================================";
cout<<"\npresione cualquier tecla para continuar:";
getch();
fclose(arch);
};
}
37
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
else
res=ftell(arch)-sizeof(struct producto);
fclose(arch);
}; return res;
}
38
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
{
arch=fopen("e:/jcbv/materia/sis2210/sis2210prog/archivosc++/medicina.dat","rb+");
if (arch==NULL)
cout<<"\n ERROR EN LA APERTURA DEL ARCHIVO\n";
else
{
clrscr();
cout<<"\n CONTENIDO ACTUAL DEL REGISTRO EN EL ARCHIVO\n";
fseek(arch,res,SEEK_SET);
fread(®,sizeof(producto),1,arch);
cout<<"\nCODIGO NOMBRE PRECIO PROCDEDENCIA ESTADO";
cout<<"\n===================================================";
cout<<"\n"<<reg.cod<<" "<<reg.nombre<<" "<<reg.precio<<" "<<reg.proced<<"
"<<reg.estado;
cout<<"\n===================================================";
cout<<"\npresione cualquier tecla para continuar:\n";
getch();
reg.estado=0;
fseek(arch,res,SEEK_SET);
fwrite(®,sizeof(struct producto),1,arch);
cout<<"\nregistro eliminado exito\n";
fclose(arch);
};
};
getch();
}
// eliminacion fisica de registros
// solo se elimina los registros eliminados en forma logica
void farmacia::elifisica()
{
producto reg;
FILE *ft;
arch=fopen("e:/jcbv/materia/sis2210/sis2210prog/archivosc++/medicina.dat","rb");
ft=fopen("e:/jcbv/materia/sis2210/sis2210prog/archivosc++/medicina.tmp","wb");
if (arch==NULL || ft==NULL)
cout<<"\n ERROR EN LA APERTURA DEL ARCHIVO\n";
else
{
clrscr();
cout<<"\n ELIMINACION FISICA DE REGISTROS\n";
fread(®,sizeof(struct producto),1,arch);
while (!feof(arch))
{
if (reg.estado==1)
fwrite(®,sizeof(struct producto),1,ft);
fread(®,sizeof(struct producto),1,arch);
};
cout<<"\nse han copiado satisfactoriamente los registros al archivo temporal\n";
cout<<"\npresione cualquier tecla para continuar:";
getch();
fclose(arch);
fclose(ft);
char cad[100],cad1[100];
strcpy(cad,"e:/jcbv/materia/sis2210/sis2210prog/archivosc++/medicina.dat");
strcpy(cad1,"e:/jcbv/materia/sis2210/sis2210prog/archivosc++/medicina.tmp");
39
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
remove(cad);
rename(cad1,cad);
};
}
40
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
cout<<"\n===================================================";
cout<<"\n"<<reg.cod<<" "<<reg.nombre<<" "<<reg.precio<<" "<<reg.proced<<"
"<<reg.estado;
cout<<"\n===================================================";
reg.estado=1;
fseek(arch,res,SEEK_SET);
fwrite(®,sizeof(struct producto),1,arch);
cout<<"\nregistro restaurado con exito\n";
fclose(arch);
};
};
getch();
}
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <e:/jcbv/materia/sis2210/sis2210prog/archivosc++/farmacia.cpp>
int main()
{
farmacia f;
int op,clave;
do {
clrscr();
cout<<"\n PROCEAMIENTO DE ARCHIVOS DIRECTOS";
cout<<"\n ======================================";
cout<<"\n 1: CREACION DEL ARCHIVO VACIO";
cout<<"\n 2: ADICION DE REGISTROS";
cout<<"\n 3: REPORTE GENERAL DE REGISTROS ACTIVOS";
cout<<"\n 4: REPORTE DE REGISTROS INACTIVOS";
cout<<"\n 5: REPORTE DE UN REGISTRO ESPECIFICO";
cout<<"\n 6: MODIFICACION DE REGISTROS";
cout<<"\n 7: ELIMINACION LOGICA";
cout<<"\n 8: ELIMINACION FISICA !!!!!";
cout<<"\n 9: RESTAURAR REGISTROS";
cout<<"\n 10: SALIR DE LA APLICACION";
cout<<"\n ======================================";
cout<<"\n ELIJA LA TAREA A REALIZAR : ";
cin>>op;
switch (op)
{
case 1: f.crear();break;
case 2: f.adicion();break;
case 3: f.reporte();break;
case 4: f.reportei();break;
case 5: clrscr();
cout<<"\ncodigo del medicamento:";
cin>>clave;
f.reporteesp(clave);
break;
case 6: clrscr();
cout<<"\ncodigo del medicamento a modificar:";
41
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
cin>>clave;
f.modificar(clave);
break;
case 7: clrscr();
cout<<"\ncodigo del medicamento a eliminar:";
cin>>clave;
f.elilogica(clave);
break;
case 8: clrscr();
f.elifisica();
break;
case 9: clrscr();
cout<<"\ncodigo del medicamento a RESTAURAR:";
cin>>clave;
f.restaurar(clave);
break;
};
} while (op<10);
return 0;
}
42
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
43
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas
Metodología de la Programación
BIBLIOGRAFIA
44
_____________________________________________________________________________
M.Cs. Ing. Julio Cesar Bermúdez Vargas