Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Решение квадратных уравнений на С++

Ответить
Настройки темы
C/C++ - Решение квадратных уравнений на С++

Пользователь


Сообщения: 98
Благодарности: 1

Профиль | Отправить PM | Цитировать


Изменения
Автор: Drongo
Дата: 06-02-2009
Описание: тег [code]...[/code]
Люди подскажите плиз, пробую написать тестовую програмку на С++ , чего то не правельно считает "sqrt" от числа , тип переменной назначаю с плавающей тачкой(навсякмй случа).
Вот пример

для проверки можно взять такое квадратное уравнение

y = 4x^2 + 3x - 5

Програмка

Код: Выделить весь код
#include <iostream.h>
#include <conio.h>
#include <math.h>
 main()
{
float b,a,x,c,D,y,z;
D=0;

cout <<"Davayte reshim kvadratnoe uravnenie sleduyushego vida y=ax**2+b*x+c "<<endl;
cout <<"Dla etogo vnesite znacheniya v posledovatelnosti a,b,c"<<endl;getch();clrscr();
cout <<"a="<<endl;
cin>>a;
if (a==0)
{
cout <<"Esli znachenie a=0 - Net resheniy"<<endl;getch();clrscr();
}
if (a!=0)
{
cout <<"b="<<endl;
cin>>b;
cout <<"c="<<endl;
cin>>c;
D=b*b-4*a*c;
cout <<"Diskremenant="<<D<<endl;getch();clrscr();
}
if (D<0)
{
cout <<"Net resheniy"<<endl;getch();clrscr();
} 
if (D==0)
{
x=b*b/2*a;
cout <<"naydeno odno vozmoznoe reshenie x="<<x<<endl;getch();clrscr();
}
if (D>0)
{
y=b*b+sqrt(D)/2*a;
z=b*b-sqrt(D)/2*a;
cout <<"naydeni znacheniya x1 i x2"<<endl;
cout <<"x1="<<y<<" x2="<<z<<endl;getch();clrscr();
 }
 }
Вопрос то сам как раз в выделеной части, почему то неправельно считает?
Может структура записи формулы не правельная?

Отправлено: 14:22, 06-02-2009

 

Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Цитата Alan85:
помоему слово signed лишнее »
Цитата Admiral:
Нужно указывать signed float »
Мнения разделились?


Без signed ошибки нет, но появляется ошибка:
Цитата:
[C++ Ошибка] PolinomTwoStepeny1.cpp(75): E2203 Goto bypasses initialization of a local variable
Попробовал, прикинул, если все
Код: Выделить весь код
goto end;
заменить на
Код: Выделить весь код
break;
логично? Логично. Тогда программа компилируется и работает.
Но всё же два вопроса:
1. Эта замена в данном случае мне кажется равноценной, верно?
2. Чего всё же надо было при ошибке goto? (Этот вопрос я ещё сегодня вечером попробую решить, возьму книгу, сверюсь, уточню)

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 16:57, 23-02-2009 | #21



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Alan85

Старожил


Сообщения: 463
Благодарности: 91

Профиль | Отправить PM | Цитировать


1. Нет. Так как автор предлагал этим трюком закончить выполнение программы окончательно, а break лишь выводит из текущего блока и все идет далее по тексту. Лучше уж тогда exit.
2. Потому что между goto end и самим есть есть два объявления переменных (выходит что они могут быть не объявлены - как будто вырезается часть исходника между goto end и самой меткой, но не в момент компиляции а в реал тайм. Что приведет к ошибки. Исправляется переносом объявления переменных и их инициализации до первого использования goto end. В данном случаи это переменные int i и float D.
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:37, 23-02-2009 | #22


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Цитата Alan85:
1. Нет. Так как автор предлагал этим трюком закончить выполнение программы окончательно, а break лишь выводит из текущего блока и все идет далее по тексту. Лучше уж тогда exit. »
Спасибо за поправку. Неучёл этого, думал будет выход в конец программы.
Цитата Alan85:
2. Потому что между goto end и самим есть есть два объявления переменных (выходит что они могут быть не объявлены - как будто вырезается часть исходника между goto end и самой меткой, но не в момент компиляции а в реал тайм. Что приведет к ошибки. Исправляется переносом объявления переменных и их инициализации до первого использования goto end. В данном случаи это переменные int i и float D. »
Спасибо!!! Получилось. Сместил объявления вверх:
Код: Выделить весь код
...
int main()
{
   int i;
   float D = 0;
...

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 17:59, 23-02-2009 | #23


Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


Цитата Drongo:
Код:
4х^2 + 3х – 5 = 0
Оно же в общем виде
Код:
ах^2 + bх с = 0. »
Ошибка в минусе. Общий случай неизменный
ax^2 + bx + c = 0
При вводе в программу, мы указываем с = -5. предварительно указав правильный тип переменной.
Нашел здесь
Цитата:
float f; double d; // Single or double precision real (never unsigned)
Т.е. тип float он в любом случае знаковый.
В справке NetBeans ничего про unsignet float не нашел.

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)

Это сообщение посчитали полезным следующие участники:

Отправлено: 23:12, 23-02-2009 | #24


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


Drongo, алгоритм ответа был таков, я помнил что для типов существует такая приставка как signed, но не был уверен доступна ли она для float. Через поиск провёл данную комбинацию (вместо того что б проверить компилятором) и вышел на ту тему. Как оказал безграмотное. Насчёт signed float я ошибся - ибо signed/unsigned только для char/int Is unsigned float legal?
Компилятор говорит что много типов так как, по его мнению объявляют signed int и float.
Что делать, оставить всё как есть. Я проверил, на практике никакого минуса выставлять не требуется. Минус сохраняется в переменной, скомпилив
данный код
Код: Выделить весь код
#include <stdio.h>

int main(int argc, char* argv[])
{
	float b,a,c,D;

	printf("a=");
	scanf("%f",&a);

	printf("b=");
	scanf("%f",&b);

	printf("c=");
	scanf("%f",&c);

	D = (b * b) - (4 * a * c);
	printf("Answer %f",D);

	return 0;
}

И запустив на выполнение с предложенными параметрами
получим корректный расчёт
Цитата:
a=3
b=4
c=-5
Answer 76.000000


Если интересно то минус можно задать так c=-c.
Мнение не разделись, а были предложены варианты.
Alan85 не просто лишние, а кардинально не к месту и недопустимо его с float использовать.

Кроме exit можно использовать return 0 если конечно не void main/WinMain/etc то есть если главная функция программы не без типовая.

lxa85 видимо и в Java (или NetBeans может быть IDE и для С\С++?) решили не вносить путаницу по данному вопросу.

Последний раз редактировалось Admiral, 24-02-2009 в 00:58.

Это сообщение посчитали полезным следующие участники:

Отправлено: 00:47, 24-02-2009 | #25


Аватара для lxa85

Необычный


Contributor


Сообщения: 4463
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


Цитата Admiral:
или NetBeans может быть IDE и для С\С++? »
NetBeans - это просто среда разработки. У нее есть модули и для C\C++ как одного из основных языков программирования. Есть и для Java, Python, Ruby, MySQL, Pascal и пр.
Но сама среда да, написана на Java.

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Отправлено: 09:21, 24-02-2009 | #26


Аватара для XEN_STRANGER

Старожил


Сообщения: 158
Благодарности: 4

Профиль | Отправить PM | Цитировать


Вот мой вариант проги:


Код: Выделить весь код
int x2yravn ()
{
	double a, b, c, x1, x2;
	double error;
	unsigned short int back;
	cout << "Ввод уравнения: " << endl;
	cout << endl << "(a=) ";
	cin >> a;
	cout << "(b=) ";
	cin >> b;
	cout << "(c=) ";
	cin >> c;


    error = GetX2yravn (a, b, c, &x1, &x2);
	if (!error)
	{
		backer ();
	}

    else
	{
		cout << endl << "Ошибка! а=0, уравнение не квадратное" << endl;
	}
	char response;
	cin >> response;
	return 0;

}


// Функция нахождения корней

double GetX2yravn (double a, double b, double c, double *px1, double *px2)
{
	double value = 0;
	if (a == 0)
		value = 1;
	else
	{
		double D;
	    D = b*b - 4*a*c;
		cout << endl << "Дискриминант равен " << D << endl;
		if (D < 0)
		{
			cout << "=====РЕЗУЛЬТАТ============================================";
			cout << endl << "Корней не найдено, дискриминант меньше ноля" << endl;
			cout << "==========================================================" << endl;
		}
		if (D == 0)
		{
			*px1 = -b / (2*a);
			cout << "=====РЕЗУЛЬТАТ============================================";
			cout << endl << "Найден один корень, x = " << *px1 << endl;
			cout << "==========================================================" << endl;
		}
		if (D > 0)
		{
			*px1 = (-b + sqrt(D)) / (2*a);
			*px2 = (-b - sqrt(D)) / (2*a);
			cout << "=====РЕЗУЛЬТАТ============================================";
			cout << endl << "Найдено два корня, x1 = " << *px1 << ", x2 = " << *px2 << endl;
			cout << "==========================================================" << endl;
		}
		value = 0;
	}
	return value;



//----Функция возврата------------------------------------------------------------------------------

int backer ()
{
	unsigned short int back;
	cout << endl << endl<< "Вернуться в главное меню? (Да - 1, Нет - 2)";
	cin >> back;
	cout << endl << endl;
	switch (back)
	{
	case 1:
		{
		   cout << "-----END---------------------------------------------------------";
		   cout << endl << endl << endl << endl << endl << endl << endl;
		   return int x2yravn();
		}
		break;

	case 2:
		{
                                   cout << endl << "Можете закрыть программу.";
	   	   char response;
                                   cin >> response;
		   return 0;
		}
	    break;
	default:
		{
	                   cout << endl << "<Ошибка! Введите коректное число!>" << endl << endl;
		   return backer ();
		}
	}
}

Последний раз редактировалось Drongo, 24-03-2009 в 11:23. Причина: Тег [code]...[/code] #


Отправлено: 11:08, 24-03-2009 | #27


Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


Программа решения квадратных уравнений

Отправлено: 19:55, 19-05-2011 | #28


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


gusenkovs, где описание программы? Что она делает и т.д.?

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 21:46, 19-05-2011 | #29


Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


Программа решает уравнния вида ax^2+bx+c
Код: Выделить весь код
#include <math.h>
#include <iostream>
#include <fstream>
using namespace std;
double kkui_discremenant (double a,double b,double c)
{double discreminant=pow(b,2)-4*a*c;
 return discreminant;
}
double x1v (double a,double b,double c)
{double discreminant=kkui_discremenant(a,b,c);
if (discreminant>=0)
{double x1=(sqrt(discreminant)-b)/(2*a);
return x1;}return 0;}

double x2v (double a,double b,double c)
{double discreminant=kkui_discremenant(a,b,c);
if (discreminant>=0)
{double x2=(-sqrt(discreminant)-b)/(2*a);
return x2;};return 0;}
void log(double a,double b,double c,double discremenant,double x1,double x2) 
{
	ofstream outfile("C:\\kku.log",ios::app);
    outfile<<a<<"x^2+"<<b<<"x+"<<c<<endl<<"дискрименант"<<discremenant<<endl<<"x1="<<x1<<endl<<"x2="<<x2<<endl<<"Теорема Виетта"<<"(x-("<<x1<<")(x-("<<x2<<"))"<<endl; 
    outfile.close();}

Последний раз редактировалось Drongo, 20-05-2011 в 23:39. Причина: Не вижу причит выкладывать .h файл через файлообменник


Отправлено: 17:23, 20-05-2011 | #30



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Решение квадратных уравнений на С++

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Wireless - Посоветуйте WI-FI решение. krec Сетевое оборудование 2 29-06-2009 10:39
C/C++ - Решение кубических уравнений на С++ XEN_STRANGER Программирование и базы данных 16 02-04-2009 14:19
Теория - Решение системы уравнений quaker_strelok Программирование и базы данных 3 23-09-2007 14:29
*Теория* | Решение системы линейных уравнений DeadBoy Программирование и базы данных 5 23-02-2005 17:12
Терминальное решение Baboon Сетевые технологии 2 06-10-2003 17:13




 
Переход