Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2009, 23:33   #1
liver1981
Пользователь
 
Регистрация: 25.03.2009
Сообщений: 20
Вопрос перегруженные шаблоны функций и корни линейных уравнений

Господа, имеется такая задача:

Условие:

Написать перегруженные шаблоны функций для нахождения корней линейного (a*x + b = 0) и квадратного (a*x2+b*x + c = 0) уравнений. Замечание: в функции передаются коэффициенты уравнений.

Мой код:

Код:
#include <iostream>
#include <windows.h>
#include <math.h>
using namespace std;
template <typename T> T My (T A, T B, T C)
{
	B=B*(-1);
	float x=B/A;
	float D=((B*B)-(4*A*C));
	if (D>0)
	{
		float res1=(B*(-1)+sqrt((B*B)-(4*A*C)))/2*A;
		cout<<"a*x2+b*x + c = 0_res1: "<<res1<<"\n";
		float res2=(B*(-1)-sqrt((B*B)-(4*A*C)))/2*A;
		cout<<"a*x2+b*x + c = 0_res2: "<<res2<<"\n";
	}
	if (D==0)
	{
		float res3=((-1)*B)/2*A;
		cout<<"a*x2+b*x + c = 0_res3: "<<res3<<"\n";
	}
	if (D<0)
	{
		cout<<"a*x2+b*x + c = 0_Корней нет!\n";
	}
	return x;
}
void main ()
{
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
	float a, b, c;
	cout<<"a:\n"<<"b:\n"<<"c:\n";
	cin>>a>>b>>c;
	cout<<"a*x + b = 0_res: "<<My (a,b,c);	
}
Вроде бы всё работает, но я ся оч неуверенно чуствую в этом материале...Скажите, есть ли тут ошибки??

Заранее благодарен!

Последний раз редактировалось MaTBeu; 03.04.2009 в 23:56.
liver1981 вне форума Ответить с цитированием
Старый 04.04.2009, 12:21   #2
Pashan
Пользователь
 
Регистрация: 18.03.2009
Сообщений: 89
По умолчанию

Цитата:
Написать перегруженные шаблоны функций
Что-то по коду не видно, в чем заключается перегруженность шаблона. Да и задание какое-то странное.

Зато возник другой вопрос: зачем везде написано B*(-1) ? Просто -B нельзя написать?

P.S. Если A = 0, то капец
Pashan вне форума Ответить с цитированием
Старый 04.04.2009, 12:45   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Pashan Посмотреть сообщение
Зато возник другой вопрос: зачем везде написано B*(-1) ? Просто -B нельзя написать?
Мне больше интересно зачем первой строчкой идёт: B=B*(-1);
а потом везьде опять B*(-1), а просто B используется только в B*B. Не проще ли эту первую строчку убить и никаких B*(-1) не нужно будет?)
И еще смысл в шаблонной функции, если внутри всё равно используются переменные float? Получается ограничение, что результат T / T должен неявно уметь приводиться к float

Последний раз редактировалось pu4koff; 04.04.2009 в 12:49.
pu4koff вне форума Ответить с цитированием
Старый 04.04.2009, 13:00   #4
liver1981
Пользователь
 
Регистрация: 25.03.2009
Сообщений: 20
Радость

Но позвольте, господа, а как же всё таки праильно написать (я новичок ещё))?
liver1981 вне форума Ответить с цитированием
Старый 04.04.2009, 13:01   #5
liver1981
Пользователь
 
Регистрация: 25.03.2009
Сообщений: 20
Радость

Цитата:
Сообщение от Pashan Посмотреть сообщение
зачем везде написано B*(-1) ? Просто -B нельзя написать?
Хм, не знал, что так мона писАть- пасип)
liver1981 вне форума Ответить с цитированием
Старый 04.04.2009, 13:12   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Вот это на int будет парвильно работать: float x=B/A? Округление до целого не произойдет при делении?
Кроме того возвращаем из функции тип T, пишем: return x; а x - это строго float. Если я захочу с типом double работать, то вернётся вероятно мне double, но точность вычисления значения то будет как у типа float.
В данной задаче использование шаблонов притянуто за уши. Логичнее использовать простую перегрузку функций.
Изначально определитесь какие типы должен Ваш шаблон поддерживать и что будет с Вашим кодом при разных параметрах шаблона.
Еще D - это float. Забудьте для вещественных типов оператор ==. Нельзя писать D == 0. Нужно:
модуль(D) < погрешности. Для погрешности должен быть макрос что-то вроде FLOAT_EPS или как-то так. Точно не помню.
Используйте else if, а то к чему лишние проверки производить?
И еще про саму "архитектуру" функции: выкиньте вы этот вывод в консоль. Представьте, что эту функцию захотите в оконном приложении использовать или изменить формат вывода на экран. А если бы стандартные функции тоже выводили на экран что-то? Вызываете в коде rand(), а в нагрузку выводится на экран что-то вроде: "Generated random value: 0.00005". Я думаю это бы Вам не понравилось

Последний раз редактировалось pu4koff; 04.04.2009 в 13:21.
pu4koff вне форума Ответить с цитированием
Старый 08.04.2009, 18:54   #7
liver1981
Пользователь
 
Регистрация: 25.03.2009
Сообщений: 20
Радость

pu4koff, пасиба огромное, но мы пока что тока в консоли и пишем. половину из того что вы в последнем посте сказали мне к сож пока ещё не оч понятно но я буду стараца понять. ещё раз пасип)
liver1981 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решение системы линейных уравнений методом Гаусса. maliyusha Помощь студентам 16 18.02.2013 15:44
паскаль система линейных уравнений student77rus Помощь студентам 1 19.11.2008 21:48