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

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

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

> Как отсортировать?, двусторонний динамич. список
pukelis
сообщение 3.05.2005 12:17
Сообщение #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.
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Pukelis
сообщение 5.05.2005 20:59
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 5.05.2005 22:12
Сообщение #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
сообщение 5.05.2005 22:21
Сообщение #4


Новичок
*

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

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


спасибо, ВСЕ понял! smile.gif Узнал много нового для себя! теперь бы ето хорошенько запомнить и сказать-по литовски завтра ))) Мож еще к завтру каких вопросов придумаю ^_^
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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


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

 



- Текстовая версия 21.07.2025 20:11
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"