Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Busqueda lineal en C

Estas en el tema de Busqueda lineal en C en el foro de C/C++ en Foros del Web. Veran tengo mi primer programa "complejo" en la uni y ps compila y todo, pero a la hora de realizar una busqueda simplemente no me ...
  #1 (permalink)  
Antiguo 10/03/2010, 20:24
 
Fecha de Ingreso: marzo-2010
Mensajes: 10
Antigüedad: 14 años, 2 meses
Puntos: 0
Busqueda lineal en C

Veran tengo mi primer programa "complejo" en la uni y ps compila y todo, pero a la hora de realizar una busqueda simplemente no me funciona en el programa uso la función strcmp vean mi codigo:

Código:
#include <stdio.h>
#include <string.h>
#define NALUMNOS  10
#define NMATERIAS 5
struct materia {
    char nom[50];
    float calif;
};

struct alumno {
    char nombre[50];
    int edad;
    char sexo, marca;
    struct materia mat[NMATERIAS];
};

struct alumno ListaAlumnos[NALUMNOS];
void limpieza () {
    int i;
    for(i=0;i<NALUMNOS;i++)
        ListaAlumnos[i].marca='0';
}
float promedio () {
    int j,x;
    char cad[50];
    float suma=0;
    printf("\nIntroduce el nombre del alumno ");
    fpurge(stdin);
    gets(cad);
    if ((x=buscar(cad))!=-1) {
        for (j=0;j<NMATERIAS;j++)
            suma+=ListaAlumnos[x].mat[j].calif;
    }
    else
            printf("\nAlumno no encontrado");
    suma/=NMATERIAS;
    return suma;
}
char menu() {
    char op;
    printf("\nMENU");
    printf("\n1.Insertar");
    printf("\n2.Eliminar");
    printf("\n3.Modificar");
    printf("\n4.Buscar");
    printf("\n5.Listar todo");
    printf("\n6.Obtener promedio del alumno");
    printf("\n7.Mostrar informacion de un alumno");
    printf("\n8.Salir");
    printf("\nOPCION: ");
    fpurge(stdin);
    scanf("%c",&op);
    return op;
}
int buscar(char bus[]) {
    int i,regresar,r;
    for (i=0;i<NALUMNOS;i++) {
        if (ListaAlumnos[i].marca=='1') {
         r=strcmp(bus,ListaAlumnos[i].nombre);
         if (r==0) {
            regresar=i;
            i=NALUMNOS;
         }
        }
    }
    if (regresar==0)
        regresar=-1;
    printf("\n%i",regresar);
    return regresar;
}
void insertar() {
    int i=0,ban=0,r,j,k;
    char resp;
    for (k=0;k<NALUMNOS;k++) {
    if (ListaAlumnos[i].marca=='0') {
        printf("\nDame tu nombre ");
        fpurge(stdin);
        gets(ListaAlumnos[i].nombre);
        r=strlen(ListaAlumnos[i].nombre);
        while (r>50) {
            printf("\nEl tamaño del nombre es muy grande (mayor a 50 caracteres), ó el alumno ya existe");
            printf("\nVuelva a insertar otro alumno ");
            fpurge(stdin);
            gets(ListaAlumnos[i].nombre);
        }
        printf("\nDame tu edad ");
        scanf("%i",&ListaAlumnos[i].edad);
        while (ListaAlumnos[i].edad<=0) {
            printf("tu edad es menor a cero, vuelva a ingresarla ");
            scanf("%i",&ListaAlumnos[i].edad);
        }
        printf("\nDime cual es tu sexo (m/f) ");
        scanf("%c",&ListaAlumnos[i].sexo);
        while (ListaAlumnos[i].sexo!='m' && ListaAlumnos[i].sexo!='f') {
            printf("Tu sexo no es valido vuelva a ingresarlo (m/f) ");
            fpurge(stdin);
            scanf("%c",&ListaAlumnos[i].sexo);
        }
        for (j=0;j<NMATERIAS;j++) {
            printf("\nDame el nombre de la materia ");
            fpurge(stdin);
            gets(ListaAlumnos[i].mat[j].nom);
            printf("ahora dame la calificación de la materia %s ",ListaAlumnos[i].mat[j].nom);
            scanf("%F",&ListaAlumnos[i].mat[j].calif);
            while (ListaAlumnos[i].mat[j].calif<0 || ListaAlumnos[i].mat[j].calif>10) {
                printf("\nTu calificacion debe estar entre 0 y 10, ");
                printf("vuelva a ingresarla ");
                scanf("%F",&ListaAlumnos[i].mat[j].calif);
            }
        }
        ListaAlumnos[i].marca='1';
        ban=1;
    }
    }
    if (ban==0)
        printf("\nNo hay espacios vacios para agregar alumnos, elimne algun alumno");
}
void modificar() {
    int x,ed,i,r,j;
    char nom[50];
    printf("\nQue alumno deseas modificar? ");
    fpurge(stdin);
    gets(nom);
    if (i=buscar(nom)!=-1) {
        printf("Deme los nuevos datos para el alumno %s",ListaAlumnos[i].nombre);
        printf("\nDame tu nombre");
        fpurge(stdin);
        gets(ListaAlumnos[i].nombre);
        r=strlen(ListaAlumnos[i].nombre);
        while ((buscar(ListaAlumnos[i].nombre)==-1)||(r>59)) {
            printf("\nEl tamaño del nombre es muy grande (mayor a 50 caracteres), ó el alumno ya existe");
            printf("\nVuelva a insertar otro alumno ");
            fpurge(stdin);
            gets(ListaAlumnos[i].nombre);
        }
        printf("\nDame tu edad ");
        scanf("%i",&ListaAlumnos[i].edad);
        while (ListaAlumnos[i].edad<=0) {
            printf("tu edad es menor a cero, vuelva a ingresarla ");
            scanf("%i",&ListaAlumnos[i].edad);
        }
        printf("\nDime cual es tu sexo (m/f) ");
        scanf("%c",&ListaAlumnos[i].sexo);
        while (ListaAlumnos[i].sexo!='m' && ListaAlumnos[i].sexo!='f') {
            printf("Tu sexo no es valido vuelva a ingresarlo (m/f) ");
            scanf("%c",&ListaAlumnos[i].sexo);
        }
        for (j=0;j<NMATERIAS;j++) {
            printf("\nDame el nombre de la materia ");
            fpurge(stdin);
            gets(ListaAlumnos[i].mat[j].nom);
            printf("ahora dame la calificación de la materia %s ",ListaAlumnos[i].mat[j].nom);
            scanf("%F",&ListaAlumnos[i].mat[j].calif);
            while (ListaAlumnos[i].mat[j].calif<0 || ListaAlumnos[i].mat[j].calif>10) {
                printf("\nTu calificacion debe estar entre 0 y 10, ");
                printf("vuelva a ingresarla ");
                scanf("%F",&ListaAlumnos[i].mat[j].calif);
            }
        }
    }
    else
        printf("\alumno no encontrado, imposible modificar");
}
void eliminar() {
    char nom[50];
    int pos;
    printf("\nQue alumno deseas eliminar? ");
    scanf("%s",nom);
    if (pos=buscar(nom)!=-1)
        ListaAlumnos[pos].marca='0';
    else
        printf("\nAlumno no encontrado");
}
void imprimir() {
    int i=0,j=0;
    for (i=0;i<NALUMNOS;i++) {
        if (ListaAlumnos[i].marca=='1')
         printf("\nAlumno: %s",ListaAlumnos[i].nombre);
         printf("\nSexo: %c",ListaAlumnos[i].sexo);
         printf("\nEdad: %i",ListaAlumnos[i].edad);
         for (j=0;j<NMATERIAS;j++) {
            printf("\nCalificacion de %s: %F",ListaAlumnos[i].mat[j].nom,ListaAlumnos[i].mat[j].calif);
         }
        }
        printf("\n\tPromedio: %F",promedio());
}
main() {
    char opcion,busqueda[50];
    limpieza();
    do {
        switch (opcion=menu()) {
            case '1':
                insertar();
                break;
            case '2':
                eliminar();
                break;
            case '3':
                modificar();
                break;
            case '4':
                printf("\nA quien deseas buscar? ");
                fpurge(stdin);
                gets(busqueda);
                if ((buscar(busqueda))!=(-1))
                    printf("\nAlumno encontrado");
                else
                    printf("\nAlumno no encontrado");
                        
                break;
            case '5':
                imprimir();
                break;
            default: printf("\nOpcion no valida");
        }
    }
    while (opcion!='8');
    return 0;
}
Pero al momento de de realizar la busqueda aunque ponga ambas cadenas de igual forma no me devuelve un cero la función de cadena, me podrian informar si en alguna parte estoy mal. desde ya muchas gracias :)
  #2 (permalink)  
Antiguo 11/03/2010, 06:53
 
Fecha de Ingreso: agosto-2009
Ubicación: Cartagena, Colombia
Mensajes: 516
Antigüedad: 14 años, 9 meses
Puntos: 13
Respuesta: Busqueda lineal en C

donde le estas asignado cero a la variable regresar?
__________________
Un camino de mil millas comienza por el primer paso. Lao Tse

Última edición por mhax; 11/03/2010 a las 06:58
  #3 (permalink)  
Antiguo 11/03/2010, 07:02
 
Fecha de Ingreso: agosto-2009
Ubicación: Cartagena, Colombia
Mensajes: 516
Antigüedad: 14 años, 9 meses
Puntos: 13
Respuesta: Busqueda lineal en C

lo que haria yo:
Código C:
Ver original
  1. bool found=false;
  2.     for (i=0;i<NALUMNOS;i++) {
  3.         if (ListaAlumnos[i].marca=='1') {
  4.            if (strcmp(bus,ListaAlumnos[i].nombre) == 0) {
  5.               found = true;
  6.               break;    
  7.          }
  8.         }
  9.     }
  10.     if (found)
  11.        return  0;
  12.  
  13.     return -1;

Intenta asi haber..

Saludos!
__________________
Un camino de mil millas comienza por el primer paso. Lao Tse

Etiquetas: busquedas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:09.