Download as pdf or txt
Download as pdf or txt
You are on page 1of 2

10)

(T) ком-ые чис-а (2/3+-1/2i) в триг-ую форму (арг-ы обык-ые дроби)


Lex
%{
#include<stdio.h>
#include"y.tab.h"
#define YYSTYPE
extern YYSTYPE yylval;
%}
%Start NOM IM
%%
^[-]?([0]|[1-9][0-9]*)/\/ {yylval=atoi(yytext);BEGIN NOM;return RENM;}<IM>[+-]([0]|[1-9][0-
9]*)/\/ {yylval=atoi(yytext);BEGIN NOM;return IMNM;}
<NOM>[0] {return ZERO;}
\/ {return '/';}
<NOM>[1-9][0-9]*/(j\n) {yylval=atoi(yytext);return IMDNM;}
<NOM>[1-9][0-9]*/[+-] {BEGIN IM; yylval=atoi(yytext);return REDNM;}
\n |
. {return 0;}
YACC
%{
#include <stdio.h>
#include <math.h>
#include<ctype.h>
#define ST 1000
void drob(double,int*,int*);
void trans(double ,double ,double *, double *);
double arg, fi, im1,re1;
int fn,fd,an,ad;
%}
%token RENM IMNM REDNM IMDNM ZERO
%%
complex: real image
{trans(re1,im1,&arg,&fi);
drob(arg,&an,&ad);
drob(fi,&fn,&fd);
printf("%d/%d*(cos(%d/%d)+j*sin(%d/%d))\n",
an,ad,fn,fd,fn,fd);}
real: RENM '/' REDNM {re1=(double)$1/$3;}
| RENM '/' ZERO {puts("ZERO FAKE");return 0;}
image: IMNM '/'IMDNM {im1=(double)$1/$3;}
| IMNM '/' ZERO {puts("ZERO FAKE");return 0;}
%%
int yyerror(char*s)
{puts(s);}
int yywrap() {
return 0;}
void drob(double num,int *fnm,int *fdnm)
{
int a,b,p;
*fnm=(int)(num*ST);
*fdnm=ST;
for(a=abs(*fnm),b=abs(*fdnm);a*b;)
{ if(a>=b) a=a%b;
else b=b%a;
}
p=a+b;
*fnm/=p;
*fdnm/=p;
}
void trans(double re,double im,double *farg,
double *ffi)
{
if(!re)
{*farg=im;*ffi=3.14;return;}
if(!im)
{*farg=re;*ffi=0;return;}
*farg=pow(re*re+im*im,0.5);
*ffi=atan(im/re);
}
main()
{yyparse();}

You might also like