Leer un char como float

Iniciado por za.asi, 23 Octubre 2012, 22:38 PM

0 Miembros y 1 Visitante están viendo este tema.

za.asi

Hola, estoy haciendo un programa sencillo que calcula el radio de Schwarzschild entre otras cosas de un agujero negro a partir de la masa del agujero negro, pero quiero poder escribir Ms (por ejemplo) para no tener que escribir la masa del Sol y que al leer lo lea como float 1.9891e30.
Alguien podría explicarme como hacerlo?

la idea es escribir:

...
const long float G=6.67e-11,
                       c=3e8;
float m;
cin >> m;
r=2*G*m/(c*c);
...


Y que al escribir Ms cuando te pide la masa (m) el programa entienda que he escrito 1.9891e30

Gracias

leosansan

#1
Cita de: za.asi en 23 Octubre 2012, 22:38 PM
quiero poder escribir Ms (por ejemplo) para no tener que escribir la masa del Sol y que al leer lo lea como float 1.9891e30.
Alguien podría explicarme como hacerlo?

Puedes escribir incluso menos:
Código (cpp) [Seleccionar]
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
   const  float G=6.67e-11,c=3e8,Ms=1.9891e30;
   float m,r,a=0;
   cout << "a(1 para Ms )=" ;
   cin >> a;
   if (a==1) m=Ms;
   else {cout << "m=" ;cin >> m;}
   r=2*G*m/(c*c);
   cout << r << endl;
   return 0;
}

Saludos!.

za.asi

Pero no quiero tener que escribirlo así, porque de esta manera no puedo calcular el radio de un AN de 1 kg, que puedo querer hacerlo. Además, quiero hacer esto para las masas de un protón, un átomo, la Tierra, Júpiter y el Sol, y tendría que reservar demasiadas variables. Lo que quiero es escribir Mt y que lea 5.98e24 (la masa de la Tierra) sin que tenga que reservar valores concretos que me podría interesar calcular.

rir3760

No puedes hacerlo directamente con una secuencia de sentencias como esta:
Código (cpp) [Seleccionar]
float m;
cin >> m;


En su lugar debes leer una linea de texto y verificar si contiene la palabra "Ms", un numero de punto flotante o algo mas, continuas dependiendo del caso.

Eso se puede hacer de varias formas, por ejemplo utilizando las clases "string" e "istringstream":
Código (cpp) [Seleccionar]

#include <iostream>
using std::cin;
using std::cout;
using std::endl;
using std::getline;

#include <string>
using std::string;

#include <sstream>
using std::istringstream;

int main()
{
   double val;
   bool ok;
   
   do {
      ok = true;
     
      cout << "Indica el valor: ";
      string linea;
      getline(cin, linea);
     
      if (linea == "Ms")
         val = 1.9891e30;
      else {
         istringstream ss(linea);
         if (!(ss >> val)){
            cout << "Entrada no valida!" << endl;
            ok = false;
         }
      }
   }while (!ok);
   
   cout << "El valor es " << val << endl;
   
   return 0;
}


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

za.asi

Ya entiendo, pero me podrías decir en que biblioteca esta la función val?

leosansan

Cita de: za.asi en 23 Octubre 2012, 23:36 PM
Pero no quiero tener que escribirlo así, porque de esta manera no puedo calcular el radio de un AN de 1 kg, que puedo querer hacerlo. Además, quiero hacer esto para las masas de un protón, un átomo, la Tierra, Júpiter y el Sol, y tendría que reservar demasiadas variables. Lo que quiero es escribir Mt y que lea 5.98e24 (la masa de la Tierra) sin que tenga que reservar valores concretos que me podría interesar calcular.
El ordenador no es "adivino", en el sentido de que al introducir Ms él interprete que es la masa del Sol. Tienes que implementarlo, bien a lo sencillo como hice yo o a lo profesional como hizo rir.
En cualquier caso, en el código tienes que introducir previamente los valores de las variables más comunes que uses; masad del Sol, de júpiter, de la Tierra, del protón, etc.
Una vez introducidas en el código dichas masas está la forma de acceder a ellas. Una forma sencilla sería crear un índice donde a cada masa se le va asignando un valor: Ms=0,Mt=1,Mj=2 .... y luego crear un array donde "estén" los valores numéricos: masas[3]={1.9891e30, 5.98e24, 5.98e24}. Lo anterior lo he hecho para el caso de las masa del Sol, Tierra y Júpiter, y tú lo amplias según tus necesidades.
Al corrrer el program tienes una opción para entrar la masa en Kg, si así lo deseas, o con la "chuletilla" de las masas según el índice.
Repito lo primero, el ordenador "no sabe" lo que es Ms, lo tienes que declarar tú.

Código (cpp) [Seleccionar]
#include <iostream>
#include <cstdio>
using namespace std;
int main ()
{
    double masa=0,r=0,G=6.67e-11,c=3e8,Ms=0,Mt=1,Mj=2;
    double masas[3]={1.9891e30, 5.98e24, 5.98e24};
    int indice;
    cout << "Indique la masa (negativo si va e entrar la masa en Kg)=";
    cin >> indice;
    if (indice<0)
        {
            cout <<"m=";cin >>masa;
            r=2*G*masa/(c*c);
        }
    else
        r=2*G*masas[indice]/(c*c);
    cout <<r;
    return 0;
}

rir3760

Cita de: za.asi en 24 Octubre 2012, 12:59 PMme podrías decir en que biblioteca esta la función val?
No es una función, es la variable donde se almacena el valor a utilizar (1.9891e30 si la linea es igual a "Ms" o el valor indicado por el usuario).

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

za.asi

Vale, gracias a los dos. Veo mas sencillo el codigo que me explica leosansan, pero voy a utilizar el de rir3760 porque aún no controlo los string y tengo que practicar con ellos.
Ya se que tengo que declarar la masa del sol antes de poder utilizarla, el ordenador solo sabe hacer lo que yo le digo que haga, pero lo que preguntaba era como podía indicarlo sin tener que reservar unos valores que me podría interesar calcular.
Gracias a ambos, me ha sido muy útil.