///////////////////////////////////////////////////////
//                                                   //
//       Московский Государственный Технический      //
//           Университет Гражданской Авиации         //
//                                                   //
//      Курсовая работа студента группы: ЭВМ-2-2     //
//           Новичкова Виталия Дмитриевича           //
//                                                   //
// (с) 2005-2012 Система Компьютнрных Сетей  WohlNET //
//                                                   //
///////////////////////////////////////////////////////

//Распознание математических функций

// numpar ::= number | '(' expr ')' | (func1||...||func2) '(' expr ')'
double numpar(char *s,char *sid)
{
int i=0;//,j=0;
    if (Oper.Op=='n')
    {
	double res=Oper.tokval;
	skip('n',s,sid);
	return res;
    }
    if (Oper.Op=='a')
    {
	if(skip('a',s,sid)==1) return 999999999;
	if(skip('(',s,sid)==1) return 999999999;
	double res=expr(s,sid);
	if(skip(')',s,sid)==1) return 999999999;
	for(i=0;(strcmp(sid,Oper.sid[i])!=0);i++);
	switch(i)
	{
		case 0: res=sin(res); break;
		case 1: res=cos(res); break;
		case 2: res=sin(res)/cos(res); break;
		case 3: res=cos(res)/sin(res); break;
		case 4: if(res>=0) res=sqrt(res);
			else
			{
				res=res+getmaxx()/2;
				res=sqrt(res);
			}
			break;
		case 5: if(res>=0) res=log(res);
			else
			{
				res=res+getmaxx()/2;
				res=log(res);

			}
		break;
		case 6: res=exp(res); break;
		default: closegraph(); printf("\nBad function: %s\n",sid);res=0;
	}
	return res;
    }
    if(skip('(',s,sid)==1) return 999999999;
    double res=expr(s,sid);
    if(skip(')',s,sid)==1) return 999999999;
    return res;
}
