Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Архив ПТ Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 105 106 107 108 109 110 111 112 [113] 114   вперед  Ctrl
 Re: С++?  [new]
D!sa
Member

Откуда:
Сообщений: 288
А насчет пайтона - его гугл активно использует, это тоже вполне значимо.
18 фев 08, 22:12    [5307258]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
D!sa
Member

Откуда:
Сообщений: 288
Умаксуман

Нет, до Сени тебе далеко


В этом ты прав, нам все оочень далеко до него.
18 фев 08, 22:15    [5307269]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
Владимир М.
Member

Откуда: Москва
Сообщений: 4990
Умаксуман
D!sa


ПО управляемых ракет тоже наЛИСПЕ пишут? Оракл - написан на ЛИСПЕ или питоне?

Постараюсь быть объективным.
Насколько мне известно на LISP была написана программа управления космическим зондом (по-моему отправленным на Марс). Когда гаджет быть на расстоянии порядка 100 млн. км. выяснилось, что в программу вкралась ошибка. Её удалось исправить УДАЛЕННО!!!!
19 фев 08, 11:31    [5308752]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
Умаксуман
Member

Откуда: Новороссия
Сообщений: 108164
Владимир М.
Постараюсь быть объективным.
Насколько мне известно на LISP была написана программа управления космическим зондом (по-моему отправленным на Марс). Когда гаджет быть на расстоянии порядка 100 млн. км. выяснилось, что в программу вкралась ошибка. Её удалось исправить УДАЛЕННО!!!!


Типа, "А если бы ее писали на ЦПП, то хрен бы ее исправили!" ?
19 фев 08, 11:32    [5308765]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
Владимир М.
Member

Откуда: Москва
Сообщений: 4990
Умаксуман
Владимир М.
Постараюсь быть объективным.
Насколько мне известно на LISP была написана программа управления космическим зондом (по-моему отправленным на Марс). Когда гаджет быть на расстоянии порядка 100 млн. км. выяснилось, что в программу вкралась ошибка. Её удалось исправить УДАЛЕННО!!!!


Типа, "А если бы ее писали на ЦПП, то хрен бы ее исправили!" ?

Не знаю. Я просто изложил факт.
19 фев 08, 11:35    [5308793]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
rt555
Member [заблокирован]

Откуда:
Сообщений: 446
Как на ЦПП оценить строковое выражение? Надо типа такого:

float y;

float x = 5.5;

string s = "23.77+x+8.0/(2*x+9)*x*x-234.567";

y = eval(s);


В выражении могут быть:
"0..9", ".", "+", "-", "*", "/"
19 фев 08, 17:32    [5311772]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
rt555
Member [заблокирован]

Откуда:
Сообщений: 446
пиплы, вы хде? может, у кого-то что-то готовое есть
19 фев 08, 17:58    [5312007]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
rt555
Member [заблокирован]

Откуда:
Сообщений: 446
rt555
В выражении могут быть:
"0..9", ".", "+", "-", "*", "/"

мудилка : и буква "х" , конечно.
19 фев 08, 18:08    [5312081]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
rt555
Member [заблокирован]

Откуда:
Сообщений: 446
float y;

float x = 5.5;

string s = "23.77+x+8.0/(2*x+9)*x*x-234.567";

y = eval(s);



cout << y



------------------
-193.197

19 фев 08, 18:13    [5312129]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
D!sa
Member

Откуда:
Сообщений: 288
Умаксуман

Типа, "А если бы ее писали на ЦПП, то хрен бы ее исправили!" ?


Естественно не исправили бы. ЛИСП код славиться изоморфностью данных и программ, лисп программа может обрабатывать сама себя и вообще любая программа на лиспе содержит как минимум интерпретатор, т.е. динамика там стопроцентная, прогу не надо перекомпилировать, достаточно внести изменения прямо в работаюший код. Если бы там был С++ то пришось бы все перекомпилять и перешивать. А потом зачем лишний геморой на С++, если он даже на процент не приблизиться к тем возможностям, которые дает лисп.
19 фев 08, 19:10    [5312426]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
D!sa
Member

Откуда:
Сообщений: 288
rt555



Вот в гугле откапал - http://www.programmersheaven.com/download/39608/download.aspx
19 фев 08, 19:19    [5312447]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
rt555
Member [заблокирован]

Откуда:
Сообщений: 446
D!sa
rt555



Вот в гугле откапал - http://www.programmersheaven.com/download/39608/download.aspx

Щас гляну.

По ЛИСП сабжу от ЛИСП гуру ( http://www.paulgraham.com/diff.html ):
9. The whole language always available. There is no real distinction between read-time, compile-time, and runtime. You can compile or run code while reading, read or run code while compiling, and read or compile code at runtime.

Running code at read-time lets users reprogram Lisp's syntax; running code at compile-time is the basis of macros; compiling at runtime is the basis of Lisp's use as an extension language in programs like Emacs; and reading at runtime enables programs to communicate using s-expressions, an idea recently reinvented as XML.

Я ничё не понял :)
19 фев 08, 19:33    [5312491]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
rt555
Member [заблокирован]

Откуда:
Сообщений: 446
D!sa
rt555



Вот в гугле откапал - http://www.programmersheaven.com/download/39608/download.aspx

Press 'ENTER' accept the disclaimer and continue..............Any key to quit.
Enter equation in infix : 23.77+5.5+8.0/(2*5.5+9)*5.5*5.5-234.567

Post fix equation : 23.775.5+8.025.5*9+5.5*5.5*234.567-/+

Symbol Table
                           23.77       23.77  0
                             5.5        5.50  0
                             8.0        8.00  0
                               2        2.00  0
                             5.5        5.50  0
                               9        9.00  0
                             5.5        5.50  0
                             5.5        5.50  0
                         234.567      234.57  0

Answer = 29.291597

                           Thanks For Using


у Питона ответ "-193.197". Што за хня..
19 фев 08, 20:17    [5312578]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
sobolev
Member

Откуда: Петрозаводск
Сообщений: 1424
rt555
Как на ЦПП оценить строковое выражение? Надо типа такого:

float y;

float x = 5.5;

string s = "23.77+x+8.0/(2*x+9)*x*x-234.567";

y = eval(s);


В выражении могут быть:
"0..9", ".", "+", "-", "*", "/"


Вот это работает. Только я выдрал это из толстой системы. Так что в лоб скомпилировать тебе не удасться. Класс PPExprParser как раз делает то, что ты просишь.

//
// Descr: Базовый класс контекстов разрешения переменных в формулах.
//
class ExprEvalContext {
public:
	SLAPI  ExprEvalContext();
	virtual int SLAPI Resolve(const char * pSymb, double * pVal) = 0;
	virtual int SLAPI IsFunc(const char * pSymb, int * pFuncId);
	virtual int SLAPI ResolveFunc(int funcId, uint argCount, double * pArgList, double * pVal);
};
//
// Descr: Реализует разрешение формулы. Использует ExprEvelContext для разрешения переменных
//   и функций. Формулы обрабатывают только значения с плавающей точкой.
//   Доступ к сервису этого класса осуществляется только через статический метод
//   PPExprParser::CalcExpression
//
class PPExprParser {
public:
	static int SLAPI CalcExpression(const char *, double *, const PPCalcFuncList *, ExprEvalContext *);
private:
	enum {
		tokNumber = 257,
		tokName = 258,
		tokFunc = 259
	};
	enum {
		funcAbs   = 1, // abs(x)
		funcSqrt  = 2, // sqrt(x)
		funcSin   = 3, // sin(x)
		funcCos   = 4, // cos(x)
		funcTan   = 5, // tan(x)
		funcSieve = 6  // sieve[1.; 20000. ? 2.5; 40000 ? 4](x)
	};
	SLAPI  PPExprParser(const char *, const PPCalcFuncList *, ExprEvalContext *);
	SLAPI ~PPExprParser();
	int    SLAPI CalcExpr(double *);
	int    SLAPI GetToken();
	int    SLAPI GetFactor(double *);
	int    SLAPI GetTerm(double *);
	int    SLAPI ResolveName(const char *, double *);
	int    SLAPI Next();
	int    SLAPI GetSieve();

	int    Token;
	double Number;
	SString Name;
	int    Func;
	int    Cur;
	char * P_S;
	size_t Pos;
	SHistogram Sieve;
	RAssocArray SieveVal;

	const PPCalcFuncList * P_CFL;
	ExprEvalContext * Ctx;
};
//
//
//
//static
int SLAPI PPExprParser::CalcExpression(const char * pStr, double * pResult, const PPCalcFuncList * pCFL, ExprEvalContext * pCtx)
{
	PPExprParser parser(pStr, pCFL, pCtx);
	return parser.CalcExpr(pResult);
}

SLAPI PPExprParser::PPExprParser(const char * pStr, const PPCalcFuncList * pCFL, ExprEvalContext * pContext)
{
	Token   = 0;
	Number  = 0;
	P_S     = newStr(pStr);
	Pos     = 0;
	Ctx     = pContext;
	P_CFL   = pCFL;
	Next();
}

SLAPI PPExprParser::~PPExprParser()
{
	delete P_S;
}

int SLAPI PPExprParser::Next()
{
	return P_S[Pos] ? (Cur = (int)P_S[Pos++]) : (Cur = -1);
}

// sieve[1.; 20000. ? 2.5; 40000 ? 4]

int SLAPI PPExprParser::GetSieve()
{
	int    ok = 1;
	SString temp_buf, sub;
	Sieve.Clear();
	SieveVal.freeAll();
	while(Cur == ' ' || Cur == '\t')
		Next();
	if(Cur == '[') {
		while(Next() != ']') {
			if(Cur == -1) {
				ok = 0;
				break;
			}
			else
				temp_buf.CatChar(Cur);
		}
		if(ok) {
			Next(); // Забрать символ ']' из потока
			SString sub, left, right;
			StringSet ss(';', temp_buf.Strip());
			long   id = 0;
			int    was_default = 0;
			for(uint pos = 0; ss.get(&pos, sub);) {
				++id;
				if(sub.Divide('?', left, right) > 0) {
					Sieve.AddBin(id, left.ToReal());
					SieveVal.Add(id, right.ToReal(), 0);
				}
				else {
					if(!was_default) {
						SieveVal.Add(-MAXLONG, left.ToReal(), 0);
						was_default = 1;
					}
					else
						ok = 0;
				}
			}
		}
	}
	else
		ok = 0;
	return ok;
}

int SLAPI PPExprParser::GetToken()
{
	char   buf[128];
	char * p = buf;
	Token = 0;
	if(Cur > 0) {
		while(Cur == ' ' || Cur == '\t' || Cur == '\r' || Cur == '\n')
			Next();
		if(isalpha(Cur) || oneof3(Cur, '_', '@', '[')) { //  ('[') @v5.6.9 AHTOXA
			do {
				*p++ = Cur;
				Next();
			} while(isalnum(Cur) || oneof3(Cur, '_', '.', ']'));  // (']') @v5.6.9 AHTOXA
			*p = 0;
			Func = 0;
			if(stricmp(buf, "abs") == 0)        { Func = funcAbs; Token = tokFunc; }
			else if(stricmp(buf, "sqrt") == 0)  { Func = funcAbs; Token = tokFunc; }
			else if(stricmp(buf, "sin") == 0)   { Func = funcSin; Token = tokFunc; }
			else if(stricmp(buf, "cos") == 0)   { Func = funcCos; Token = tokFunc; }
			else if(stricmp(buf, "tan") == 0)   { Func = funcTan; Token = tokFunc; }
			else if(stricmp(buf, "sieve") == 0) {
				Func = funcSieve;
				GetSieve();
				Token = tokFunc;
			}
			else if(Ctx && Ctx->IsFunc(buf, &Func)) { Token = tokFunc; }
			else { Name = buf; Token = tokName; }
		}
		else if(isdigit(Cur) || Cur == '.' /* @v5.5.1 || Cur == ','*/) {
			int    dot = 0;
			do {
				if(Cur == '.' /* @v5.7.2 || Cur == ','*/)
					dot = 1;
				// @v5.7.2 *p++ = (Cur == ',') ? '.' : Cur;
				*p++ = Cur; // @v5.7.2
				Next();
			} while(isdigit(Cur) || ((Cur == '.' /* @v5.7.2 || Cur == ','*/) && !dot));
			*p = 0;
			Number = atof(buf);
			Token  = tokNumber;
		}
		else {
			//long   csymb[4];
			//csymb[0] = 0x2528292AL; // "*)(%"
			//csymb[1] = 0x002B2D2FL; // "/-+\0"
			if(strchr("*)(%/-+<>=,", Cur)) { // @v5.5.1 ','
				Token = Cur;
				Next();
			}
		}
	}
	return Token;
}

int SLAPI PPExprParser::GetFactor(double * pResult)
{
	int    ok = 1;
	int    uminus = 0;
	// Цикл для корректной обработки любого количества
	// подряд идущих плюсов и минусов
	while(Token == '-' || Token == '+') {
		if(Token == '-')
			uminus++;
		GetToken();
	}
	uminus = uminus % 2;
	if(Token == tokNumber) {
		*pResult = Number;
		GetToken();
	}
	else if(Token == tokFunc) {
		int    func = Func;
		uint   arg_count = 0;
		double arg_list[32];
		GetToken();
		THROW_PP_S(Token == '(', PPERR_INVEXPR, P_S);
		arg_list[0] = 0.0;
		do {
			arg_list[arg_count] = 0;
			THROW(CalcExpr(&arg_list[arg_count]));
			arg_count++;
		} while(Token == ',');
		THROW_PP_S(Token == ')', PPERR_INVEXPR, P_S);
		GetToken();
		switch(func) {
			case funcAbs:   *pResult = fabs(arg_list[0]); break;
			case funcSqrt:  *pResult = sqrt(arg_list[0]); break;
			case funcSin:   *pResult = sin(arg_list[0]);  break;
			case funcCos:   *pResult = cos(arg_list[0]);  break;
			case funcTan:   *pResult = tan(arg_list[0]);  break;
			case funcSieve:
				{
					long   bin_id = 0;
					*pResult = Sieve.GetBinByVal(arg_list[0], &bin_id) ? SieveVal.Get(bin_id) : 0.0;
				}
				break;
			default:
				if(Ctx)
					Ctx->ResolveFunc(func, arg_count, arg_list, pResult);
				else
					*pResult = 0;
		}
	}
	else if(Token == '(') {
		THROW(CalcExpr(pResult));
		THROW_PP_S(Token == ')', PPERR_INVEXPR, P_S);
		GetToken();
	}
	else if(Token == tokName) {
		uint16 func_id = 0;
		if(P_CFL && (func_id = P_CFL->SearchFuncByName(Name)) != 0) {
			StringSet params;
			char   result[64];
			size_t next_pos;
			THROW(P_CFL->ReadParams(func_id, P_S+Pos-1, &next_pos, ¶ms));
			Pos += next_pos;
			Cur = P_S[Pos-1];
			THROW(P_CFL->CalcFunc(func_id, ¶ms, result, sizeof(result)));
			*pResult = atof(result);
		}
		else
			THROW(ResolveName(Name, pResult));
		GetToken();
	}
	else
		CALLEXCEPT_PP_S(PPERR_INVEXPR, P_S);
	if(uminus)
		*pResult = -*pResult;
	CATCH
		ok = 0;
	ENDCATCH
	return ok;
}

int SLAPI PPExprParser::GetTerm(double * pResult)
{
	int    ok = 1;
	THROW(GetFactor(pResult));
	while(Token == '*' || Token == '/' || Token == '%') {
		double mult = 0.0;
		int    op   = Token;
		GetToken();
		THROW(GetFactor(&mult));
		if(op == '*') {
			if(*pResult != 0)
				*pResult *= mult;
		}
		else if(op == '/') {
			if(*pResult != 0)
				*pResult /= mult;
		}
		else if(op == '%')
			*pResult = (long)*pResult % (long)mult;
	}
	CATCH
		ok = 0;
	ENDCATCH
	return ok;
}

int SLAPI PPExprParser::CalcExpr(double * pResult)
{
	int    ok = 1;
	double result = 0.0;
	GetToken();
	THROW(GetTerm(&result));
	while(Token == '+' || Token == '-' || Token == '<' || Token == '>' || Token == '=') {
		double add = 0.0;
		if(Token == '+' || Token == '-') {
			int    sign = (Token == '+') ? 1 : -1;
			GetToken();
			THROW(GetTerm(&add));
			if(sign > 0)
				result += add;
			else
				result -= add;
		}
		else {
			int    cmp;
			if(Token == '<')
				cmp = -1;
			else if(Token == '>')
				cmp = 1;
			else
				cmp = 0;
			//
			// Операции -, + имеют больший приоритет, чем <>=. Поэтому вызываем
			// CalcExpr вместо { GetToken(); GetTerm(&add); }
			//
			THROW(CalcExpr(&add));
			if(cmp == 0)
				result = (result == add) ? 1 : 0;
			else if(cmp == -1)
				result = (result < add) ? 1 : 0;
			else if(cmp == 1)
				result = (result > add) ? 1 : 0;
		}
	}
	CATCH
		ok = 0;
		result = 0;
	ENDCATCH
	ASSIGN_PTR(pResult, result);
	return ok;
}

int SLAPI PPExprParser::ResolveName(const char * b, double * v)
{
	return Ctx ? Ctx->Resolve(b, v) : (PPErrCode = PPERR_ILLVAR, 0);
}
20 фев 08, 09:26    [5313601]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
rt555
Member [заблокирован]

Откуда:
Сообщений: 446
Спасибо конешне за код (ужасный по размеру и по замаху), но я уже сам накарябал;
причем без всяких push/pop, а весьма оригинально :) и даже унарные +/- обрабатываю корректно:

-(2-7)

=              5.00000000


3*8-29*-1

=             53.00000000


3/5-1*2/3

=             -0.06666667


(8.252-4*5.7)

=            -14.54800000


(33.222/43.5)*-22.5507

=            -17.22251392


23.77+5.5+8.0/(2*5.5+9)*5.5*5.5-234.567

=           -193.19700000


23.77+5.5+8.0*(8+0-3*3.141576543)/(2*5.5+99*((-6+456.78)*23+11*23.654))*5.5*5.5-234.567*34/34/23.78*654.31

=          -6424.87388403


(-45.939393-34.54000335*(12.56-77.44))*23.56/-45.937474/1.717171*43*-92.878

=        2618265.21326070


54-(67*78)/0.763*99.63*52*(6.33-8+4*5.7-(((-5+99.32)*(4/3.11*4.8)+(7-3.3)*-8)*2.2-3))

=    42290522127.00735000

20 фев 08, 10:30    [5314005]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
rt555
Member [заблокирован]

Откуда:
Сообщений: 446
Это мне надо под эту таску : http://www.spoj.pl/problems/CERC07W/

Там всё крутится вокруг парсинга формул, а они там намного навороченнее, чем в сэмплах инпута.

Питон это по тайм-лимиту не вытянет. В идеале, конечно, взять ба интеграл из строки...
20 фев 08, 10:35    [5314037]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
rt555
Member [заблокирован]

Откуда:
Сообщений: 446
фпесду эту таску; 16 часов уже долблюсь; и всё без толку.
Без интеграла хер ее сделаешь, а суммирование а ля архимед не катитЪ.

======================
Пошлифсенаhуй.
21 фев 08, 10:56    [5320459]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
sobolev
Member

Откуда: Петрозаводск
Сообщений: 1424
В чем трудность с интегралом то? Примени функцию с параметрами и заюзай численное интегрирование. Я ж тебе все что надо запостил (кроме интегрирования конечно, но этого добра в инете навалом).
21 фев 08, 11:47    [5320981]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
rt555
Member [заблокирован]

Откуда:
Сообщений: 446
есть строка, напр., : "23.345 + 30.5 * (1.8 + x * x)/(7 - x)/(7 + 32 * x)"

И как мне взять от нее интеграл? Это ж какой крутой парсинг надо делать!

А численное интегрирование как раз-то и не подойдет. Точность очень сильно проседает.

Это же детский лепет, типа такого моего "интегрирования":


r:=eval(1);
while x<b do
begin
x:=x+db;
rr:=eval(1);
dmc:=db*sqr(0.5*(r+rr));
mc:=mc+dmc;
mcx:=mcx+dmc*(x-db*0.5);
r:=rr;
end;

mc:=mc*2.5;
mcx:=mcx*2.5;
t:=eval(2);
dh:=(h-b)/p;

while x<h do
begin
x:=x+dh;
rr:=eval(1);
tt:=eval(2);
r1:=0.5*(r+rr);
r2:=r1-0.5*(t+tt);
dmc:=dh*(r1-r2)*(r1+r2)*2.5;
mc:=mc+dmc;
mcx:=mcx+dmc*(x-dh*0.5);
dmw:=dh*r2*r2;
mw:=mw+dmw;
mwx:=mwx+dmw*(x-dh*0.5);
r:=rr;
t:=tt;
sch:=sch+1;
w[sch][1]:=mwx;
w[sch][2]:=mw;
w[sch][3]:=x;
end;


21 фев 08, 12:08    [5321263]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
sobolev
Member

Откуда: Петрозаводск
Сообщений: 1424
Действительно, я не полностью прав в моем пред посте.
Без численного интегрирования тебе не обойтись (по крайней мере, не видно другого пути), но разбор усложняется: тебе придется выражение под интегралом дополнительно разбирать. То есть, функция допустим, такая:

integral(x, a, b, 23.345 + 30.5 * (1.8 + x * x)/(7 - x)/(7 + 32 * x))
x - переменная, по которой берется интеграл
a, b - пределы интегрирования
последний параметр придется принимать как строку, которую разбираешь на каждой итерации в функции интегрирования (тут как раз тебе быстродействие c++ пригодится. языки типа ruby, python, c# загнут тебе расчет по времени). Есть более быстрый для runtime'а вариант, но он очень сложный - предварительная "метакомпиляция" интегрируемого выражения.
21 фев 08, 12:36    [5321549]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
rt555
Member [заблокирован]

Откуда:
Сообщений: 446
sobolev
Действительно, я не полностью прав в моем пред посте.
Без численного интегрирования тебе не обойтись (по крайней мере, не видно другого пути), но разбор усложняется: тебе придется выражение под интегралом дополнительно разбирать. То есть, функция допустим, такая:

integral(x, a, b, 23.345 + 30.5 * (1.8 + x * x)/(7 - x)/(7 + 32 * x))
x - переменная, по которой берется интеграл
a, b - пределы интегрирования
последний параметр придется принимать как строку, которую разбираешь на каждой итерации в функции интегрирования (тут как раз тебе быстродействие c++ пригодится. языки типа ruby, python, c# загнут тебе расчет по времени). Есть более быстрый для runtime'а вариант, но он очень сложный - предварительная "метакомпиляция" интегрируемого выражения.

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

>тут как раз тебе быстродействие c++ пригодится

для ЛИСПА это вообще не задача :) Он бы в ран-тайме подхватил эту строку и вставил в свой код, как обычную функцию. А дальше дело техники:

def foo(x):
    return 23.345 + 30.5 * (1.8 + x * x)/(7 - x)/(7 + 32 * x)




integral = 0


x  =   2.0
xx = 234.0
dx =   0.0001
z  = foo(x)


while x <= xx:
    x += dx
    zz = foo(x)    
    integral += zz - z
    z  = zz


print integral


>>> ================================ RESTART ==================
>>> 
-1.48055500027
>>> 
21 фев 08, 12:53    [5321695]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
rt555
Member [заблокирован]

Откуда:
Сообщений: 446
я немножко не тот код запостил, но не важно :)
21 фев 08, 13:03    [5321792]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
sobolev
Member

Откуда: Петрозаводск
Сообщений: 1424
rt555

для ЛИСПА это вообще не задача :) Он бы в ран-тайме подхватил эту строку и вставил в свой код, как обычную функцию. А дальше дело техники:

Я не знаю лиспа, да и других языков кроме c++, но если подумать над тем, что ты сказал, то встает такой вопрос: какой ценой ЛИСП сделает это?
А цена та же (плюс накладные издержки языка), что я и привел для цпп. Фактически, он загребет функцию в кэш (отнюдь не в виде машинных кодов) и будет мурыжить ее на каждой итерации в таком виде, в каком ее представил программист. По-этому, производительность не улучшается.
Возможно ошибаюсь.
Однако ж для программера задачу такой трюк безусловно упрощает.
21 фев 08, 13:12    [5321870]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
rt555
Member [заблокирован]

Откуда:
Сообщений: 446
я тоже лисп не знаю :)

>последний параметр придется принимать как строку, которую разбираешь на каждой итерации в функции интегрирования

Именно так я щас и делаю, но это ведь стыдобище - на каждой итерации насиловать строки и их функции.
Хошь не хошь, а придется преобразовать (один раз!) это выражение в польскую нотацию и впихнуть в массив.
Пробегать, на каждой итерации, по массиву и собирать сумму = F(x)*F(x)*dx будет, конечно, намного быстрее.


Щас я на простом сэмпле (из описания задачи) требуемую точность (0.001)
получаю только на 5000 итераций, но.. тайм-лимит (вылетаю и на 4000 итераций)

1000 итераций

Pour 0.030 litres / 3.368 cm of water.
Pour 0.879 litres / 2.196 cm of water.


2000 итераций

Pour 0.030 litres / 3.364 cm of water.
Pour 0.877 litres / 2.192 cm of water.


3000 итераций

Pour 0.030 litres / 3.366 cm of water.
Pour 0.878 litres / 2.193 cm of water.


4000 итераций

Pour 0.030 litres / 3.366 cm of water.
Pour 0.878 litres / 2.194 cm of water.


5000 итераций

Pour 0.030 litres / 3.365 cm of water.
Pour 0.878 litres / 2.193 cm of water.



20000 итераций    <<--------------<<----------------------------------

Pour 0.030 litres / 3.366 cm of water.  <<--------<<---  Ошибка !!! ---<<--------------------- 
Pour 0.878 litres / 2.193 cm of water.

21 фев 08, 13:38    [5322131]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
rt555
Member [заблокирован]

Откуда:
Сообщений: 446
еле накарябал, на питоне, infix2postfix:

def foo(s):
    d=('0','1','2','3','4','5','6','7','8','9','.')
    st1,st2,i=[],[],0  
    while i<len(s):
        if s[i] in d:
            num=s[i]
            i+=1
            while (i<len(s))and(s[i] in d):
                num+=s[i]
                i+=1
            st1+=[float(num)]
            continue
        elif s[i] in ('+','-'):
            while (len(st2)>0)and(st2[-1] in ('*','/')):
                st1+=[st2.pop()]
            st2+=[s[i]]
        elif s[i] in ('*','/'):
            while (len(st2)>0)and(st2[-1] in ('*','/')):
                st1+=[st2.pop()]
            st2+=[s[i]]
        elif s[i]=='(':
            st2+=['(']
        elif s[i]==')':
            while st2[-1]!='(':
                z=st2.pop()
                st1+=[z]
            z=st2.pop()
        i+=1
    st2.reverse()
    st=st1+st2
    print st





while 1:
    foo(raw_input())





>>> ================================ RESTART ==================
>>> 
(2+3)*5

[2.0, 3.0, '+', 5.0, '*']

((2+3)+7)*9

[2.0, 3.0, '+', 7.0, '+', 9.0, '*']

((2+3)+7)*9-4*((3-8)/7)

[2.0, 3.0, '+', 7.0, '+', 9.0, '*', 4.0, 3.0, 8.0, '-', 7.0, '/', '*', '-']

Traceback (most recent call last):
File "E:/Z/00/CERC07W_2060_foo.py", line 46, in <module>
foo(raw_input())
KeyboardInterrupt
>>> 





не, ну не знаю... сишная портянка меня просто бесит ( http://en.literateprograms.org/Shunting_yard_algorithm_(C) ):



#include<stdlib.h>
#include<stdio.h>
#include<ctype.h>

#define MAXOPSTACK 64
#define MAXNUMSTACK 64


int eval_uminus(int a1, int a2) 
{
	return -a1;
}
int eval_exp(int a1, int a2)
{
	return a2<0 ? 0 : (a2==0?1:a1*eval_exp(a1, a2-1));
}
int eval_mul(int a1, int a2) 
{
	return a1*a2;
}
int eval_div(int a1, int a2) 
{
	if(!a2) {
		fprintf(stderr, "ERROR: Division by zero\n");
		exit(EXIT_FAILURE);
	}
	return a1/a2;
}
int eval_mod(int a1, int a2) 
{
	if(!a2) {
		fprintf(stderr, "ERROR: Division by zero\n");
		exit(EXIT_FAILURE);
	}
	return a1%a2;
}
int eval_add(int a1, int a2) 
{
	return a1+a2;
}
int eval_sub(int a1, int a2) 
{
	return a1-a2;
}




void shunt_op(struct op_s *op)
{
	struct op_s *pop;
	int n1, n2;
	if(op->op=='(') {
		push_opstack(op);
		return;
	} else if(op->op==')') {
		while(nopstack>0 && opstack[nopstack-1]->op!='(') {
			pop=pop_opstack();
			n1=pop_numstack();
			if(pop->unary) push_numstack(pop->eval(n1, 0));
			else {
				n2=pop_numstack();
				push_numstack(pop->eval(n2, n1));
			}
		}
		if(!(pop=pop_opstack()) || pop->op!='(') {
			fprintf(stderr, "ERROR: Stack error. No matching \'(\'\n");
			exit(EXIT_FAILURE);
		}
		return;
	}

	if(op->assoc==ASSOC_RIGHT) {
		while(nopstack && op->prec<opstack[nopstack-1]->prec) {
			pop=pop_opstack();
			n1=pop_numstack();
			if(pop->unary) push_numstack(pop->eval(n1, 0));
			else {
				n2=pop_numstack();
				push_numstack(pop->eval(n2, n1));
			}
		}
	} else {
		while(nopstack && op->prec<=opstack[nopstack-1]->prec) {
			pop=pop_opstack();
			n1=pop_numstack();
			if(pop->unary) push_numstack(pop->eval(n1, 0));
			else {
				n2=pop_numstack();
				push_numstack(pop->eval(n2, n1));
			}
		}
	}
	push_opstack(op);
}





struct op_s *opstack[MAXOPSTACK];
int nopstack=0;

int numstack[MAXNUMSTACK];
int nnumstack=0;

void push_opstack(struct op_s *op)
{
	if(nopstack>MAXOPSTACK-1) {
		fprintf(stderr, "ERROR: Operator stack overflow\n");
		exit(EXIT_FAILURE);
	}
	opstack[nopstack++]=op;
}

struct op_s *pop_opstack()
{
	if(!nopstack) {
		fprintf(stderr, "ERROR: Operator stack empty\n");
		exit(EXIT_FAILURE);
	}
	return opstack[--nopstack];
}

void push_numstack(int num)
{
	if(nnumstack>MAXNUMSTACK-1) {
		fprintf(stderr, "ERROR: Number stack overflow\n");
		exit(EXIT_FAILURE);
	}
	numstack[nnumstack++]=num;
}

int pop_numstack()
{
	if(!nnumstack) {
		fprintf(stderr, "ERROR: Number stack empty\n");
		exit(EXIT_FAILURE);
	}
	return numstack[--nnumstack];
}









int main(int argc, char *argv[]) {
	char *expr;
	char *tstart=NULL;
	struct op_s startop={'X', 0, ASSOC_NONE, 0, NULL};	/* Dummy operator to mark start */
	struct op_s *op=NULL;
	int n1, n2;
	struct op_s *lastop=&startop;

	if(argc<2) {
		fprintf(stderr, "Usage: %s <expression>\n", argv[0]);
		return EXIT_FAILURE;
	}

	for(expr=argv[1]; *expr; ++expr) {
		if(!tstart) {
      if((op=getop(*expr))) {

      enum {ASSOC_NONE=0, ASSOC_LEFT, ASSOC_RIGHT};

struct op_s {
	char op;
	int prec;
	int assoc;
	int unary;
	int (*eval)(int a1, int a2);
} ops[]={
	{'_', 10, ASSOC_RIGHT, 1, eval_uminus},
	{'^', 9, ASSOC_RIGHT, 0, eval_exp},
	{'*', 8, ASSOC_LEFT, 0, eval_mul},
	{'/', 8, ASSOC_LEFT, 0, eval_div},
	{'%', 8, ASSOC_LEFT, 0, eval_mod},
	{'+', 5, ASSOC_LEFT, 0, eval_add},
	{'-', 5, ASSOC_LEFT, 0, eval_sub},
	{'(', 0, ASSOC_NONE, 0, NULL},
	{')', 0, ASSOC_NONE, 0, NULL}
};

struct op_s *getop(char ch)
{
	int i;
	for(i=0; i<sizeof ops/sizeof ops[0]; ++i) {
		if(ops[i].op==ch) return ops+i;
	}
	return NULL;
}


				if(lastop && (lastop==&startop || lastop->op!=')')) {
					if(op->op=='-') op=getop('_');
					else if(op->op!='(') {
						fprintf(stderr, "ERROR: Illegal use of binary operator (%c)\n", op->op);
						exit(EXIT_FAILURE);
					}
				}
				shunt_op(op);
				lastop=op;
			} else if(isdigit(*expr)) tstart=expr;
			else if(!isspace(*expr)) {
				fprintf(stderr, "ERROR: Syntax error\n");
				return EXIT_FAILURE;
			}
		} else {
			if(isspace(*expr)) {
				push_numstack(atoi(tstart));
				tstart=NULL;
				lastop=NULL;
			} else if((op=getop(*expr))) {
				push_numstack(atoi(tstart));
				tstart=NULL;
				shunt_op(op);
				lastop=op;
			} else if(!isdigit(*expr)) {
				fprintf(stderr, "ERROR: Syntax error\n");
				return EXIT_FAILURE;
			}
		}
	}
	if(tstart) push_numstack(atoi(tstart));

 	while(nopstack) {
		op=pop_opstack();
		n1=pop_numstack();
		if(op->unary) push_numstack(op->eval(n1, 0));
		else {
			n2=pop_numstack();
			push_numstack(op->eval(n2, n1));
		}
	}
	if(nnumstack!=1) {
		fprintf(stderr, "ERROR: Number stack has %d elements after evaluation. Should be 1.\n", nnumstack);
		return EXIT_FAILURE;
	}
	printf("%d\n", numstack[0]);


  system("pause");
  return 0;
}

21 фев 08, 19:09    [5325107]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 105 106 107 108 109 110 111 112 [113] 114   вперед  Ctrl
Все форумы / Архив ПТ Ответить