Как принять квадратное уравнение в качестве входного сигнала через Scanf? - PullRequest
0 голосов
/ 27 января 2019

Я делаю курс в C, где меня попросили найти корни квадратного уравнения. Сначала я попытался с помощью жесткого кодирования, и это сработало. Затем я дал входные данные, используя scanf (например, a, b, c), он работал. Но я потерпел неудачу в сценарии, где все квадратное выражение берется в качестве входных данных, т.е. (ax ^ 2 + bx + c), и извлекает эти значения a, b, c из выражения. Я потратил много времени на это, искал в Интернете, я не мог найти ответ, поэтому я прошу здесь о помощи.

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

#define PI 3.14

int main(void)
{

puts("---- ROOTS ----");

char equ[20]; //Quadratic Expression in an Array 
float a,b,c,ope;
float root1,root2;

printf("please provide the expression :");
scanf("%d",&equ[20]);//Example : 5x^2+3x+1 as input

a == equ[0];//since ax^2+bx+c in the above expression a==5
b == equ[3];//b==3
c == equ[6];//c==1

ope = sqrt(b*b -4*a*c);
root1 = (-b + ope)/2*a;
root2 = (-b - ope)/2*a;

printf("The root 1 of the expression is : %d", root1); 
printf("\nThe root 2 of the expression is : %d", root2);

return EXIT_SUCCESS;
}

ВЫХОД:

PS F:\Thousand C GO> gcc 3.c
PS F:\Thousand C GO> ./a
---- ROOTS ----
please provide the expression :5x^2+3x+1//edited
The root 1 of the expression is : 0
The root 2 of the expression is : 0  

Я хотел знать, есть ли способ решить эту проблему в C, и если да, то как? если нет, то почему?

Помощь очень ценится. Спасибо.

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Привет, вот измененный код:

scanf("%s",equ);//Example : 5x^2+3x+1 as input NOT

a = equ[0]-48;//since ax^2+bx+c in the above expression a==5
b = equ[5]-48;//b==3
c = equ[8]-48;//c==1
//printf("\n%f %f %f",a,b,c);

ope = sqrt(b*b -4*a*c);
printf("\n%f",ope);
root1 = (-b + ope)/(2*a);
root2 = (-b - ope)/(2*a);

printf("\nThe root 1 of the expression is : %f", root1); 
printf("\nThe root 2 of the expression is : %f", root2);

Теперь я постараюсь решить проблемы

  1. попробуйте использовать правильный заполнитель для ввода массива символов, который является "% s", а не "% d".
  2. не дают scanf("%d",&equ[20]) для сканирования массива символов, дают только scanf("%s",equ). здесь - это объяснение.
  3. значения индекса неверны, исправьте их.
  4. символы сохраняются как значения ASCII. здесь является связью всех значений ASCII. Обратите внимание, что значение ASCII, равное 1, равно 49, поэтому при преобразовании в float ( неявное приведение типов ) преобразуйте его в соответствующее значение. В вашем случае вычтите 48.
  5. == - оператор сравнения, измените его на оператор присваивания =.
  6. поставьте скобку над (-b + ope)/(2*a), потому что ваш /2 сначала оценивает, что *a вычисляется, это приоритет оператора и ассоциативность .
  7. Теперь главная проблема: обратите внимание, что я изменил уравнение на 5x^2+3x+1, это потому, что в случае 5x^2+3x+2 значение b*b -4*a*c будет -31, что отрицательно, и вы не можете сохранить мнимое число в типе с плавающей точкой. здесь и здесь - некоторые хорошие чтения для этой темы.

Потребуется некоторое время, чтобы понять все это, но не сдавайтесь.

Счастливого кодирования!

Редактировать: Как упомянуто в пункте 1, для соответствующего типа данных должен использоваться правильный заполнитель.

  1. В последних двух строках я изменил %d на %f для печати root1 и root2, которые float и НЕ int. здесь - хорошее чтение для начинающих.
0 голосов
/ 27 января 2019
  1. Чтобы прочитать строку -

, попробуйте

scanf("%s",equ);

или

scanf("%s",&equ[0]);

== - это оператор «равно».Вы можете изменить это на = (оператор присваивания)

Еще раз проверьте значения индекса, которые вы используете для извлечения коэффициентов в квадратном уравнении.

Коэффициенты сохраняются в значениях ascii в массиве символов.Вам необходимо преобразовать их в соответствующее целое или числовое значение.

...