[Ayuda] Comenzando con C++...

Iniciado por Lettro, 8 Diciembre 2012, 23:30 PM

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

Lettro

Buenas, me acabo de registrar en el foro, ya que necesitaria ayuda con la creación de un sencillo programa, el cual consiste en resolver una ecuación cuadratica.
Tuve varios errores y ahora llege a resolver la mayoría, pero ahora me tira 1 alerta más, la cual es importante ya que es la causante de que no se resuelva la ecuación.

Les dejo el código que tengo:

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <iostream>
#include <math.h>

/*


...Codigo generado por el programa...


*/

/* Boton que daria el resultado de la ecuacion */
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
int a = Convert::ToInt16(textBox1->Text);
int b = Convert::ToInt16(textBox2->Text);
int c = Convert::ToInt16(textBox3->Text);

        int discriminant = sqrt(float(b*b) -  float(4*a*c));
cout << ((-b + discriminant) / (2*a)) << endl;
}


El warning que me tira es el siguiente:
Citarwarning C4244: 'inicializando' : conversión de 'float' a 'int'; posible pérdida de datos

Busqué el warning y pero nada me dio solución. Tampoco entiendo bien por qué en el sqrt() tengo que aclarar si los valores van a ser float, double, long double..
la cosa es que el usuario agrega los 3 valores de la ecuación cuadrática, uno en cada textbox, y después se toca el boton1 y se supone que tendría que dar el resultado de toda la ecuación, cuya fórmula es la que esta en la última línea de código (cout << ((-b...

Tirenme todos los datos, recomendaciones, explicaciones que quieran que todo me va a sumar. Gracias!

Aclaro, que como dice en el título del post, estoy recién empezando (este sería mi primer programa) con C++ (vengo de programar con PHP, javascript, AJAX) y también, que estoy utilizando Visual C++ Express 2010. Este mismo programita, lo hice antes de ayer en PHP y quedo listo en 30 minutos, me decidí a hacerlo tipo aplicación y me meti en un quilom**

Lettro

En otro foro me dijeron que declare "discriminant" como float, y eso me quito la alerta, pero ahora mi problema es el siguiente:
La cosa ahora es que, no me muestra ningun error/alerta, pero no me tira el resultado de la ecuación. Mi duda también es que, cout en Visual C++ donde se supone que tiraria la línea de texto dentro del form? No tendría que mostrar el resultado en un label algo asi?

naderST

#2
Si estás trabajando con una GUI deberías mostrarlo en un label o algo por el estilo, por otra parte,  Visual Studio si no me equivoco tiene una consola donde debería mostrarse lo que estás imprimiendo con cout. Como te mencionaron en el otro foro, deberías declarar discriminant como float puesto que si lo declaras como int el número se truncará y podrías perder información del mismo. Si te fijas a,b y c los estás trabajando como entero, sería bueno que los trabajes como flotante porque los coeficientes de la ecuación pueden ser cualquier número real.

Te doy un consejo, primero lo primero, si estás empezando con C++ empieza con aplicaciones pequeñas en consola, para luego poder realizar aplicaciones con interfaces gráficas.

EDIT.

Con respecto al casting en la función sqrt() no es necesario debido a que esta función esta sobrecargada, es decir, dependiendo del tipo de dato que le pases como argumento se va a llamar a la función que le corresponda.

Lettro

Lo probe en consola y me muestra el resultado perfectamente. Se ve que en un form el cout no funciona, por lo tanto tendría que mostrar el resultado en un label como decis.. La cosa es que no tengo idea como mostrarlo en un label. Busque bastante y no pude encontrar la simple función para mostrar el resultado en un label.
También probe con print_f pero lo mismo que con cout, no me tira nada, y es más, me tira un error :
error C3861: 'print_f': no se encontró el identificador

Espero su respuesta, gracias!

naderST

Evidentemente ni con cout ni printf vas a mostrar algo en un form... Por lo visto estás utilizando la suite de Visual Studio, no tengo experiencia utilizando VS, pero asumo que de la misma manera en que creaste el botón creas el label y desde el "evento" clicked del botón le asignas el texto al label.

PD: Te recomiendo que leas un libro básico de C/C++

Lettro

Utilizo Visual C++ Express 2010, ya trate de asignarle a un label el resultado, pero me sale el error de que el float no se puede convertir a string...
Tengo un par guardados en la compu, después me voy a poner a leer alguno..

naderST

Deberías ponerte de una vez ya que estás trancado por cosas muy básicas diría yo.

Lettro

Lo pude solucionar, mostrando el resultado en un label. Aca esta todo:

Código (cpp) [Seleccionar]
float a = Convert::ToInt16(textBox1->Text);
float b = Convert::ToInt16(textBox2->Text);
float c = Convert::ToInt16(textBox3->Text);

float discriminant = sqrt(float(b*b) -  float(4*a*c));
float solucion_1 = (-b + discriminant) / (2*a);

label1 -> Text = solucion_1.ToString();


La cosa ahora es que el resultado final, me lo tira como entero. Por ejemplo, la ecuación tendria que dar -1,66 y da -1. Esto es porque al principio, convierto el texto de los textbox, en int16. Necesito convertirlos a float, pero probe con miles de funciones que encontre en internet y ninguna funciona. Probe con boost::lexical_cast, atof(), sscanf... Espero su respuesta.

naderST

Porque al hacer Convert::ToInt16() te lo convierte a entero lo trunca, por lo tanto no va a mostrar los decimales.

Lettro

Te agradezco toda la ayuda que me estas dando, pero en el 70% de las respuestas que me diste, parece como si no leyeras todos mis mensajes completamente. Ya sé que se trunca el resultado por eso. Te puse :

CitarEsto es porque al principio, convierto el texto de los textbox, en int16. Necesito convertirlos a float, pero...

Te agradecería muchísimo si pudieses darme una solución a la conversión del string a float. Desde ya, muchísimas gracias!