Bueno, comparto este codigo que hice en C, simplemente te devuelve los valores de x para las raices y los valores de y para la ordenada al origen.
En caso de que sea polinomica y teniendo en cuenta el siguiente modelo: ax^2 + bx + c. Y en el programa se debera ingresar los valores para a, b, c.
Y en el caso de la racional, teniendo el cuenta el siguiente modelos:
(ax^2+bx+c)/(ax^2+bx+c). Y tendremos que ingresar los valores a,b,c del numerador y del denominador.
Aqui el codigo:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
float divis(float numa,float numb,float numc,float dena,float denb,float denc);
float div0(float numa,float numb,float numc,float dena,float denb,float denc);
float divt(float numa,float numb,float numc,float dena,float denb,float denc);
float diva(float numa,float numb,float numc,float dena,float denb,float denc);
float var10(float b,float c);
float var20(float a,float c);
float vartrue(float a,float b,float c);
float a;
float b;
float c;
float raiz1;
float raiz2;
float ordenada;
float numa;
float numb;
float numc;
float dena;
float denb;
float denc;
float asihor;
float asiver1;
float asiver2;
int x;
int main(int argc, char *argv[]){ //comienzo funcion main
prin: //menu principal
system("cls");
printf (" *****************Version 2.0*******************\n\a");
printf (" ----------------------------------------------------\n| Si desea calcular una funcion polinomica ingrese 1.|\n| Si desea calcular una funcion racional ingrese 2. |\n ----------------------------------------------------\n");
scanf ("%d",&x);
switch (x){
case 1:
goto poli;
case 2:
goto raci;
case 1992:
goto rights;
default:
goto prin;
}
rights: //Rights
system("cls");
printf ("PROGRAMADO Y DISEÑADO POR ALEJANDRO BENTIVENGO ^^ \n");
system("PAUSE");
goto prin;
poli: //ACA EMPIEZA LA SELECCION DE LAS POLINOMICAS
system("cls");
printf ("Esta opcion unicamente calcula los valores correspondientes a funciones polinomicas de hasta grado 2\n\a");
printf ("Ingrese el valor a de la funcion\nEn caso de que no exista colocar 0\n");
scanf ("%f",&a);
printf ("Ingrese el valor b de la funcion\nEn caso de que no exista colocar 0\n\a");
scanf ("%f",&b);
printf ("Ingrese el valor c de la funcion\nEn caso de que no exista colocar 0\n\a");
scanf ("%f",&c);
if (a==0) {
var10(b,c);
goto pregunta;
}
else if (b==0){
var20(a,c);
goto pregunta;
}
else {
vartrue(a,b,c);
goto pregunta;
}
pregunta: //PREGUNTA PARA ARRANCAR DE VUELTA
system("cls");
printf (" ********************************************\n * Si desea resolver otra funcion ingrese 1.*\n * Si desea salir ingrese 2. *\n ********************************************\n\a");
scanf ("%d",&x);
switch (x){
case 1:
goto prin;
case 2:
return (0);
default:
goto pregunta;
}
raci: // Comiendo funciones RACIONALES
system("cls");
printf ("Esta opcion unicamente calcula los valores correspondientes a funciones racionales de hasta grado 2\nEste programa expresa: Las asintotas, las raices, y la ordenada al origen.\n\a");
printf ("Comenzando por el numerador, ingrese a.\nEn caso que no exista colocar 0.\n\a");
scanf ("%f",&numa);
printf ("Ingrese el b del numerador.\nEn caso que no exista colocar 0.\n\a");
scanf ("%f",&numb);
printf ("Ingrese el c del numerador.\nEn caso que no exista colocar 0.\n\a");
scanf ("%f",&numc);
printf ("Siguiendo por el denominador, ingrese el a del mismo.\nEn caso que no exista colocar 0.\n\a");
scanf ("%f",&dena);
printf ("Ingrese el b del denominador.\nEn caso que no exista colocar 0.\n\a");
scanf ("%f",&denb);
printf ("Ingrese el c del denominador.\nEn caso que no exista colocar 0.\n\a");
scanf ("%f",&denc);
if (numa==0 && dena==0){
divis(numa,numb,numc,dena,denb,denc);
goto pregunta;
}
else if (numa==0 && dena!=0){
div0(numa,numb,numc,dena,denb,denc);
goto pregunta;
}
else if (numa!=0 && dena==0){
diva(numa,numb,numc,dena,denb,denc);
goto pregunta;
}
else {
divt(numa,numb,numc,dena,denb,denc);
goto pregunta;
}
}
float var10(float b,float c){
system("cls");
raiz1=((0-c)/b);
ordenada=c;
printf ("La raiz esta en %f\nY la ordenada al origen en %f\n\a", raiz1, ordenada);
system("PAUSE");
return (0);
}
float var20(float a,float c){
system("cls");
raiz1=(-4*(a*c));
if (raiz1>0){
raiz1=sqrt(raiz1);
raiz1=0-raiz1;
raiz1=raiz1/(2*a);
}
else {
ordenada=c;
printf ("La funcion no tiene raices.\nLa ordenada esta en %f\n\a", ordenada);
system("PAUSE");
return (0);
}
raiz2=(-4*(a*c));
raiz2=sqrt(raiz2);
raiz2=0+raiz2;
raiz2=raiz2/(2*a);
ordenada=c;
printf ("La raiz 1 esta en %f\nLa raiz 2 esta en %f\nY la ordenada al origen en %f\n\a", raiz1, raiz2, ordenada);
system("PAUSE");
}
float vartrue(float a,float b,float c){
system("cls");
raiz1=((b*b)-4*(a*c));
if (raiz1>0){
raiz1=sqrt(raiz1);
raiz1=(0-b)-raiz1;
raiz1=raiz1/(2*a);
}
else {
ordenada=c;
printf ("La funcion no tiene raices.\nLa ordenada esta en %f\n\a", ordenada);
system("PAUSE");
return (0);
}
raiz2=((b*b)-4*(a*c));
raiz2=sqrt(raiz2);
raiz2=(0-b)+raiz2;
raiz2=raiz2/(2*a);
ordenada=c;
printf ("La raiz 1 esta en %f\nLa Raiz 2 esta en %f\nY la ordenada al origen en %f\n\a", raiz1, raiz2, ordenada);
system("PAUSE");
}
float divis(float numa,float numb,float numc,float dena,float denb,float denc){
system("cls");
asiver1=((0-denc)/denb);
asihor=(numa/dena);
raiz1=((0-numc)/numb);
ordenada=(numc/denc);
printf ("La raiz se encuentra en %f.\nLa asintota Vertical en %f y la horizontal en %f.\nLa ordenada esta en %f\n\a", raiz1, asiver1, asihor, ordenada);
system("PAUSE");
}
float div0(float numa,float numb,float numc,float dena,float denb,float denc){
system("cls");
asihor=0;
asiver1=((denb*denb)-4*(dena*denc));
if (asiver1>0){
asiver1=sqrt(asiver1);
asiver1=((0-denb)-asiver1);
asiver1=asiver1/(2*dena);
asiver2=((denb*denb)-4*(dena*denc));
asiver2=sqrt(asiver2);
asiver2=((0-denb)+asiver2);
asiver2=asiver2/(2*dena);
printf ("Existe asintota Vertical en %f y %f\n\a", asiver1, asiver2);
}
else {
printf ("No existe Asintota Vertical\n\a");
}
raiz1=((0-numc)/numb);
ordenada=(numc/denc);
printf ("La asintota horizontal se encuentra en %f.\nLa raiz se encuentra en %f.\nLa ordenada se encuentra en %f\n\a",asihor,raiz1,ordenada);
system("PAUSE");
}
float divt(float numa,float numb,float numc,float dena,float denb,float denc){
system("cls");
asihor=numa/dena;
asiver1=((denb*denb)-4*(dena*denc));
if (asiver1>0){
asiver1=sqrt(asiver1);
asiver1=((0-denb)-asiver1);
asiver1=asiver1/(2*dena);
asiver2=((denb*denb)-4*(dena*denc));
asiver2=sqrt(asiver2);
asiver2=((0-denb)+asiver2);
asiver2=asiver2/(2*dena);
printf ("Existe asintota Vertical en %f y %f\n\a", asiver1, asiver2);
}
else {
printf ("No existe Asintota Vertical\n\a");
}
raiz1=((numb*numb)-4*(numa*numc));
if (raiz1>0){
raiz1=sqrt(raiz1);
raiz1=((0-numb)-raiz1);
raiz1=(raiz1/(2*numa));
raiz2=((numb*numb)-4*(numa*numc));
raiz2=sqrt(raiz2);
raiz2=((0-numb)+raiz2);
raiz2=(raiz2/(2*numa));
printf ("Existe raiz en %f y %f\nCUIDADO!: Si el valor de las raices es igual al de las asintotas\nentonces no es una raiz!!!\n\a",raiz1,raiz2);
}
else {
printf ("No existen raices\n\a");
}
ordenada=(numc/denc);
printf ("La ordenada se encuentra en %f\nY la asintota horizontal en %f.\n\a", ordenada, asihor);
system("PAUSE");
}
float diva(float numa,float numb,float numc,float dena,float denb,float denc){
system("cls");
printf ("No existe asintota horizontal\n\a");
raiz1=((numb*numb)-4*(numa*numc));
if (raiz1>0){
raiz1=sqrt(raiz1);
raiz1=((0-numb)-raiz1);
raiz1=(raiz1/(2*numa));
raiz2=((numb*numb)-4*(numa*numc));
raiz2=sqrt(raiz2);
raiz2=((0-numb)+raiz2);
raiz2=(raiz2/(2*numa));
printf ("Existe raiz en %f y %f\nCUIDADO!: Si el valor de las raices es igual al de las asintotas\nentonces no es una raiz!!!\n\a",raiz1,raiz2);
}
else {
printf ("No existen raices\n\a");
}
asiver1=((0-denc)/denb);
ordenada=numc/denc;
printf ("Existe asintota vertical en %f\nYla ordenada al origen en %f\n\a",asiver1,ordenada);
system("PAUSE");
}
El programa esta 100% probado y resuelve las funciones con un 99.9999% de exito.
Espero respuestas =)
Consejos...
- No uses goto , por que no llamas directamente a las funciones?
- No uses llamadas a system
- No uses conio.h
- Limpia el buffer de entrada despues de las llamadas a scanf .
- Es buena práctica comentar los procedimientos , parámetros que recibe, finalidad y valor de retorno.
muchas gracias por los consejos!! jejeje yo recien toy empezando :P
El problema que tuve es que si no pongo goto, como hago para que vuelva a empezar ¬¬
El conio.h ni me acuerdo porque lo use xD
lo del system, estoy tratando de reemplazar el pause por el getchar de a poquito jajaja y el system("cls"); con que puede reemplazarse???
Como haces para limpiar el buffer de entrada?? cual es la funcion??
jejeje lo de los comentarios siempre lo uso pero pense que iba a quedar re pet* poner los comentarios mios en un post publico jejeje
CitarEl problema que tuve es que si no pongo goto, como hago para que vuelva a empezar ¬¬
Con un ciclo, un switch mas las funciones que necesites. Hay mil variantes que podes realizar para conseguir ese objetivo, sea cual sea va a ser mejor que "goto", que dicho sea de paso es considerada una
muy mala practica.
CitarEl conio.h ni me acuerdo porque lo use xD
Olvídate de conio, completamente.
Citarlo del system, estoy tratando de reemplazar el pause por el getchar de a poquito jajaja y el system("cls"); con que puede reemplazarse???
No hay un reemplazo estándar, para limpiar la pantalla no te queda otra que o bien usar funciones especificas de cada sistema o librerías multi-plataforma.
CitarComo haces para limpiar el buffer de entrada?? cual es la funcion??
Función estándar no existe, esos aspectos son inherentes a cada sistema. Aplica igual que en el caso anterior, funciones especificas del sistema o librerías multi-plataforma.
Ignora los códigos que utilizan fflush(stdin) u setbuf(stdin,NULL) y demás, invocan comportamiento indefinido y no limpian el buffer precisamente. Lo ideal es que utilices fgets+sscanf y no tengas que preocuparte por la basura en el buffer.
Saludos
Como dice LittleHorse , lo suyo sería usar fgets+sscanf, pero si de todas maneras usas scanf , para limpiar el buffer después de cada llamada haces
while(getchar() != '\n');
saludos.
barbaroo!!! muchas gracias por las respuestas!!!