Está en la página 1de 27

Introducción a la programación

Dra. Ofelia Delfina Cervantes – Sección 6

Proyecto Final – Agenda Electrónica

Eckamn Rodríguez García 159564


Jorge Lazcano Vázquez 154188

Lunes 10 de diciembre de 2018


Agenda electrónica con manejo de archivos .txt

1. Descripción del algoritmo y problemas que resuelve.


Este algoritmo nos permite administrar una lista de contactos a partir de la lectura del
archivo contactos.txt con 5 contactos ya declarados previamente. Para cada contacto se
conoce su nombre de pila, apellido paterno, apellido materno, sexo, fecha de nacimiento,
ciudad de nacimiento, numero celular y correo electrónico. Estos se agruparon en una
estructura de tipo contacto en el programa.

Mediante el uso de funciones y procedimientos se permite mostrar la lista ordenada


(usando ordenamiento por selección) por nombre, apellido paterno, apellido materno,
edad y lugar de nacimiento. Adicionalmente, se permite agregar un nuevo contacto o
eliminarlo, además de buscar un contacto a partir del apellido paterno (mediante
búsqueda binaria) y modificar el correo electrónico o el teléfono de cualquier contacto.

2. Pseudocódigo de las de funciones/procedimientos y explicación

Procedimiento que permite desplegar los contactos: Se declaran el vector x de tipo


contacto y la variable n que referencia el tamaño del vector. Después de declarar el
contador se muestra el mensaje “Aquí está tu lista de contactos: “. Posteriormente se abre
un ciclo for que va de 0 hasta n, el cual imprime los datos de cada contacto guardado en la
agenda. Finaliza el ciclo y el procedimiento.

void desplegar (struct contacto x[], int n) {

i=0;

Imprimir “Aquí está tu lista de contactos:”

Para i=0 hasta n

Imprimir “numero”;
Imprimir “nombre”;

Imprimir “pateno”;

Imprimir “materno”;

Imprimir “nacimiento”;

Imprimir “edad”;

Imprimir “lugar”;

Imprimir “correro”;

Imprimir “telefono” } }

Procedimiento que permite agregar un nuevo contacto a la lista: Se declaran el vector x


de tipo contacto y la variable k que referencia el tamaño del vector. Se muestra el
mensaje “Registra los datos del contacto para agregarlo” y e pregunta al usuario cada uno
de los datos y se van guardando hasta que finalice el procedimiento.

void agregar (struct contacto x[], int k){

Imprimir “Registra los datos del contacto para agregarlo”;

Incrementar variable x[n]. numero= n+1

Imprimir “Nombre de pila:”;

Leer “nombre”;

Imprimir “Apellido Paterno:”;

Leer “paterno”;

Imprimir “Apellido Materno:”;

Leer “materno”;
Imprimir “Fecha de nacimiento:”;

Leer “nacimiento”;

Imprimir “Lugar de nacimiento:”;

Leer “lugar”;

Imprimir “Correo electrónico:”;

Leer “correo”;

Imprimir “Teléfono:”;

Leer “teléfono”; }

Procedimiento para eliminar un contacto: Se declaran el vector x de tipo contacto y la


variable n que referencia el tamaño del vector, así como el posicionador entero “donde”.
Posteriormente, para eliminar y buscar la posición en donde se encuentra el contacto
usamos la variable i previamente declarada. Se abre el ciclo for que va de donde a n-1, al
recorrerse se elimina un contacto y finaliza el procedimiento.

void eliminar (struct contacto x[], int donde, int n) {

int I;

Para i=donde hasta n-1

ax[i]=x[i+1] } }

Función para buscar la posición de un contacto: Se declaran el vector x de tipo contacto y


la variable n que referencia el tamaño del vector, así como la variable entera “numerox”.
Se declaran las variables que se utilizan en la búsqueda binaria y se usan para buscar al
contacto. La función regresa la posición donde se encuentra.

int buscarnumero (struct contacto x [], int numerox, int n) {

Variables:
Int primero, centro, posición=-1, ultimo;

Primero=0

Ultimo=n-1

Mientras (primero <=ultimo) {

centro=(primero+ultimo)/2;

Si (x[mitad].numero == numerox){

posición = centro; primero=n+1; }

Sino {

Si (numerox < x[mitad].numero)

Sino

prim=centro+1;} }

Regresar a (posición); };

Función para buscar la posición de un contacto y su apellido paterno: Se declaran el


vector x de tipo contacto y la variable n que referencia el tamaño del vector, así como la
variable char “nom” donde se encuentran los apellidos. Se declaran las variables que se
utilizan en la búsqueda binaria y se usan para buscar al contacto. La función regresa la
posición donde se encuentra.

int buscarcontacto(struct contacto x[], char nom[20], int n ){

int centro, prim, ult;

int posicion=-1;

prim=0;

ult=n-1;
Mientras (prim<=ult) {

Centro=(prim+ult)/2;

Si (char(a[centro].apaterno, nom);== 0) {

posicion=centro;

prim=n+1;}

Sino{

Si(char(a[centro].aPaterno, nom);< 0)

ult=centro-1;

Sino

prim=centro+1; } }

return (posicion);

Procedimiento para buscar un contacto por apellido paterno: Se declaran el vector x de


tipo contacto y la variable k que referencia el tamaño del vector, se utilizarán los datos de
una estructura y el número de contactos, previamente declarando las variables otro=1,
donde, y buscado. Se abre un ciclo do-while, en el cual se preguntará al usuario el apellido
del contacto a buscar y se guardará en la variable buscado. Se le asigna un valor a donde
(que es la posición donde está el contacto a buscar) llamando a la función buscar
contacto, dándole los valores de un vector, el apellido del contacto y el número de
contacto. Se declara un if el cual, si es menor que 0, es decir no tiene un valor de posición,
se muestra al usuario “El contacto no existe, por favor ingresa otro”, y se le da el valor de
1 a otro, por lo tanto, el usuario podrá buscar otro contacto. Si no es así, teniendo el valor
de la posición donde se encuentra el contacto a buscar, se muestra al usuario todos los
datos del contacto que buscó. Se le asigna a otro el valor de 0.

void buscarapellido(struct contacto x[ ], int n){


int otro=1, donde;

letras buscado [20];

hacer { imprimir ("¿Cuál es el apellido paterno que deseas buscar")

Leer “buscado”

donde = buscarcontacto(x, buscado, n);

Si(donde<0){ Imprimir “El contacto no existe, por favor ingresa otro: ”;

otro=1; }

Sino {

Imprimir "Contacto";

Imprimir " x[donde].nombre";

Imprimir " x[donde].n apaterno"

Imprimir " x[donde].amaterno";

Imprimir " x[donde].fnacimiento";

Imprimir " x[donde].edad";

Imprimir " x[donde].lugar";

Imprimir " x[donde].correo";

Imprimir " x[donde].tel";

otro=0; } } mientras(otro==1); }

Procedimiento para ordenar los contactos por nombre alfabéticamente: Se declaran el


vector x de tipo contacto y la variable n que referencia el tamaño del vector.
Posteriormente, se declaran las variables a utilizar para el ordenamiento por selección y se
ordenan los contactos de acuerdo con el nombre de pila. (alfabéticamente).

void ordenarpornombre (struct contacto x[], int n) {

int min, paso, k;

struct contacto temp;

Para paso=0 ,hasta n;

min=paso;

para i=paso hasta n;

Si (x[i].nombre, x[min].nombre)<0

Min=1; } }

Procedimiento para ordenar los contactos por apellido paterno: Se declaran el vector x
de tipo contacto y la variable n que referencia el tamaño del vector. Posteriormente, se
declaran las variables a utilizar para el ordenamiento por selección y se ordenan los
contactos de acuerdo al apellido paterno (alfabéticamente).

void ordenarporpaterno (struct usuario a[], int n) {

int paso, h, min;

struct contacto temp;

Para paso=0 hasta n

min=paso

parai=paso hasta n

Si (x[i].paterno, x[min].paterno)<0

min=i; }
temp=x[paso];

x[paso]=x[min];

x[min]=temp; } }

Procedimiento para ordenar los contactos por apellido materno: Se declaran el vector x
de tipo contacto y la variable n que referencia el tamaño del vector. Posteriormente, se
declaran las variables a utilizar para el ordenamiento por selección y se ordenan los
contactos de acuerdo al apellido materno (alfabéticamente).

void ordenarpormaterno (struct contacto x[], int n) {

int min, z, paso;

struct contacto temp;

Para paso=0 hasta n{

min=paso;

Para i=paso hasta n{

Si(char (x[i].materno, a[min].materno)<0)

min=i; }

temp=x[paso];

x[paso]=x[min];

x[min]=temp; } }

Procedimiento para ordenar los contactos por número: Se declaran el vector x de tipo
contacto y la variable n que referencia el tamaño del vector. Posteriormente, se declaran
las variables a utilizar para el ordenamiento por selección y se ordenan los contactos de
acuerdo con el número.
void ordenarpornumero (struct contacto x[], int n) {

int i,paso,min;

struct contacto temp;

Para paso=0 hasta <n {

min=paso;

Para i=paso hasta n; {

Si (x[i].numero< x[min].numero)

min=i; }

temp=x[paso];

x[paso]=x[min];

x[min]=temp; } }

Procedimiento para ordenar los contactos por edad: Se declaran el vector x de tipo
contacto y la variable n que referencia el tamaño del vector. Posteriormente, se declaran
las variables a utilizar para el ordenamiento por selección y se ordenan los contactos por
edad (del menor al mayor).

void ordenarporedad (struct contacto x[], int n) {

int j, paso,min;

struct contacto temp;

Para paso=0 hasta n{

min=paso;

Para i=paso hasta n {


Si(x[i].edad< x[min].edad)

min=i; }

temp=x[paso];

x[paso]=x[min];

x[min]=temp; } }

Procedimiento para ordenar los contactos por lugar de nacimiento: Se declaran el vector
x de tipo contacto y la variable n que referencia el tamaño del vector. Posteriormente, se
declaran las variables a utilizar para el ordenamiento por selección y se ordenan los
contactos por lugar de nacimiento (alfabéticamente).

void ordenarporlugar (struct contacto x[], int n) {

int w, paso;

int min;

struct contacto temp;

Para paso=0 hasta n{

min=paso;

Para i=paso hasta n{

Si char (x[i].lugar, x[min].lugar)<0

min=i; }

temp=x[paso];

x[paso]=x[min];

x[min]=temp; }
3. Pseudocódigo del programa principal y explicación

Después de la declaración e inicialización de variables que usaremos en el programa se


abre el archivo “contactos.txt” para la lectura de este, mediante un ciclo if-esle se realiza
la lectura de los datos del archivo y se pregunta por el nombre del usuario, si no se logra
leer se muestra el mensaje “error al abrir la agenda”. Mediante un ciclo do-while se
muestran las opciones que el usuario puede realizar y se leen hasta que este decida
finalizar ingresando cualquier número distinto de 1. Las 10 opciones que se encuentran
dentro del ciclo se desarrollan mediante cases (uso de switch) en donde cada caso llama a
una función o procedimiento requerido para realizar la opción deseada. Al finalizar se
guardan los cambios realizados en el archivo contactos.txt.

int main() {

File abrir archivo;

struct usuario contactos[500];

int i=0; opcion, n, donde, otra, numero;

char nomarchivo[]="contactos.txt", escribir;

Si(archivo == NULL)

Imprimir “Error, no se puede abrir la agenda”;

Sino { Imprimir “Bienvenido, esta es tu agenda electrónica"

Mientras (LeerArchivo archivo, contactos[i].num) != EOF){

Leer Archivo contactos[i]. nombre;

LeerArchivo contactos[i].apaterno;

LeerArchivo contactos[i].amaterno;
LeerArchivo contactos[i].fnacimiento;

LeerArchivo contactos[i].edad;

LeerArchivo contactos[i].lugar;

LeerArchivo contactos[i].correo;

LeerArchivo contactos[i].tel;

i=i+1; }

Cerrar archivo (archivo); }

n=i;

Hacer {

imprimir ("Menu de opciones: ");

imprimir ("Mostrar contactos");

imprimir ("Agregar un nuevo contacto");

imprimir (" Eliminar un contacto");

imprimir ("Buscar datos de un contacto");

imprimir ("Ordenar los contactos por el apellido paterno");

imprimir ("Ordenar los contactos por el apellido materno");

imprimir ("Ordenar los contactos por la edad");

imprimir ("Ordenar los contactos por el lugar de nacimiento");

Imprimir ("Cambiar el número telefónico");

Imprimir (“Cambiar el correo electrónico de un contacto”),


Leer “opciones”

Cambiar (opciones){

Caso 1: desplegar(contactos, n);

salir;

caso 2: agregar(contactos, n);

n=n+1;

ordenarpornumero(contactos,n);

desplegar(contactos, n);

salir;

caso 3: imprimir "Que número de contacto deseas eliminar?: ";

Leer “numero”;

donde= buscarnumero(contactos, numero, n);

eliminar(contactos, donde, n);

n=n-1;

ordenarpornumero(contactos,n);

desplegar (contactos, n);

salir;

caso 4: buscarapellido(contactos, n);

salir;

caso 5: ordenarporpaterno (contactos, n);


Imprimir "Lista de contactos ordenados por apellido paterno: ";

desplegar (contactos, n);

salir;

caso 6: ordenarpormaterno (contactos, n);

Imprimir "Contactos ordenados por apellido materno: ";

desplegar (contactos, n);

salir;

caso 7: ordenarporedad (contactos, n);

Imprimir "Lista de contactos ordenados por edad: ";

desplegar (contactos, n);

salir;

caso 8: ordenarporlugar (contactos, n);

Imprimir "Contactos ordenados por lugar de nacimiento: ";

desplegar (contactos, n);

salir;

caso 9: Imprimir “De que numero de contacto deseas cambiar su número?: “

Leer número

Imprimir “Registra el nuevo número”:

Leer número

Strcy (contactos[numero-1]. Teléfono, numer);


caso 10: Imprimir “De que numero de contacto deseas cambiar su correo electrónico? “

Leer número

Imprimir “Registra el nuevo correo electrónico”:

Leer correo

Strcy (contactos[numero-1]. correo, ncorreo);

Por defecto: Imprimir "Opción incorrecta";

salir; }

Mientras (otra==1);

Imprimir "Gracias, que tengas un buen día !";

archivo = abrir archivo nomarchivo,"escribir";

Para i=0 hasta n

Imprimir archivo (archivo,"%d %s %s %s %s %d %s %s %s\n",

contactos[i].numero,contactos[i].nombre,contactos[i].paterno,contactos[i].materno,conta
ctos[i].nacimiento, contactos[i].edad, contactos[i].lugar ,
contactos[i].correo,contactos[i].telefono); }

Cerrar archivo (archivo);

Regresar 0;

4. Código en C del programa que permite la creación del archivo


5. Código en C de la Agenda Electrónica
 Captura de ejecución Opción 1

 Captura de ejecución Opción 2


 Captura de ejecución Opción 3

 Captura de ejecución Opción 4


 Captura de ejecución Opción 5

 Captura de ejecución Opción 6


 Captura de ejecución Opción 7

 Captura de ejecución Opción 8

 Captura de ejecución Opción 9


 Captura de ejecución Opción 10

También podría gustarte