From 4990c0b6a3e3b45bd0cf6adff6f5c9c7fcab0ea4 Mon Sep 17 00:00:00 2001 From: serr Date: Mon, 12 May 2025 21:08:24 +0300 Subject: [PATCH] =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=87=D0=B0=D1=82=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0=D1=82=20=D0=BE=D1=82?= =?UTF-8?q?=20=D1=82=D0=BE=D0=B9=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=BD=D0=BE=D0=B9,=20=D0=BA=D0=BE=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=B0=D1=8F=20=D0=B2=20allowed=5Fvariable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- analyzers/polynomials/poly_calc/poly_calc.c | 4 ++-- analyzers/polynomials/poly_calc/poly_calc.h | 2 +- .../polynomials/poly_calc/test_poly_calc.c | 14 +++++++------- analyzers/polynomials/polynomials.l | 17 ++++++++++++++++- analyzers/polynomials/polynomials.y | 3 ++- poly.txt | 2 +- 6 files changed, 29 insertions(+), 13 deletions(-) diff --git a/analyzers/polynomials/poly_calc/poly_calc.c b/analyzers/polynomials/poly_calc/poly_calc.c index d1c54ca..ec3a9ef 100644 --- a/analyzers/polynomials/poly_calc/poly_calc.c +++ b/analyzers/polynomials/poly_calc/poly_calc.c @@ -142,7 +142,7 @@ void free_polynomial(Polynomial *p) { } // Печать полинома -void print_polynomial(Polynomial *p) { +void print_polynomial(Polynomial *p, char letter) { if (p->size == 0) { printf("0\n"); return; @@ -165,7 +165,7 @@ void print_polynomial(Polynomial *p) { // Печать переменной if (term.exponent > 0) { - printf("x"); + printf("%c", letter); // Печать степени только если она больше 1 if (term.exponent > 1) { printf("^%d", term.exponent); diff --git a/analyzers/polynomials/poly_calc/poly_calc.h b/analyzers/polynomials/poly_calc/poly_calc.h index 0b01310..0aad909 100644 --- a/analyzers/polynomials/poly_calc/poly_calc.h +++ b/analyzers/polynomials/poly_calc/poly_calc.h @@ -25,7 +25,7 @@ void free_polynomial(Polynomial *p); // Копирование полинома // Polynomial copy_poly(Polynomial *p); // Печать полинома -void print_polynomial(Polynomial *p); +void print_polynomial(Polynomial *p, char letter); // Возвращает копию полинома Polynomial copy_poly(Polynomial *p); // Например есть полином x+1 и терм (2,1)=2x, значит в полиноме есть diff --git a/analyzers/polynomials/poly_calc/test_poly_calc.c b/analyzers/polynomials/poly_calc/test_poly_calc.c index e58463c..16bfac2 100644 --- a/analyzers/polynomials/poly_calc/test_poly_calc.c +++ b/analyzers/polynomials/poly_calc/test_poly_calc.c @@ -33,7 +33,7 @@ void test6() { printf("EXPECTED:\n-60x^4+30x^1+10\n"); printf("OUTPUT:\n"); - print_polynomial(&res); + print_polynomial(&res, 'x'); free_polynomial(&p1); free_polynomial(&p2); @@ -55,7 +55,7 @@ void test5() { printf("EXPECTED:\n-7776x^20+19440x^17+6480x^16-19440x^14-12960x^13-2160x^12+9720x^11+9720x^10+3240x^9-2070x^8-3240x^7-1620x^6-117x^5+375x^4+270x^3+90x^2+15x^1+1\n"); printf("OUTPUT:\n"); - print_polynomial(&res); + print_polynomial(&res, 'x'); free_polynomial(&p); free_polynomial(&res); @@ -79,7 +79,7 @@ void test4() { printf("EXPECTED:\n-18x^8-12x^6+9x^5+63x^4+6x^3+2x^2-30x^1-10\n"); printf("OUTPUT:\n"); - print_polynomial(&res); + print_polynomial(&res, 'x'); free_polynomial(&p1); free_polynomial(&p2); @@ -107,7 +107,7 @@ void test3() { printf("EXPECTED:\n-9x^4-2x^2+8x^1+21\n"); printf("OUTPUT:\n"); - print_polynomial(&res); + print_polynomial(&res, 'x'); free_polynomial(&p1); free_polynomial(&p2); @@ -131,7 +131,7 @@ void test2() { printf("EXPECTED:\n-3x^4+2x^2+3x^1-9\n"); printf("OUTPUT:\n"); - print_polynomial(&res); + print_polynomial(&res, 'x'); free_polynomial(&p1); free_polynomial(&p2); @@ -154,8 +154,8 @@ void test1() { printf("EXPECTED:\n+3x^2+2x^1-1\n-2x^3+4x^2-5\n"); printf("OUTPUT:\n"); - print_polynomial(&poly1); - print_polynomial(&poly2); + print_polynomial(&poly1, 'x'); + print_polynomial(&poly2, 'x'); free_polynomial(&poly1); free_polynomial(&poly2); diff --git a/analyzers/polynomials/polynomials.l b/analyzers/polynomials/polynomials.l index 7a5f0f6..20695aa 100644 --- a/analyzers/polynomials/polynomials.l +++ b/analyzers/polynomials/polynomials.l @@ -3,6 +3,9 @@ #include "polynomials.tab.h" extern FILE *yyin; + +// Глобальная переменная для хранения разрешенной переменной +char allowed_variable = 0; %} %% @@ -11,11 +14,23 @@ extern FILE *yyin; add_term(&yylval.poly, atoi(yytext), 0); return NUMBER; } -"x" { + +[a-zA-Z] { + // Если переменная еще не задана, запоминаем первую встреченную + if (allowed_variable == 0) { + allowed_variable = yytext[0]; + } + // Проверяем, что текущая переменная совпадает с разрешенной + else if (yytext[0] != allowed_variable) { + fprintf(stderr, "Error: Only variable '%c' is allowed in this expression\n", allowed_variable); + exit(1); + } + init_polynomial(&yylval.poly); add_term(&yylval.poly, 1, 1); return VARIABLE; } + [-+*^()] { return yytext[0]; } [ \t] ; \n { return 0; } diff --git a/analyzers/polynomials/polynomials.y b/analyzers/polynomials/polynomials.y index cb91e95..b22bb99 100644 --- a/analyzers/polynomials/polynomials.y +++ b/analyzers/polynomials/polynomials.y @@ -8,6 +8,7 @@ int yylex(); // Объявляем внешнюю переменную для файла extern FILE *yyin; +extern char allowed_variable; %} %union { @@ -27,7 +28,7 @@ input: | input expr { printf("Result: "); sort_polynomial(&$2); - print_polynomial(&$2); + print_polynomial(&$2, allowed_variable); free_polynomial(&$2); } ; diff --git a/poly.txt b/poly.txt index 5f4c8b1..0753209 100644 --- a/poly.txt +++ b/poly.txt @@ -1 +1 @@ -((3*x^2 - 2*x + 1) * (x^3 - 4*x) + (5*x^4 - x^2)^2) - (x + 1)^5 \ No newline at end of file +((3*x^2 - 2*x + 1) * (x^3 - 4*x) + (5*x^4 - x^2)^2) - (x + 1)^4 \ No newline at end of file