Estoy elaborando un programa el cual sirviera como una base para guardar una agenda para personas pero la linea if(bcod==cod[h]) parece no trabajar correctamente...
El error se debe porqué no estás haciendo la búsqueda de información a través de un bucle (for
, while
o do-while
).
Analicemos esta condición:
if(bcod==cod[h])
La variable h
anteriormente se la usó en un bucle y está claro que se quedó con el valor que tenga la variable n
. Por ejemplo, imagínate que la variable n
tiene guardado un 10
, esto quiere decir que el arreglo cod
tendrá 10
códigos de personas, el resto de espacio valdrán 0
(como declaraste el arreglo cod
como global, el compilador inicializa cada elemento del arreglo a 0
).
Así que cuando esta condición se evalue:
bcod == cod[h]
Dará como resultado un false
, porqué como h
tiene el mismo valor que n
(un 10
), estaríamos accediendo a la posición 10
del arreglo cod
, dando como resultado un 0
y la única forma para que la condición se cumpla, es que la variable bcod
tenga almacenado un 0
, de lo contrario, la restricción siempre arrojará un false
y esa es la razón del porqué te imprime el mensaje: No existe
.
Solución: Debes recorrer cada elemento del arreglo cod
a través de un bucle y compararlo con el valor que tenga almacenado la variable bcod
.
for(h = 0; h < n; h++)
{
if(bcod==cod[h])
{
printf("Contacto #%d\n", h+1);
printf("El Codigo es: %d", cod[h]);
printf("Su Nombre es: %s", nom[h]);
printf("Su Numero es: %d", tel[h]);
printf("Su E-mail es: %s", email[h]);
break; //Rompemos el ciclo for.
}
}
if(h == n)
printf("No existe");
ISO C++ forbids comparison between pointer and integer
El error se debe porqué estás comparando una dirección de memoria con un número entero.
Ejemplo:
if(bcod == cod)
El código de arriba dará un posible error de compilación (dependería del compilador) porqué no tiene ningún sentido comparar el contenido del puntero cod
con la variable bcod
.
Observaciones:
1. Al principio tienes declarado estos arreglos:
int cod[100];
char nom[40][100];
int tel[100];
char email[15][100];
Sin embargo, no tienen el mismo tamaño. En la matriz nom
tiene como capacidad máxima para almacenar 40 nombres (que representa el número de filas) de personas y en cod
se tiene como tamaño máximo un 100
, es decir, esto puede ocasionar un desbordamiento de búfer. Por ejemplo, si la variable n
llegara a tener un valor de 95
, estarás desbordando la matriz nom
, porqué en su primera dimensión solo acepta índices de 0
a 39
.
El desbordamiento de búfer es un error que te pueda costar horas en solucionarlo y más aún cuando sobreescribes algún espacio de memoria del propio programa. Otra consecuencia sería si se llegara a sobreescribir un registro que al programa no le pertenece, en este caso el programa si dejaría de funcionar, debido a que, ocurriría un fallo de segmentación.
La solución sería cambiar el número de filas a 100
de las matrices nom
y email
.
#define MAX_PERSONAS 100
int cod[MAX_PERSONAS];
char nom[MAX_PERSONAS][100];
int tel[MAX_PERSONAS];
char email[MAX_PERSONAS][100];
2. Al momento de pedir al usuario que ingrese el número de contactos, estás dando la oportunidad de que ocurra un posible desbordamiento de búfer. Anteriormente habíamos definido que la capacidad máxima de cada arreglo sería de 100
, sin embargo, si el usuario llegara a ingresar un 110
, se estaría pasando del tamaño máximo, debido a que, los arreglos nom
, email
, cod
, solo aceptarán índices de 0
a 99
.
La solución sería establecer una restricción al usuario para que solo pueda ingresar como máximo 100 contactos.
do{
printf("Ingrese el número de contactos que deseas ingresar: ");
scanf("%d", &n);
if(n < 1 || n > 100)
{
printf("Error: Solo se permite ingresar de 1 a 100 contactos\n\n");
continue;
}
break;
}while(1);
3. No deberías usar variables globales de forma innecesaria (para más información: ¿Por qué es considerado una mala práctica utilizar variables globales?), esto se debe porqué hace que la depuración del código sea más complicada de ver, ya que no se sabe en que momento va a cambiar el valor de la variable. En su reemplazo, puedes hacer uso de variables locales.
4. Si vas a usar la función scanf para leer una cadena hasta encontrar un espacio, por lo menos debes anteponer en el especificador, el tamaño máximo de caracteres que podrá leer la función scanf
en el búfer del teclado, de lo contrario, habrá desbordamiento de búfer.
for(h=0; h+1<=n; h++)
{
printf("\nIngresando contacto #%d\n", h+1);
printf("\n> Ingrese Codigo: ");
scanf("%d", &cod[h]);
printf("\n> Ingrese Nombre: ");
scanf("%99s", &nom[h]);
printf("\n> Ingrese Telefono: ");
scanf("%d", &tel[h]);
printf("\n> Ingrese Correo: ");
scanf("%99s", &email[h]);
system("cls");
}
Se agrega 99
para que la función scanf
pueda leer hasta 99 caracteres, debido a que, se debe dejar un espacio para el caracter nulo.
Tu programa quedaría de esta forma teniendo en cuenta las cuatro observaciones que se mencionaron anteriormente:
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#define MAX_PERSONAS 100
int main()
{
int n,h,a,d,comp;
int cod[MAX_PERSONAS];
char nom[MAX_PERSONAS][100];
int tel[MAX_PERSONAS];
char email[MAX_PERSONAS][100];
int bcod;
system("cls");
printf("Agenda de tu empresa\n\n");
printf("Ingrese el número de contactos que deseas ingresar: ");
scanf("%d", &n);
do{
printf("Ingrese el número de contactos que deseas ingresar: ");
scanf("%d", &n);
if(n < 1 || n > 100)
{
printf("Error: Solo se permite hasta 100 contactos\n\n");
continue;
}
break;
}while(1);
for(h=0; h+1<=n; h++)
{
printf("\nIngresando contacto #%d\n", h+1);
printf("\n> Ingrese Codigo: ");
scanf("%d", &cod[h]);
printf("\n> Ingrese Nombre: ");
scanf("%99s", &nom[h]);
printf("\n> Ingrese Telefono: ");
scanf("%d", &tel[h]);
printf("\n> Ingrese Correo: ");
scanf("%99s", &email[h]);
system("cls");
}
system("cls");
for(h=0; h+1<=n; h++)
{
printf("\nGuardando Contacto #%d\n", h+1);
printf("Su Codigo es: %d\n", cod[h]);
printf("Su Nombre es: %s\n", nom[h]);
printf("Su Numero es: %d\n", tel[h]);
printf("Su E-mail es: %s\n", email[h]);
Sleep(3250);
}
system("cls");
printf("Menu de busqueda");
printf("Escriba el codigo de la persona a buscar: ");
scanf("%d", &bcod);
//Recorremos cada elemento del arreglo
for(h = 0; h < n; h++)
{
if(bcod==cod[h])
{
printf("Contacto #%d\n", h+1);
printf("El Codigo es: %d", cod[h]);
printf("Su Nombre es: %s", nom[h]);
printf("Su Numero es: %d", tel[h]);
printf("Su E-mail es: %s", email[h]);
break;
}
}
if(h == n)
printf("No existe");
getch();
return 0;
}
Recomendación: Podrías hacer uso de una lista enlazada para no limitar el registro de contactos.