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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2015, 23:02   #1
olya-rud
Пользователь
 
Регистрация: 15.10.2013
Сообщений: 14
По умолчанию Случайное значение из списка

Помогите пожалуйста из списка, который ввел пользователь, выбрать случайное значение. Знаю что для выбора случайного значения в массиве используется функция random, а как тут это реализовать не знаю
Код:
type
  //Тип основных данных.
  TData = Integer;
  //Тип указателя на элемент списка.
  TPElem = ^TElem;
  //Тип элемента списка.
  TElem = record
    Data: TData; //Основные данные.
    PNext: TPElem; //Указатель на следующий элемент списка.
  end;
  //Тип, описывающий однонаправленный список.
  TList = record
    PFirst, PLast: TPElem; //Указатели на первый и на последний элементы списка.
  end;
 
//Начальная инициализация списка. Внимание! Эту процедуру можно выполнять
//только в отношении пустого списка! Иначе - будут утечки памяти.
procedure Init(var aList: TList);
begin
  aList.PFirst := nil;
  aList.PLast := nil;
end;
 
//Добавление элемента в конец однонаправленного списка.
procedure Add(var aList: TList; const aData: TData);
var
  PElem: TPElem;
begin
  New(PElem);
  PElem^.Data := aData;
  PElem^.PNext := nil;
  if aList.PFirst = nil then
    aList.PFirst := PElem
  else
    aList.PLast^.PNext := PElem;
  aList.PLast := PElem;
end;
 
//Удаление элемента из однонаправленного списка по указателю на предыдущий элемент.
//Если указатель на предыдущий элемент равен NIL, то удаляется первый элемент списка.
procedure Del(var aList: TList; var aPPrev: TPElem);
var
  PDel: TPElem;
begin
  if aList.PFirst = nil then Exit;
  
  if aPPrev = nil then begin
    PDel := aList.PFirst;
    aList.PFirst := PDel^.PNext;
  end else begin
    PDel := aPPrev^.PNext;
    if PDel <> nil then aPPrev^.PNext := PDel^.PNext;
  end;
  if aList.PLast = PDel then aList.PLast := aPPrev;
  if PDel <> nil then Dispose(PDel);
end;
 
//Удаление однонаправленного списка из памяти и инициализация.
procedure Free(var aList: TList);
var
  PNext, PDel: TPElem;
begin
  PNext := aList.PFirst;
  while PNext <> nil do 
  begin
    PDel := PNext;
    PNext := PNext^.PNext;
    Dispose(PDel);
  end;
  Init(aList);
end;
 
//Распечатка однонаправленного списка.
procedure Print(const aList: TList);
var
  PElem: TPElem;
begin
  if aList.PFirst = nil then begin
    Writeln('Список пуст.');
    Exit;
  end;
  
  PElem := aList.PFirst;
  while PElem <> nil do 
  begin
    if PElem <> aList.PFirst then Write(', ');
    Write(PElem^.Data);
    PElem := PElem^.PNext;
  end;
end;
 
var
  N: TList;
  Data: TData;
  i, Code: Integer;
  S: String;
 
begin
  //Начальная инициализация списка.
  Init(N);
  repeat
    //Создание списока.
    Writeln('Создание списка 1.');
    Writeln('Прекратить ввод - пустая строка + Enter.');
    i := 0;
    repeat
      Write('Элемент ', i + 1, ': ');
      Readln(S);
      if S <> '' then begin
        Val(S, Data, Code);
        if Code = 0 then begin
          Inc(i);
          Add(N, Data);
        end else
          Writeln('Неверный ввод. Повторите.');
      end;
    until S = '';
    Writeln('Составлен список:');
    Print(N);
    Writeln;
       
    //Удаление списка из памяти.
    Free(N);
    Writeln('Список удалён из памяти. Работа завершена.');
    Writeln('Повторить - Enter. Выход - любой символ + Enter.');
    Readln(S);
  until S <> '';
end.
olya-rud вне форума Ответить с цитированием
Старый 15.10.2015, 23:22   #2
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

С ума сойти. Указатели..
А без них нельзя, например с массивами?
С массивами было бы просто
Код:
const KOL=10;
var Ar:array[0..KOL]of Integer;
//
 Randomize; // - 1 раз на всю программу
// случайное значение из массива
 x:=Ar[Random(KOL+1)];
type_Oleg вне форума Ответить с цитированием
Старый 15.10.2015, 23:39   #3
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Я бы сделал так:
1. В цикле, пока не обнаружен конец списка, переходим от элемента к элементу и подсчитываем число элементов. Пусть их будет N;
2. Сформируем случайное число:
Код:
randomize;
m := random(N) + 1; {число в диапазоне 1 -:- N}
3. В цикле двигаемся по списку к элементу m и читаем его.


Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 16.10.2015, 00:06   #4
olya-rud
Пользователь
 
Регистрация: 15.10.2013
Сообщений: 14
Печаль

Цитата:
Сообщение от type_Oleg Посмотреть сообщение
С ума сойти. Указатели..
А без них нельзя, например с массивами?
С массивами было бы просто
Код:
const KOL=10;
var Ar:array[0..KOL]of Integer;
//
 Randomize; // - 1 раз на всю программу
// случайное значение из массива
 x:=Ar[Random(KOL+1)];
к сожалению с массивами нельзя, если бы было с массивами то никаких проблем, а так куча проблем

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Я бы сделал так:
1. В цикле, пока не обнаружен конец списка, переходим от элемента к элементу и подсчитываем число элементов. Пусть их будет N;
2. Сформируем случайное число:
Код:
randomize;
m := random(N) + 1; {число в диапазоне 1 -:- N}
3. В цикле двигаемся по списку к элементу m и читаем его.


Как-то так, ...
можешь помочь посчитать количество элементов?

Последний раз редактировалось Stilet; 16.10.2015 в 06:47.
olya-rud вне форума Ответить с цитированием
Старый 16.10.2015, 00:36   #5
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

В Вашем коде есть функция печати списка:
Код:
procedure Print(const aList: TList);
Думаю, что Вам следует потренироваться на ней.
Эту функцию нужно переделать, добавив счетчик числа элементов.
Это не сложно, просто попробуйте ...
Сожалею, но у меня не так много времени ...


Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 16.10.2015, 00:38   #6
olya-rud
Пользователь
 
Регистрация: 15.10.2013
Сообщений: 14
По умолчанию

вот именно я на ней и тренируюсь, вставляю счетчик цикл for, но не могу понят до какого элемента мне ставить
Код:
for k:=1 to ?????  do
вот с этим не разберусь
olya-rud вне форума Ответить с цитированием
Старый 16.10.2015, 08:53   #7
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Цикл for тут не комильфо ...
Цитата:
В переводе с французского «comme il faut» буквально означает «как надо», «как следует».
Либо
Код:
if (<указатель на начало списка> <> Nil) then
begin
   n := 1;
   while (<указатель на следующий элемент> <> Nil) do
   begin
   ...
      n := n + 1;
   ...
   end;
end;
Либо
Код:
if (<указатель на начало списка> <> Nil) then
begin
   n := 1;
   repeat
   ...
   n := n + 1;
   ...
   until (<указатель на следующий элемент> = Nil);
end;
Как-то так, ...
Как-то так, ...

Последний раз редактировалось ViktorR; 16.10.2015 в 09:00.
ViktorR вне форума Ответить с цитированием
Старый 16.10.2015, 09:46   #8
olya-rud
Пользователь
 
Регистрация: 15.10.2013
Сообщений: 14
По умолчанию

Помогите пожалуйста вставить в код, никак не работает((
указатель на начало списка - aList.PFirst
указатель на следующий элемент - PElem^.PNext
olya-rud вне форума Ответить с цитированием
Старый 16.10.2015, 11:27   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Оля, ну Вам же прямо конкретно-конкретно намекнули - берёте процедуру Print и делаете из неё функцию подсчёта количества элементов.
например:
Код:
//Подсчёт количества элементов в однонаправленном списке aList.
function CountList(const aList: TList):integer;
var
  PElem: TPElem;
  n : integer;
begin
  n:=0;
  PElem := aList.PFirst;
  while PElem <> nil do 
  begin
    Inc(n); {нарастили счётчик элементов на единичку}
    PElem := PElem^.PNext;
  end;
  CountList := n; {вернули значение счётчик}
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.10.2015, 11:41   #10
olya-rud
Пользователь
 
Регистрация: 15.10.2013
Сообщений: 14
По умолчанию

Спасибо за пример, я и пыталась сделать то на что мне намекнули, но так как я только учусь и в самом начале изучения у меня не получилось этого сделать. Я думаю у вас в начале изучения тоже не все получалось.
olya-rud вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вернуть случайное текстовое значение из списка КакоеИмяПридумать? Microsoft Office Excel 2 04.01.2015 13:06
Паскаль. Случайное заполнение списка. Silverstone Помощь студентам 3 25.05.2012 11:21
Возведение в степень и случайное значение переменной БалаШагаЛ Общие вопросы C/C++ 14 19.03.2011 19:03
Последнее значение в столбце списка ALev Microsoft Office Excel 2 02.07.2009 16:29
Случайное разбиение списка на множесво маленьких списков eXa Общие вопросы Delphi 5 15.08.2007 09:23