Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Решение биквадратного уравнения, не могу найти ошибку 
:(
    Опции темы
mr.Anderson
Дата 6.9.2008, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 1
Всего: 128



Ерунда какая-то получается.  Решаю биквадратное уравнение. Алгоритм продумал, он несложный, написал программу, но уперся в совершенно непонятную для меня ошибку. Компилятор Borland C++ 3.1, который я ненавижу, а что делать, в универе только его принимают.

Так. Запутался совсем с проверкой на ноль дробных чисел в Си. Привожу свое полное решение задачи, но оно не работает, сразу говорю, не проходят условия на проверку >, < или = 0. Чтоб эти дробные числа провалились уже. Помогите с этими условиями, остальное я сам доработаю.
Код

#include <stdio.h>
#include <math.h>
//--------------------------------------

int solveFullQuadEq(float A, float B, float C, float &x1, float &x2)
{
 //result - count of solutions

 float D = B*B - 4*A*C;

 if (D<0)
  return 0;

 if (D==0)
 {
  x1 = -B/2*A;
  return 1;
 }
 else
 {
  x1 = (-B+sqrt(D))/2*A;
  x2 = (-B-sqrt(D))/2*A;

  return 2;
 } 
}

//--------------------------------------
void main(void)
{
 const zeroCheck = 0.00001;

 float a,b,c;

 printf("A: "), scanf("%f", &a);
 printf("B: "), scanf("%f", &b);
 printf("C: "), scanf("%f", &c);

 if (fabs(a) < zeroCheck) //a==0
 {
  printf("Invalid input data!");
  return;
 }

 if (fabs(b) < zeroCheck) //b==0
 {
  if (c > 0)
  {
   printf("No solutions.");
   return;
  }
  else if (c < 0)
  {
   float r = sqrt(sqrt(b));
   printf("First solution: %.5f\nSecond solution: - %.5f", r, r);
   return;
  }
  else //c==0
  {
   printf("Solution: 0");
   return;
  }
 }
 else //b!=0
 {
  if (fabs(c) < zeroCheck)
  {
   printf("Solution: 0");
   return;
  }
  else
  {
   float r = sqrt(b);
   printf("First solution: 0\nSecond solution: %.5f\nThird solution: - %.5f", r, r);
   return;
  } 
 }
 else //full version
 { //for checking: x^4 + 4x^2 - 21 = 0, solutions are sqrt(3) and -sqrt(3)
  float x1, x2;

  if (solveFullQuadEq(a,b,c,x1,x2) == 1)
  {
   if (x1 >= 0)
   {
    float r = sqrt(x1);
    printf("Solution 1: %.5f\nSolution 2: - %.5f", r, r);
   }
   else printf("No solutions.");
  }
  else
  {
   float rx1, rx2;
   short flag1=0, flag2=0;

   if (x1 >= 0)
   {
    flag1 = 1;
    rx1 = sqrt(x1);
   }
   if (x2 >= 0)
   {
    flag2 = 1;
    rx2 = sqrt(x2);
   }

   if (flag1 && flag2)
    printf("Solution 1: %.5f\nSolution 2: - %.5f\nSolution 3: %.5f\nSolution 4: %.5f",rx1,rx1,rx2,rx2);
   else
   {
    if (flag1)
     printf("Solution 1: %.5f\nSolution 2: - %.5f", rx1, rx1);
    else if (flag2)
     printf("Solution 1: %.5f\nSolution 2: - %.5f", rx2, rx2);
   }
  }
 }
}

ЗЫ попутно еще вопрос... Логический тип в Си - bool ? А почему тогда Borland C++ его не понимает? И еще, если я написал какие-нить глупости в коде, прошу поправить...

Это сообщение отредактировал(а) mr.Anderson - 7.9.2008, 10:30


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
vinter
Дата 6.9.2008, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Цитата(mr.Anderson @  6.9.2008,  21:23 Найти цитируемый пост)
Запускаю прогу, ввожу числа 1, 2, 3. И вываливаюсь по "Invalid input data!", хотя это бред!

канеш бред smile
Код

printf("Enter A: "), scanf("%d", &a);
 printf("Enter B: "), scanf("%d", &b);
 printf("Enter C: "), scanf("%d", &c);

Цитата(mr.Anderson @  6.9.2008,  21:23 Найти цитируемый пост)
Не получилось. Это условие теперь не выполняется при A != 0, но теперь непонятно, как прописать условие a > 0. Просто > 0? Или тоже константа нужна?

тут я не понял о чем ты smile


--------------------
Мой блог
PM MAIL WWW   Вверх
mr.Anderson
Дата 6.9.2008, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 1
Всего: 128



vinter, отредактировал. Ведь коэффициенты могут быть и дробными. С целыми-то все легко и просто. А вот с дробными как?


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
anatox91
Дата 6.9.2008, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: 1
Всего: 13



Цитата(mr.Anderson @  6.9.2008,  20:23 Найти цитируемый пост)
Логический тип в Си - bool ? А почему тогда Borland C++ его не понимает?

bool появился только в С++ (ну еще может быть в каких-то более поздних версиях Си)


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
Lazin
Дата 6.9.2008, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



зачем fabs вызывать для аргумента типа int?
PM MAIL Skype GTalk   Вверх
Hades
Дата 6.9.2008, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 226
Регистрация: 8.8.2008

Репутация: нет
Всего: 37



Цитата(mr.Anderson @  6.9.2008,  20:23 Найти цитируемый пост)

Код

int a,b,c; 
printf("A: "), scanf("%f", &a); 
printf("B: "), scanf("%f", &b); 
printf("C: "), scanf("%f", &c);



mr.Anderson, если вводишь дробные числа, то и обьявляй их дробными.

P.S. Добро пожаловать в клуб программистов на BorlandC++ 3.1  smile 
PM MAIL   Вверх
vinter
Дата 6.9.2008, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Цитата(mr.Anderson @  6.9.2008,  22:02 Найти цитируемый пост)
А вот с дробными как?

дробные так не проверяются. Дробные надо сверять по какой-то бесконечно малой епсилон. Допустим тебе надо сравнить две переменные типа float\double => |a - b| < e, где e допустим 0.000001


--------------------
Мой блог
PM MAIL WWW   Вверх
mr.Anderson
Дата 7.9.2008, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 1
Всего: 128



anatox91, бред какой-то. Куда ж без логики-то? И что вместо него использовать?
Lazin, угу, забыл объявление поправить. Но суть не в этом.
vinter, это я понял, а как проверить > < нуля? На равенство уже понятно.
Hades, спасибо, хотя Си и С++ ненавижу, а среду эту вообще глаза б не видели. А что делать.

Добавлено через 4 минуты и 36 секунд
Да, кстати, и что делает fabs()? Слова "возвращает абсолютное значение аргумента" мне мало о чем говорят...

Это сообщение отредактировал(а) mr.Anderson - 7.9.2008, 10:28


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Alexeis
Дата 7.9.2008, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Цитата(mr.Anderson @  7.9.2008,  09:27 Найти цитируемый пост)
Да, кстати, и что делает fabs()? Слова "возвращает абсолютное значение аргумента" мне мало о чем говорят...

  Возвращает модуль числа с плавающей точкой smile .


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
vinter
Дата 7.9.2008, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Цитата(mr.Anderson @  7.9.2008,  11:27 Найти цитируемый пост)
это я понял, а как проверить > < нуля? На равенство уже понятно.

a > e и a < -e smile

Цитата(mr.Anderson @  7.9.2008,  11:27 Найти цитируемый пост)
"возвращает абсолютное значение аргумента"

возаращет модуль вещественного числа.


--------------------
Мой блог
PM MAIL WWW   Вверх
mr.Anderson
Дата 7.9.2008, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 1
Всего: 128



Alexeis, vinter, спасибо, теперь въехал... smile "float abs", abs - модуль, а тут вещественный модуль... Понятно. smile

Попробую с эпсилонами этими сейчас.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Lazin
Дата 7.9.2008, 12:57 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 27
Всего: 154



Цитата(mr.Anderson @  7.9.2008,  10:27 Найти цитируемый пост)
Си и С++ ненавижу, а среду эту вообще глаза б не видели

вот оно тебе и платит тем-же smile 
PM MAIL Skype GTalk   Вверх
Ln78
Дата 7.9.2008, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 25.11.2006

Репутация: нет
Всего: 15



Цитата(mr.Anderson @  6.9.2008,  21:23 Найти цитируемый пост)
x1 = (-B+sqrt(D))/2*A;

Вообще-то признания типа:
Цитата(mr.Anderson @  7.9.2008,  11:27 Найти цитируемый пост)
хотя Си и С++ ненавижу

не повышают желания помочь, но 2*А нужно брать в скобки, как, впрочем, и в паскале.
PM MAIL   Вверх
mr.Anderson
Дата 7.9.2008, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 1
Всего: 128



Усе получилось. smile Проверил все описанные в программе варианты исхода, по-моему, это все возможные варианты. Все работают корректно.

Так что, я думаю, это полное решение биквадратного уравнения.
Код

#include <stdio.h>
#include <math.h>
//--------------------

int solveFullQuadEq(float A, float B, float C, float &x1, float &x2)
{
  //result - count of solutions

  const float eps = 0.00001;

  float D = B*B - 4*A*C;

  if (D < -eps) //D<0
    return 0;

  if (fabs(D) < eps) //D==0
  {
    x1 = -B/(2*A);

    return 1;
  }
  else //D>0, full quadratic equation
  {
    x1 = (-B+sqrt(D))/(2*A);
    x2 = (-B-sqrt(D))/(2*A);

    return 2;
  }
}

void main(void)
{
  const float eps = 0.00001;

  float a,b,c;

  printf("Enter A: "), scanf("%f", &a);
  printf("Enter B: "), scanf("%f", &b);
  printf("Enter C: "), scanf("%f", &c);

  if (fabs(a) < eps) //a==0
  {
    printf("Invalid input data!");
    return;
  }

  if (fabs(b) < eps) //b==0
  {
    if (c > eps) //c>0
    {
      printf("No solutions.");
      return;
    }
    else if (c < -eps) //c<0
    {
      float r = sqrt(sqrt(-c));
      printf("First solution: %.5f\nSecond solution: - %.5f", r, r);
      return;
    }
    else //c==0
    {
      printf("Solution: 0");
      return;
    }
  }
  else //b!=0
  {
    if (fabs(c) < eps) //c==0
    {
      if (b > eps) //b>0
      {
    printf("Solution: 0");
    return;
      }
      else //b<0
      {
    float r = sqrt(-b);
    printf("First solution: 0\nSecond solution: %.5f\nThird solution: - %.5f", r, r);
    return;
      }
    }
    else //full version
    { //for checking: x^4 + 4x^2 - 21 = 0, solutions are sqrt(3) and -sqrt(3)
      float x1, x2;

      if (solveFullQuadEq(a, b, c, x1, x2) == 1)
      {
    if (x1 >= eps)
    {
      float r = sqrt(x1);
      printf("Solution 1: %.5f\nSolution 2: - %.5f", r, r);
    }
    else printf("No solutions.");
      }
      else
      {
    float rx1,rx2;
    short flag1=0, flag2=0;

    if (x1 > eps)
    {
      flag1 = 1;
      rx1 = sqrt(x1);
    }
    if (x2 >= eps)
    {
      flag2 = 1;
      rx2 = sqrt(x2);
    }

    if (flag1 && flag2)
      printf( "Solution 1: %.5f\nSolution 2: - %.5f\nSolution 3: %.5f\nSolution 4: - %.5f",rx1,rx1,rx2,rx2);
    else
    {
      if (flag1)
        printf("Solution 1: %.5f\nSolution 2: - %.5f", rx1, rx1);
      else if (flag2)
        printf("Solution 1: %.5f\nSolution 2: - %.5f", rx2, rx2);
    }
      }
    }
  }
}


Добавлено @ 13:20
Lazin,  smile 

Ln78, угу.

Это сообщение отредактировал(а) mr.Anderson - 7.9.2008, 13:40


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
vinter
Дата 7.9.2008, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Цитата(mr.Anderson @  7.9.2008,  14:19 Найти цитируемый пост)
if (fabs(a) < eps) //a<0 a==0




--------------------
Мой блог
PM MAIL WWW   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0643 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.