На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
Дорогие друзья! Поздравляем вас с днём Победы!
msm.ru
Название темы должно быть информативным !
Прежде чем задать вопрос, воспользуйтесь Поиском. и проверьте в FAQ (ЧАВО) Паскаля
Чтобы получить вразумительный ответ, подробно опишите проблему: что надо сделать, что не получается и номер ошибки (если есть), которую выводит компилятор.
Для вставки кода ваших программ используйте, пожалуйста, кнопку СODE=pas или выпадающий список СODE для других языков (подсветка синтаксиса).
[!] Как правильно задавать вопросы | Руководство по языку B.Pascal 7 & Objects/LR | Borland Pascal. Руководство пользователя
Модераторы: volvo877
  
> Индекс массива. Очередь. TP 7.0 Помогите......
    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; Ведь он же не должен этого воспринимать, я просто отдельно массив стал делать он этот элемент потерял, а в этой программе все работает. Сидел с листом переменных смотрел, за каждой переменной, ну и куда он эту переменныю с нулевым индексом девает? В простом массиве теряет, а в этой проге работает....... поясните пожалуйста.
      Потому что выключена проверка диапазонов в компиляторе, иначе он ругался бы последникми словами на фрагменте:
      event[spos]:=q;
      spos:=spos+1;
      Не надо было присваивать spos:=0 - присваивать ему 1, а в приведенном фрагменте поменять строчки местами
        Да программу я переделал, сам до этого дошел, просто не понюмаю, че он в этой-то программе massiv[0]:=q; выводит значение writeln(massiv[0]) а вот если простой массив брать (к этой проге вообще не относящейся) то он просто напросто не печатает это значение...... а как включить проверку диапозонов? у меня компилятор ТП7.0
          Options/Compiler/Range checking
          Да и вообще - при отладке все проверки должны быть включены
            Ща исправлю этот недостаток.... Спасибо.
              Дополню........
              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, как вообще должна работать программа.
                Допёрло :)
                Предлагаю такой вариант:

                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.
                  Правильно, очередь так и должна, если я занес и вынул, да еще и не сохранил, то значения потеряются... FIFO елки палки:)
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0323 ]   [ 15 queries used ]   [ Generated: 10.05.24, 16:40 GMT ]