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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2012, 23:57   #1
fasty
Пользователь
 
Регистрация: 09.11.2011
Сообщений: 25
Стрелка оптимизация алгоритма подсчёта производной

задание такое:
дан многочлен, с убывающими степенями, коэффиценты которого находятся в файле, пользователь указывает максимальную степень, порядок производной и t0-аргумент, от которого необходимо подсчитать значение производной

вот код который я написал, он всё правильно считает,всё работает, НО! надо его улучшить ( ну мне так препод сказал), а именно чтобы в функции подсчёта производной не считались факториалы по несколько раз, например:
3x^4+8x^3+x^2+9x при третьем порядке производной и t0=1
1) а)3*(x^4)'=3*4*x^3
б)3*4*(x^3)'=3*4*3*x^2
в)3*4*3*(x^2)'=3*4*3*2*x
2)8*(x^3)'=8*3*x^2
8*3*(x^2)'=8*3*2*x
8*3*2*(x)'=8*3*2*1
3)(x^2)'=2*x
2*(x)'=2
2(1)'=0
4) 9(x)'=9
9(1)'=0
то есть надо сделать так, чтобы он не высчитывал каждый раз факториал 3*2 для 1 и 2 случая в примере
то есть, часть факториала кроме первого элемента должна оставать и добавляться новый маленький элемент в произведение
как так сделать? я вообще не могу придумать никак
Код:
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <fstream>
using namespace std;
float proizvodnaya(float a, int n, int p, float t0);
void main()
{setlocale( LC_ALL,"Russian");
	 
	int n,p;float t0,a,z=0;
	fstream f; f.open ("C://proga/in.txt", ios::in);
  if (!f){cout << "Невозможно открыть файл для чтения" << endl;}  else
  {
	cout << "Введите максимальную степень многочлена" << endl;
	cin >> n;
	cout << "введите порядок производной" << endl;
	cin >> p;
	if (p<0) 
		{
			cout << "Введите корректное значение произвдной" << endl; system("pause"); exit(1);
		}
	cout << "Введите значение t0" << endl;
	cin >> t0;
	while(1)
	{if (f.eof()) break;
		f >> a;

		z=z+proizvodnaya(a, n, p, t0);

		n=n-1;
		
	}
  }

  f.close();
f.open("C://proga/out.txt", ios::out);
if(f.bad()!=0) cout << "Ошибка при открытии фала out_kurs.txt на запись \n";
else
{
	cout << "Значение " << p << "-ой производной от многочлена в точке t0=" << t0 << " равно " << z << endl;
	f << "Значение " << p << "-ой производной от многочлена в точке t0=" << t0 << " равно " << z << endl;
}
  system("pause");
}

float proizvodnaya(float a, int n, int p, float t0)
{int i,k;float s=0;
k=n;
	for(i=0;i<p;i++)
	{	if ((a==0)||(k==0)) 
		{
			return(0);break;
		}
		a=a*k;
		k=k-1;
	}
	s=a*(pow(t0,k));
	return(s);
}
fasty вне форума Ответить с цитированием
Старый 08.03.2012, 01:09   #2
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
f.open ("C://proga/in.txt", ios::in);
f.open("C://proga/out.txt", ios:ut);
Как у вас вообще это работает?
Надо:
Цитата:
fstream f; f.open ("C:\\proga\\in.txt", ios::in);
f.open("C:\\proga\\out.txt", ios:ut);
Код:
while(1)
{
     if (f.eof()) break;
     ...
}
Кто так вообще делает? Напишите:
Код:
while(!f.eof())
{
    ...
}
Ну а теперь по теме. Вообще если степени убывают монотонно по одной, достаточно высчитать самый большой факториал, а каждый следующий делить на предыдущую степень.

Но если брать для общего случая, т.е. когда степени уменьшаются в рандомном порядке, то напрашивается записать факториалы в массив и юзать нужный в зависимости от степени.
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 08.03.2012, 02:16   #3
fasty
Пользователь
 
Регистрация: 09.11.2011
Сообщений: 25
По умолчанию

всё работало, как не странно :D
вот переделал, работает теперь тоже, те же ответы, но не высчитывает каждый раз факториалы)
Код:


#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <fstream>
using namespace std;
float a1=1;
float proizvodnaya(float a, int n, int p, float t0, int nmax);
void main()
{setlocale( LC_ALL,"Russian");
	 
	int n,p;float t0,a,z=0;
	fstream f; f.open ("C:\\proga\\in.txt", ios::in);
  if (!f){cout << "Невозможно открыть файл для чтения" << endl;}  else
  {
	cout << "Введите максимальную степень многочлена" << endl;
	cin >> n;
	int nmax=n;
	cout << "введите порядок производной" << endl;
	cin >> p;
	if (p<0) 
		{
			cout << "Введите корректное значение произвдной" << endl; system("pause"); exit(1);
		}
	cout << "Введите значение t0" << endl;
	cin >> t0;
	while(!f.eof())
	{
		f >> a;

		z=z+proizvodnaya(a, n, p, t0, nmax);

		n=n-1;
		
	}
  }

  f.close();
f.open("C:\\proga\\out.txt", ios::out);
if(f.bad()!=0) cout << "Ошибка при открытии фала out_kurs.txt на запись \n";
else
{
	cout << "Значение " << p << "-ой производной от многочлена в точке t0=" << t0 << " равно " << z << endl;
	f << "Значение " << p << "-ой производной от многочлена в точке t0=" << t0 << " равно " << z << endl;
}
  system("pause");
}

float proizvodnaya(float a, int n, int p, float t0, int nmax)
{int i,k;float s=0;
k=n;float koef=a;
	for(i=0;((i<p)&&(n==nmax));i++)
	{	
		koef=koef*k;a1=a1*k;cout << koef << endl;
		k=k-1;
	}
		k=n-p;
		if (n!=nmax)
		a=a*a1;
		else a=koef;
	a1=(a1/n)*(k);
	s=a*(pow(t0,k));
	return(s);
}
fasty вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ Оптимизация алгоритма Сtrl Помощь студентам 7 02.05.2011 20:53
Delphi. Оптимизация алгоритма. Риндера Помощь студентам 28 12.11.2010 09:27
оптимизация алгоритма выделения слов furstenberg Общие вопросы Delphi 12 02.02.2010 07:44
Нахождение производной Sota Свободное общение 11 02.05.2008 18:32