[Pascal]Процедура для списка данных

Ответить
aSn
Сообщения: 4
Зарегистрирован: 04 янв 2008, 17:02

04 янв 2008, 17:04

Никак не могу сообразить, как написать такую процедуру:

Элементами линейного соединенного списка являются целые числа.Напишите процедуру,

которая данный список удвоит, т.е. к концу списка присоединит еще копию каждого

числа с сохранением порядка последовательности.Например,из списка 1,2,3,4

получится список 1,2,3,4,1,2,3,4.

Буду очень благодарен за любые советы!
BHy4ok
Сообщения: 229
Зарегистрирован: 01 май 2007, 09:03
Откуда: г.Находка
Контактная информация:

04 янв 2008, 18:51

В чем собственно проблема?
Пишешь строку, запоминаешь ее значение, и затем к ней-же при выводи информации плюсуешь.

Это просто строка. Если надо только с числами, либо поставь проверку провописания, либо просто задай "integer" и так-же выводи:

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

uses crt;
var
   s,s1:string;
begin
     clrscr;
      write('Input String: ');
        readln(s);
      S1:=S;
      S:=S+S1;
      writeln(s);
        readln;
end.
aSn
Сообщения: 4
Зарегистрирован: 04 янв 2008, 17:02

04 янв 2008, 19:04

Я, наверное, непонятно написал задание... Я вот пытаюсь написать, но пока не получается... Что-то подобное:

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

unit doc;

interface
  type Tdata = Integer; 

     uPrvek = ^prvek; 

     prvek = record   
       data: Tdata;
       dalsi: uPrvek;
     end;

     seznam = record  
       hlava: uPrvek;
       konec: uPrvek;

     end;


 procedure Kopie(var sez:seznam);



implementation

    procedure Kopie(var sez:seznam);
    var p,q:uPrvek;
        z:Integer;
    begin
    new(p);
    sez.konec:=p;

    for z:= sez.hlava^.data to sez.konec^.data do

     repeat
     new(q);
     sez.konec^.data:=q^.data;
     sez.konec^.dalsi:=q;
     sez.konec:=q;
     until q <> p;

    end;
Serge_Bliznykov
Сообщения: 366
Зарегистрирован: 31 авг 2007, 03:06

05 янв 2008, 00:12

извините, не знаю, вроде тут тэга [MORE] нет, как прятать длинный текст, я не знаю ;-( можно, конечно, было бы через вложение сделать... но, как мне кажется, так удобнее...


aSn,
вот полное решение с оснасткой (чтобы проверить можно было ;-)
лишнее уберёте
сам модуль (переменовал в DOC1.PAS)

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

unit doc1;

interface
  type Tdata = Integer; 

     uPrvek = ^prvek; 

     prvek = record   
       data: Tdata;
       dalsi: uPrvek;
     end;

     seznam = record  
       hlava: uPrvek;
       konec: uPrvek;
     end;
     
     var 
       MySezNam : seznam;

 procedure InitPrvek(var sez:seznam);
 
 procedure ListPrvek(var sez:seznam);

 procedure Kopie(var sez:seznam);



implementation

   procedure InitPrvek(var sez:seznam);
   var p : uPrvek;
       i : Integer;
   begin
     if sez.hlava <> nil then Exit;
     new(p);
     sez.hlava := p;
     sez.konec := p;
     sez.hlava^.data := 1;
     sez.hlava^.dalsi := nil;
     for i:=2 to 5 do begin
       New(p);
       sez.konec^.dalsi := p;
       sez.konec := p;
       p^.data := i;
       p^.dalsi := nil;
     end;

   end;

   procedure ListPrvek(var sez:seznam);
   var
     NextPrvek : uPrvek;
   begin
     if sez.hlava = nil then Exit;
     NextPrvek := sez.hlava;
     while NextPrvek <> nil do
     begin
       WriteLn(NextPrVek^.data);
       NextPrvek := NextPrvek^.dalsi;
    end;
   end;


    procedure Kopie(var sez:seznam);
    var
      KonecSourceList, CurElement, p : uPrvek;
    begin
      if sez.hlava = nil then Exit;

      CurElement := sez.hlava;
      KonecSourceList :=  sez.konec;
      repeat
        New(p);
        sez.konec^.dalsi := p;
        sez.konec := p;
        p^.data := CurElement^.data;
        p^.dalsi := nil;
        CurElement := CurElement^.dalsi;
      until CurElement=KonecSourceList;

      {последний элемент исходного списка докопируем ручками...}
      New(p);
      sez.konec^.dalsi := p;
      sez.konec := p;
      p^.data := KonecSourceList^.data;
      p^.dalsi := nil;

    end;

begin
  MySezNam.hlava := nil;
  MySezNam.konec := nil;
  
  InitPrvek( MySezNam );
    
end.    
модуль для вызова:

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

uses Doc1;

begin
  writeln('Source List before coping....');
  ListPrvek( MySezNam );
  WriteLn('----------------------');
  Kopie( MySezNam );
  WriteLn(' after coping ');
  ListPrvek( MySezNam );
  WriteLn('----------------------');
end.
и последнее, для работы с однонаправленным списком можно было обойтись и хранением только ссылки на первый элемент списка, хотя, безусловно, две ссылки - на голову и на конец - НАМНОГО удобнее...
aSn
Сообщения: 4
Зарегистрирован: 04 янв 2008, 17:02

05 янв 2008, 17:27

Serge_Bliznykov,
ОГРОМНОЕ Вам СПАСИБО! Просто и не знаю, как отблагодарить... :)
Serge_Bliznykov
Сообщения: 366
Зарегистрирован: 31 авг 2007, 03:06

05 янв 2008, 20:11

aSn, а... не стоит прямо уж такой благодарности. ;-)))
Лишь бы на пользу пошло.
Приятно было засохшие мозги чуть поразмять, молодость вспомнить ;-)))
а скажите честно - код, который Вы привели - сами писали, или взяли у кого не разбираясь, что там и как?...
aSn
Сообщения: 4
Зарегистрирован: 04 янв 2008, 17:02

05 янв 2008, 20:36

Саму процедуру сам "сочинял", только никак не получалось - все время бесконечный цикл выходил :D А интерфейс мы в универе делали.
Serge_Bliznykov
Сообщения: 366
Зарегистрирован: 31 авг 2007, 03:06

05 янв 2008, 23:59

ясно.
Ну молодец.
Желаю дальнейших успехов в учёбе.
Будут вопросы - милости прошу.
Ответить