IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Как отсортировать?, двусторонний динамич. список
сообщение
Сообщение #1


Гость






По возрастанию ли - убыванию - нет разницы. smile.gif Надо всего лишь создать некую процедуру, что для таких АСОВ как Вы - не составит труда.. ^_^ Жду с нетерпением Вашей помощи! ;)

Код
program rabota;
type spis = ^el;
     el  = record
        next:spis;
        data : integer;
        back : spis;
     end;
             
procedure sozdat_spisok ( var nach, konc : spis );
  var g : spis;
      x : integer;
begin  { sozdat_spisok }
nach  := nil;    
konc := nil;
writeln('Sozdaem spisok, vvedite celye 4isla.');
writeln('Hotite zakon4it - voodite 0.');
readln ( x );
while x <> 0 do
   begin
     if nach = nil
     then
       begin
         new( g );
         g^.data  := x;
         g^.next := nil;
         g^.back := nil;
         nach       := g;
         konc      := g;
         readln( x );
       end
     else  
       begin
         new( g );
         g^.data    := x;
         g^.next   := nil;
         g^.back := konc;
         konc^.pnext:=g;
         konc        := g;
         readln( x );
       end
   end;
writeln('Spisok uspe6no sozdan');
end; { Sozdat spisok }

procedure pe4atat( nach : spis );
var p : spis;
begin  { pe4atat }
  writeln('pe4ataem spisok:' );
  p := nach;
  while p <> nil do
    begin
      write( p^.data, ' ');
      p := p^.next;
    end;
  writeln;
end; { pe4atat }

procedure uni4tozhit( var nach, konc : spis );
var s : spis;
begin  { uni4tozhit }
  writeln('uni4tozhaem spisok s konca.');
  while pr <> nil do
  begin

     s := nach;
     if konc <> nach
     then
       begin
         while (s^.next <> konc) and (nach<>konc) do
               s := s^.next;
         writeln('  uni4tozhaem ', s^.next^.data);
         konc := s;
         dispose( s^.next );
       end
     else
       begin
         writeln('  Ui4tozhaem 1-j: ', s^.data);
         dispose( s );
         nach  := nil;
         konc := nil;
       end;
  end;
end; { uni4tozhit }

var na4alo, konec : spis;
begin
  sozdat_spisok ( na4alo, konec );
  pe4atat ( na4alo );
 uni4tozhit(na4alo,konec);

end.
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Мужской

Репутация: -  0  +


Ну а вот и вопросы, которые я собирался тебе задать:

Зачем каждый раз в цикле перед присваиванием arr[i] значения переменной ch присваивать ей пробел? И что конкретно делает предпоследняя строчка?

procedure get_array(var f: text; var arr: myArray;
const n: integer);
var
i: integer;
ch: char;
begin
for i := low(arr) to high(arr) do begin
arr[i] := #32;
read(f, ch);
arr[i] := ch;
end;
for i := succ(high(arr)) to n do read(f, ch)
end;


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

type
clients = ^node;
node = record
data: recType;
next, back: clients;
end;

tlist = record
first, last: clients;
end;


вот ето еще немного неясно, особенно то, что в скобках:
r.tip_komnaty := komType(ord(ch) - ord('1'));
а так же ето:
chr(ord('1') + byte(tip_komnaty))

Еще непонятно, зачем кое-где ты прописывал типы:
byte(p^.data.tip_komnaty)
longint(p^.data.cena)

Вот пока что все вопросы smile.gif Ответь до 12 завтрашнего дня, ок? :P
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Значит, по-порядку: smile.gif
Цитата(Pukelis @ 5.05.05 20:59)
Зачем каждый раз в цикле перед присваиванием arr[i] значения переменной ch присваивать ей пробел? И что конкретно делает предпоследняя строчка?

Пробел - это для гарантии того, что ни при каких условиях старое значение элемента массива не сохранится.

А предпоследняя строчка делает вот что: если в процедуру передана константа N, равная размеру массива arr, то ничего не происходит, т.е. сразу же после прочтения из файла всех элементов массива выполнение процедуры заканчивается.
А вот если мне нужно кроме строки прочесть еще и несколько символов, чтобы при следующем заходе опять спокойно считывать саму строку, то я передам в N не 10, а большее число, и процедура считает из файла дополнительно
N - high(arr) символов. Кстати, high(arr) это верхняя граница массива Arr, то есть 10 smile.gif Есть такая функция в Паскале.


Цитата(Pukelis @ 5.05.05 20:59)
а вот ето нужно, чтоб потом нормально пользоваться методом пузырька, да?
Именно. Чтобы проще было менять записи местами...

Цитата(Pukelis @ 5.05.05 20:59)
вот ето еще немного неясно, особенно то, что в скобках:
r.tip_komnaty := komType(ord(ch) - ord('1'));
а так же ето:
chr(ord('1') + byte(tip_komnaty))

У тебя читается символ от '1' до '4' как признак типа комнаты, правда? smile.gif
А сами k1, k2, k3, k4 в описании komType = (k1,k2,k3,k4); чему равны, ты знаешь? Для компилятора 0, 1, 2 и 3 соответственно. Вот и пользуемся этим.
Берем порядковый номер символа и вычитаем из него номер '1' - цы. Результат приводим к нужному типу, чтобы не было сообщений о несовместимости.
Вторая строка - то же самое, только обратный процесс...

Цитата(Pukelis @ 5.05.05 20:59)
Еще непонятно, зачем кое-где ты прописывал типы:
byte(p^.data.tip_komnaty)
longint(p^.data.cena)

Первый случай - чтобы избежать несовместимости... Если там не поставить byte(), то программа даже не скомпилируется. Но это не страшно, потому что проблема явная, и ты знаешь, что она есть. А значит - решишь.

Вот вторая строка - ГОРАЗДО опаснее. В Паскале есть очень нехорошая особенность - Тип результата приводится к самому емкому из типов операндов. Так вот если у тебя есть:
Var a, b: Word; c: LongInt;
{ и ты сделаешь так: }
begin
a := 300; b := 300;
c := a * b;
WriteLn( c );
end.

То ты вроде бы должен получить 90000, но ты их не получишь. Почему? Объясняю: сначала тип результата устанавливается в самый емкий из типов операндов (в этом случае - Word), потом производится умножение, результат "запихивается" в Word... Все что не поместилось - усекается. Что имеем после усечения - 24464. А потом этот результат запишется в LongInt ( переменную C ). Вот эту ошибку ОЧЕНЬ трудно найти, она никак компилятором не определяется sad.gif

Как ее избежать? Правильно:
Var a, b: Word; c: LongInt;
begin
a := 300; b := 300;
c := LongInt( a ) * b;
WriteLn( c );
end.

Теперь результат будет заноситься в LongInt, как более емкий, и усечения не произойдет...

smile.gif Что-то много получилось...
 К началу страницы 
+ Ответить 

Сообщений в этой теме
pukelis   Как отсортировать?   3.05.2005 16:17
volvo   Ну, во-первых, сразу возникает вопрос - можно или …   3.05.2005 16:51
Guest   Все переделывать как-то неохота, тк на етой проге …   3.05.2005 17:00
volvo   Ну, тогда вспомни как выглядит пузырьковая сортиро…   3.05.2005 17:34
Pukelis   TX!! вот именно имитация пузырька мне и бы…   3.05.2005 17:45
Guest   у меня что-то компилятор ругается на function fin…   3.05.2005 18:08
volvo   Ну да, конечно. Я в одном месте поменял, в другом …   3.05.2005 18:14
Pukelis   задача такая: используя инфу из 2-х разных файлов …   3.05.2005 18:26
volvo   То есть, как я понял, список содержит И имя, И фа…   3.05.2005 18:55
Guest   program Noname1; uses crt; type klient=^kli; …   3.05.2005 19:03
volvo   Ну так тогда в чем дело? Просто объедини все поля …   3.05.2005 19:24
Pukelis   Вот, перевел прогу ))) Посмотри, куда что вставить…   3.05.2005 20:41
volvo   Вот так (см. аттач)... А теперь можешь спокойно со…   3.05.2005 20:57
Pukelis   попробовал я сделать как ты говорил.. не пашет ниф…   3.05.2005 22:42
volvo   Только одна просьба - такие большие исходники прис…   3.05.2005 23:17
Pukelis   :) Пасииб, да, компилируется превосходно, но при р…   3.05.2005 23:54
volvo   :blink: Sorry... My fault Ошибка закралась вот …   4.05.2005 0:16
Pukelis   та же фигня (( Вот как прога выглядит сейчас (см. …   4.05.2005 0:35
volvo   Pukelis, а ты уверен, что N содержит правильное зн…   4.05.2005 1:02
Pukelis   ошибка пропала, но сортировка не происходит (( Ком…   4.05.2005 2:07
volvo   В-общем, с такими файлами данных ты замучаешься де…   4.05.2005 3:07
Pukelis   :unsure: поетому я и не хотел ее сразу выкладыват…   4.05.2005 3:34
volvo   Значится, так... :) Вот что мне удалось сделать п…   4.05.2005 5:53
Pukelis   :) ПАСИБ!!! :molitva: Ты - просто су…   4.05.2005 11:09
Pukelis   Ну а вот и вопросы, которые я собирался тебе задат…   6.05.2005 0:59
volvo   Значит, по-порядку: :) Пробел - это для гаранти…   6.05.2005 2:12
Pukelis   спасибо, ВСЕ понял! :) Узнал много нового для …   6.05.2005 2:21
sheka   я бы использовал не пузырьковую, а гибридную: тот …   1.06.2011 20:43


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 4.05.2024 23:21
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name