Доброго времени суток. Взял в качестве темы курсового проекта доработку калькулятора, написанного в bison.
Там простенькие действия вроде сложения и умножения. В качестве добавочного действия в калькуляторе я взял обычный симплекс-метод (при приведении ограничений к равенствам в матрице коэффициентов должен появиться единичный минор).
калькулятор в bison
Показать
%{
#define YYSTYPE double
%}
%token DATA
%left '+' '-'
%left '*' '/'
%%
spisok : /* Їгбв® */
| spisok '\n'
| spisok wyrag '\n' {printf("\t%g\n",$2);}
;
wyrag : DATA { $$=$1; }
| wyrag '+' wyrag { $$=$1+$3; }
| wyrag '-' wyrag { $$=$1-$3; }
| wyrag '*' wyrag { $$=$1*$3; }
| wyrag '/' wyrag { $$=$1/$3; }
| '(' wyrag ')' { $$=$2; }
;
%%
#include <stdio.h>
#include <ctype.h>
main()
{
yyparse();
}
yyerror(s)
char *s;
{
fprintf(stderr,"%s\n",s);
}
yylex()
{
int c;
do{
c=getchar();
}while(c==' ' || c=='\t');
if(c==EOF)
return 0;
if(c=='.' || isdigit(c)){
ungetc(c,stdin);
scanf("%lf",&yylval);
return DATA;
}
return c;
}
К этому калькулятору я написал функцию лексического анализа, так как старая принимает только целые положительные числа.
inline char *proverka_double(char *shstr);Функция вернёт строку в случае числа и NULL иначе.
Прототип основной функции решения симплекс-метода.
inline char *sipmlexx(double **p,int m,int n);Сама матрица и количество ограничений и переменных.
Тестирование в мэине.
Показать
#include "simplex.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#define mp 4
#define np 5
int main()
{
int i,j;
int m=3,n=3;
char *e;
double **p;
double h[mp][np]=
{{4,5,4,0,return_znak("->max")},//целевая функция
{2,3,6,240,return_znak("<=")},
{4,2,4,200,return_znak("<=")},
{4,6,8,160,return_znak("<=")}};
p = (double**)malloc(mp * sizeof(double*));
for(i=0;i<mp;i++)
p[i]=(double *)malloc(np * sizeof(double));
for(i=0;i<mp;i++)
for(j=0;j<np;j++)
p[i][j]=h[i][j];
show_dan(p,m,n);//вывод исходных данных
printf("\n");
e=sipmlexx(p,m,n);
vivod_out(e);//вывод итоговых данных
free(p);
free(e);
return 0;
}
Первая строка в матрице соответствует целевой функции.
Последний столбец - стремлению целевой функции и знакам ограничений в уравнениях.
Предпоследний - свободные члены в ограничениях и коэффициент без x в целевой функции.
Вот как это выглядит в терминале:
Показать
2.000000x[1] + 3.000000x[2] + 6.000000x[3] <= 240.000000
4.000000x[1] + 2.000000x[2] + 4.000000x[3] <= 200.000000
4.000000x[1] + 6.000000x[2] + 8.000000x[3] <= 160.000000
x[1] = 40.000000
x[2] = 0.000000
x[3] = 0.000000
x[4] = 160.000000
x[5] = 40.000000
x[6] = 0.000000
F = 160.000000[/console]
Проблема в том, что не знаю, как уложить всё это дело в исходном калькуляторе bisona. Как-то всё замудрёно здесь. Как поменять функцию лексического анализа на свою и считать матрицу с данными?
Для одного/двух чисел там всё просто.
Кто-нибудь может помочь с bisonом?