Ayuda

Iniciado por Marsi, 27 Mayo 2020, 18:55 PM

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

Marsi

Alguien sabe como en el case 2 puede modificar el contacto ingresando el numero telefonico local

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

#define MAX 256

struct agenda
{
int Num_Contacto;
char AP[20];
char AM[20];
char Nombre[20];
double tel[8];
double cel[8];
char email[50];
char sitio_web[50];
char Notas[30];
char Empresa[20];
char Cargo[10];
};
struct agenda contactos[MAX];

int main()
{
int count;
int i = 0;
int resp, opc, opc2, opc3;

while (opc != 4){
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");
do{
printf("Escriba '0' si no quiere escribir algo.\n");
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 con lada: ");
fflush(stdin);
scanf("%llu", &contactos[count].tel);
printf("Telefono celular: ");
fflush(stdin);
scanf("%llu", &contactos[count].cel);
printf("Correo electronico: ");
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);
contactos[count].Num_Contacto = count;
system("cls");
printf( "\nEl numero de contacto guardado es: %d\n ", contactos[count].Num_Contacto);
printf( "Nombre(s): %s\n ", contactos[count].Nombre);
printf( "Apellido Paterno: %s\n ", contactos[count].AP);
printf( "Apellido Materno: %s\n", contactos[count].AM);
printf("Numero de telefono local: %llu\n ", contactos[count].tel);
printf( "Numero de telefono celular: %llu\n ", contactos[count].cel);
printf( "E-mail: %s\n ", contactos[count].email);
printf( "Sitio web: %s\n ", contactos[count].sitio_web);
printf( "Notas: %s\n ", contactos[count].Notas);
printf( "Empresa: %s\n ", contactos[count].Empresa);
printf( "Cargo: %s\n", contactos[count].Cargo);
printf("\nContacto agregado correctamente.\n");
printf("Este es el contacto numero: %d.", contactos[count].tel);
getch();
printf("\n¿Desea agregar otro contacto?\n SI=1   NO=0\n");
scanf("%d",&resp);
   }while(resp!=0);
   getch();
break;
}
case 2:
{
system("cls");
do
{
printf("Inserte el numero del contacto a modificar: ");
fflush(stdin);
scanf("%d", &opc2);
}while(opc2 < 1 || opc2 > 255);


for(i = 1; i <= count; i++)
{
if(contactos[i].Num_Contacto == opc2)
{
printf("\nNombre: %s %s %s", contactos[opc2].Nombre, contactos[opc2].AP, contactos[opc2].AM);
printf("\nTelefono fijo: %d", contactos[opc2].tel);
printf("\nTelefono celular: %d", contactos[opc2].cel);
printf("\nE-mail: %s", contactos[opc2].email);
printf("\nSitio Web: %s", contactos[opc2].sitio_web);
printf("\nNotas: %s", contactos[opc2].Notas);
printf("\nEmpresa: %s", contactos[opc2].Empresa);
printf("\nCargo: %s", contactos[opc2].Cargo);

do
{
printf("\n\nEsta seguro de que quiere modificar este contacto? (1. Si, 2. No): ");
fflush(stdin);
scanf("%d", &opc3);
}while(opc3 < 1 || opc3 > 2);

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

pf = fopen("Archivo.BIN", "wt");
if(pf == NULL)
{
printf("\nError al abrir el archivo.");
getch();
return -1;
}
for(i = 1; i <= count; i++)
{
fprintf(pf, "%d ", contactos[i].Num_Contacto);
fprintf(pf, "%s ", contactos[i].Nombre);
fprintf(pf, "%s ", contactos[i].AP);
fprintf(pf, "%s ", contactos[i].AM);
fprintf(pf, "%d ", contactos[i].tel);
fprintf(pf, "%d ", contactos[i].cel);
fprintf(pf, "%s ", contactos[i].email);
fprintf(pf, "%s ", contactos[i].sitio_web);
fprintf(pf, "%s ", contactos[i].Notas);
fprintf(pf, "%s ", contactos[i].Empresa);
fprintf(pf, "%s\n", contactos[i].Cargo);
}
fclose(pf);

printf("\nContacto modificado correctamente.");
getch();
}
break;
}
else
{
if(i == count)
{
printf("\nNo se encontro el contacto.");
getch();
break;
}
}
}
break;
}
case 3:
{
system("cls");
do
{
printf("Inserte el numero del contacto a eliminar: ");
fflush(stdin);
scanf("%d", &opc2);
}while(opc2 < 1 || opc2 > 255);

for(i = 1; i <= count; i++)
{
if(contactos[i].Num_Contacto == opc2)
{
printf("\nNombre: %s %s %s", contactos[opc2].Nombre, contactos[opc2].AP, contactos[opc2].AM);
printf("\nTelefono fijo: %d", contactos[opc2].tel);
printf("\nTelefono celular: %d", contactos[opc2].cel);
printf("\nE-mail: %s", contactos[opc2].email);
printf("\nSitio Web: %s", contactos[opc2].sitio_web);
printf("\nNotas: %s", contactos[opc2].Notas);
printf("\nEmpresa: %s", contactos[opc2].Empresa);
printf("\nCargo: %s", contactos[opc2].Cargo);

do
{
printf("\n\nEsta seguro de que quiere eliminar este contacto? (1. Si, 2. No): ");
fflush(stdin);
scanf("%d", &opc3);
}while(opc3 < 1 || opc3 > 2);

if(opc3 == 1)
{
for(i = opc2; i <= count; i++)
{
contactos[i].Num_Contacto = contactos[i+1].Num_Contacto;
contactos[i].Num_Contacto = contactos[i].Num_Contacto - 1;
strcpy(contactos[i].Nombre, contactos[i+1].Nombre);
strcpy(contactos[i].AP, contactos[i+1].AP);
strcpy(contactos[i].AM, contactos[i+1].AM);
contactos[i].tel = contactos[i+1].tel;
contactos[i].cel = contactos[i+1].cel;
strcpy(contactos[i].email, contactos[i+1].email);
strcpy(contactos[i].sitio_web, contactos[i+1].sitio_web);
strcpy(contactos[i].Notas, contactos[i+1].Notas);
strcpy(contactos[i].Empresa, contactos[i+1].Empresa);
strcpy(contactos[i].Cargo, contactos[i+1].Cargo);
}
count = count - 1;

pf = fopen("Archivo.BIN", "wt");
if(pf == NULL)
{
printf("\nError al abrir el archivo.");
getch();
return -1;
}
for(i = 1; i <= count; i++)
{
fprintf(pf, "%d ", contactos[i].Num_Contacto);
fprintf(pf, "%s ", contactos[i].Nombre);
fprintf(pf, "%s ", contactos[i].AP);
fprintf(pf, "%s ", contactos[i].AM);
fprintf(pf, "%d ", contactos[i].tel);
fprintf(pf, "%d ", contactos[i].cel);
fprintf(pf, "%s ", contactos[i].email);
fprintf(pf, "%s ", contactos[i].sitio_web);
fprintf(pf, "%s ", contactos[i].Notas);
fprintf(pf, "%s ", contactos[i].Empresa);
fprintf(pf, "%s\n", contactos[i].Cargo);
}
fclose(pf);

printf("\nContacto eliminado correctamente.");
getch();
break;
}
}
else
{
if(i == count)
{
printf("\nNo se encontro el contacto.");
getch();
break;
}
}
}
break;
}
case 4:
{
system("cls");
printf("Gracias por usar esta agenda.");
getch();
break;
}
default:
{
printf("Inserte otra opcion.");
getch();
break;
}
}

}while (opc != 4);

return 0;
}




MOD: Código adaptado al uso de etiquetas de Código GeSHi

K-YreX

Si lo que quieres es buscar en tu array de Agenda, el que tenga el número telefónico igual al que introduces:

Pedir telefono
i := 0
encontrado := -1
MIENTRAS i < longitud(contactos) and encontrado = -1 HACER
  SI contactos[i].telefono = telefono ENTONCES
    encontrado = i
  FIN SI
FIN MIENTRAS

Con este pseudocódigo puedes localizar el índice del contacto que tiene el número de teléfono que buscas. Luego solo es modificar sus campos accediendo a él.
El problema que tienes es que estás mezclando los índices de los contactos con sus números de teléfono.




PD: Unas cuantas mejoras para el programa:
  • Ya que usas una constante para el tamaño de los contactos, por qué no usas también constantes para los arrays de agenda??
  • Algunos nombres de variables no ayudan. opc, opc2, opc12432454... no dice nada. Llámalas opcion_menu, telefono_buscado, indice_buscado... y verás como no tienes el problema que has tenido de confundir un índice con un teléfono.
  • La programación utiliza el principio de una única vez, es decir, no repetir fragmentos de código innecesarios. Tienes un bloque de al menos 30 líneas y otro de unas 10 líneas por lo pronto repetidos... Deberías hacer uso de funciones, no solo para esa parte sino para otras también. Saber modularizar un programa también es programar.
  • Para leer cadenas de caracteres es recomendable usar la función fgets(), no scanf().
  • La biblioteca <conio.h> no pertenece al estándar y no se recomienda su uso. La única función que le das es llamar a getch() y puedes utilizar la función getchar() perteneciente a <stdio.h> en su defecto. Así te ahorras la biblioteca <conio.h>.
  • El único uso recomendado de break es para finalizar cada case de un switch. En tu programa veo algún break con otro fin.
  • Es más seguro utilizar strncpy() para copiar cadenas que strcpy().
    Y el que más me ha dolido de todos: dicen que por cada fflush(stdin) que se utiliza, muere un gatito. No hagas eso a los pobres animalitos inocentes.

    Con aplicar uno o dos de los consejos de esta lista, ese código pasaría de tener 311 líneas a unas 100 o menos y sería más fácil de leer para ti y para los demás. Aunque lo suyo sería que las aplicases todas o prácticamente todas.

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

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