Ahí va un código más bonito y adaptado totalmente a C, ya que había batiburrillo de mucho C y algo de C++.
Aviso que el código no compila. Los errores originales siguen estando. Tan solo se ha aclarado y se han quitado problemas dialectales.
A ver si así la gente se anima con este post.
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
// defino una estructura llamada agenda
struct agenda {
int codigo;
char nombre[10];
char apellido[10];
int telefono;
int vacio;
} registros[10];
// funciones a utilizar
int ingresar(int codigo, int pos);
void consultar();
int verifica_pos();
void desmarcar_pos();
int verifica_cod(int cod);
int excluir();
void mostrar();
int main() {
int op, retorno, codaux, posicion;
desmarcar_pos(); // no entiendo para que sirve esta funcion bien
do {
printf("\n\n\t\t\t\t** AGENDA **\n1 - Ingresar\n2 - Buscar\n3 - Borrar\n4 - Mostrar todo\n\nOpcion: ");
switch(op) {
case 1:
posicion = verifica_pos();
if (posicion != -1) {
printf("\nIngresar codigo: ");
retorno = verifica_cod(codaux);
if(retorno)
ingresar(codaux, posicion);
else
puts("\nIntenta de nuevo"); }
else
puts("\nLa agenda ya esta llena"); break;
case 2:
consultar();
break;
case 3:
excluir();
break;
case 4:
mostrar();
break;
case 5:
puts("\nPresione INTRO para salir"); break;
default:
printf ("\nEsa opcion no existe"); break;
}
} while(op != 5);
}
void mostrar( )
{
/* Aqui tengo que mostrar todo pero sin el dato eliminado ya que me
* muestras todo seria con registros[pos].vacio == 1 pero
* no se como muy bien */
int cont = 0;
while (cont < 10) {
printf ("\n\t ----------------"); printf ("\n\t posicion %d",cont
); printf ("\n\t codigo %d",registros
[cont
].
codigo); printf ("\n\t nombre %s",registros
[cont
].
nombre); printf ("\n\t apellido %s",registros
[cont
].
apellido ); cont++;
}
}
int ingresar(int codigo, int pos) {
int val_atomic;
int val_atomic2;
int estado;
int estado2;
int x, y;
int i;
if(pos > 10) {
puts("\nTodo esta lleno"); }
else {
registros[pos].codigo=codigo;
val_atomic = 0;
val_atomic2 = 0;
estado = 0;
estado2 = 0;
do {
if(!estado) {
scanf ("%s", ®istros
[pos
].
nombre); // utilizo scanf ya que no se utyilizar muy bien el gets creo que hice lo correcto }
else {
if(val_atomic == 1) {
puts("\nNombre correcto no es necesario modificar"); x = 1;
}
}
if(!estado2) {
scanf("%s", ®istros
[pos
].
apellido); }
else {
if (val_atomic2 == 1) {
puts("\nApellido correcto no es necesario 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;
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 puts("\nLo siento demasiadas letras"); printf("El nombre %s", registros
[pos
].
nombre); 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 estado = 1;
break;
}
else {
puts("\nEl nombre es incorrecto nada de caracteres o numeros raros"); registros[pos].vacio = 0; // aqui se supone que si lo que ingreso fue incorrecto le digo que me lo elimine de la estructura
estado = 0;
break;
}
i++;
}
i = 0;
while(str2) {
if(strlen(registros
[pos
].
apellido) > 10) { puts("\nLo siento demasiadas letras"); printf("El apellido %s", registros
[pos
].
apellido); printf(" tiene %d letras", strlen(registros
[pos
].
apellido)); break;
}
estado2 = 1;
break;
}
else {
puts("\nApellido es incorrecto nada de numeros o caractes raros"); registros[pos].vacio = 0;
estado2 = 0;
break;
}
i++;
}
} while (estado != 1 || estado2 != 1);
suma = x + y;
registros[pos].vacio = 1; // aqui valido y digo que se le pase el valor para poder ser registrado
puts("\nEl registro a sido realizado\n"); return suma;
}
}
void consultar() {
int cont = 0;
int codigo;
printf("\nIngresa el codigo: "); while(cont <= 10) {
if(registros[cont].codigo == codigo) { // igualo el codigo con el codigo de la estructura
if(registros[cont].vacio == 1) { // se supone que verifico si en determinada posicion vacio 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
puts("\nCodigo no encontrado"); }
}
int verifica_pos() {
int cont = 0;
while(cont <= 10) {
if(registros[cont].vacio == 0)
return(cont);
cont++;
}
return -1; // retorno -1 para comprobar que no este lleno
}
void desmarcar_pos() {
int cont;
for(cont = 0; cont <= 10; cont++)
registros[cont].vacio = 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
puts("\nLo 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;
int cont = 0;
printf("\nIngresa el codigo para ser eliminado: "); while(cont <= 10) {
if(registros[cont].codigo == codigo) // compara como arriba
if (registros[cont].vacio == 1) { // verifico que el valor de la estrctura de determinada posicion sea iguala uno para eliminarlo con la linea sigueinte
registros[cont].vacio = 0;
puts("\nEliminado correctamente"); break;
}
cont++;
if(cont > 10)
puts("\nCodigo no encontrado"); }
return codigo;
}
Vaya diferencia ¿eh?