Разбор арифметического выражения и его вычисление - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Имеется программа для решения квадратных уравнений
#include <stdio.h>
#include <math.h>
int main(int argc, char *argv[])
{
float a, b, c, x1, x2, d;
int s;
sscanf(argv[1],"%fx^2%fx%f", &a, &b, &c);
printf("a=%f, b=%f, c=%f\n", a, b, c);
printf("========\n Решаем \n========\n");
d=pow(b,2)-(4*(a*c));
printf("D=%f\n", d);
if (d<0) {
printf("Корни не определены.\n");}
else if (d=0) {
x1=(b*(-1)+1)/(2*a);
printf("X=%f",x1);}
else if (d>=0) {
x1=((b*(-1))-sqrt(d))/(2*a);
x2=((b*(-1))+sqrt(d))/(2*a);
printf("X1=%f, X2=%f\n", x1, x2);}
getchar();
return 0;}
Проблема лишь в одном..
sscanf(argv[1],"%fx^2%fx%f", &a, &b, &c);
Точнее в "%fx^2%fx%f". Если именно указывать x^2, переменные b и c будут нулями. Как можно сделать, чтобы вводить всё же можно было кв.уравнение с x^2? Например, 2x^2+4x-2. Чтобы программа именно различала 2 перед x^ и последующий коэффициент b? Заранее спасибо)

Решение задачи: «Разбор арифметического выражения и его вычисление»

textual
Листинг программы
#include <stdio.h>
#include <string.h>
 
#define SIZE_BUFER  ( 4 )
 
int main() {
 
    const char* const liter = "3x^2+3x+4";
    /*
        "3x^2+3x+4" выражение должно быть приведено к виду без пробелов
        или прочих непозволительных символов, или проверяться на наличие
        таких символов и завершать программу при их обнаружении.
        выражение "3x^2 + 3x + 4" уже будет обработано программой иначе
    */
    char buf[ SIZE_BUFER ];
    float x, y, z;
    memset( buf, 0, SIZE_BUFER );
 
    sscanf( liter, "%f%3s%f%*c%f", &x, buf, &y, &z );
    fprintf( stdout, "%3f%s + %3fx + %3f \n", x, buf, y, z );
 
    return 0;
}

Объяснение кода листинга программы

  1. Подключение необходимых библиотек для работы с файлами и строками.
  2. Определение константы SIZE_BUFER, которая задает размер буфера в байтах.
  3. Вход в функцию main().
  4. Объявление константной строки liter, содержащей арифметическое выражение 3x^2+3x+4.
  5. Создание массива buf типа char с фиксированным размером SIZE_BUFER для хранения промежуточных результатов.
  6. Инициализация всех элементов массива buf нулевыми значениями при помощи функции memset().
  7. Использование функции sscanf() для разбора строки liter и сохранения значений переменных x, y и z в соответствующие переменные.
  8. Вывод на экран значений переменных x, y и z с помощью функции fprintf().
  9. Возврат значения 0 из функции main(), что означает успешный конец работы программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.571 из 5
Похожие ответы