Q PASA CON ESTO??????URGENTE

PAncho
09 de Mayo del 2004
En un fichero tengo que guardar 10 perros con su nombre,raza, puntos que obtiene en velocidad, puntos que obtiene en obediencia y puntos que obtiene en aspecto. Tengo que hacer un programa que me pida el perro ganador, los puntos de todos y el perdedor. La segunda opción es la que me sale bien, y el ganador y el perdedor me dan mal. Me podríais ayudar????
Gracias
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>

struct concursocanino
{
char nombredelanimal[25];
char raza[25];
int puntosvelocidad[1];
int puntosobediencia[1];
int puntosaspecto[1];
} a[10];
void ficherodeperros(struct concursocanino b[10]);
void menu(struct concursocanino b[10]);
void ganador(struct concursocanino b[10]);
void puntosdetodo(struct concursocanino b[10]);
void perdedor(struct concursocanino b[10]);

void main(void)


{
ficherodeperros(a);
menu(a);
}

void menu(struct concursocanino b[10])
{ int opcion;
do{
clrscr();
printf("(1)El animal gandor del concurson");
printf("(2)Puntos obtenidos por cada animal en velovidad,obedencia a las ¢denes y aspecton");
printf("(3)El animal con peor puntuaci¢nn");
printf("(4)Salirn");
scanf("%d",&opcion);
switch (opcion)
{
case 1:
ganador(b);
break;
case 2:
puntosdetodo(b);

break;
case 3:
perdedor(b);

break;
case 4:
exit(1);
break;
}
getch();
}while(opcion!=4);
}

void ficherodeperros(struct concursocanino b[10])
{
FILE *fich;
int f,p;
char nombredelanimal,raza;

fich=fopen("a:\perros.txt","rt");
if(fich==NULL)
{
printf("error al abrir el ficheron");
exit(1);

}


for(f=0;f<=9;f++)
{
fscanf(fich,"%s",b[f].nombredelanimal);
fscanf(fich,"%s",b[f].raza);


for(p=0;p<=2;p++)
fscanf(fich,"%d",&b[f].puntosvelocidad[p]);
fscanf(fich,"%d",&b[f].puntosobediencia[p]);
fscanf(fich,"%d",&b[f].puntosaspecto[p]);
}
fclose(fich);
}

void ganador(struct concursocanino b[10])
{
clrscr();
int f,p,suma=0,mayor=0,pmayor;

for(f=0;f<=9;f++)

{
for(p=0;p<=2;p++)

{
suma=suma+(b[f].puntosvelocidad[p]+b[f].puntosobediencia[p]+b[f].puntosaspecto[p]);

if (suma>mayor)
{
mayor=suma;
pmayor=f;

}
}
}
printf("El ganador es %s",b[pmayor].nombredelanimal);

}


void puntosdetodo(struct concursocanino b[10])
{
clrscr();
int p,f;

for(f=0;f<=9;f++)



{
printf("El perro %sn",b[f].nombredelanimal);
printf("De raza %sn",b[f].raza);

for(p=0;p<=2;p++)

{
printf("Los puntos que tiene son %dn",b[f].puntosvelocidad[p],b[f].puntosobediencia[p],b[f].puntosaspecto[p]);

}
}
}


void perdedor(struct concursocanino b[10])

{
clrscr();

int f,p,suma=0,menor=0,pmenor;

for(f=0;f<=9;f++)

{

for(p=0;p<=2;p++)

{
suma=suma+(b[f].puntosvelocidad[p]+b[f].puntosobediencia[p]+b[f].puntosaspecto[p]);

if (menor>suma)
{
menor=suma;
pmenor=f;
}
}
}

printf("El perdedor es %s",b[pmenor].nombredelanimal);

}


Alejandro_
09 de Mayo del 2004
Antes que nada, yo sugeriría que en el título del mensaje se trate de poner algo que describa el problema, así será más fácil que alguien se interese por responder, y facilitará la búsqueda para el que tenga uno parecido.

Encuentro varias cosas extrañas...

Primero, declaras 10 estructuras de tipo concursocanino en el espacio global, y después las pasas como argumentos a cada una de las funciones. No es que no funcione, sólo que si son globales entonces son conocidas por todas las funciones, por lo que no hace falta pasárselas.

En segundo lugar, declaras algunos de los miembros de esas estructuras como de tipo cadena de enteros de longitud 1:

int puntosvelocidad[1]; // (?)
int puntosobediencia[1]; // (?)
int puntosaspecto[1]; // (?)

lo que quiere decir que sólo podrán guardar un único entero. Esto tampoco se trata de un error, sólo que es inútil. Es lo mismo, aunque más eficaz y menos propenso a errores declarlas como:

int puntosvelocidad;
int puntosobediencia;
int puntosaspecto;

Después, en la implementación de las funciones ganador() y perdedor() pones

... ... ...
for(p=0;p<=2;p++)
{
suma=suma+(b[f].puntosvelocidad[p]+b[f].puntosobediencia[p]+b[f].puntosaspecto[p]);
... ... ...

Aquí sí hay un error:

Has declarado a puntosvelocidad, puntosobediencia y a puntosaspecto como cadenas de un único entero, así que sólo tiene sentido referirse a sus primeros y únicos elementos, que son: puntosvelocidad[0], puntosdeovediencia[0] y puntosaspecto[0]. (Si los hubieras declarado como enteros en lugar de cadenas, el compilador te hubiera señalado el error)

Este tipo de errores lógicos no son detectados por el compilador porque una cadena "es" un puntero, y es uno el responsable de usarlos adecuadamente. Por ejemplo, si declaras una cadena de caracteres:

char ch[5] = "algo"; // cuatro caracteres más el terminador nulo

prueba poniendo:

for(int i=0; i<20; i++) {
printf("%c", ch[i]);
}

y verás qué después de "algo" escribirá 16 caracteres "raros".

Alejandro




Rev
09 de Mayo del 2004
Oye para que usas

for(p=0;p<=2;p++)

{
suma=suma+(b[f].puntosvelocidad[p]+b[f].puntosobediencia[p]+b[f].puntosaspecto[p]);

.......

Por que no le veo sentido de que este for este dentro del programa, ah y otra es que todos los resultados los estas sumando dentro de la variable suma, razón por la que no te sale un ganador solo sumas todos los puntos de todos las categorías dentro de la variable.
Trata de almacenar el valor final obtenido por cada perro dentro de una variable diferente, por ejemplo

int suma[10]

Por decir algo.
Espero te sirva.