Ayuda con borrado en estructuras anidadas

Iniciado por JHodges, 10 Junio 2015, 18:30 PM

0 Miembros y 2 Visitantes están viendo este tema.

JHodges

Hola, tengo un problema con structs anidados.
tengo estos dos structs:  

Código (cpp) [Seleccionar]
typedef struct jugadors{
                  char nombre_j[20];
                  char apellido_j[20];
                  int dorsal;
           }tjugador;
           
   struct equip{
                char nombre_e[20];
                int ano_fundacio;
                tjugador plantilla[25];
                int qt_jug;
                }equipos[20];

y un apartado del programa es borrar el jugador introduciendo el nombre del equipo y su dorsal.
Tengo este codigo:
Código (cpp) [Seleccionar]
printf("Introduce Nombre Equipo:\n");
scanf("%s", nombre_aux);
fflush(stdin);
                         
i=0;
while((i<equipos[i].qt_jug) && (strcmp(equipos[i].nombre_e,nombre_aux)!=0)){
                                           i++;
                                           }
if(strcmp(equipos[i].nombre_e,nombre_aux)==0){
                                                                 printf("Introduce Dorsal:\n");
                                                                 scanf("%d", &dorsal_aux);
                                                                 fflush(stdin);
                                                                  if(equipos[i].plantilla[equipos[i].qt_jug].dorsal=dorsal_aux){
                                                                                  for(j=i+1;j<equipos[i].qt_jug;j++){
                                                                                                                                                                     equipos[i].plantilla[j-1]=equipos[i].plantilla[j];
                                                                                                                                                             }
                                                                                                                               equipos[i].qt_jug--;
                                                                                                                               printf("Jugador Eliminado\n");
                                                                                                                               }
                                                                  else{
                                                                       printf("Este Dorsal no existe\n");
                                                                       }
                                                                 }
else{
      printf("Este equipo no existe\n");
       }

El problema es que aunque tenga 3 jugadores me elimina el primero no el dorsal introducido. Como podria solucionarlo?
Gracias.

Mof: Los códigos deben ir en etiquetas GeSHi

user-marcos

has puesto
Código (cpp) [Seleccionar]

if(equipos[i].plantilla[equipos[i].qt_jug].dorsal=dorsal_aux)

Supongo que querras poner:
Código (cpp) [Seleccionar]

if(equipos[i].plantilla[equipos[i].qt_jug].dorsal == dorsal_aux)

JHodges

Gracias por la respuesta, pero si hago eso me pone que el dorsal no existe y si existe.

engel lex

básicamente acabas de decir "como el código no funciona, decidí interpretarlo como un error del compilador"

comparación es "==" si o si...

"=" es asignación... es decir
Código (cpp) [Seleccionar]
equipos[i].plantilla[equipos[i].qt_jug].dorsal

va a pasar a contener dorsal_aux y if funcionará si dorsal_aux no es false o 0
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

user-marcos

Yo uso c++, scanf no se bien como se usa, pero aquí no te falta algo?
Código (cpp) [Seleccionar]

scanf("%s", nombre_aux);

Código (cpp) [Seleccionar]

scanf("%s", &nombre_aux);

JHodges

no, a mi me han enseñado que al menos en c cuando son cadenas esto: & no se pone.

Gh057

#6
Hola JHodges , lo primero que veo es que la limpieza del buffer con fflush debes hacerla antes del scanf. Luego como bien te han indicado, el condicional if se refiere a una preposición lógica de comparación contra el auxiliar; si utilizas "=" estás asignando... por ende, obtendrás siempre la misma respuesta. Saludos
4 d0nd3 1r4 3l gh057? l4 r3d 3s 74n v4s74 3 1nf1n1t4...

user-marcos

- Estas usando la variable qt_jug para comparar pero no asignas ningún valor.
- ¿En que momento buscas el dorsal?

rir3760

Cita de: JHodges en 10 Junio 2015, 18:30 PMy un apartado del programa es borrar el jugador introduciendo el nombre del equipo y su dorsal.
En ese caso debes debes utilizar un bucle donde iteres hasta encontrar un equipo que coincida con el nombre indicado o bien el contador del bucle sea igual al numero de equipos existente. Ese ultimo valor lo debes tener almacenado en alguna variable con un nombre como "num_equipos", "cant_equipos", etc.

No puedes utilizar (esta mal esta parte del fragmento):
i=0;
while((i<equipos[i].qt_jug) && (strcmp(equipos[i].nombre_e,nombre_aux)!=0)){
   i++;
}

Porque "equipos[ i ].qt_jug" es el numero de jugadores en la plantilla del equipo "i".

A continuación tienes la sentencia condicional:
if (strcmp(equipos[i].nombre_e,nombre_aux) == 0) ...
No es necesario otra llamada a strcmp ya que puedes reutilizar el valor de la variable "i": si esta es menor que el numero de equipos indica una coincidencia (equipo encontrado), si es igual al numero de equipos implica que no no hay uno con el nombre indicado.

A continuación debes buscar, de forma similar, al jugador que coincida con el dorsal indicado algo que no haces.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language