Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <math.h>
- #include <stdnoreturn.h>
- unsigned calculoRaices(double *a, double *b, double c) {
- double x1, x2, discr;
- if(*a == 0) {
- // caso !a, !b, c
- if(*b == 0) {
- return 0;
- }
- // caso !a, b, !c
- if(c == 0) {
- *a = 0;
- return 1;
- }
- // caso !a, b, c
- *a = -c / *b;
- return 1;
- }
- if(*b == 0) {
- // caso a, !b, !c
- if(c == 0) {
- *a = 0;
- return 1;
- }
- // caso a, !b, c
- if(-c / *a < 0) {
- // subcaso -c/a < 0
- return 0;
- }
- x1 = sqrt(-c / *a);
- *a = x1;
- *b = -x1;
- return 2;
- }
- // caso a, b, !c
- if(c == 0) {
- x1 = -*b / *a;
- *a = 0;
- *b = x1;
- return 2;
- }
- // caso a, b, c
- discr = *b * *b - 4 * *a * c;
- // subcaso discriminante < 0
- if(discr < 0) {
- return 0;
- }
- // subcaso discriminante = 0
- if(discr == 0) {
- *a = -*b / (2 * *a);
- return 1;
- }
- // subcaso discriminante > 0
- x1 = (-*b + sqrt(discr)) / (2 * *a);
- x2 = (-*b - sqrt(discr)) / (2 * *a);
- *a = x1;
- *b = x2;
- return 2;
- }
- noreturn void imprimirErrorEntrada(char *nombrePrograma) {
- printf("Uso: %s A B C\n", nombrePrograma);
- puts(" donde A, B y C deben ser numeros reales [notacion de punto decimal].");
- exit(EXIT_FAILURE);
- }
- int main(int argc, char *argv[]) {
- double a, b, c;
- unsigned resultados;
- if(argc != 4) {
- imprimirErrorEntrada(argv[0]);
- }
- if(
- !sscanf(argv[1], "%lf", &a) ||
- !sscanf(argv[2], "%lf", &b) ||
- !sscanf(argv[3], "%lf", &c)) {
- imprimirErrorEntrada(argv[0]);
- }
- resultados = calculoRaices(&a, &b, c);
- switch(resultados) {
- case 0:
- puts("No hay raices computables en R");
- break;
- case 1:
- printf("Hay una raiz: %lf\n", a);
- break;
- case 2:
- printf("Hay dos raices: %lf y %lf\n", a, b);
- break;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement