Здравствуйте! Задана строка, задающая функцию, содержащую переменную x, знаки арифметических действий +, -, * и функции sin, cos, tg, ctg. Найти производную заданной функции. т.е. нам дана функция sin(x)+cos(3x-4) и ее производная должна быть cos(x)-3*sin(3x-4) еще, т.к. мы используем то что нам дано по условию, степеней у нас нет, но я так понял , что без деления не обойтись. сначала даже не знал с чего начать, но потом решил сделать так (за код прошу не ругать):
Код void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString fun = Memo1->Lines->Text+' '; AnsiString *stroka=new AnsiString[150]; AnsiString plst=""; int k=0; for (int i= 1; i <=fun.Length();i++) { if ((fun[i]!=' ') && (fun!='+') && (fun!='-') && (fun!='*') && (fun!='(') && (fun!=')') && (fun!='\n')) plst+=fun; else { //if ((fun==' ') || (fun=='+') || (fun=='-') // || (fun=='*') || (fun=='(') || (fun==')') || (fun=='\n')) stroka[k++]=plst; plst=""; } } for (int i = 0; i <k;i++) { if (stroka== "sin") stroka = "cos"; else if (stroka== "cos") stroka = "-sin"; else if (stroka== "tan") stroka = "1/cos(x)*cos(x)"; else if (stroka== "ctan") stroka = "-1/sin(x)*sin(x)"; } Memo2->Clear(); for (int i = 0; i <k;i++) Memo2->Lines->Append(stroka); for(int i=0;i<Memo2->Lines->Count;i++) {if(Memo2->Lines->Strings=="") Memo2->Lines->Delete(i); } } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { Memo1->Clear(); Memo2->Clear(); } //------------------[/i]
суть кода в том, что берется строка с данной функцией и по разделяющим знакам я ищу тригонометрические функции. тут вроде все норм. вот я их нашел и делаю производную, вроде тоже все хорошо, НО, он не сохраняет знаки арифметических операций, и не пишет заново все в строку(тут я думаю проблема в мемо, т.к. написано выводить в столбец, хочу попробовать заменить на листбокс). По-поводу знаков, в каде я закомментировал этот кусок,корявый до боли, но не получилось его применить, т.е. он либо выводит знаки, либо функции, как отредактировать еще не додумал. и главная проблема это скобки в аргументах. я думаю сделать еще один цикл, который находит выражение в этих скобках и вычисляет производную, но пока не знаю как это сделать, а потом еще свять с самой функцией. Заранее спасибо!
|
|
|
не выдумывай, всех случаев вручную не предусмотришь всё равно (на случай, если функция внезапно поменяется), почитай про обратную польскую запись
Нужна помощь? Сюда: vkontakte.ru/berestovskiy
|
|
|