Necesito ayuda en c++ un programa que es una agenda

Necesito el código de este lenguaje ya casi esta terminado falta muy poco pero esto tiene algunos errores pues bo hace lo que quiero que haga, en primera si introduzco los datos pero al momento de verlos no aparecen todos, ademas no se borran por favor lo necesito bueno aquí esta lo que llevo...
/* Agenda de telefonos*/
#include "stdio.h"
#include "stdlib.h"
#define MAX 5
struct dir {
char nombre[30];
char calle[40];
char ciudad[20];
char telefono[12];
} datos[MAX];
void inic_lista(void);
void intro(void);
void borrar(void),listar(void);
int menu(void),busca_libre(void);
/*Bloque Principal**********************************************/
main(void)
{
char opcion;
inic_lista();
for (;;)
{
opcion = menu();
switch(opcion)
{
case 1: intro();
break;
case 2:borrar();
break;
case 3: listar();
break;
case 4: exit(0);
}
}
}
/*rutina para inicilizar el array**********************************/
void inic_lista(void)
{
register int t;
for (t=0; t<MAX; ++t)
datos[t].nombre[0]='\0';
}
/*rutina para vizulizar un menu************************************/
menu (void)
{
char s[80];
int c;
printf("\n\n\n\n");
printf(" MENU \n\n");
printf ("1. Introducir un nombre\n");
printf ("2. Borrar un nombre \n");
printf ("3. Listar el archivo\n");
printf ("4. Salir\n");
do
{
printf("\nIntroduzca su opcion NUMERICA : ");
gets(s);
c = atoi(s);
}
while(c<0 || c>4);
return c;
}
/*rutina para introducir un dato****************************************/
void intro(void)
{
int sitio;
sitio = busca_libre();
if(sitio==-1)
{
printf("\n lista llena");
return;
}
printf("introduzca nombre: ");
gets(datos[sitio].nombre);
printf("introduzca calle: ");
gets(datos[sitio].calle);
printf("introduzca ciudad: ");
gets(datos[sitio].ciudad);
printf("introduzca telefono: ");
gets(datos[sitio].telefono);
}
/*rutina para buscar una localidad vacia***********************************/
busca_libre(void)
{
register int t;
for (t=0;datos[t].nombre[0] && t<MAX;++t);
if (t==MAX)
return -1;
return t;
}
/* rutina para borrar un dato*********************************************/
void borrar(void)
{
register int sitio;
char s[80];
printf("Introdusca el numero de registro");
gets(s);
sitio= atoi(s);
if (sitio>=0 && sitio< MAX)
datos[sitio].nombre[0]='\0';
}
/* rutina para listar los datos********************************************/
void listar(void)
{
register int t;
for (t=0; t<MAX;++t)
{
if(datos[t].nombre[0])
{printf("posicion %s\n",t);
printf ("%s\n",datos-> nombre);
printf ("%s\n",datos->calle);
printf ("%s\n",datos->ciudad);
printf ("%s\n",datos->telefono);
}
}
printf("\n\n");
}
Respuesta
1
El código esta bastante bien, lo que pasa es que utilizas gets en vez de scanf para leer enteros, gets es para leer las cadenas. Con scanf("%d", &entero) almacenas en entero el numero que el usuario entra por teclado.
Los datos no se pueden borrar porque lo único que haces es borrar el primer carácter del nombre, pero en la estructura tienes más datos, y a la hora de mostrarlos lo que posiblemente pase es que no se vea el nombre pero todo lo otro sí.
Deberías utilizar funciones para el trabajo con cadenas (string.h) Como strcpy(str1, str2) donde copias lo de str2 a str1.
Ademas cuando uno utiliza gets, si se llena el buffer stdin no te recoge lo que el usuario entre y se pierde por lo que después de cada gets debes utilizar fflush().
jeje sip ia m di cuenta gracias pero un preguntita mas...
¿Cómo le podría hacer para que borre todo
oces me dices que nada más borraría el nombre pero todo los de más?
Debes hacer parecido a como haces con el nombre
...
#include <string.h>
.......
strcpy(datos[sitio].nombre, "");
strcpy(datos[sitio].calle,"");
strcpy(datos[sitio].ciudad,"");
strcpy(datos[sitio].telefono, "");
...
/*Seria algo así, esto es solo una vía, lo puedes seguir haciendo como hiciste con el nombre pero debes hacérselo a cada campo de tu estructura, si no lo borras el contenido va a seguir ahi.*/
oies mira ahora el problema es cuando enlisto el archivo =S pues solo enlista el primer registro i los demás no =S esto es lo que tengo mira...
/* Agenda de telefonos*/
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#define MAX 5
#include "string.h"
struct dir {
char nombre[30];
char calle[40];
char ciudad[20];
char telefono[12];
} datos[MAX];
void inic_lista(void);
void intro(void);
void borrar(void),listar(void);
int menu(void),busca_libre(void);
/*Bloque Principal*******************************...
*/
main(void)
{
char opcion;
inic_lista();
for (;;)
{
opcion = menu();
switch(opcion)
{
case 1: intro();
break;
case 2:borrar();
break;
case 3: listar();
break;
case 4: exit(0);
}
}
}
/*rutina para inicilizar el array**********************************/
void inic_lista(void)
{
register int t;
for (t=0; t<MAX; ++t)
datos[t].nombre[0]='\0';
}
/*rutina para vizulizar un menu************************************...
*/
menu (void)
{
clrscr();
char s[80];
int c;
printf("\n\n\n\n");
printf(" MENU \n\n");
printf ("1. Introducir un nombre\n");
printf ("2. Borrar un nombre \n");
printf ("3. Listar el archivo\n");
printf ("4. Salir\n");
do
{
printf("\nIntroduzca su opcion NUMERICA : ");
gets(s);
c = atoi(s);
}
while(c<0 || c>4);
return c;
}
/*rutina para introducir un dato************************************...
*/
void intro(void)
{
int sitio;
sitio = busca_libre();
if(sitio==-1)
{
printf("\n lista llena");
return;
}
printf("introduzca nombre: ");
gets(datos[sitio].nombre);
printf("introduzca calle: ");
gets(datos[sitio].calle);
printf("introduzca ciudad: ");
gets(datos[sitio].ciudad);
printf("introduzca telefono: ");
gets(datos[sitio].telefono);
}
/*rutina para buscar una localidad vacia***********************************...
*/
busca_libre(void)
{
register int t;
for (t=0;datos[t].nombre[0] && t<MAX;++t);
if (t==MAX)
return -1;
return t;
}
/* rutina para borrar un dato************************************...
*/
void borrar(void)
{
register int sitio;
char s[80];
printf("Introdusca el numero de registro");
gets(s);
sitio= atoi(s);
if (sitio>=0 && sitio< MAX)
strcpy(datos[sitio].nombre, "\0");
strcpy(datos[sitio].calle,"\0");
strcpy(datos[sitio].ciudad,"\0");
strcpy(datos[sitio].telefono, "\0");
}
/* rutina para listar los datos***********************************...
*/
void listar(void)
{
clrscr();
int t;
for (t=0; t<MAX;t++)
{
if(datos[t].nombre[0])
{printf("---------------------posicion... %d\n",t+1);
printf ("%s\n",datos-> nombre);
printf ("%s\n",datos->calle);
printf ("%s\n",datos->ciudad);
printf ("%s\n",datos->telefono);
printf("\n");
}
}
getche();
}
Todo lo demás ya lo hace eso es el problema que al presionar 3 no me muestra todo... =S
Fíjate bien lo que tienes:
printf ("%s\n",datos-> nombre);
printf ("%s\n",datos->calle);
printf ("%s\n",datos->ciudad);
printf ("%s\n",datos->telefono);
Lo que pasa es que estas tratando a datos como un puntero (el nombre de un array es un puntero a la primera posición del array) al poner el símbolo -> lo que tienes que hacer es sustituir datos-> por datos[t]. Eso te permitirá desplazarte por cada posición del arreglo datos y acceder a la estructura en la posición t, que es lo que quieres.
Ademas tienes otro error en el metodo borrar, en el if(sitio >=0 && datos[sitio]. Nombre[]) no lo has notado porque siempre sitio es válido, pero en caso contrario el programa va a explotar, todo se debe a que no encierras las cosas entre llaves y por tanto el if es válido solo para la linea siguiente, lo que debes hacer es encerrar todo lo que tenga que ver con la validación que haces de la variable sitio y del nombre entre llaves o sea:
if(sitio >= 0 && datos[sitio].nombre[0])
{
strcpy(datos[sitio].nombre, "\0");
strcpy(datos[sitio].calle,"\0");
strcpy(datos[sitio].ciudad,"\0");
strcpy(datos[sitio].telefono, "\0");
}

1 respuesta más de otro experto

Respuesta
1
Lo que encontré hasta ahora es como hacer que aparezca correctamente el contenido o la función listar y si borra bien eso si registro a registro, pero lo que aun no he logtrado hacer es que al ingresar un dato como si lo replicase porque cuando ingreso por segunda vez datos a la hora de listarlos me muestra 2 registros de la agenda pero el segundo no muestra los datos ingresados la segunda vez si no me muestra lo mismo el el `primer renglón y también en el segundo
¿Y cómo le hiciste?
Ha si olvide el código pero te lo envío solo que por falta de tiempo no he logrado corregir el error de que a la hora de ingresar los datos e ingresar una segunda persona no muestra bien los datos ingresados de la segunda persona sino que me muestra los de la primera persona y así lo hace con los siguientes 3 registros lo subiré(code) más tarde solo que ahorita no lo cargo en el USB.
Con lo anterior cambie el %s a %d para que me mostrara la posición o numero del registro porque d me mostrara datos numéricos decimales y la s para cadena de caracteres por eso cunado lo ejecute por primera vez me dio null, allí te envío el código al rato
ok pasamlo kuando kieras
#include <stdio.h>
#include <stdlib.h>
#define MAX 5
struct dir{
char nombre[30];
char calle[40];
char ciudad[20];
char telefono[12];
}datos[MAX];
int inic_lista();
int intro();
void borrar(void);
void listar(void);
int menu(void);
int busca_libre();
int main()
{
char opcion;
inic_lista();
for(;;)
{
opcion=menu();
switch(opcion)
{
case 1:intro();
break;
case 2:borrar();
break;
case 3:listar();
break;
case 4:exit(0);
}
}
system("PAUSE");
return 0;
}
/*rutina para inicializar el array***************/
int inic_lista()
{
//register int t;
int t;
for(t=0; t<MAX; ++t)
datos[t].nombre[0]='\0';
}
/*rutina para visualizar un menu******************/
int menu(void)
{
char s[80];
int c;
printf("\n\n\n");
printf("MENU\n\n");
printf("1. Introducir un nomnre\n");
printf ("2. Borrar un nombre \n");
printf ("3. Listar el archivo\n");
printf ("4. Salir\n");
do
{
printf("\nIntroduzca su opcion NUMERICA : ");
gets(s);
c = atoi(s);
}
while(c<0 || c>4);
return c;
}
/*rutina para introducir un dato****************************************/
int intro()
{
int sitio;
sitio = busca_libre();
if(sitio==-1)
{
printf("\n lista llena");
return;
}
printf("\tintroduzca nombre: ");
gets(datos[sitio].nombre);
printf("\n\t",datos[sitio].nombre);
printf("introduzca calle: ");
gets(datos[sitio].calle);
printf("\n\t",datos[sitio].calle);
printf("introduzca ciudad: ");
gets(datos[sitio].ciudad);
printf("\n\t",datos[sitio].telefono);
printf("introduzca telefono: ");
gets(datos[sitio].telefono);
printf("\n\t",datos[sitio].telefono);
}
/*rutina para buscar una localidad vacia***********************************/
int busca_libre()
{
register int t;
for (t=0;datos[t].nombre[0] && t<MAX;++t);
if (t==MAX)
return -1;
//if(datos[t].nombre=='\0')
return t;
}
/* rutina para borrar un dato*********************************************/
void borrar(void)
{
register int sitio;
char s[80];
printf("Introdusca el numero de registro");
gets(s);
sitio= atoi(s);
if (sitio>=0 && sitio< MAX)
datos[sitio].nombre[0]='\0';
}
/* rutina para listar los datos********************************************/
void listar(void)
{
int t;
for (t=0; t<MAX;t++)
{
if(datos[t].nombre[0])
{
printf ("posicion %d",t); printf("\t");
printf ("%s\t",datos->nombre);
printf ("%s\t",datos->calle);
printf ("%s\t",datos->ciudad);
printf ("%s\n",datos->telefono);
}
//printf ("posicion %d",t);
//printf ("%s\t",datos->nombre);
//printf ("%s\t",datos->calle);
//printf ("%s\t",datos->ciudad);
//printf ("%s\n",datos->telefono);
}
//printf("\n\n");
}
Mira esto es me falta modificar más pero no lo he hecho por tiempo

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas