Переделать под стеки Паскаль

Общие вопросы: версии и диалекты, синтаксис языка, cтруктуры и типы данных (массивы, строки, списки...), обработка данных и т.д.
Ответить
misha_beginner
Сообщения: 20
Зарегистрирован: 13 окт 2013, 22:33

20 апр 2014, 14:16

Всем привет прошу вашей помощи пожалуйста. Была такая вот программа

Код: Выделить всё

 const
  n = 4;
type
  student = record
    N: byte;
    prizv: string;
    matan: real;
    prog: real;
    Os: real;
    alg: real;
  end;
var
  i: integer;
  tabl: array[1..n] of student; 
  otv: integer;

procedure lin(m: integer);
var i: integer;
begin
  for i := 1 to m do write('-'); writeln;
end;

begin
 
    writeln('VVedi dani stydentiv');
    for i := 1 to n do
    begin
      tabl[i].N := i;
      readln(tabl[i].Prizv, tabl[i].matan, tabl[i].prog, tabl[i].OS, tabl[i].alg);
    end;
 
 

  

  Lin(69);
  writeln('|   | Призвіще | Matematuchnuy | Programyvannya | OS | Algebra | cer|');
  writeln('|   |          |    analis     |                |    |  i geom.|    |');
  Lin(69);
  for i := 1 to n do
  begin
    write('|', tabl[i].N: 2, ' |', tabl[i].Prizv: 10, '|');
    write(tabl[i].matan: 15, '|', tabl[i].prog: 16, '|', tabl[i].OS: 4, '|', tabl[i].alg: 9, '|',
     ((tabl[i].matan + tabl[i].prog + tabl[i].OS + tabl[i].alg) / n): 0: 2, '|');
    writeln;
    Lin(69);
  end;
  writeln;
  writeln('vidcortov');
  Lin(69);
  for i := 1 to n do
  begin
    if ((tabl[i].matan + tabl[i].prog + tabl[i].OS + tabl[i].alg) / 4 >= 4) then
    begin
      write('|', tabl[i].N: 2, ' |', tabl[i].Prizv: 10, '|');
      write(tabl[i].matan: 15, '|', tabl[i].prog: 16, '|', tabl[i].OS: 4, '|', tabl[i].alg: 9, '|', ((tabl[i].matan + tabl[i].
      prog + tabl[i].OS + tabl[i].alg) / n): 0: 2, '|');
      writeln;
      Lin(69);
    end;
  end;
  readln
end.
ёё нужно было переделать под стеки, там с процедурой добавление в вершину элементов, удаления и т.д.
Вот мой код:

Код: Выделить всё

uses
  crt; 
  const 
       n=4;
type
  Tinf=string; 
  List=^TList;  
  TList=record 
    data:TInf;  
    next:List;  
    N:byte;
     Prizv:string[20];
     matan:byte;
     prog:byte;
     OS:byte;
     alg:byte;
  end;
 

procedure AddElem(var stek1:List;znach1:TInf);
var
  tmp:List;
begin
 GetMem(tmp,sizeof(TList));
  tmp^.next:=stek1;  
  tmp^.data:=znach1; 
  stek1:=tmp; 
end;






procedure Line(m:integer);
var i:integer;
begin
for i:=1 to m do
write('-');
writeln;
end;




procedure Print(stek1:List);
begin
  if stek1=nil then {проверка на пустоту стека}
  begin
    writeln('Стек пуст.');
    exit;
  end;
  while stek1<>nil do {пока указатель stek1 не станет указывать в пустоту}
  begin   {а это произойдёт как только он перейдёт по ссылке последнего элемента}
    Write(stek1^.data, ' '); {выводить данне}
    stek1:=stek1^.next  {и переносить указатель вглубь по стеку}
  end;
end;



var
  Stk, 
  tmpl:List; 
  znach:Tinf; 
  ch:char; 
  i:integer;
  
  tabl:array[1..n] of Tlist;
  
  
begin
    Stk:=nil;
    
    
    repeat
     writeln('1) add elements');
   writeln('2) output');
   writeln('3) exit');
   writeln('press key 1..3');
   ch:=readkey;
   
   
   case ch of 
   '1':begin
   
   
   for i:=1 to  n do
   begin
   writeln('enter data item' , i);
   
   
    tabl[i].N := i;
      readln(tabl[i].Prizv, tabl[i].matan, tabl[i].prog, tabl[i].OS, tabl[i].alg);
      addelem(stk,znach);
      end;
          End;
          
          
          
          
          
          
          '2':begin
          Line(69);
  writeln('|   | Призвіще | Matematuchnuy | Programyvannya | OS | Algebra | cer|');
  writeln('|   |          |    analis     |                |    |  i geom.|    |');
  Line(69);
  
  for i := 1 to n do
  begin
 
  
  write('|', tabl[i].N: 2, ' |', tabl[i].Prizv: 10, '|');
    write(tabl[i].matan: 15, '|', tabl[i].prog: 16, '|', tabl[i].OS: 4, '|', tabl[i].alg: 9, '|',
     ((tabl[i].matan + tabl[i].prog + tabl[i].OS + tabl[i].alg) / n): 0: 2, '|');
    writeln;
    Line(69);
  end;
  writeln;
  writeln('vidcortov');
  Line(69);
  for i := 1 to n do
  begin
    if ((tabl[i].matan + tabl[i].prog + tabl[i].OS + tabl[i].alg) / 4 >= 4) then
    begin
      write('|', tabl[i].N: 2, ' |', tabl[i].Prizv: 10, '|');
      write(tabl[i].matan: 15, '|', tabl[i].prog: 16, '|', tabl[i].OS: 4, '|', tabl[i].alg: 9, '|', ((tabl[i].matan + tabl[i].
      prog + tabl[i].OS + tabl[i].alg) / n): 0: 2, '|');
      writeln;
      Line(69);
       print(stk);
    end;
  end;
  
     End;
     end;
но у меня проблема с процедурой AddElem она только 1 раз добавляет файлы в таблицу и если ёё повторно вызвать то она стираент все ост данные и снова надо водить новые, но мне нужно чтобы эта процедура могла уже к существующим файлам мы могли добавлять еще сколько нужно в таблицу.(корректировка стека) помогите плиз исправить эту процедуру
Ответить