Agenda telefonica

Iniciado por Marsi, 1 Junio 2020, 10:33 AM

0 Miembros y 1 Visitante están viendo este tema.

Marsi

Hola, ayudenme por favor, tengo que modificar un numero de contacto en el case 2 aportando el numero telefonico (contactos[count].tel) en el case 1 ya lo tengo pero no se como poder modificarlo en el case 2, como lo pido y lo edito si esta guarado en contactos[count].tel, he tartado pero no me sale llego asta ahí, suponiendo que tengo muchos numeros y el programa lo tiene que buscar luego modificar, en el case 1 tambien tengo que agregar si deseo poner otro contacto mas, soy nueva programando y no entiendo muy bien :(  :-(


int main()
{
int count;
int i = 0;
int opc, telefono;

do
{
system("cls");
printf("PIA\n");
printf("Programa para hacer una agenda usando Archivos\n");
printf("Elija una opcion.\n");
printf("1. Crear Contacto\n");
printf("2. Actualizar Contacto\n");
printf("3. Eliminar Contacto\n");
printf("4. Salir\n");
scanf("%d", &opc);

switch(opc)
{
case 1:
{
system("cls");

printf("Escriba '0' si no quiere escribir algo.\n");
printf("Telefono : ");
scanf("%d", &contactos[count].tel);
printf("Apellido Paterno: ");
fflush(stdin);
scanf("%[^\n]", &contactos[count].AP);
printf("Apellido Materno: ");
fflush(stdin);
scanf("%[^\n]", &contactos[count].AM);
printf("Nombre (usa '_' para separar nombres): ");
fflush(stdin);
scanf("%[^\n]", &contactos[count].Nombre);
printf("Telefono fijo: ");
fflush(stdin);
fflush(stdin);
scanf("%[^\n]", &contactos[count].email);
printf("Sitio web: ");
fflush(stdin);
scanf("%[^\n]", &contactos[count].sitio_web);
printf("Notas (usa '_' para separar palabras): ");
fflush(stdin);
scanf("%[^\n]", &contactos[count].Notas);
printf("Empresa (usa '_' para separar palabras): ");
fflush(stdin);
scanf("%[^\n]", &contactos[count].Empresa);
printf("Cargo (usa '_' para separar palabras): ");
fflush(stdin);
scanf("%[^\n]", &contactos[count].Cargo);

pf = fopen("Archivo.BIN", "at");
if(pf == NULL)
{
printf("\nNo se pudo abrir el archivo.");
getch();
return -1;
}


fprintf(pf, "%s ", contactos[count].Nombre);
fprintf(pf, "%s ", contactos[count].AP);
fprintf(pf, "%s ", contactos[count].AM);
fprintf(pf, "%ld ", contactos[count].tel);
fprintf(pf, "%s ", contactos[count].email);
fprintf(pf, "%s ", contactos[count].sitio_web);
fprintf(pf, "%s ", contactos[count].Notas);
fprintf(pf, "%s ", contactos[count].Empresa);
fprintf(pf, "%s\n", contactos[count].Cargo);
fclose(pf);

printf("\nContacto agregado correctamente.\n");
printf("Este es el numero de contacto guardado %d.", contactos[count].tel);
getch();
break;
}
case 2:
{
system("cls");

printf("Inserte el numero del contacto a modificar: ");
fflush(stdin);
scanf("%ld", &telefono);




MOD: Utiliza etiquetas de Código GeSHi para colocar fragmentos de código

K-YreX

Visto que todas mis recomendaciones anteriores fueron ignoradas, me limitaré a decirte el procedimiento que tienes que seguir:

PEDIR telefono
indice := 0
MIENTRAS indice < contactosTotales && telefono != contactos[indice].telefono HACER
  indice := indice + 1
FIN MIENTRAS
// Si indice = contactosTotales, el numero buscado no existe
SI telefono = contactos[indice].telefono ENTONCES
  PEDIR nuevoTelefono
  contactos[indice].telefono = nuevoTelefono
FIN SI

Ahora tienes que adaptar este psedocódigo a tu problema mirando a ver cómo puedes representar las variables que aparecen.
Suerte. :-X
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

Marsi

#2
depsues de mucho intentos tuve que modificar y empezar de nuevo el codigo para tenerlo mas claro, pero ahora el problema es que no se guardan los contactos, solo guarda el ultimo y en la opción dos de modificar en el listado de numeros guardados solo aparece el ultimo ingresado no los demás

include<stdio.h>
#include<conio.h>

struct contacto
{
int Numero_registrado, activo;
long int tel;
char nom[10],AP[10],AM[10],correo[20], empresa[30],puesto[15],sito_web[30],notas[30];
}contact[30];
int no_reg=0;


int main()
{

}
menu()
{
int opc;
       printf("Elija una opcion.\n");
printf("1. Crear Contacto\n");
printf("2. Actualizar Contacto\n");
printf("3. Eliminar Contacto\n");
printf("4. Salir\n");
scanf("%d", &opc);
while(opc<1||opc>4)
{
printf("\a\n\t\tERROR\n");
system("pause");
system("cls");
       printf("Elija una opcion.\n");
printf("1. Crear Contacto\n");
printf("2. Actualizar Contacto\n");
printf("3. Eliminar Contacto\n");
printf("4. Salir\n");
scanf("%d", &opc);
fflush(stdin);
}
system("cls");
switch(opc)
{
case 1:
CrearContacto();
break;
case 2:
ActualizarContacto();
break;
case 3:
EliminarContacto();
break;
case 4:
return 0;
break;
}
}

CrearContacto()


{
int crear;

printf("AGREGAR CLIENTE\n\n");
contact[no_reg].activo=1;
contact[no_reg].Numero_registrado= no_reg+1;
printf("Ingrese el telefono (a 8 digitos): ");
scanf("%ld",&contact[no_reg].tel);
fflush(stdin);
printf("\n\t\t*EL NUMERO DE TELEFONO HA SIDO REGISTRADO CORRECTAMENTE*\n");
printf("\nIngrese el apellido paterno: ");
gets(contact[no_reg].AP);
fflush(stdin);
strupr(contact[no_reg].AP);
printf("Ingrese el appelido materno: ");
gets(contact[no_reg].AM);
fflush(stdin);
strupr(contact[no_reg].AM);
printf("Ingrese el nombre: ");
gets(contact[no_reg].nom);
fflush(stdin);
strupr(contact[no_reg].nom);
printf("Ingrese el E-mail: ");
gets(contact[no_reg].correo);
fflush(stdin);
strupr(contact[no_reg].correo);
printf("Ingrese su sitio web: ");
gets(contact[no_reg].sito_web);
fflush(stdin);
strupr(contact[no_reg].sito_web);
printf("Ingrese su puesto: ");
gets(contact[no_reg].puesto);
fflush(stdin);
strupr(contact[no_reg].puesto);
printf("Ingrese el nombre de la empresa: ");
gets(contact[no_reg].empresa);
fflush(stdin);
strupr(contact[no_reg].empresa);
printf("Ingrese alguna nota: ");
gets(contact[no_reg].notas);
fflush(stdin);
strupr(contact[no_reg].notas);

system("cls");
printf("Los Datos Registrados son: \n");
printf("\n\nTelefono: ");
printf("%ld",contact[no_reg].tel);
printf("\nNumero de registo del cliente: %d\n",contact[no_reg].Numero_registrado);
printf("Apellido paterno:");
puts(contact[no_reg].AP);
printf("Apellido materno:");
puts(contact[no_reg].AM);
printf("Nombre del cliente:");
puts(contact[no_reg].nom);
printf("E-mail:");
puts(contact[no_reg].correo);
printf("Sitio web:");
puts(contact[no_reg].sito_web);
printf("Nota:");
puts(contact[no_reg].notas);
printf("Empresa:");
puts(contact[no_reg].empresa);
printf("Puesto:");
puts(contact[no_reg].puesto);
printf("\n\n¿Desea agregar otro contacto?:    ");
   printf("2)Si.");
printf("1)No.\n");
scanf("%d",&crear);
system("cls");


while(crear<1||crear>2)
{
printf("\a\t\tERROR\n");
system("pause");
system("cls");
printf("\nEL telefono: ");
printf("%ld",contact[no_reg].tel);
printf("El El numero de registro del cliente es: %d\n",contact[no_reg].Numero_registrado);
printf("El apellido paterno es:\n");
puts(contact[no_reg].AP);
printf("El apellido materno es:\n");
puts(contact[no_reg].AM);
printf("El nombre del cliente es:\n");
puts(contact[no_reg].nom);
printf("El correo es:\n");
puts(contact[no_reg].correo);
printf("El sitio web es:\n");
puts(contact[no_reg].sito_web);
printf("Nota:\n");
puts(contact[no_reg].notas);
printf("La empresa es:\n");
puts(contact[no_reg].empresa);
printf("El puesto es:\n");
puts(contact[no_reg].puesto);
    printf("\n\n¿Desea agregar otro contacto?:    ");
       printf("2)Si.");
    printf("    1)No.\n");
scanf("%d",&crear);
system("cls");
}
if(crear==1)
{
printf("\nLOS DATOS HAN SIDO REGISTRADOS CORRECTAMENTE");
no_reg++;
printf("\n");
menu();
}
else
{
CrearContacto();
}
}
ActualizarContacto()
{
int m,i;
long int telefono;
printf("\nACTUALIZAR CONTACTO\n");
printf("\n\n\t\t\tCONTACTOS EXISTENTES\n\t");
printf("\tTELEFONO\t\tNOMBRE\n\t\t");
for(i=0;i<50;i++)
{
if(contact[i].activo==1)
{
printf("%lld",contact[i].tel);
printf("\t\t%s",contact[i].nom);
}
}
printf("\n\nIngrese el telefono del contacto a actualizar\n");
scanf("%lld",&telefono);
fflush(stdin);
system("cls");
for(i=0;i<50;i++)
{
m=0;
if(telefono==contact[i].tel)
{
printf("\n\n\t\t\tCONTACTO ENCONTRADO\n\n\n\n\n\n\n");
system("pause");
system("cls");
printf("\nEL telefono: ");
printf("%lld",contact[i].tel);
printf("\n\nEl Id del cliente es: %d\n",contact[no_reg].Numero_registrado);
printf("\n\nEl apellido paterno es:\n");
puts(contact[i].AP);
printf("\n\nEl apellido materno es:\n");
puts(contact[i].AM);
printf("\n\nEl nombre del cliente es:\n");
puts(contact[i].nom);
printf("\n\nEl correo es:\n");
puts(contact[i].correo);
printf("\n\nEl sitio web es:\n");
puts(contact[i].sito_web);
printf("\n\nNota:\n");
puts(contact[i].notas);
printf("\n\nLa empresa es:\n");
puts(contact[i].empresa);
printf("\n\nEl puesto es:\n");
puts(contact[i].puesto);
system("pause");
system("cls");
ActualizarC(i);
break;
}
else
{
m=1;
}
}
if(m==1)
{
printf("\n\n\t\t\tTELEFONO NO ENCONTRADO\n\n\n\n\n\n\n");
system("pause");
system("cls");
menu();
}
}
ActualizarC(int i)
{
int x,y;
printf("\n\n\t\t\tACTUALIZAR CLIENTE\n\n\n\n\n\n\n");
system("pause");
system("cls");
fflush(stdin);
printf("Ingrese el telefono (celular de 10 digitos o local + lada): ");
scanf("%lld",&contact[i].tel);
fflush(stdin);
printf("\t\t\t\n\n\n\nCONTACTO REGISTRADO\n\n\n");
//apellido paterno
printf("Ingrese el apellido paterno: ");
gets(contact[i].AP);
fflush(stdin);
strupr(contact[i].AP);
//apellido materno
printf("Ingrese el appelido materno: ");
gets(contact[i].AM);
fflush(stdin);
strupr(contact[i].AM);
//nombre
printf("Ingrese el nombre: ");
gets(contact[i].nom);
fflush(stdin);
strupr(contact[i].nom);
//correo
printf("Ingrese el correo: ");
gets(contact[i].correo);
fflush(stdin);
strupr(contact[i].correo);
//sitio web
printf("Ingrese su sitio web: ");
gets(contact[i].sito_web);
fflush(stdin);
strupr(contact[i].sito_web);
//puesto
printf("Ingrese su puesto: ");
gets(contact[i].puesto);
fflush(stdin);
strupr(contact[i].puesto);
//empresa
printf("Ingrese el nombre de la empresa: ");
gets(contact[i].empresa);
fflush(stdin);
strupr(contact[i].empresa);
//notas
printf("Ingrese alguna nota: ");
gets(contact[i].notas);
fflush(stdin);
strupr(contact[no_reg].notas);

//Imprimir datos
system("cls");
printf("\nEL telefono: ");
printf("%lld",contact[i].tel);
printf("\n\nEl Id del cliente es: %d\n",contact[i].Numero_registrado);
printf("\n\nEl apellido paterno es:\n");
puts(contact[i].AP);
printf("\n\nEl apellido materno es:\n");
puts(contact[i].AM);
printf("\n\nEl nombre del cliente es:\n");
puts(contact[i].nom);
printf("\n\nEl correo es:\n");
puts(contact[i].correo);
printf("\n\nEl sitio web es:\n");
puts(contact[i].sito_web);
printf("\n\nNota:\n");
puts(contact[i].notas);
printf("\n\nLa empresa es:\n");
puts(contact[i].empresa);
printf("\n\nEl puesto es:\n");
puts(contact[i].puesto);
//verificar datos
printf("\n\n\t\tIngrese:\n\n\t1)Si los datos son correctos.\n\t2)Si los datos son incorrectos.");
scanf("%d",&x);
system("cls");
while(x<1||x>2)
{
printf("\n\t\t\tERROR\n\n");
system("pause");
system("cls");
printf("\n\nEL telefono:\n");
printf("%lld",contact[i].tel);
printf("\n\nEl Id del cliente es: %d\n",contact[i].Numero_registrado);
printf("\n\nEl apellido paterno es:\n");
puts(contact[i].AP);
printf("\n\nEl apellido materno es:\n");
puts(contact[i].AM);
printf("\n\nEl nombre del cliente es:\n");
puts(contact[i].nom);
printf("\n\nEl correo es:\n");
puts(contact[i].correo);
printf("\n\nEl sitio web es:\n");
puts(contact[i].sito_web);
printf("\n\nNota:\n");
puts(contact[i].notas);
printf("\n\nLa empresa es:\n");
puts(contact[i].empresa);
printf("\n\nEl puesto es:\n");
puts(contact[i].puesto);
//verificar datos
printf("\n\n\t\tIngrese:\n\n\t1)Si los datos son correctos.\n\t2)Si los datos son incorrectos.");
scanf("%d",&x);
system("cls");
}
if(x==1)
{
system("cls");
printf("\n\t\t\tCONTACTO ACTUALIZADO");
menu();
}
else
{
ActualizarC(i);
}
}
EliminarContacto()
{
int x,i,m,y;
long long int telefono;
printf("\n\n\t\t\tELIMINAR CONTACTO\n\n\n\n\n\n\n");
system("pause");
system("cls");
printf("\n\n\t\t\tCONTACTOS EXISTENTES\n\t");
printf("\tTELEFONO\t\tNOMBRE\n\t\t");
for(i=0;i<50;i++)
{
if(contact[i].activo==1)
{
printf("%lld",contact[i].tel);
printf("\t\t%s",contact[i].nom);
}
}
printf("\t\nINGRESE EL TELEFONO DEL CONTACTO A ELIMINAR\n\n");
scanf("%lld",&telefono);
fflush(stdin);
system("cls");
for(i=0;i<50;i++)
{
m=0;
if(telefono==contact[i].tel)
{
printf("\n\n\t\t\tCONTACTO ENCONTRADO\n\n\n\n\n\n\n");
system("pause");
system("cls");
printf("\n\nEL telefono:\n");
printf("%lld",contact[i].tel);
printf("\n\nEl Id del cliente es: %d\n",contact[i].Numero_registrado);
printf("\n\nEl apellido paterno es:\n");
puts(contact[i].AP);
printf("\n\nEl apellido materno es:\n");
puts(contact[i].AM);
printf("\n\nEl nombre del cliente es:\n");
puts(contact[i].nom);
printf("\n\nEl correo es:\n");
puts(contact[i].correo);
printf("\n\nEl sitio web es:\n");
puts(contact[i].sito_web);
printf("\n\nNota:\n");
puts(contact[i].notas);
printf("\n\nLa empresa es:\n");
puts(contact[i].empresa);
printf("\n\nEl puesto es:\n");
puts(contact[i].puesto);
system("pause");
system("cls");
printf("\nSeguro que desea eliminar este contacto?\n1)Seguro.\n2)No estoy seguro\n");
scanf("%d",&y);
if(y=1)
{
BorrarC(i);
break;
}
else
{
menu();
}
}
else
{
m=1;
}
}
if(m==1)
{
printf("\n\n\t\t\tTELEFONO NO ENCONTRADO\n\n\n\n\n\n\n");
system("pause");
system("cls");
menu();
}
}
BorrarC(int i)
{
printf("\n\n\t\t\tELIMINAR CLIENTE\n\n\n\n\n\n\n");
system("pause");
system("cls");
contact[i].activo=0;
printf("\n\n\t\t\tCLIENTE ELIMINADO\n\n\n\n\n\n\n");
system("pause");
system("cls");
menu();
}







K-YreX

Sigue siendo un poco lío ese código... Las funciones tienen que tener un valor de retorno aunque este sea void, la función main() está vacía, es difícil seguir con precisión la ejecución si se va pasando de función en función, algunas funciones hacen demasiadas cosas...
Te pongo una estructura alternativa para que la rellenes:

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

// Declara constantes para los numeros que vayas a usar luego. Si siguen algun patron que poner de nombre para recordarlos mejor, usalo.
// Si las longitudes que utilizas estan fundamentadas en algo no dire nada pero si son aleatorias te recomiendo que utilices una para todo. O las minimas necesarias, por ejemplo: LONG_NOMBRE y LONG_OTRAS_CADENAS o lo que mas te convenza
#define LONG_NOMBRE 20
#define LONG_OTRAS_CADENAS 15
#define MAX_CONTACTOS 30

// Crea un tipo de dato Contacto que consta de un struct. Los campos es mejor poner uno por linea.
// Si no quieres usar typedef cambialo por struct Contacto {...} pero tendras que usar "struct Contacto" cada vez que quieras hacer referencia a "Contacto"
typedef struct {
int numeroRegistrado; // Este campo no podras relacionarlo con el numero de contactos porque al borrar uno se produciran saltos y se repetiran valores.
//int activo; // Por lo que veo lo usas para determinar si el numero esta borrado o no. Para este codigo es prescindible, ya lo veras.
int telefono; // Dudo que realmente necesites un long para un telefono asi que usare int durante todo el codigo
char nombre[LONG_NOMBRE];
char apellidoPaterno[LONG_NOMBRE]; // Que no te de miedo poner nombres un poco largos. Cuanto mejor se entienda, mejor
char apellidoMaterno[LONG_NOMBRE];
//...
} Contacto; // No declares el array global

int main(){
Contacto contactos[MAX_CONTACTOS]; // Declara el array local
int contactosRegistrados = 0;
int telefonoBuscado;
int indiceBuscado;
int opcion;
do {
opcion = mostrarMenu(); // Muestra el menu y devuelve la opcion. En mostrarMenu() puedes controlar que la opcion este en el rango
switch(opcion){
case 1:
if(contactosRegistrados < MAX_CONTACTOS){
contactos[contactosRegistrados] = crearContacto(); // Crea un contacto en el array contactos en la posicion contactosRegistrados
++contactosRegistrados;
} else printf("Limite de contactos alcanzado\n");
break;

case 2: // Cuando actualizas es como si creases un contacto nuevo en la posicion del existente
printf("Introduce el numero de telefono del contacto a modificar: ");
scanf("%d", &telefonoBuscado);
while(getchar() != '\n');
indiceBuscado = buscarPorTelefono(contactos, contactosRegistrados, telefonoBuscado); // Que devuelva el indice del contacto con ese numero o -1 si no lo encuentra
if(indiceBuscado != -1){
contactos[indiceBuscado] = crearContacto();
} else printf("No existe ningun contacto con ese numero\n");
break;

case 3: // Para borrar de un array lo que se hace es mover todos los elementos a la derecha del eliminado una posicion hacia la izquierda para no dejar huecos
printf("Introduce el numero de telefono del contacto a eliminar: ");
scanf("%d", &telefonoBuscado);
while(getchar() != '\n');
indiceBuscado = buscarPorTelefono(contactos, contactosRegistrados, telefonoBuscado); // Que devuelva el indice del contacto con ese numero o -1 si no lo encuentra
if(indiceBuscado != -1){
eliminarContacto(contactos, contactosRegistrados, indiceBuscado); // Que empiece en indiceBuscado y hasta el final mueva cada contactos a su izquierda
--contactosRegistrados;
} else printf("No existe ningun contacto con ese numero\n");
break;
}
mostrarContactos(contactos, contactosRegistrados);
} while(opcion != 4); // La opcion 4 solo sale. No es necesario hacer un case para ella.
// Para hacer una pausa olvidate de getch() y de system("pause"). La mejor opcion SIEMPRE es getchar() que pertenece a <stdio.h> asi que olvidate de <conio.h>
getchar();
return 0;
}


Como ves, la función main() tiene que dar una idea general del funcionamiento del programa. Que al mirar el main() puedas saber lo que hace el programa aunque no sepas cómo (esto corresponde a las funciones adicionales).
Crea funciones estructuradas, no que se llamen unas a otras haciendo bucles o que tengan varios return (hay casos excepcionales pero son pocos).
Ahora te queda a ti implementar las funciones que he ido llamando por ahí. Créalas de forma que cumplan las restricciones que te pongo y todo funcionará correctamente. Observa también los parámetros que tienen que tener y sus valores de retorno. Y limítate a que cada función realice su labor, no quieras mezclar. Cuanto más precisa sea una función más independiente será y más la podrás reutilizar (fíjate en buscarPorTelefono() o crearContacto() como las hemos podido usar varias veces).

Casi lo olvido: para solucionar el tema del numeroRegistro de cada contacto, puedes crear dentro de la función crearContacto() una variable static. Las variables static mantienen su existencia y su valor durante las diferentes llamadas a la función. Así cada vez que llames a la función puedes incrementar en 1 esa variable y en la siguiente llamada, se mantendrá ese valor para volver a incrementarle 1.

Ya tienes bastante trabajo. Y te aseguro si te sirve de inspiración que vas a aprender/reforzar bastantes cosas de hacer este programa. Dos consejos más para que por favor apliques y te quede ya un programa de 10, te lo aseguro:
  • Leer cadenas de texto: Para esto la función recomendada es fgets(). Por ejemplo, para guardar el nombre (que te hará falta):

    Contacto contacto;
    printf("Introduce el nombre: ");
    fgets(contacto.nombre, LONG_NOMBRE, stdin);

    Una vez guardado el nombre es importante hacer dos cosas más: eliminar el salto de línea que se habrá almacenado al pulsar ENTER y limpiar el buffer para el siguiente dato que pidamos. Para hacer ambas cosas utiliza el siguiente código justo después del fgets():

    if(contacto.nombre[strlen(contacto.nombre)-1] == '\n') // Si antes del final de cadena hay un salto de linea...
        contacto.nombre[strlen(contacto.nombre)-1] = '\0'; //... lo sustituimos por el final de cadena para eliminarlo
    else // sino, el salto de linea se ha quedado en el buffer ademas de que puede haber otros caracteres antes...
        while(getchar() != '\n'); // ...entonces con esto limpiamos el buffer en caso de que quede algo

    Como puedes ver en las funciones scanf() de más arriba también he utilizado la misma sentencia para limpiar el buffer pero en ese caso sin la comprobación del if pues el scanf() siempre deja el ENTER en el buffer.
    Esta es una manera más correcta de limpiar el buffer que con fflush(stdin). Utilízalo.

    Cualquier duda, problema o lo que sea que tengas, no dudes en preguntar. El objetivo es que entiendas lo que se hace y por qué.

    Suerte. :-X
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;