Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
68 / 2 / 0
Регистрация: 09.06.2015
Сообщений: 210
1

Разве бывает 2 Begin?

03.05.2016, 20:44. Показов 2432. Ответов 6
Метки нет (Все метки)

Пробую сделать САМ СВОЕ меню. Для этого отовсюду собираю разные образцы и варианты. И вот попался какой-то любопытный вариант с двумя begin'ами.
Кликните здесь для просмотра всего текста
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
{ from bpascal.ru}
Uses CRT;
Const MaxMenuItem = 4;
Var Ret : Byte;
 
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; {выбран пункт меню}
    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 := 'item 0'; Menu[0].X := 20; Menu[0].Y :=  5;
     Menu[1].S := 'item 1'; Menu[1].X := 20; Menu[1].Y :=  6;
     Menu[2].S := 'item 2'; Menu[2].X := 20; Menu[2].Y :=  7;
     Menu[3].S := 'item 3'; Menu[3].X := 20; Menu[3].Y :=  8;
     Menu[4].S := ' exit '; Menu[4].X := 20; Menu[4].Y :=  9;
 
     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;
 
Begin
     ClrScr;
     TextBackground(Blue);
     TextColor(LightGreen);
 
     Ret := 0;
     Repeat
          Ret := MainMenu(Ret);
          Case Ret Of
               0: Begin
                       WriteLn('Выбран пункт: ', Ret);
                       WriteLn('... нажми клавишу ...');
                       ReadLn;
                  End;
               1: Begin
                       WriteLn('Выбран пункт: ', Ret);
                       WriteLn('... нажми клавишу ...');
                       ReadLn;
                  End;
               2: Begin
                       WriteLn('Выбран пункт: ', Ret);
                       WriteLn('... нажми клавишу ...');
                       ReadLn;
                  End;
               3: Begin
                       WriteLn('Выбран пункт: ', Ret);
                       WriteLn('... нажми клавишу ...');
                       ReadLn;
                  End;
               Else Begin
                       WriteLn('Выход из программы');
                       WriteLn('... нажми клавишу ...');
                       ReadLn;
                    End;
          End; {case Ret}
     Until Ret = MaxMenuItem;
     TextBackground(Black);
     TextColor(LightGray);
     ClrScr;
 
End.


Скажите, неужели так возможно? Пример полностью рабочий.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.05.2016, 20:44
Ответы с готовыми решениями:

Дан массив строк. Напишите программу, проверяющую правильность вложения операторных скобок begin . end — каждому begin должен соответствовать end
Дан массив строк, представляющий собой фрагмент программы на языке Pascal. Напишите программу,...

Ошибка BEGIN
Recompiling because of C:\fpc\2.2.4\bin\i386-win32\pascal work\test.pas test.pas(46) Fatal: Syntax...

Баланс BEGIN-END
Баланс BEGIN-END. Дан текстовый файл, содержащий программу на языке Паскаль. Проверить в нем...

Pascal ...ошибка 36: begin expected
uses crt; const maxn=100; var a:arrayof integer; //матрица смежности w:arrayof integer;...

6
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31466 / 20513 / 7988
Регистрация: 22.10.2011
Сообщений: 35,637
Записей в блоге: 7
03.05.2016, 20:45 2
Begin, который на 43-ой строке - начало тела функции MainMenu, а на 94-ой - основная часть программы. Так что все в порядке.
0
68 / 2 / 0
Регистрация: 09.06.2015
Сообщений: 210
03.05.2016, 20:50  [ТС] 3
Т. е. просто функция содержит в себе процедуры? Вот не знал, что так можно.
А процедуры в процедуре тоже могут быть?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31466 / 20513 / 7988
Регистрация: 22.10.2011
Сообщений: 35,637
Записей в блоге: 7
03.05.2016, 20:52 4
Да, возможны и вложенные процедуры, и вложенные функции. Причем очень глубокого уровня вложенности, одним уровнем не ограничено. Фишка Паскаля.
1
68 / 2 / 0
Регистрация: 09.06.2015
Сообщений: 210
03.05.2016, 20:59  [ТС] 5
Отлично.
Еще тогда один вопрос.
Во всех более-менее нормальных примерах меню ваяют с помощью кучи процедур и процедурочек.
А я хочу сделать, как-то, чтоб это была одна единственная процедура, которую я могу вызывать в разных местах моей программки.
И, к тому же, пункты меню в каждом случае свои, и количество их разное - в одном случае 3, в другом - 4, в третьем, например, 8.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31466 / 20513 / 7988
Регистрация: 22.10.2011
Сообщений: 35,637
Записей в блоге: 7
03.05.2016, 21:06 6
Ну, так и получай пункты меню как открытый строковый массив, а задача меню - только отображать этот массив там, где нужно и с нужной подсветкой активного айтема. И передавай разные массивы в эту функцию (в FPC их вообще можно "на лету" конструировать). В чем проблема-то?

С учетом того, что ты сейчас узнал о вложенных подпрограммах - можно это сделать и в одной функции В приведенном примере именно так и сделано. Слишком большая, мешает? Вынеси в отдельный модуль, и вызывай оттуда.
0
68 / 2 / 0
Регистрация: 09.06.2015
Сообщений: 210
03.05.2016, 21:13  [ТС] 7
Мне еще сложновато это. Я без году неделя, как самотужки начал паскаль изучать.
К тому же образование не совсем техническое, а гуманитарное. Да и возраст не совсем молодой.
Изучаю разные варианты и, пока, пытаюсь что-то свое изобрести.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.05.2016, 21:13

Можно ли в паскале объявить массив после begin
можно ли в паскале объявить массив после begin Очень надо!!!!!!!!!!

программа не запускается выдает Error 36 begin expected
Program V_Prizma; Uses Crt; Read Function Vp(x1,y1,z1,x2,y2,z2,x3,y3,z3:Integer):Integer;...

Mozilla бывает открывает вкладку лишнюю, бывает отдельно окно
Браузер Mozilla бывает открывает дополнительную вкладку, хотя я делаю действия совсем даже не...

Синие экраны бывает месяц нету, бывает каждый день
Забадал BSOD


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru