Pues eso, estos días he decidido comenzar a aprender C, un poco por mi cuenta, todo un reto.
Después de leer algunos artículos, hice el típico "Hello world", un programa para sumar, multiplicar etc etc, un comparador de números, y demás chorradas.
Intentando ir un poco por mi cuenta, me dio por hacer un pequeño programilla que resuelva ecuaciones de 2º grado, pero el fallo es que los valores que devuelve están redondeados a enteros, este es mi código:
#include <stdio.h>
#include <conio.h>
#include <math.h>
int main(void)
{
/*Definir variables*/
int a;
int b;
int c;
int value1;
int value2;
/*Introducir coeficientes*/
printf("Introduce el coeficiente del la x^2:");
scanf("%d", &a);
printf("Introduce el coeficiente del la x:");
scanf("%d", &b);
printf("Introduce el termino independiente:");
scanf("%d", &c);
/*Para raíces positivas*/
if((b*b-4*a*c) > 0){
value1 = ((-b)+sqrt(b*b-4*a*c))/(2*a);
value2 = ((-b)-sqrt(b*b-4*a*c))/(2*a);
printf("La x vale: %d y %d", value1, value2);
}
/*Para raíces 0 o negativas*/
if((b*b-4*a*c) <= 0){
printf("No existe solucion");
}
getch();
}
Creo que el fallo es algún %d, pero no estoy seguro, también creo que debería meter algun float por ahí, pero tras intentarlo no me ha salido gran cosa.
Me encomiendo a vosotros, gracias de antemano.
Tampoco se mucho, tambien estoy empezando en C pero n error que he visto es que utilizas un signo que no debes printf("%d", &a)
Porque ese singo es el que lee la informacion de dicha variable scanf()
Cita de: Bledniss en 27 Abril 2011, 17:36 PM
Tampoco se mucho, tambien estoy empezando en C pero n error que he visto es que utilizas un signo que no debes printf("%d", &a)
Porque ese singo es el que lee la informacion de dicha variable scanf()
Estás seguro?, porque yo no veo eso.....
Tu problema esta en que usas variables de tipo int y no tienen decimales, por lo que se redondea. Si lo que quieres es la mayor precisión posible usa otras variables con bits de precisión como float.
Cita de: El_Java en 27 Abril 2011, 17:44 PM
Tu problema esta en que usas variables de tipo int y no tienen decimales, por lo que se redondea. Si lo que quieres es la mayor precisión posible usa otras variables con bits de precisión como float.
Entonces todos los sitios que pone int meto float, y donde dice %d pongo %f, no?
Gracias por la ayuda, me temia algo parecido...
[EDITO]Perfecto, probado y funcionando. Ya lo había intentado antes, pero no se porque no iba... será que de esta vez te cogio miedo, jeje.
Una vez más gracias, he añadido en %.3f para redondear a 3 decimales.
Llevo sólo dos días, y reconozco que tengo fallos algo tontos.
Un saludo
P.D: Una comunidad más grande de lo que esperaba, una hora y ya solucionado, gracias!
Pues así queda finalmente:
#include <stdio.h>
#include <conio.h>
#include <math.h>
int main(void)
{
/*Definir variables*/
int a;
int b;
int c;
float value1;
float value2;
/*Introducir coeficientes*/
printf("Introduce el coeficiente del la x^2:");
scanf("%d", &a);
printf("Introduce el coeficiente del la x:");
scanf("%d", &b);
printf("Introduce el termino independiente:");
scanf("%d", &c);
/*Para raíces positivas*/
if((b*b-4*a*c) > 0){
value1 = ((-b)+sqrt(b*b-4*a*c))/(2*a);
value2 = ((-b)-sqrt(b*b-4*a*c))/(2*a);
printf("La x vale: %.3f y %.3f", value1, value2);
}
/*Para raíces 0 o negativas*/
if((b*b-4*a*c) <= 0){
printf("No existe solucion");
}
getch();
}
Te faltó el return de la función main() y deberías hacerlo totalmente estandard, no necesitas el getch() de la librería conio.h.
Perdon, error mio, me habre fiajdo mal :o
Y ahora que lo deciis que diferencia hay entre return y getch???
Cita de: Bledniss en 27 Abril 2011, 19:26 PM
Perdon, error mio, me habre fiajdo mal :o
Y ahora que lo deciis que diferencia hay entre return y getch???
Por lo que fui pillando entre ayer y hoy, getch() corresponde a la librería conio.h y no es estándar, por eso hay quien dice que no se debe usar. Permite mantener la ventana visible hasta que presiones una tecla una vez finaliza el programa. Es decir, acabas el programa y pulsas una tecla, y se cierra.
Y return, es parte de main, y dice que debe devolver la función. Así que pones return 0; y no hace nada y teoricament e se queda parada la ventana.
Sin embargo yo uso el getch() porque el return no me va o algo, y la ventada solo me dura un parpadeo.
La función "main" debe declararse como "int", esto significa que al finalizar la función main, esperará un valor de retorno, en este caso un return 0, para indicarle al sistema operativo que todo fue bien.
Por otro lado getch pertenece a la libreria conio.h, que es una libreria muy anticuada y no estandar. Si ese mismo programa lo intentas compilar en un sistema UNIX es muy probable que no funcione por el uso de esa libreria, aparte de otros problemas más que puede dar.
Te recomiendo que leas el post que está arriba sobre las cosas que no se deben hacer en c/c++, es un post muy útil que a mi me gustó bastante.
Un saludo.
Mira, has declarado la función main como int main(), entonces debes retornar un entero, es por eso que debes de usar la sentencia return. Cuando retornamos algo en la función main() le estamos avisando a nuestro sistema operativo cómo finalizó nuestro programa. Ejemplo:
tres.c:
#include <stdio.h>
int main(void)
{
int x = 23;
/* Supongamos que no debe de dar 23 la comprobación
si da 23 es que algo hubo mal y salimos insatisfactoriamente del programa */
if(x == 23)
return 1;
return 0;
}
Cuando ejecuto y compruebo cómo salió mi programa:
┌─[0 leo@archero ~/c_proyects]$
└─> ./tres; echo $?
1
┌─[0 leo@archero ~/c_proyects]$
└─>
Fijate que me devolvió un 1, esto es porque en nuestro programa algo salió mal.
┌─[0 leo@archero ~/c_proyects]$
└─> ./tres && echo -e "Todo bien" || echo -e "Algo salió mal"
Algo salió mal
┌─[0 leo@archero ~/c_proyects]$
└─>
Es por eso que es importante retornar algo, retornar el diagnóstico de nuestro programa.
Y si quieres que cuando el programa acabe espere a que presiones una tecla utiliza getchar() que sí es estándar.
Saludos
vale, entonces meto siempre return 0; al final de todo como medida "formal".
Por otro lado, habia leido lo de getchar(); pero no me hace lo mismo que getch() por algun motivo, se cierra sola al acabar.
Cita de: alex030293 en 27 Abril 2011, 20:30 PM
vale, entonces meto siempre return 0; al final de todo como medida "formal".
Por otro lado, habia leido lo de getchar(); pero no me hace lo mismo que getch() por algun motivo, se cierra sola al acabar.
utiliza la libreria stdlib.h y la funcion system("pause") es estandar y pausa el programa que es lo que quieres...
y el return como dijieron se deve de poner pues la funcion main la estas declarando como int main() lo cual al finalizar estas diciendo que tendra un valor de retorno...
y pues te recomiendo repasar la informacion que has estudiado y centrarte en los distintos tipos de datos que puedes manejar (int, char, float, bool, double,etc)...
Lo recomendable es limpiar el buffer y utilizar getchar() o fgetc(stdin) para pausar el programa. Si utilizas system("pause") no funcionaría en otros sistemas operativos.
Y de todas formas no hace falta, algo tan sencillo se acaba antes llamando desde la consola.
Bien, ahora que ya repasé algunos conceptos, y este programa va sin problema, voy a intentar algo diferente.
Alguien sabe la forma de hacer lo mismo, solo que en vez de introducir coeficiente por coeficiente, el usuario escriba la ecuación directamente (pej: 2x^2+4x-3=0)??
Gracias de antemano.
Bueno, por ejemplo, podrías leer la expresión, y luago tratarla caracter a caracter. Por ejemplo, se me ocurre guardar la ecuación en un array de tamaño variable (podrías usar la clase vector de stl para esto, que es muy útil), en la que en la posición 0 del vector guardas el termino independiente, en la posición 1 el termino de grado 1 etc...
También piensa que en realidad no tienes que tratar de manera especial que sea una suma o una resta, simplemente puedes guardar en el array el vector cambiado de signo o no, y con el término o términos de la derecha de la igualdad lo mismo, solo tendrías que cambiarles el signo para luego operar fácilmente...
PD: Vale veo que solo pretendes hacerlo para ecuaciones de segundo grado, asi que lo tienes más fácil si quieres, no necesitas ni crear un "vector" de stl, puedes hacerlo con variables directamente o con un array fijo de 3 posiciones.
Cita de: Acermax en 29 Abril 2011, 19:10 PM
Bueno, por ejemplo, podrías leer la expresión, y luago tratarla caracter a caracter. Por ejemplo, se me ocurre guardar la ecuación en un array de tamaño variable (podrías usar la clase vector de stl para esto, que es muy útil), en la que en la posición 0 del vector guardas el termino independiente, en la posición 1 el termino de grado 1 etc...
También piensa que en realidad no tienes que tratar de manera especial que sea una suma o una resta, simplemente puedes guardar en el array el vector cambiado de signo o no, y con el término o términos de la derecha de la igualdad lo mismo, solo tendrías que cambiarles el signo para luego operar fácilmente...
PD: Vale veo que solo pretendes hacerlo para ecuaciones de segundo grado, asi que lo tienes más fácil si quieres, no necesitas ni crear un "vector" de stl, puedes hacerlo con variables directamente o con un array fijo de 3 posiciones.
Me parece una buena idea. Pero me la apunto para más adelanto, porque llevo tres días con C/C++ y aún no llegue a los arrays. Cuando controle un poco eso pruebo.
Gracias de todos modos
Me temo que no podrás leer una expresión así si no tienes conocimientos sobre arrays por lo menos ;D
Cita de: ~xassiz en 4 Mayo 2011, 16:01 PM
Me temo que no podrás leer una expresión así si no tienes conocimientos sobre arrays por lo menos ;D
0k, ahora tengo dos semanas de exámenes en el instituto. Cuando acabe retomo esto, pillo lo básico de los arrays y a ver si sale algo.
Gracias por contestar.