Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
melkie_progi.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
53.45 Кб
Скачать

Int yyerror()

{puts("ERROR");}

Int yywrap()

{return 0;}

int trans(int a, int b)

{

int c=0;

double sn=0.0;

c=a/b;

sn=(double)a/b;;

if(sn<0)

{

if(a!=0 && a%b==0)

{printf("Result = %d\n", c+1);}

else

{printf("Result = %d\n", c);}

}

else

{printf("Result = %d\n", c+1);}

}

main()

{yyparse();}

9)

Разработать транслятор для преобразования алгебраического формата записи комплексных чисел в эквивалентную тригонометрическую форму. Входные записи любых комплексных чисел, где мнимая и действительная части заданы обыкновенными дробями, в которых числитель и знаменатель разделяет символ '/', должны передаваться транслятору строками стандартного ввода. Результаты трансляции должны отображать строки стандартного вывода, где модули и аргументы комплексных чисел, заданы десятичными дробями.

LEX:

%{

#include<stdio.h>

#include"y.tab.h"

%}

%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>

void trans(double ,double ,

double *, double *);

double arg, fi, im1,re1;

%}

%token RENM IMNM REDNM IMDNM ZERO

%%

complex: real image

{trans(re1,im1,&arg,&fi);

printf("%.3f*(cos(%.3f)+j*sin(%.3f))\n",

arg,fi,fi);}

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);}

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();}

10)

Разработать транслятор для преобразования алгебраического формата записи комплексных чисел в эквивалентную тригонометрическую форму. Входные записи любых комплексных чисел должны передаваться транслятору строками потока стандартного ввода, а результаты трансляции должны отображать строки потока стандартного вывода. При этом любые численные значения во входных и выходных записях комплексных чисел должны быть заданы обыкновенными дробями, где числитель и знаменатель разделены символом '/'.

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);}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]