Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.01.2011, 14:57   #1
ProofAlex
Новичок
Джуниор
 
Регистрация: 24.01.2011
Сообщений: 5
По умолчанию Паскаль. Список с различными элементами

Задача. Разработать список, который содержит ссылки на данные разных типов. Например первый элемент ссылается на целое число, второй - на логическое, третий на массив и т.д. Написать программу для печати хранящихся значений.

думал в качестве списка сделать динамический массив типа pointer. Но возникают проблемы с выводом значений и pointer только указатель на значения. Действующие значения все равно должны быть. Подскажите в каком направлении развивать мысли.
ProofAlex вне форума Ответить с цитированием
Старый 24.01.2011, 20:13   #2
was3110
Форумчанин
 
Аватар для was3110
 
Регистрация: 25.04.2010
Сообщений: 254
По умолчанию

Если нужно делать список, то, конечно, без указателей не обойтись.
Причем в каждом элементе списка будет два указателя : 1- на следующий элемент списка (тип опишите и назовете сами), а 2 указатель - без типа (т.е. pointer) на хранимое значение. Вот поэтому в структуре элементов списка нужно еще иметь переменную хранящую тип значения элемента. При создании элемента пользователю должен задаваться вопрос о типе вводимого элемента. Сохраняться в структуре. А при выводе на печать это значение должно использоваться для конкретизации типа указателя (какой тип читать)
помогать студентам - моя вторая профессия
was3110 вне форума Ответить с цитированием
Старый 24.01.2011, 21:55   #3
ProofAlex
Новичок
Джуниор
 
Регистрация: 24.01.2011
Сообщений: 5
По умолчанию

если будет список из двух указателей, то должен быть еще и список самих значений. Подумал сделать много динамических массивов. правда будет много пустых значений.
в одном массиве хранятся переменные, которые будут указывать на сохраненный тип элемента. Остальные массивы уже с самими элементами
...

для ввода For i:=1 to КонецМассива, узначем что именно вводим и вставляем в типовой массив; для вывода проверять на nil и выводить значения уже из типизированных массивов.

Последний раз редактировалось ProofAlex; 24.01.2011 в 22:48. Причина: передумал
ProofAlex вне форума Ответить с цитированием
Старый 24.01.2011, 22:09   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Подумал сделать еще многомерный массив. правда будет много пустых значений.
Это очень плохая мысль!

Перечитайте ответ was3110, имхо, он дело говорит!

т.е. смысл такой - создаёте объект нужного типа. (через New, например), ссылочку на него (Pointer) помещаете в ваш список, ну и ту даже обязательно тип элемента, который создали.
Тогда, проходя по списку можно получить и тип объекта и указатель на этот объект.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.01.2011, 22:52   #5
ProofAlex
Новичок
Джуниор
 
Регистрация: 24.01.2011
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
указатель на этот объект.
сам объект то все равно должен быть.
ProofAlex вне форума Ответить с цитированием
Старый 24.01.2011, 23:31   #6
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

300 руб - и забирай.
mss вне форума Ответить с цитированием
Старый 25.01.2011, 08:10   #7
ProofAlex
Новичок
Джуниор
 
Регистрация: 24.01.2011
Сообщений: 5
По умолчанию

Цитата:
Сообщение от mss Посмотреть сообщение
300 руб - и забирай.
откуда такие деньги у студентов платного обучения. Да и раздел фриланса в другом месте.
ProofAlex вне форума Ответить с цитированием
Старый 25.01.2011, 10:32   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну раз денег нет - тогда надо самостоятельно учиться!!

вот, для затравки:
Код:
{список}
const ArrSize = 10;

type
  ObjectType = (MyInt, MyBool, MyArray, UnknownType);

  MyArrayType= array[1..ArrSize] of real;
  PMyInt = ^Integer;
  PMyBool = ^Boolean;
  PMyArray = ^MyArrayType;

  PMyObjectList = ^TMyObjectList;
  TMyObjectList = record
    TypeObject: ObjectType;
    Link2Object: pointer;
    Next: PMyObjectList;
  end;

var haid, tail, p: PMyObjectList;
  c: char;

procedure InstallSpisok(var golova, hvost: PMyObjectList);
var ObType, BoolInt : word;
  i : integer;
  vMyInt : PMyInt;
  vMyBool: PMyBool;
  vMyArray: PMyArray;
begin
  while true do
  begin
    if golova = nil then
    begin
      new(golova);
      hvost := golova;
      golova^.Next := nil;
    end
    else
    begin
      new(hvost^.Next);
      hvost := hvost^.Next;
      hvost^.Next := nil;
    end;
    write('Введите тип создаваемого объекта: (',
                 ord(MyInt),'-',ord(MyArray),') : ');
    Readln(ObType);

    case ObType of
      ord(MyInt) : begin
                New(vMyInt);
                WriteLn('Введите целое число: ');
                Readln(vMyInt^);
                hvost^.TypeObject := MyInt;
                hvost^.Link2Object :=  vMyInt;
              end;
      ord(MyBool) : begin
                New(vMyBool);
                WriteLn('Введите логическое значение (1-True, 0-False): ');
                Readln(BoolInt);
                vMyBool^ := BoolInt = 1;
                hvost^.TypeObject := MyBool;
                hvost^.Link2Object :=  vMyBool;
              end;
      ord(MyArray) : begin
                New(vMyArray);
                for i:=1 to ArrSize do vMyArray^[i] := i*2.574;
                hvost^.TypeObject := MyArray;
                hvost^.Link2Object :=  vMyArray;
              end;
      else begin
        hvost^.TypeObject := UnknownType;
        hvost^.Link2Object :=  nil;
      end
    end;

    write('Продолжить ввод чисел? Y/N');
    readln(c);
    if (c = 'n') or (c = 'N') then
      break;
  end; {while}
end;

(*
procedure Summa(golova, hvost, p: PMyObjectList);
var summa: integer;
begin
  summa := 0;
  p := golova;

  if p = hvost then {Если в списке один элемент}
    if p^.info > 0 then
    begin
      summa := p^.info;
      writeln('Сумма положительных элементов: ', summa);
    end;

  while p <> hvost do
  begin
    if (p^.info > 0) then
      summa := summa + p^.info;
    p := p^.Next;

    if p = hvost then
    begin
      if (p^.info > 0) then
        summa := summa + p^.info;
      write('Сумма положительных элементов = ', summa);
    end;
  end; {while}


end;
*)


begin

  InstallSpisok(haid, tail);
  readln;
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.01.2011, 11:43   #9
ProofAlex
Новичок
Джуниор
 
Регистрация: 24.01.2011
Сообщений: 5
По умолчанию

по подсчетам британских ученых время на самостоятельное обучение увеличивается в разы, нежели коллективное

Плоды моего самостоятельного обучения с этим списком получились далекими даже от этой затравки.
Спасибо за помощь.

Последний раз редактировалось ProofAlex; 25.01.2011 в 11:48.
ProofAlex вне форума Ответить с цитированием
Старый 25.01.2011, 11:49   #10
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
Сообщение от ProofAlex Посмотреть сообщение
откуда такие деньги у студентов платного обучения. Да и раздел фриланса в другом месте.
Нет денег - нет стульев)
Да и раздел "Сделайте мне нахаляву" в другом месте.
mss вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль: Операции с элементами массивов. iolopukki Помощь студентам 1 23.06.2009 19:54
Страничка с различными ссылками Modernistka PHP 4 28.03.2009 20:12
Работа с элементами массива. (Паскаль). tanuschka Помощь студентам 1 20.11.2008 20:38
Имеется список,элементами которого являются вещественные числа.Создать консольное приложение,описывающее Smart Помощь студентам 1 06.05.2008 08:09
Распространение приложений работающих с различными видами БД ThreeADo БД в Delphi 4 14.05.2007 15:02