Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: javieer en 8 Marzo 2018, 11:48 am



Título: duda
Publicado por: javieer en 8 Marzo 2018, 11:48 am
Hola,

estoy iniciandome en programación, mi duda es la siguiente: modificando un ejercicio en C para intentar que me calcule el IMC pero no se porque me da error, adjunto la imagen

gracias a todos!

http://s2.subirimagenes.com/privadas/previo/thump_2433259duda.jpg (http://s2.subirimagenes.com/privadas/previo/thump_2433259duda.jpg)


Título: Re: duda
Publicado por: nonokario en 8 Marzo 2018, 18:19 pm
Muy chiquita la imagen. No llego a leer nada!


Título: Re: duda
Publicado por: srWhiteSkull en 8 Marzo 2018, 20:20 pm
(http://s2.subirimagenes.com/privadas/2433259duda.jpg)

Me imagino que has definido una estructura y has asignado una operación dentro a un miembro de dicha estructura. Eso no se hace así. Si quieres asignar una operación debes hacerla fuera de la estructura tomando el miembro que te interese, en este caso IMC. Ejemplo:

Código:
struct MiEstructura ms;

ms.IMS=5.1;


Título: Re: duda
Publicado por: MAFUS en 8 Marzo 2018, 20:40 pm
A ver:
Dentro de una estructura no se puede poner código. Ahí intentas que IMC sea calculado por una operación matemática pero eso debes hacerlo en otro sitio.
Y aunque fuera C++, que sí permite código éste debe encapsulado en un método, no se puede escribir directamente.
Siendo coherentes con el código deberías eliminar todo lo referente al IMC de la estructura ya que si dejas allí la variable en cualquier momento se podría cambiar falseando el dato.

Haz una función que reciba la estructura, calcule la IMC a partir de sus datos y lo devuelva.

De todas formas veo algo raro con las funciones PrintPatient#(tPatient p#);
¿Las funciones hacen cosas diferentes? ya que tPatient, tPatient2 y tPatient3 son el mismo tipo de dato ¿porqué hay 3? Una cosa es el tipo de dato y la otra las variables.
Si las funciones PrintPatient# son todas iguales te basta que exista solo una y le vayas pasando las diferentes variables de los pacientes. Algo así:

Código:
tPatient p1, p2, p3;

// Cargas los datos de p1, p2 y p3

PrintPatient(p1);
PrintPatient(p2);
PrintPatient(p3);


Título: Re: duda
Publicado por: javieer en 8 Marzo 2018, 23:42 pm
gracias a los dos por contestar!! ahora tengo algo asi pero me da error, perdonad pero soy noob :huh: :(http://s2.subirimagenes.com/privadas/previo/thump_2433299duda2.jpg)


Título: Re: duda
Publicado por: srWhiteSkull en 9 Marzo 2018, 00:00 am
No hombre, estás muy verde, mira este ejemplo e intenta asimilarlo :

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. // En este ambito se hacen las declaraciones GLOBALES
  5. typedef struct ms {
  6.    float IMC;
  7. } loquesea;
  8. /*
  9.  *
  10.  */
  11. int main(int argc, char** argv) { // Ambito funcion (aqui se ponen las operaciones)
  12.    struct ms m; // declaramos nuestra estructura m de tipo ms LOCALMENTE
  13.    m.IMC=1.0;
  14.  
  15.    printf("%f",m.IMC);
  16.    system("PAUSE");
  17.    return (EXIT_SUCCESS);
  18. }

Lo ideal es que busques una guía de C para continuar,
https://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Estructuras_y_Uniones


Título: Re: duda
Publicado por: MAFUS en 9 Marzo 2018, 01:12 am
Como te decía, la estructura no debe guardar el IMC, lo debes sacar de forma que no se pueda modificar, y eso es con una función.

Algo así:
Código:
float get_IMC(tPatient p) {
    return weight/(height*height);
}

Cada vez que en el código debas obtener el IMC de alguien usas la función.

¿Por qué? Imagínate que IMC se guarda en la estructura y la calculas:
Código:
p.IMC = p.wheight/(height*height);

Ahora tienes en p.IMC el índice de masa corporal, pero eso no evita que en cualquier otro punto del programa se haga
Código:
p.IMC = 25;

A partir de este momento el IMC será 25 porqué sí y no el resultado del cálculo.


Título: Re: duda
Publicado por: javieer en 9 Marzo 2018, 11:42 am
gracias!, creo que algo aunque sea muy poco voy pillando.. jeje ahora estoy intentando hacer la media del peso de tres pacientes, mi idea es declarar una cariable tipo entero y almacenar weight.p1, weight.p2 y weight.p3 no se como hacelo lo que tengo en la cabeza es:

float totalweight = (weight.p1+weight.p2+weight.p3)/3 pero al hacerlo siempre me dice que no estan declaradas las variables, perdonad por las gilipolleces que digo pero es que acabo de empezar  :xD


Título: Re: duda
Publicado por: MAFUS en 9 Marzo 2018, 13:47 pm
Es al revés p1.wheight. Primero va la variable de tipo estructura (que es quien engloba) y después su variable interna.


Título: Re: duda
Publicado por: javieer en 11 Marzo 2018, 12:21 pm
gracias me habia equivocado al escribirlo, ahora ya he conseguido que me funcione el programa ahora tengo un switch case que me indica que un paciente es fumador o no lo es, o si es hombre o mujer pero tengo que mostrar las pacientes que sean mujer y fumadoras como hago para unir esas dos variables?


Título: Re: duda
Publicado por: stderr en 11 Marzo 2018, 12:55 pm
Suponiendo que tienes una estructura algo así:
Código
  1. struct persona {
  2.    char nombre[20];
  3.    char sexo; // 'M' o 'H'
  4.    int fumador; // 1 o 0
  5.  

La condición quedaría así:
Código
  1. struct persona p;
  2. if (p.sexo == 'M' && p.fumador == 1) {
  3.    printf("%s\n", p.nombre);
  4. }
  5.  


Título: Re: duda
Publicado por: javieer en 15 Marzo 2018, 11:32 am
muchas gracias marcebond! ya lo he acabado  :D