Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.145.191.169] |
|
Сообщ.
#1
,
|
|
|
program ohcered;
uses crt; const max_event=3; type EvtType=string[80]; var event: array[1..max_event] of EvtType; spos,rpos,t: integer; ch:char; done:boolean; {Постановка объекта в очередь} procedure Qstore(q:EvtType); begin if spos=max_event then writeln('Lis full') else begin event[spos]:=q; spos:=spos+1; end; end; {Выборка объекта из очереди} function Qretrieve:EvtType; begin if rpos=spos then begin writeln('No appointments scheduled.'); Qretrieve:=''; end else begin rpos:=rpos+1; Qretrieve:=event[rpos-1]; end; end; {Ввод предписания в планировщик} procedure Enter; var s: string[80]; begin repeat write('Enter appointment ',spos+1,': '); readln(s); writeln; if length(s)<>0 then Qstore(s); until length(s)=0; end; {Вывести предписания} procedure Review; var t: integer; begin for t:=rpos to spos-1 do writeln(t+1,':',event[t]); end; {Активизировать предписание} procedure Perform; var s:string[80]; begin s:=Qretrieve; if length(s)<>0 then writeln(s); end; begin clrscr; for t:=1 to max_event do event[t]:=''; spos:=0; rpos:=0; done:=False; repeat write('Enter,Reviev,Perform,Quit: '); readln(ch); writeln; case ch of 'e':Enter; 'r':Review; 'p':Perform; 'q':done:=true; end; until done=true; end. У меня такой вопрос возник. Ребят! Помогите пожалуйста. Вот программа для работы с предписанием. Принцип очереди. Используется массив. И она работает правильно, вот тока никак понять не могу почему. event[0]:=q; Ведь он же не должен этого воспринимать, я просто отдельно массив стал делать он этот элемент потерял, а в этой программе все работает. Сидел с листом переменных смотрел, за каждой переменной, ну и куда он эту переменныю с нулевым индексом девает? В простом массиве теряет, а в этой проге работает....... поясните пожалуйста. |
Сообщ.
#2
,
|
|
|
Потому что выключена проверка диапазонов в компиляторе, иначе он ругался бы последникми словами на фрагменте:
event[spos]:=q; spos:=spos+1; Не надо было присваивать spos:=0 - присваивать ему 1, а в приведенном фрагменте поменять строчки местами |
Сообщ.
#3
,
|
|
|
Да программу я переделал, сам до этого дошел, просто не понюмаю, че он в этой-то программе massiv[0]:=q; выводит значение writeln(massiv[0]) а вот если простой массив брать (к этой проге вообще не относящейся) то он просто напросто не печатает это значение...... а как включить проверку диапозонов? у меня компилятор ТП7.0
|
Сообщ.
#4
,
|
|
|
Options/Compiler/Range checking
Да и вообще - при отладке все проверки должны быть включены |
Сообщ.
#5
,
|
|
|
Ща исправлю этот недостаток.... Спасибо.
|
Сообщ.
#6
,
|
|
|
Дополню........
1. Qstore: Строчки... event[spos]:=q; spos:=spos+1; ...по-моему, нужно поменять местами... 2. Review: for t:=rpos to spos-1 do writeln(t+1,':',event[t]); почему??? Может... for t:=rpos to spos-1 do writeln(t+1,':',event[t+1]); 3. for t:=1 to max_event do event[t]:=''; spos:=0; rpos:=0; done:=False; Можно вообще не делать, т.к. TP7 сам обнуляет все переменные в начале работы... (а вот TMT Pascal - нет). 4. Если ты занёс три объекта и вынул их, ты больше не сможешь поставить их в очередь? Объясни, plz, как вообще должна работать программа. |
Сообщ.
#7
,
|
|
|
Допёрло
Предлагаю такой вариант: Uses Crt; Const MaxEvt = 3; MaxLen = 80; Var Event: array [1..MaxEvt] of String[MaxLen]; Total: Integer; S: String[MaxLen]; Ch: Char; Procedure Enter; Begin If Total >= MaxEvt then WriteLn('List is full!') else While Total < MaxEvt do Begin Write('Enter appointment #', Total+1, ': '); ReadLn(S); If S = '' then Break; Inc(Total); Event[Total] := S End End; Procedure Review; Begin For Total := 1 to Total do WriteLn(Total, ': ', Event[Total]) End; Procedure Perform; Begin If Total = 0 then WriteLn('No appointments scheduled.') else Begin WriteLn(Event[1]); For Total := 1 to Total-1 do Event[Total] := Event[Total+1] End End; Begin Repeat HighVideo; WriteLn('Total evets: ', Total); WriteLn('[E]nter, [R]eview, [P]erform, [Q]uit'); LowVideo; Repeat Ch := UpCase(ReadKey) Until Ch in ['E','R','P','Q']; Case Ch of 'E': Enter; 'R': Review; 'P': Perform; 'Q': Break End Until False End. |
Сообщ.
#8
,
|
|
|
Правильно, очередь так и должна, если я занес и вынул, да еще и не сохранил, то значения потеряются... FIFO елки палки:)
|