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

Estructuras

Estas en el tema de Estructuras en el foro de C/C++ en Foros del Web. Hola gente! necesito su ayuda de nuevo! tengo un problemita. El programa que tengo que hacer es buscar un alumno por dni (char) y cargar ...
  #1 (permalink)  
Antiguo 21/04/2012, 09:02
 
Fecha de Ingreso: mayo-2011
Ubicación: Bs.As Argentina
Mensajes: 193
Antigüedad: 12 años, 10 meses
Puntos: 3
Estructuras

Hola gente! necesito su ayuda de nuevo! tengo un problemita. El programa que tengo que hacer es buscar un alumno por dni (char) y cargar sus notas si lo encontro
tengo esta función

Cita:
//Busco el alumno que deseo ingresar las notas
int buscoAlm(struct alumno b[], int valor){

struct alumno doc;
int i, con=0, registros=1, reg;
int val = 0;

//Ingreso el alumno a buscar
printf("Ingrese el dni del alumno para buscarlo\n");
fflush(stdin);
gets(doc.dni);

//Busco el alumno
for(i=0;i<valor;i++){
if(strcmp(doc.dni, b[i].dni) == 0){
val = 1;
break;
}
else{
printf("El alumno no existe\n");
val = 0;
return;
}
}

return val;
}
y esta llamado así en el menú

Cita:
case 2:
valbool = buscoAlm(b,con);
if(valbool == 1){
cargoNota(b, con);
}
break;
con es la cantidad de alumnos ingresados. (lo verifique y funciona bien eso)

La función cargo nota funciona bien. La que funciona mal es buscoAlm (que siempre ponga lo que ponga siempre encuentra el primer valor, despues nunca encuentra)

No veo cual es el error.

Muchas gracias de antemano
saludos
  #2 (permalink)  
Antiguo 21/04/2012, 09:31
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 3 meses
Puntos: 94
Respuesta: Estructuras

Hola! a "dni" lo declarast como char (char dni;) o como un arreglo de char, osea char dni[20]; ?? La segunda forma es la correcta para usar strcmp.

Algo para mejorar: si vas a buscar por dni no es necesario declarar una estructura, struct alumno doc; solo basta con declarar un arreglo,ej
Código C:
Ver original
  1. char auxDni[20];
  2. ............
  3. if(strcmp(auxDni, b[i].dni) == 0){
  4. ...........

Otra cosa en
Código C:
Ver original
  1. else{
  2. printf("El alumno no existe\n");
  3. val = 0;
  4. return;
  5. }
Estas haciendo un return pero sin retornar nada

Saludos
  #3 (permalink)  
Antiguo 21/04/2012, 10:02
 
Fecha de Ingreso: mayo-2011
Ubicación: Bs.As Argentina
Mensajes: 193
Antigüedad: 12 años, 10 meses
Puntos: 3
Respuesta: Estructuras

bueno primero te quiero agradecer por tomarte el tiempo para responder...
así es la estructura que tengo declara:

Cita:
//Defino la estructura
typedef struct alumno{
char nomApe[50];
char dni[10];
int nota;
}alumno;
y de la forma que me dijiste tampoco funciono. Lo hice así:

Cita:
//Busco el alumno que deseo ingresar las notas
int buscoAlm(struct alumno b[], int valor){

//struct alumno doc;
int i, con=0, registros=1, reg;
int val = 0;
char dni[10];
//Ingreso el alumno a buscar
printf("Ingrese el dni del alumno para buscarlo\n");
fflush(stdin);
gets(dni);

//Busco el alumno
for(i=0;i<valor;i++){
if(strcmp(dni, b[i].dni) == 0){
val = 1;
break;
}
else{
printf("El alumno no existe\n");
val = 0;
return;
}
}

return val;
}

el return que me indicas es más que nada para parar el programa... simplemente eso
esta mal hecho de esa forma?

gracias
  #4 (permalink)  
Antiguo 21/04/2012, 14:50
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 3 meses
Puntos: 94
Respuesta: Estructuras

A q t referis "parar el programa"? EL return retorna a la funcion desde donde fue llamado, en este caso al main. Si vos declaras una funcion que devuelve un int lo ideal es q devuelvas algo cuando haces el return, es por eso que return solo estaria mal.
De todas formas no veo el error en esta funcion; subi todo el codigo asi lo puedo compilar y veo si encuentro el error

Saludos

PD: usa la etiqueta highlight de C que se ve mas lindo el codigo XDD
  #5 (permalink)  
Antiguo 21/04/2012, 20:56
 
Fecha de Ingreso: mayo-2011
Ubicación: Bs.As Argentina
Mensajes: 193
Antigüedad: 12 años, 10 meses
Puntos: 3
Respuesta: Estructuras

Ok ahi lo cambie.
Este es todo el programa que tengo

Cita:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>

//Defino la estructura
typedef struct alumno{
char nomApe[50];
char dni[10];
int nota;
}alumno;

//Declaración de funciones
int cargaAlumno();
int buscoAlm();
void menu();
int cargoNota();
void promedio();

//Función principal
int main(){

struct alumno a[35];

//Llamo al menu
menu(a);

printf("\n");
system("pause");

}

//***************************************

//Menu del programa
void menu(struct alumno b[]){

int mn=0;
int con=0;
int valbool=0;

while(mn==0){
printf("Ingrese 1 para ingresar al menu\n");
scanf("%i",&mn);

if(mn==1){

//Limpio la pantalla
system("cls");

int op;

printf("*****************************\n");

printf("Carga de alumnos: Ingrese 1\n");
printf("Carga de notas: Ingrese 2\n");
printf("Promedio por alumno: Ingrese 3\n");

printf("*****************************\n");

printf("Ingrese la opcion que desee\n");
scanf("%i", &op);


//Menu
switch(op){
case 1:
//Llamo a la funcion carga de alumno
con = cargaAlumno(b);
break;
case 2:
//Llamo a la funcion que se encarga de buscar y cargar
// Notas por alumno
valbool = buscoAlm(b,con);
if(valbool == 1){
cargoNota(b, con);
}
break;
case 3:
//Funcion que calcula el promedio de los alumnos (primero ordeno)
promedio(b, con);
break;
}
mn=0;
//cierre del if
}
}

}

//***************************************

//Carga de los alumnos
int cargaAlumno(struct alumno b[]){
int i, con=0,res=0, reg=0, registros=1;
int a=0;

for(i=0;i<35;i++){
//Cargo los datos
printf("Ingrese el nombre y apellido %i\n", registros);
fflush(stdin);
gets(b[i].nomApe);
printf("Ingrese el DNI %i \n", registros);
fflush(stdin);
gets(b[i].dni);

//Cuento la cantidad de registros ingresados
con++;

//Verifico si el usuario desea agregar otro registro
printf("¿Desea ingresar otro registro? 1. si , 2. no \n");
scanf("%i", &reg);
if(reg == 1){
printf("Ingrese un nuevo registro: \n");
}
else{
i=35;
}
//Aviso que no se permitan mas de 35 registro
if(con == 35){
printf("\n");
printf("No se permiten mas de 35 registros\n");
break;
}

printf("\n");
}
//Retorno la cantidad de alumnos
return con;
}


//***************************************

//Busco el alumno que deseo ingresar las notas
int buscoAlm(struct alumno b[], int valor){

//struct alumno doc;
int i, con=0, registros=1, reg;
int val = 0;
char dni[10];
//Ingreso el alumno a buscar
printf("Ingrese el dni del alumno para buscarlo\n");
fflush(stdin);
gets(dni);

//Busco el alumno
for(i=0;i<valor;i++){
if(strcmp(dni, b[i].dni) == 0){
val = 1;
break;
}
else{
printf("El alumno no existe\n");
val = 0;
break;
}
}

return val;
}

//***************************************

//Ingreso la nota del alumno
int cargoNota(struct alumno b[], int valor){

int i, con=0, registros=1, reg;

printf("Las notas son entre 1 y 10\n");

//Ingreso las notas
for(i=0;i<valor;i++){
printf("Ingrese la nota %i \n", registros);
scanf("%i", &b[i].nota);

//Valido que la nota sea entre 1 y 10
if(b[i].nota < 1 || b[i].nota > 10){
printf("Nota incorrecta\n");
return;
}

con++;
registros++;

//Verifico si el usuario desea agregar otro nota
printf("¿Desea ingresar otro nota? 1. si , 2. no \n");
scanf("%i", &reg);
if(reg == 1){
printf("Ingrese otra nota: \n");
}
else{
i=5;
}

//Valido que no ingrese mas de 5 notas
if(con == 5){
printf("No se permiten mas de 5 notas por alumno\n");
break;
}
}

return registros;
}

//Promedio por alumno
void promedio(struct alumno b[], int valor){

int i=0, j=0, res=0, con=1, prom=0;
struct alumno aux;

//Ordeno de forma ascendente
for(i=0;i<valor;i++){
for(j=i+1;j<valor;j++){
if(strcmp(b[i].nomApe, b[j].nomApe) > 0){
aux = b[i];
b[i] = b[j];
b[j] = aux;
}
}
printf("Alumno: %s \n", b[i].nomApe);
}


for(i=0;i<valor;i++){
if(((i+1)<valor) && (strcmp(b[i].nomApe , b[i+1].nomApe) == 0)){
con++;
res = res + b[i].nota;
prom = res / con;
}
else{
con++;
res = res + b[i].nota;
prom = res / con;
printf("El alumno %s, tiene un promedio de %i \n", b[i].nomApe, prom);
con=0;
res=0;
prom=0;
}
}


}
Agradezco mucho tu ayuda!
  #6 (permalink)  
Antiguo 22/04/2012, 11:19
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 3 meses
Puntos: 94
Respuesta: Estructuras

Hola! al final si tenias el error en la funcion buscoAlm(). El problema esta en el else del for:
Código C:
Ver original
  1. //Busco el alumno
  2. for(i=0;i<valor;i++){
  3. if(strcmp(dni, b[i].dni) == 0){
  4. val = 1;
  5. break;
  6. }
  7. else{
  8. printf("El alumno no existe\n");
  9. val = 0;
  10. break;
  11. }
  12. }
Ese else no deberia esta ahi; al hacer un break en el else estas obligando a que el for solo cumpla un ciclo y luego salga.. Deberia ser asi:
Código C:
Ver original
  1. //Busco el alumno que deseo ingresar las notas
  2. int buscoAlm(struct alumno b[], int valor){
  3.  
  4. //struct alumno doc;
  5. int i, con=0, registros=1, reg;
  6. int val = 0;
  7. char dni[10];
  8. //Ingreso el alumno a buscar
  9. printf("Ingrese el dni del alumno para buscarlo\n");
  10. fflush(stdin);
  11. gets(dni);
  12.  
  13. //Busco el alumno
  14. for(i=0;i<valor;i++){
  15. if(strcmp(dni, b[i].dni) == 0){
  16. val = 1;
  17. break;
  18. }
  19. }
  20.  
  21. if(val==0){
  22. printf("El alumno no existe\n");
  23. }
  24. return val;
  25. }


Cosas que vi:
1º para que buscas por dni si lo unico que haces es retornar un 1 si existe o un 0 en caso contrario, me refiero a q no lo utilizas para nada a ese dato.
Si lo que queres es encontrar por dni y luego cargar la nota a ese dni encontrado lo que deberias hacer es retornar la posicion del arreglo donde se encontro y luego pasarle ese dato a la funcion cargoNota() para cargar las notas
2º A cada alumno vos le queres ingresar 5 notas como maximo pero solo podes ingrasar una nota ya que en la estructura declaras int nota; deberias declarar un arreglo para ingresar mas de una nota por alumno,ej:
Código C:
Ver original
  1. typedef struct alumno{
  2. char nomApe[50];
  3. char dni[10];
  4. int nota[5];
  5. }alumno;

Revisa bien el programa y fijate si hace lo que vos queres

Saludos
  #7 (permalink)  
Antiguo 22/04/2012, 13:26
 
Fecha de Ingreso: mayo-2011
Ubicación: Bs.As Argentina
Mensajes: 193
Antigüedad: 12 años, 10 meses
Puntos: 3
Respuesta: Estructuras

ahi funciona a la perfección!!! muchas gracias!

y sobre el arreglo! tenés razon se me paso ese detalle! ahi lo resolvi.. pero tengo una dudita ya que estamos te pregunto!

declare la estructura como me dijiste!
y ahora compilo y me da este error:

"comparison between pointer and integer"

por ej en esas lineas:

Código C:
Ver original
  1. for(i=0;i<valor;i++){
  2.          if(((i+1)<valor) && (strcmp(b[i].nomApe , b[i+1].nomApe) == 0)){
  3.             con++;
  4.             [B]res = res + b[i].nota;[/B]
  5.             prom = res / con;
  6.         }
  7.         else{
  8.             con++;
  9.             [B]res = res + b[i].nota;[/B]
  10.             prom = res / con;
  11.             printf("El alumno %s, tiene un promedio de %i \n", b[i].nomApe, prom);
  12.             con=0;
  13.             res=0;
  14.             prom=0;
  15.         }
  16.     }

y no veo el error!.

Muchas gracias
  #8 (permalink)  
Antiguo 22/04/2012, 13:26
 
Fecha de Ingreso: mayo-2011
Ubicación: Bs.As Argentina
Mensajes: 193
Antigüedad: 12 años, 10 meses
Puntos: 3
Respuesta: Estructuras

Estas son!.. no se marco la negrita

res = res + b[i].nota;
res = res + b[i].nota;
  #9 (permalink)  
Antiguo 22/04/2012, 14:16
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 3 meses
Puntos: 94
Respuesta: Estructuras

Lo que pasa es que "nota" ahora es un arreglo no un int, por lo tanto deberias ponerle el subindice, ej:
Código C:
Ver original
  1. res = res + b[i].nota[j];
  #10 (permalink)  
Antiguo 22/04/2012, 18:20
 
Fecha de Ingreso: mayo-2011
Ubicación: Bs.As Argentina
Mensajes: 193
Antigüedad: 12 años, 10 meses
Puntos: 3
Respuesta: Estructuras

ahi lo resolvi!! muchas gracias !! sos un genio!, la otra vez ya me ayudaste con otro problema y ahora de nuevo. Te repito gracias por tu tiempo.
  #11 (permalink)  
Antiguo 22/04/2012, 18:39
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 3 meses
Puntos: 94
Respuesta: Estructuras

xD de nada

Saludos

Etiquetas: estructuras, funcion, int, programa, struct
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 11:32.