es de funciones hash tengo que mostrar el contenido pro al mostrarlo lo qeu ocurre es que me sae el dato elmiminado la funcion se llama mostrar y si me pueden explicar para que sirve if (registros[cont].codigo==codigo)
if (registros[cont].vazio==1) {
registros[cont].vazio=0;
printf("\neliminado correctamente \n");
break;
}
el programa completo es el siguiente:
y si alguien me pudiera explicar si esta bien implementarlo asi o si tengo que cambiar algo con eso de los "errores" se los agradeceria mucho
#include<string.h>
#include<conio.h>
#include<stdio.h>
#include <ctype.h>
#include <cstdlib>
struct agenda { // defino una estructura llamada agenda
int codigo;
char nombre[10];
char apellido[10];
int telefono;
int vazio;
} registros[10];
// funciones a utilizar
int ingresar(int codigo, int pos);
void consultar();
int verifica_pos();
void zerar();
int verifica_cod(int cod);
int excluir();
void mostrar();
main() {
zerar(); // no entiendo para que sirve esta funcion bien
int op=0,retorno,codaux,posicao;
while(op!=5){
printf("\n\n\t\t\t\t** AGENDA ** \n1 - Ingresar\n2 - Buscar\n3 - Borrar\n4 - mostrar todo \n\nOpcion: ");
scanf("%d",&op);
fflush(stdin);
switch(op) {
case 1: {
posicao=verifica_pos();
if (posicao!=-1) {
printf("\nIngresar codigo\n");
scanf("%d",&codaux);
fflush(stdin);
retorno=verifica_cod(codaux);
if (retorno==1)
ingresar(codaux,posicao);
if(retorno ==0)
printf(" intenta de nuevo ");
}
else
printf("\n La agenda ya esta llena\n");
break;
}
case 2: {
consultar();
break;
}
case 3: {
excluir();
break;
}
case 4: {
mostrar();
break;
}
case 5:
{
printf("presione una tecla para salir");
break;
}
default:
{
printf ("esa opcion no existe");
break;
}
}
}
}
void mostrar( )
{
//aqui tengo que mostrar todo pero sin el dato eliminado ya que me muestras todo seria con registros[pos].vazio== 1 pero no se como muy bien
int cont;
cont=0;
while (cont<10) {
printf ("\n \t ----------------");
printf ("\n \t posisicon %d",cont);
printf (" \n \t codigo %d",registros[cont].codigo);
fflush(stdin);
printf ("\n\t nombre %s",registros[cont].nombre);
fflush(stdin);
printf (" \n \t apellido %s",registros[cont].apellido );
fflush(stdin);
cont++;
}
}
int suma =0;
int ingresar(int codigo, int pos) {
if(pos>10)
{
printf("todo esta lleno");
}
else
{
registros[pos].codigo=codigo;
int val_atomic=0;
int val_atomic2=0;
int x,y;
bool estado2 =false ;
bool estado=false ;
do{
if (estado== false )
{
printf ("\n Nombre");
scanf ("%s",®istros[pos].nombre); // utilizo scanf ya que no se utyilizar muy bienel gets creo que hice lo correcto
} else
{
if (val_atomic == 1)
{
printf ("\n nombre correcto no es necesario modificar ") ;
x=1;
}
}
if (estado2 == false )
{
printf ("\n Apellido ") ;
scanf (" %s", & registros[pos].apellido) ;
}
else
{
if (val_atomic2 == 1)
{
printf( "\n apellido correcto no es necesaeio modificar") ;
y=1;
}
}
char *str =registros[pos].nombre; // se supone que paso lo que esta enla estrctura d de nombre a un puntero
char *str2=registros [pos].apellido;
int i=0;
while (str ) // no entiendo bien pero se supone que un puntero es un array pero no se como funciona el while aqui
{
if (strlen(registros[pos].nombre) >10) // digo que si cadena es mayor a 10 entonces que no se pueda exceder del tamaño del array
{
printf ("\n lo siento demasiadas letras ") ;
printf ("\n el nombre %s", registros[pos].nombre) ;
fflush(stdin) ;
printf ( " tiene %d letras ", strlen(registros[pos].nombre)) ; // imprimo el numero de letras contenidas
break;
}
if (isalpha(str )!= NULL ) // verifico si es o no un tipo de dato alfabetico
{
printf ("\n bien ");
estado=true ;
break;
}else
{
printf ("\n el nombre es incorrecto nada de caracteres o numeros raros \n " ) ;
registros[pos].vazio=0; // aqui se supone que si lo que ingreso fue incorrecto le digo que me lo eliimine de la estructura
estado=false;
break;
}
i++;
}
i=0;
while (str2)
{
if (strlen(registros[pos].apellido) >10)
{
printf ("\n lo siento demasiadas letras ") ;
printf ("\n el apellido %s", registros[pos].apellido) ;
fflush(stdin) ;
printf ( " tiene %d letras ", strlen(registros[pos].apellido)) ;
break;
}
if (isalpha (str2)!= NULL)
{
printf ("\n bien ");
estado2 =true ;
break;
}
else
{
printf ("\n apellido es incorrecto nada de numeros o caractes raros \n");
registros[pos].vazio=0;
estado2=false;
break;
}
i++;
}
}while (estado !=true || estado2!=true ) ;
suma =x+y;
registros[pos].vazio=1; // aqui valido y digo que se le pase el valor para poder ser rgistrado
printf("\nEl registro a sido realizado\n\n");
return suma ;
}
}
void consultar() {
int cont=0, codigo;
printf("\nIngresa el codigo\n");
scanf("%d",&codigo);
while(cont<=10) {
if (registros[cont].codigo==codigo) { // igualo el codigo con el codigo de la estructura
if (registros[cont].vazio==1) { // se supone que verifico si en determinada posicion vazio vale uno y si es asi que me lo imprima
printf("\nNombre: %s",registros[cont].nombre);
printf("\nApelldio %s",registros[cont].apellido);
break;
}
}
cont++;
if (cont>10) // si es mayor a diez significa que no lo encontro
printf("\nCodigo no encontrado\n");
}
}
int verifica_pos() {
int cont=0;
while (cont<=10) {
if (registros[cont].vazio==0)
return(cont);
cont++;
}
return(-1); /// retorno -1 para comprobar que no este lleno
}
void zerar() {
int cont;
for (cont=0;cont<=10;cont++)
registros[cont].vazio=0; // no entiendo muy bien
}
int verifica_cod(int codigo) {
int cont=0;
while (cont<=10) {
if (registros[cont].codigo==codigo) // comparo el codigo y si es el mismo que me imprima que no se puede tener el mismo codigo
{
printf ("lo siento no puedes tener el mismo codigo ");
return(0);
}
cont++;
}
return(1); // retorno 1 para decirle que pueda continuar si es que no es el mismo
}
int excluir() {
int codigo, cont=0;
printf("\nIngresa el codigo para ser eliminado\n");
scanf("%d",&codigo);
while (cont<=10) {
if (registros[cont].codigo==codigo) // compara como arriba
if (registros[cont].vazio==1) { // verifico que el valor de la estrctura de determinada posicion sea iguala uno para eliminarlo con la linea sigueinte
registros[cont].vazio=0;
printf("\neliminado correctamente \n");
break;
}
cont++;
if (cont>10)
printf("\nCodigo nao encontrado\n");
}
return codigo;
}
if (registros[cont].vazio==1) {
registros[cont].vazio=0;
printf("\neliminado correctamente \n");
break;
}
el programa completo es el siguiente:
y si alguien me pudiera explicar si esta bien implementarlo asi o si tengo que cambiar algo con eso de los "errores" se los agradeceria mucho
#include<string.h>
#include<conio.h>
#include<stdio.h>
#include <ctype.h>
#include <cstdlib>
struct agenda { // defino una estructura llamada agenda
int codigo;
char nombre[10];
char apellido[10];
int telefono;
int vazio;
} registros[10];
// funciones a utilizar
int ingresar(int codigo, int pos);
void consultar();
int verifica_pos();
void zerar();
int verifica_cod(int cod);
int excluir();
void mostrar();
main() {
zerar(); // no entiendo para que sirve esta funcion bien
int op=0,retorno,codaux,posicao;
while(op!=5){
printf("\n\n\t\t\t\t** AGENDA ** \n1 - Ingresar\n2 - Buscar\n3 - Borrar\n4 - mostrar todo \n\nOpcion: ");
scanf("%d",&op);
fflush(stdin);
switch(op) {
case 1: {
posicao=verifica_pos();
if (posicao!=-1) {
printf("\nIngresar codigo\n");
scanf("%d",&codaux);
fflush(stdin);
retorno=verifica_cod(codaux);
if (retorno==1)
ingresar(codaux,posicao);
if(retorno ==0)
printf(" intenta de nuevo ");
}
else
printf("\n La agenda ya esta llena\n");
break;
}
case 2: {
consultar();
break;
}
case 3: {
excluir();
break;
}
case 4: {
mostrar();
break;
}
case 5:
{
printf("presione una tecla para salir");
break;
}
default:
{
printf ("esa opcion no existe");
break;
}
}
}
}
void mostrar( )
{
//aqui tengo que mostrar todo pero sin el dato eliminado ya que me muestras todo seria con registros[pos].vazio== 1 pero no se como muy bien
int cont;
cont=0;
while (cont<10) {
printf ("\n \t ----------------");
printf ("\n \t posisicon %d",cont);
printf (" \n \t codigo %d",registros[cont].codigo);
fflush(stdin);
printf ("\n\t nombre %s",registros[cont].nombre);
fflush(stdin);
printf (" \n \t apellido %s",registros[cont].apellido );
fflush(stdin);
cont++;
}
}
int suma =0;
int ingresar(int codigo, int pos) {
if(pos>10)
{
printf("todo esta lleno");
}
else
{
registros[pos].codigo=codigo;
int val_atomic=0;
int val_atomic2=0;
int x,y;
bool estado2 =false ;
bool estado=false ;
do{
if (estado== false )
{
printf ("\n Nombre");
scanf ("%s",®istros[pos].nombre); // utilizo scanf ya que no se utyilizar muy bienel gets creo que hice lo correcto
} else
{
if (val_atomic == 1)
{
printf ("\n nombre correcto no es necesario modificar ") ;
x=1;
}
}
if (estado2 == false )
{
printf ("\n Apellido ") ;
scanf (" %s", & registros[pos].apellido) ;
}
else
{
if (val_atomic2 == 1)
{
printf( "\n apellido correcto no es necesaeio modificar") ;
y=1;
}
}
char *str =registros[pos].nombre; // se supone que paso lo que esta enla estrctura d de nombre a un puntero
char *str2=registros [pos].apellido;
int i=0;
while (str ) // no entiendo bien pero se supone que un puntero es un array pero no se como funciona el while aqui
{
if (strlen(registros[pos].nombre) >10) // digo que si cadena es mayor a 10 entonces que no se pueda exceder del tamaño del array
{
printf ("\n lo siento demasiadas letras ") ;
printf ("\n el nombre %s", registros[pos].nombre) ;
fflush(stdin) ;
printf ( " tiene %d letras ", strlen(registros[pos].nombre)) ; // imprimo el numero de letras contenidas
break;
}
if (isalpha(str )!= NULL ) // verifico si es o no un tipo de dato alfabetico
{
printf ("\n bien ");
estado=true ;
break;
}else
{
printf ("\n el nombre es incorrecto nada de caracteres o numeros raros \n " ) ;
registros[pos].vazio=0; // aqui se supone que si lo que ingreso fue incorrecto le digo que me lo eliimine de la estructura
estado=false;
break;
}
i++;
}
i=0;
while (str2)
{
if (strlen(registros[pos].apellido) >10)
{
printf ("\n lo siento demasiadas letras ") ;
printf ("\n el apellido %s", registros[pos].apellido) ;
fflush(stdin) ;
printf ( " tiene %d letras ", strlen(registros[pos].apellido)) ;
break;
}
if (isalpha (str2)!= NULL)
{
printf ("\n bien ");
estado2 =true ;
break;
}
else
{
printf ("\n apellido es incorrecto nada de numeros o caractes raros \n");
registros[pos].vazio=0;
estado2=false;
break;
}
i++;
}
}while (estado !=true || estado2!=true ) ;
suma =x+y;
registros[pos].vazio=1; // aqui valido y digo que se le pase el valor para poder ser rgistrado
printf("\nEl registro a sido realizado\n\n");
return suma ;
}
}
void consultar() {
int cont=0, codigo;
printf("\nIngresa el codigo\n");
scanf("%d",&codigo);
while(cont<=10) {
if (registros[cont].codigo==codigo) { // igualo el codigo con el codigo de la estructura
if (registros[cont].vazio==1) { // se supone que verifico si en determinada posicion vazio vale uno y si es asi que me lo imprima
printf("\nNombre: %s",registros[cont].nombre);
printf("\nApelldio %s",registros[cont].apellido);
break;
}
}
cont++;
if (cont>10) // si es mayor a diez significa que no lo encontro
printf("\nCodigo no encontrado\n");
}
}
int verifica_pos() {
int cont=0;
while (cont<=10) {
if (registros[cont].vazio==0)
return(cont);
cont++;
}
return(-1); /// retorno -1 para comprobar que no este lleno
}
void zerar() {
int cont;
for (cont=0;cont<=10;cont++)
registros[cont].vazio=0; // no entiendo muy bien
}
int verifica_cod(int codigo) {
int cont=0;
while (cont<=10) {
if (registros[cont].codigo==codigo) // comparo el codigo y si es el mismo que me imprima que no se puede tener el mismo codigo
{
printf ("lo siento no puedes tener el mismo codigo ");
return(0);
}
cont++;
}
return(1); // retorno 1 para decirle que pueda continuar si es que no es el mismo
}
int excluir() {
int codigo, cont=0;
printf("\nIngresa el codigo para ser eliminado\n");
scanf("%d",&codigo);
while (cont<=10) {
if (registros[cont].codigo==codigo) // compara como arriba
if (registros[cont].vazio==1) { // verifico que el valor de la estrctura de determinada posicion sea iguala uno para eliminarlo con la linea sigueinte
registros[cont].vazio=0;
printf("\neliminado correctamente \n");
break;
}
cont++;
if (cont>10)
printf("\nCodigo nao encontrado\n");
}
return codigo;
}