Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2014, 19:31   #1
sldj1
Новичок
Джуниор
 
Регистрация: 25.05.2014
Сообщений: 3
По умолчанию помогите с меню на паскале

в общем я написал программу для решения дифф. уравнения численным методом с построением графиков, она работает, но нужно для этого и меню создать ( start, about, exit), код для меню я нашёл, попытался состыковать со своей программой , но при нажатии на слово start, не видны строки " глубина ямы, полуширина и т.д.), хотя цифры, которые вводишь, когда задаёшь эти параметры - видны, графики тоже строятся. думаю проблема в том, что меню работает на crt , а при нажатии start активируется GRAPH и возникает глюк. помогите подправить код так, чтобы всё работало корректно.
вот код с меню-
Код:
program eigen (input, output);
Uses graph,CRT;
Const MaxMenuItem = 2;
Var Ret : Byte;
V0, a, xmax, dx, x0, y0, xscale, yscale: real;
GrDriver, GrMode : integer;

Function MainMenu(R_Select:Byte):Byte;
Type TMenu = record
 X,Y : Byte;
 S : String[20];
 End;
Var Menu : Array [0..MaxMenuItem] Of TMenu;
Run : Boolean; {vybran kod menu}
Sel : Byte;
TC, TB : Byte; {color}

Procedure DrawMenu;
Var I : Byte;
Begin
For I := 0 To MaxMenuItem Do
Begin
GotoXY(Menu[I].X, Menu[I].Y);
Write(Menu[I].S);
End;
End;

Procedure Select (I:Byte);
Begin
TextBackground(TC); TextColor(TB);
GotoXY(Menu[I].X, Menu[I].Y);
Write(Menu[I].S);
TextBackground(TB); TextColor(TC);
End;

Procedure DeSelect (I:Byte);
Begin
TextBackground(TB); TextColor(TC);
GotoXY(Menu[I].X, Menu[I].Y);
Write(Menu[I].S);
TextBackground(TB); TextColor(TC);
End;

Begin
Menu[0].S := 'Start'; Menu[0].X := 20; Menu[0].Y :=  5;
Menu[1].S := '‘About'; Menu[1].X := 20; Menu[1].Y :=  6;
Menu[2].S := 'Exit'; Menu[2].X := 20; Menu[2].Y :=  7;
ClrScr;
TC := TextAttr mod 16;
TB := TextAttr div 16;
DrawMenu;
Sel := R_Select;
Select(Sel);
Run := False;
While Not Run Do Begin
Case ReadKey Of
#13 : Run := True;
#27 : Begin
Run := True;
Sel := MaxMenuItem;
End;

#0 : Case ReadKey Of
#72 : Begin
DeSelect(Sel);
If Sel = 0
Then Sel := MaxMenuItem
Else Sel := Sel - 1;
Select(Sel);
End;
#80 : Begin
DeSelect(Sel);
If Sel = MaxMenuItem
Then Sel := 0
Else Sel := Sel + 1;
Select(Sel);
End;
End;
End;
End;
MainMenu := Sel;
TextBackground(TB);
TextColor(TC);
ClrScr;
End;

procedure parameter (var V0, a, xmax, dx : real);
 begin
GrDriver:= Detect;
InitGraph(GrDriver, GrMode, '');
 write('glubina yamy= ');
 readln(V0);
 write('polushirina yamy= ');
 readln(a);
 write('maximalnoe vyvodimoe na grafik znachenie x= ');
 readln(xmax);
 write('razmer shaga dx= ');
 readln(dx);
 end;

 procedure plot_potential(V0, a, xmax : real;
 var xscale, yscale, x0, y0 : real);
 (* zadanie mashtaba grafika i postroenie potenciala**)
 begin
 xscale:= 512/(2*xmax);
 yscale:= 300/(2*10);
 x0:= xscale*xmax;
 y0:= yscale*10;
 MoveTO(trunc(x0-xmax*xscale) ,trunc(y0+6*yscale));
 Lineto(trunc(x0-a*xscale) ,trunc(y0+6*yscale));
 Lineto(trunc(x0-a*xscale) ,trunc(y0+9*yscale));
 Lineto(trunc(x0+a*xscale) ,trunc(y0+9*yscale));
 Lineto(trunc(x0+a*xscale) ,trunc(y0+6*yscale));
 Lineto(trunc(x0+xmax*xscale) ,trunc(y0+6*yscale));
 end;

 function V(x, V0, a : real) : real;
 (*vychislaetsya funktsiya potenciala V(x)*)
 begin
 if x>a then
 V:= V0
 else
 V:= 0.0
 end;

 procedure Euler (V0, a, dx, xmax, xscale, yscale, x0, y0 : real);
 var
 i, j, parity : integer;
 x, phi, dphi, d2phi, E : real;
 begin
 write(' chetnaya ili nechetnaya funkciya (1 ili -1) ');
 readln(parity);
 repeat
 write('E= ');
 readln(E);
 (*zadanie nachalnyh znachenij pri x=0*)
 if parity = -1 then
 begin
 phi:= 0.0;
 dphi:= 0.0
 end
 else
 begin
 phi:= 1.0;
 dphi:= 0.0
 end;
 x:= 0.0;
 repeat
 (*vychislenie volnovoj funkcii*)
 x:= x+dx;
 d2phi:= 2*phi*(V(x, V0, a)-E);
 dphi:= dphi+ d2phi*dx;
 phi:= phi+dphi*dx;
 (*plot wave function*)
 i:= trunc(x0+ xscale*x);
 j:= trunc(y0+ yscale*phi);
 MoveTo(i,j);
 LineTo(i,j);
 i:= trunc(x0-xscale*x);
 j:= trunc(y0+ yscale*phi*parity);
 MoveTo(i,j);
 LineTo(i,j);
 until (x>xmax) or (abs(phi)>10);
 until E=0
 (*dlya vyhoda iz programmy vvedite E=0*)
 end;

Begin
ClrScr;
TextBackground(Blue);
TextColor(LightGreen);

Ret := 0;
 Repeat
 Ret := MainMenu(Ret);
 Case Ret Of
0: Begin
parameter(V0, a, xmax, dx);
plot_potential(V0, a, xmax, xscale, yscale, x0, y0);
Euler(V0, a, dx, xmax, xscale, yscale, x0, y0);
End;
1: begin
WriteLn('About');
WriteLn('... najmi klavishu ...');
ReadLn;
End;
Else Begin
WriteLn('Exit');
WriteLn('... najmi enter ...');
ReadLn;
End;
End; {case Ret}
Until Ret = MaxMenuItem;
TextBackground(Black);
TextColor(LightGray);
ClrScr;
closegraph;
End.
sldj1 вне форума Ответить с цитированием
Старый 25.05.2014, 20:32   #2
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

Вы усиленно смешиваете текстовый и графический режимы. Что само по себе затрудняет работу.
1. Попробуйте найти меню в графическом режиме.
http://www.tehnari.ru/attachments/f4...hiadhaiia2.zip
2. Найдите аналог readln в графическом режиме.

Или вовсе вот таким воспользоваться:
http://pascal.sources.ru/graph/gui-r3.htm

Последний раз редактировалось ZX Spectrum-128; 25.05.2014 в 21:05.
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 25.05.2014, 21:36   #3
sldj1
Новичок
Джуниор
 
Регистрация: 25.05.2014
Сообщений: 3
По умолчанию

допустим, я хочу оставить меню в текстовом режиме, тогда мне нужно процедуры, запускаемые кнопкой старт выполнять только в графическом режиме. вместо readln- readkey и т.д. , но что-то не выходит. вот код этих процедур-
Код:
procedure parameter (var V0, a, xmax, dx : real);
 begin
GrDriver:= Detect;
InitGraph(GrDriver, GrMode, '');
 write('glubina yamy= ');
 readln(V0);
 write('polushirina yamy= ');
 readln(a);
 write('maximalnoe vyvodimoe na grafik znachenie x= ');
 readln(xmax);
 write('razmer shaga dx= ');
 readln(dx);
 end;

 procedure plot_potential(V0, a, xmax : real;
 var xscale, yscale, x0, y0 : real);
 (* zadanie mashtaba grafika i postroenie potenciala**)
 begin
 xscale:= 512/(2*xmax);
 yscale:= 300/(2*10);
 x0:= xscale*xmax;
 y0:= yscale*10;
 MoveTO(trunc(x0-xmax*xscale) ,trunc(y0+6*yscale));
 Lineto(trunc(x0-a*xscale) ,trunc(y0+6*yscale));
 Lineto(trunc(x0-a*xscale) ,trunc(y0+9*yscale));
 Lineto(trunc(x0+a*xscale) ,trunc(y0+9*yscale));
 Lineto(trunc(x0+a*xscale) ,trunc(y0+6*yscale));
 Lineto(trunc(x0+xmax*xscale) ,trunc(y0+6*yscale));
 end;

 function V(x, V0, a : real) : real;
 (*vychislaetsya funktsiya potenciala V(x)*)
 begin
 if x>a then
 V:= V0
 else
 V:= 0.0
 end;

 procedure Euler (V0, a, dx, xmax, xscale, yscale, x0, y0 : real);
 var
 i, j, parity : integer;
 x, phi, dphi, d2phi, E : real;
 begin
 write(' chetnaya ili nechetnaya funkciya (1 ili -1) ');
 readln(parity);
 repeat
 write('E= ');
 readln(E);
 (*zadanie nachalnyh znachenij pri x=0*)
 if parity = -1 then
 begin
 phi:= 0.0;
 dphi:= 0.0
 end
 else
 begin
 phi:= 1.0;
 dphi:= 0.0
 end;
 x:= 0.0;
 repeat
 (*vychislenie volnovoj funkcii*)
 x:= x+dx;
 d2phi:= 2*phi*(V(x, V0, a)-E);
 dphi:= dphi+ d2phi*dx;
 phi:= phi+dphi*dx;
 (*plot wave function*)
 i:= trunc(x0+ xscale*x);
 j:= trunc(y0+ yscale*phi);
 MoveTo(i,j);
 LineTo(i,j);
 i:= trunc(x0-xscale*x);
 j:= trunc(y0+ yscale*phi*parity);
 MoveTo(i,j);
 LineTo(i,j);
 until (x>xmax) or (abs(phi)>10);
 until E=0
 (*dlya vyhoda iz programmy vvedite E=0*)
 end;
помогите мне заставить их правильно работать в графическом режиме. заранее спасибо.
sldj1 вне форума Ответить с цитированием
Старый 25.05.2014, 21:43   #4
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

http://forum.pascalnet.ru/index.php?showtopic=5676
Кхм, про directvideo я забыл совсем
Попробуйте написать
Код:
directvideo:=false;
Загнал в тп, текст отображается.

Последний раз редактировалось ZX Spectrum-128; 25.05.2014 в 21:47.
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 25.05.2014, 22:12   #5
sldj1
Новичок
Джуниор
 
Регистрация: 25.05.2014
Сообщений: 3
По умолчанию

заработало, спасибо за помощь.
sldj1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Меню в паскале Anton94.by Паскаль, Turbo Pascal, PascalABC.NET 2 15.03.2012 23:33
Редактирование меню в Паскале Kanris Помощь студентам 2 25.03.2010 22:41
меню пользователя в паскале GaJIbI4 Помощь студентам 2 16.11.2008 12:17