теперь печатается результат от той переменной, которая в allowed_variable

master
serr 2025-05-12 21:08:24 +03:00
parent fc2e46a654
commit 4990c0b6a3
6 changed files with 29 additions and 13 deletions

View File

@ -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) { if (p->size == 0) {
printf("0\n"); printf("0\n");
return; return;
@ -165,7 +165,7 @@ void print_polynomial(Polynomial *p) {
// Печать переменной // Печать переменной
if (term.exponent > 0) { if (term.exponent > 0) {
printf("x"); printf("%c", letter);
// Печать степени только если она больше 1 // Печать степени только если она больше 1
if (term.exponent > 1) { if (term.exponent > 1) {
printf("^%d", term.exponent); printf("^%d", term.exponent);

View File

@ -25,7 +25,7 @@ void free_polynomial(Polynomial *p);
// Копирование полинома // Копирование полинома
// Polynomial copy_poly(Polynomial *p); // Polynomial copy_poly(Polynomial *p);
// Печать полинома // Печать полинома
void print_polynomial(Polynomial *p); void print_polynomial(Polynomial *p, char letter);
// Возвращает копию полинома // Возвращает копию полинома
Polynomial copy_poly(Polynomial *p); Polynomial copy_poly(Polynomial *p);
// Например есть полином x+1 и терм (2,1)=2x, значит в полиноме есть // Например есть полином x+1 и терм (2,1)=2x, значит в полиноме есть

View File

@ -33,7 +33,7 @@ void test6() {
printf("EXPECTED:\n-60x^4+30x^1+10\n"); printf("EXPECTED:\n-60x^4+30x^1+10\n");
printf("OUTPUT:\n"); printf("OUTPUT:\n");
print_polynomial(&res); print_polynomial(&res, 'x');
free_polynomial(&p1); free_polynomial(&p1);
free_polynomial(&p2); 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("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"); printf("OUTPUT:\n");
print_polynomial(&res); print_polynomial(&res, 'x');
free_polynomial(&p); free_polynomial(&p);
free_polynomial(&res); 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("EXPECTED:\n-18x^8-12x^6+9x^5+63x^4+6x^3+2x^2-30x^1-10\n");
printf("OUTPUT:\n"); printf("OUTPUT:\n");
print_polynomial(&res); print_polynomial(&res, 'x');
free_polynomial(&p1); free_polynomial(&p1);
free_polynomial(&p2); free_polynomial(&p2);
@ -107,7 +107,7 @@ void test3() {
printf("EXPECTED:\n-9x^4-2x^2+8x^1+21\n"); printf("EXPECTED:\n-9x^4-2x^2+8x^1+21\n");
printf("OUTPUT:\n"); printf("OUTPUT:\n");
print_polynomial(&res); print_polynomial(&res, 'x');
free_polynomial(&p1); free_polynomial(&p1);
free_polynomial(&p2); free_polynomial(&p2);
@ -131,7 +131,7 @@ void test2() {
printf("EXPECTED:\n-3x^4+2x^2+3x^1-9\n"); printf("EXPECTED:\n-3x^4+2x^2+3x^1-9\n");
printf("OUTPUT:\n"); printf("OUTPUT:\n");
print_polynomial(&res); print_polynomial(&res, 'x');
free_polynomial(&p1); free_polynomial(&p1);
free_polynomial(&p2); 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("EXPECTED:\n+3x^2+2x^1-1\n-2x^3+4x^2-5\n");
printf("OUTPUT:\n"); printf("OUTPUT:\n");
print_polynomial(&poly1); print_polynomial(&poly1, 'x');
print_polynomial(&poly2); print_polynomial(&poly2, 'x');
free_polynomial(&poly1); free_polynomial(&poly1);
free_polynomial(&poly2); free_polynomial(&poly2);

View File

@ -3,6 +3,9 @@
#include "polynomials.tab.h" #include "polynomials.tab.h"
extern FILE *yyin; extern FILE *yyin;
// Глобальная переменная для хранения разрешенной переменной
char allowed_variable = 0;
%} %}
%% %%
@ -11,11 +14,23 @@ extern FILE *yyin;
add_term(&yylval.poly, atoi(yytext), 0); add_term(&yylval.poly, atoi(yytext), 0);
return NUMBER; 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); init_polynomial(&yylval.poly);
add_term(&yylval.poly, 1, 1); add_term(&yylval.poly, 1, 1);
return VARIABLE; return VARIABLE;
} }
[-+*^()] { return yytext[0]; } [-+*^()] { return yytext[0]; }
[ \t] ; [ \t] ;
\n { return 0; } \n { return 0; }

View File

@ -8,6 +8,7 @@ int yylex();
// Объявляем внешнюю переменную для файла // Объявляем внешнюю переменную для файла
extern FILE *yyin; extern FILE *yyin;
extern char allowed_variable;
%} %}
%union { %union {
@ -27,7 +28,7 @@ input:
| input expr { | input expr {
printf("Result: "); printf("Result: ");
sort_polynomial(&$2); sort_polynomial(&$2);
print_polynomial(&$2); print_polynomial(&$2, allowed_variable);
free_polynomial(&$2); free_polynomial(&$2);
} }
; ;

View File

@ -1 +1 @@
((3*x^2 - 2*x + 1) * (x^3 - 4*x) + (5*x^4 - x^2)^2) - (x + 1)^5 ((3*x^2 - 2*x + 1) * (x^3 - 4*x) + (5*x^4 - x^2)^2) - (x + 1)^4