Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Fox_Neo en 8 Junio 2010, 17:31 pm



Título: En una variable .....
Publicado por: Fox_Neo en 8 Junio 2010, 17:31 pm
Hola gracias por leer el post. Estoy haciendo una "calculadora",  cuando quiero hallar logaritmos  indico la base del logaritmo, quiero que si se pulsa la letra e (de logaritmo neperiano) me cargue el valor:
Código:
 base= 2.718281;
El problema que tengo es que no se como declarar la variable base  porque si la declaro como número no me va a cargar la letra e y si la declaro como char no me admite números  :huh:
Gracias.

Salu2.

_____Fox_Neo____


Título: Re: En una variable .....
Publicado por: nicolas_cof en 8 Junio 2010, 17:35 pm
Mmmmm tendrias que poner el codigo, para que sepamos como lo quieres implementar y podamos ayudarte

Salu10.


Título: Re: En una variable .....
Publicado por: M3LiNdR1 en 8 Junio 2010, 17:52 pm
Pues pon una condicion de que cuando le pidas la base, sea e o n. Declaras un char y lo lees, si es base e, le insertas el neperiano, si es n, les pides que te inserte el valor de la base.

En pseudo.

Código:
var 
c: caracter;
i: entero;
base: real;
fvar

leer_caracter(c);
si c = "e" entonces base := 2.718281;
sino entonces
     leer_entero(i)
     base := (real) i;

fsi



Título: Re: En una variable .....
Publicado por: Fox_Neo en 8 Junio 2010, 18:18 pm
Gracias por las respuestas.
Pues pon una condicion de que cuando le pidas la base, sea e o n. Declaras un char y lo lees, si es base e, le insertas el neperiano, si es n, les pides que te inserte el valor de la base.

En pseudo.

Código:
var 
c: caracter;
i: entero;
base: real;
fvar

leer_caracter(c);
si c = "e" entonces base := 2.718281;
sino entonces
     leer_entero(i)
     base := (real) i;

fsi


Ya se por donde vas  pero creo que no me has entendido bien según tu sería así:
 
Código
  1. float base,exponente,argumento;
  2.   char base2;
  3.   cin>>base;
  4.   cin>>base2;
  5.   if(base2=='e')
  6.   {
  7.       base=2.718281;
  8.   }
El problema de esto es que tienes que introducir  dos datos y aparte de saber que primero tienes que introducir una letra y después un númeno ya había pensado en esto pero me pareció una verdadera chapuza :¬¬
El dódigo:

Código
  1. case('l'):
  2.   cout<<"\ncalculo de logaritmos"<<endl;
  3.   cout<<"\nintroduce la base del logaritmo"<<endl;
  4.   float base,exponente,argumento;
  5.   cin>>base;
  6.   cout<<"\nintroduce el argumento"<<endl;
  7.   cin>>argumento;
  8.   exponente=(log(argumento))/(log(base));
  9.   cout<<"\nEl logaritmo de "<<argumento<<" de base "<<base<<"es "<<exponente<<endl;
  10.   cout<<"\nQuieres guardar el resultado en la memoria?"<<endl;
  11.   cin>>preg;

A ver  cuando te pida la base  que puedas introducir  una letra o un número  pero para ello  tienes que declarar antes la variable en donde se va a cargar ese valor.

Una pregunta ¿Los strings admiten numeros?? si es así ¿Se podría declarar un string y que después lo lea y dependiendo de si lee la letra 'e' o un numero se pueda cargar el valor en una variable o en otra??
 Gracias por las respuestas ;);





Título: Re: En una variable .....
Publicado por: Littlehorse en 8 Junio 2010, 18:36 pm
Si, admiten. Si lo quieres hacer con caracteres basta con leer un string y luego convertís los datos que necesitas descartando los que no.

Saludos


Título: Re: En una variable .....
Publicado por: nicolas_cof en 8 Junio 2010, 18:47 pm
Te dejo una idea de codigo, pero en C, espero que te sirva...

Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main( void )
{
    char *basec;
    double base;

    basec = malloc( 10 * sizeof( char ) );

    printf( "Ingresar base: " );
    basec = fgets( basec, 10, stdin );

    if ( !strncmp( basec, "e", 1 ) )
        base = 2.718281;
    else
        base = atof( basec );

    printf( "%f\n", base );

    free( basec );

    return 0;
}

Salu10.


Título: Re: En una variable .....
Publicado por: Fox_Neo en 8 Junio 2010, 19:05 pm
Si, admiten. Si lo quieres hacer con caracteres basta con leer un string y luego convertís los datos que necesitas descartando los que no.

Saludos

Gracias por la respuesta  Littlehorse   ¿Por curiosidad se puede hacer de otra manera sin usar strings?

Nicolas_cof gracias por el código, aunque no se como funcionan los strings todavía, creo que ya es hora de aprender algo sobre strings. :D

Gracias.


Salu2.


Título: Re: En una variable .....
Publicado por: Littlehorse en 8 Junio 2010, 19:28 pm
Haber puede haber muchas formas, el tema es que la mayoría van a ser algo "chapuzas" como mencionaste. Lo bueno de utilizar cadenas (sea char* o string) es que ganas una flexibilidad que no podes obtener de otra forma, es decir, el input puede ser muy variado, incluso con operaciones u otro tipo de expresiones. Ese es el principal atributo de las cadenas en casos como estos.

Obviamente, el trabajo extra radica en validar y convertir los datos, pero es el precio que hay que pagar por hacer una entrada de datos mas segura.

Si nunca trabajaste con cadenas, te recomiendo que primeras veas las de tipo char, luego puedes ver las del tipo string.
El ejemplo que te puso Nico te sirve perfectamente, solo tienes que modificar los headers por las declaraciones correspondientes en C++ y reemplazar las llamadas de malloc y free por new y delete.

Saludos!


Título: Re: En una variable .....
Publicado por: Fox_Neo en 8 Junio 2010, 22:11 pm
Ok muchas gracias por los consejos  buscaré también por el foro haber lo que encuentro.

Salu2.


Título: Re: En una variable .....
Publicado por: M3LiNdR1 en 8 Junio 2010, 23:46 pm
Si lo haces con strings, tendras que pasar los caracteres a enteros.


Título: Re: En una variable .....
Publicado por: do-while en 9 Junio 2010, 08:54 am
¡Buenas!

Si quieres calcular el logaritmo neperiano (base e) de cualquier numero, tienes en math.h (cmath si programas en C++) la funcion log, para base decimal tienes log10, y para cualquier otra base:

logab = logcb / logca

Para cuales quiera a,b,c reales a,b,c>0 y a,c!=1,0 (creo que estos son los valores para los que existe, aunque tampoco es que haya meditado mucho el tema de las bases...)

¡Saludos!

PD: Tambien podrias trabajar con base a negativa, pero esto te obligaria a utilizar numeros complejos, y me parece complicar mucho las cosas...

¡Saludos!

Esto... ejem... No habia prestado suficiente atencion...

La solucion, como bien te han indicado, es utilizar cadenas y las funciones que las manipulan.

¡Saludos!