Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > строгая очередность из 0, 1 и 2


Автор: Delian 20.11.2011, 16:43
Привет! Такая задачка в паскале
Из чисел 0, 1, 2, находящихся в различной последовательности, сделать строгую очередность из 0, 1 и 2. При этом сортировку не применять. Вывести результаты. Затем удалить по одному граничащему значению.


Необходимо переписать числовые данные из текстового файла в:
1.     одномерный массив,
2.     типизированный файл,
3.     линейный динамический список.

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


Вот вроде очередность:

Код

uses crt;
const max=100;
var a:array[1..max] of byte;
    n,i,j,k,x:byte;
begin
clrscr;
randomize;
repeat
write('Размер массива до ',max,' n=');
readln(n);
until n in [1..max];
writeln('Исходный массив:');
for i:=1 to n do
 begin
  a[i]:=random(3);
  write(a[i],' ');
 end;
writeln;
writeln;
{0 вперед}
k:=0;
for i:=1 to n do
if a[i]=0 then
  begin
    k:=k+1;
    x:=a[i];
    for j:=i downto k+1 do
    a[j]:=a[j-1];
    a[k]:=x;
  end;
{2 в конец}
k:=0;
for i:=n downto 1 do
if a[i]=2 then
  begin
    k:=k+1;
    x:=a[i];
    for j:=i to n-k do
    a[j]:=a[j+1];
    a[n-k+1]:=x;
  end;
writeln('Перестановка:');
for i:=1 to n do
write(a[i],' ');
readln
end.


Как дальше написать программу по заданию?

Автор: ФедосеевПавел 20.11.2011, 18:17
Полагаю, что здесь для каждого типа структуры (массив, список, файл) алгоритм такой:
1. В первом проходе посчитать количество вхождений каждого числа в структуру. Получим n0, n1 и n2 - количество 0, 1 и 2 в структуре.
2. Вторым проходом, записать в эту структуру n0 - 0, n1 - 1 и n2 - 2.

Т.е. для массива это будет:
Код

var
  NN : array [0..2] of integer; {массив с количеством появлений значений 0..2}
.......................................
  {инициализация массива NN}
  for i:=0 to 2 do
    NN[i]:=0;
  {заполнение массива NN}
  for i:=1 to n do
    Inc(NN[ a[i] ]);
  {псевдосортировка исходного массива - сортировка подсчётом}
  i:=1;
  for k:=0 to 2 do
    for j:=1 to NN[k] do
    begin
      a[i]:=k;
      Inc(i);
    end;


В файл запись ещё проще - не учитываешь индекс i, просто записываешь.
Динамический список - среднее между файлом и массивом (к следующему элементу переходишь "вручную", но индекс не используешь).

Местный FAQ почему-то сегодня не открывается, поэтому "отправляю" подальше.
http://forum.sources.ru/index.php?showtopic=69615 и http://forum.pascalnet.ru/index.php?showtopic=2706. По файлам где-нибудь там же найдёшь. Чтение из файла в массив или динамический список многократно обсуждался на этом и на других форумах.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)