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

Problema con struct y punteros. (y más :P)

Estas en el tema de Problema con struct y punteros. (y más :P) en el foro de C/C++ en Foros del Web. Cita: Ejercicio: Se debe realizar un algoritmo que tome una estructura de datos conformada por tres enteros, llamados ataque (a), defensa (b) y agilidad (c), ...
  #1 (permalink)  
Antiguo 09/04/2013, 03:36
 
Fecha de Ingreso: septiembre-2011
Mensajes: 42
Antigüedad: 12 años, 7 meses
Puntos: 3
Problema con struct y punteros. (y más :P)

Cita:
Ejercicio:
Se debe realizar un algoritmo que tome una estructura de datos conformada
por tres enteros, llamados ataque (a), defensa (b) y agilidad (c), las
cuales representan las caracteristicas de un personaje de un videojuego.
Para calcular la Fuerza Total de un personaje,se usa la siguiente fórmula:
Fuerza Total(a, b, c) = (2a · 3b) · 7c
Suponiendo que la entrada del algoritmo es a través de un archivo, en
donde esta estructura se repite n veces dentro de una línea, y cada línea
corresponde a una secuencia distinta de estructuras. Esto se ilustra a continuación.
Cita:
input1.txt
(4 5 6)(7 5 3)(4 5 8)(7 4 1)...(a b c)
(1 5 1)(7 2 2)(1 5 6)(7 3 1)...(a b c)
Observar que dentro de cada par de paréntesis “()” se encuentran las tres
variables de la estructura.
El objetivo del algoritmo es generar una secuencia donde se encuentren
las Fuerzas Totales de cada personaje representado en este archivo, línea a
línea.
Los resultados deben escribirse en un archivo de salida, como se muestra
a continuación.
Cita:
output1.txt
5040 4410 6720 1176 ... 2 · a · 3 · b · 7 · c
210 1176 1260 882 ... 2 · a · 3 · b · 7 · c
Mi codigo:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct {
  5.         int ataque;
  6.         int defensa;
  7.         int agilidad;
  8. } Personaje;
  9.  
  10. void guardar_pj(FILE *fp, Personaje *p1, Personaje *p2, int cont){
  11.      char pj[6];
  12.      p2 = (Personaje*) realloc(p1, cont*sizeof(Personaje));
  13.      if (p2!=NULL) p1=p2;
  14.      else printf("%d", 5);
  15.      fgets(pj,6,fp);
  16.      p1[cont-1].ataque = (int) pj[0];
  17.      p1[cont-1].defensa = (int) pj[2];
  18.      p1[cont-1].agilidad = (int) pj[4];
  19. }
  20.          
  21. int calcular_fuerza_total (Personaje *p){
  22.     return (2*p->ataque*3*p->defensa)*7*p->agilidad;
  23. }
  24.  
  25. int main(){
  26.     FILE *fp;
  27.     Personaje *Pjs, *Pjs2=NULL;
  28.     int line=1, cont=0;
  29.     char caracter;
  30.     fp = fopen("input.txt", "r");
  31.     while (!feof(fp)){
  32.           caracter = fgetc(fp);
  33.           if (caracter == '\n') line++;
  34.           else if (caracter == '('){
  35.                cont++;
  36.                guardar_pj(fp, &Pjs, &Pjs2, cont);
  37.           }
  38.     }
  39.     printf("%d", Pjs[1].ataque);
  40.     getch();
  41. }

Bueno, aun no logro guardar los datos en el arreglo de Struct, que es lo malo del codigo? Estuve leyendo unas cosas sobre struct, memoria dinamica y arreglos, "creo" haber seguido los mismos pasos de los ejemplos, pero ni cerca esta de funcionar.

Gracias de antemano.
__________________
"Porque nada se...
quiero saberlo todo"
  #2 (permalink)  
Antiguo 09/04/2013, 20:39
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 3 meses
Puntos: 94
Respuesta: Problema con struct y punteros. (y más :P)

Hola! tenes varios errores, te dejo algunas ya que el sueño me esta ganando:

1- Deberias inicializar el puntero Pjs a NULL porque sino la funcion realloc puede tirar error

2 - Si en la llamada de guardar_pj pasas la direccion de los punteros, en la funcion debes almacenarlo como puntero a puntero(cualquier cosa revisa el tema de pasaje por valor o por referencia). La funcion seria:
Código C:
Ver original
  1. void guardar_pj(FILE *fp, Personaje **p1, Personaje **p2, int cont){ /* ...... */
Luego para acceder al puntero tenes que usar "*":
Código C:
Ver original
  1. *p2 = (Personaje *) realloc(*p1, cont*sizeof(Personaje));
  2.      if (*p2!=NULL) *p1=*p2;
  3. /* .... */

3 - Esto nose para q es:
Código C:
Ver original
  1. else printf("%d", 5);

4 -
Código C:
Ver original
  1. fgets(pj,6,fp);
  2.      p1[cont-1].ataque = (int) pj[0];
  3.      p1[cont-1].defensa = (int) pj[2];
  4.      p1[cont-1].agilidad = (int) pj[4];
esas asignaciones estan mal. Con esto pj[0] lo que haces es asignar el ascii de los caracteres pero no los numeros enteros, debes restarle 32 que representa el asci del '0'.. Proba haciendo:
Código C:
Ver original
  1. fgets(pj,6,fp);
  2.      p1[cont-1]->ataque = (int) pj[0]-32;
  3.      p1[cont-1]->defensa = (int) pj[2]-32;
  4.      p1[cont-1]->agilidad = (int) pj[4]-32;



Igual de todas formas, todo esto:
Código C:
Ver original
  1. while (!feof(fp)){
  2.           caracter = fgetc(fp);
  3.           if (caracter == '\n') line++;
  4.           else if (caracter == '('){
  5.                cont++;
  6.                guardar_pj(fp, &Pjs, &Pjs2, cont);
  7.           }
  8.     }
  9.  
  10. /* ............ */
  11.  
  12. fgets(pj,6,fp);
  13.      p1[cont-1]->ataque = (int) pj[0]-32;
  14.      p1[cont-1]->defensa = (int) pj[2]-32;
  15.      p1[cont-1]->agilidad = (int) pj[4]-32;
se puede resumir en(eso creo, no lo probe):
Código C:
Ver original
  1. Personaje aux; /* aux tambien podria haber sido un puntero */
  2. fscanf(fp,"(%d %d %d)",&aux.ataque,&aux.defensa,&aux.agilidad);


Saludos

Etiquetas: funcion, int, punteros, struct, variable
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 14:01.