Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: dennis094 en 27 Noviembre 2013, 00:57 am



Título: Guardar salida de funcion en otra variable
Publicado por: dennis094 en 27 Noviembre 2013, 00:57 am
Buenas,
tengo este programita en c, en el que doy de alta a competidores y quiero que se cuente cuantos estan dados de alta (participan) y cuantos no participan en las pruebas.
Resulta que he creado un bucle que compare el nombre de la prueba a la que se ha presentado el atleta, y si el nombre de esa prueba es igual a "vacio", que no cuente para el recuento de atletas que compiten.

Al parecer esta todo bien, pero al ejecutar el programa me sale que ha dejado de funcionar, cuando intento que me muestre los participantes,
la funcion me devuelve los que NO PARTICIPAN(2), y para imprimir los que SI PARTICIPAN(100 que es el maximo menos 2).

participantes = maxAtletas/*100*/ - dimeNoParticipantes/*4*/ = 96

Código:
/*
 ============================================================================
 Name        : Olimpiadas.c
 Author      :
 Version     :
 Copyright   : Your copyright notice
 Description : Hello World in C, Ansi-style
 ============================================================================
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define maxAtletas 100
#define maxPruebas 15
#define noConsta "vacio"

typedef struct {
char nombre[50];
char pais[15];
char prueba[40];
int edad;
int posicion;
}Atleta;

typedef Atleta listaAtletas[maxAtletas]; // creamos un array de atletas [a1,a2...an]
listaAtletas lista;


int dimeNoParticipantes(){
int i;
int noParticipantes = 0;

int tamanio= sizeof(listaAtletas); // tamanio = tamaño array

for(i=0;i<tamanio;i++){
//desde 0 hasta el tamaño tAtletas contar si prueba es >0

char comp1 [50];
strcpy(comp1, lista[i].prueba); // contenido de lista[i].prueba copiado a variable comp1
char comp2 [50] = noConsta;

int control = strcmp(comp1,comp2); // si son iguales devuelve 0
if(control==0){ // si devuelve 0 son iguales, luego NO ha participado, incrementamos contador
noParticipantes++;
}
}

return noParticipantes;
}


int main(void) {
/*Si la posicion del atleta en alguna prueba es 0,
* siginifica que el atleta aun no ha realizado la prueba.
*/
// creamos los atletas--> 1...6 (max=100)
Atleta a0 = {"Gerardo Martinez","Espania","100m Lisos",20,3};
Atleta a1 = {"Miroslav Djuckich","Rumania","Lanzamiento de martillo",20};
Atleta a2= {"Jean Claude Van Damme","EEUU","Artes Marciales",24};
Atleta a3= {"David Silva","Espania","vacio",19};
Atleta a4 = {"Miroslav Klose","Alemania","vacio",26};

//rellenamos el array de atletas con los atletas creados

lista[0]=a0;
lista[1]=a1;
lista[2]=a2;
lista[3]=a3;
lista[4]=a4;

int participantes = (maxAtletas - dimeNoParticipantes());
printf("%d", participantes);


return 0;

}


NOTA:.
Si en la funcion en vez de poner (control!=0) pongo (control==0) si que me da correctamente el numero de participantes QUE NO PARTICIPAN EN PRUEBAS, pero el numero de participantes que SI PARTICIPAN EN PRUEBAS, me da numeros muy altos y extraños


Título: Re: Guardar salida de funcion en otra variable
Publicado por: rir3760 en 27 Noviembre 2013, 03:21 am
Cuando desarrolles un programa trata de verificar este con el menor numero de datos, por ejemplo en tu caso puedes reducir el numero de atletas a diez.

Los problemas en tu programa son dos: 1) no tomas en cuenta el numero de elementos utilizados en la lista de atletas (cinco), solo el numero máximo (cien) y 2) calculas mal el numero de elementos en el array "lista":
Código
  1. int tamanio = sizeof(listaAtletas); // tamanio = tamaño array
Eso no dará el resultado correcto porque es el numero de bytes utilizados por el array.

Para conocer el numero de elementos en el array debes utilizar:
Código
  1. int tamanio = (int) (sizeof lista / sizeof lista[0]);
Con eso se soluciona el error critico en tiempo de ejecución pero se procesan de forma innecesaria todos los elementos del array, por eso deberías cambiar la función para que solo procese los elementos utilizados (indicando el numero de estos a la función con un argumento).

Un saludo


Título: Re: Guardar salida de funcion en otra variable
Publicado por: dennis094 en 27 Noviembre 2013, 18:04 pm
Ah de acuerdo,
muchas gracias ya me funciona, la verdad es que no sabia que se hacia asi para contar el numero de elementos del array, no se me hubiera ocurrido.
Lo apunto, gracias de nuevo ! ;)