3

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, como podria solucionar o elaborarlo de una manera alternativa? Al correr el programa todo va bien hasta ese punto me dice que no existe, estoy utilizando DevC++ como IDE. Ademas de que aveces me aparecia a veces este codigo de error en esa linea "ISO C++ forbids comparison between pointer and integer ".

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

int n,h,a,d,comp;
int cod[100];
char nom[40][100];
int tel[100];
char email[15][100];
int bcod;

int main(){

    system("cls");
    printf("Agenda de tu empresa\n\n");
    printf("Ingrese el número de contactos que deseas ingresar: ");
    scanf("%d", &n);

    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("%s", &nom[h]);
        printf("\n> Ingrese Telefono: ");
        scanf("%d", &tel[h]);
        printf("\n> Ingrese Correo: ");
        scanf("%s", &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); 

     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]);
     }
     else{
     printf("No existe");
     }
getch();
return 0;
}

1 Answers1

7

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.

MrDave1999
  • 7,491
  • 1
  • 7
  • 22