1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
По возрастанию ли - убыванию - нет разницы. Надо всего лишь создать некую процедуру, что для таких АСОВ как Вы - не составит труда.. ^_^ Жду с нетерпением Вашей помощи! ;)
Код
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);
Ну а вот и вопросы, которые я собирался тебе задать:
Зачем каждый раз в цикле перед присваиванием 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)
Вот пока что все вопросы Ответь до 12 завтрашнего дня, ок? :P
Зачем каждый раз в цикле перед присваиванием arr[i] значения переменной ch присваивать ей пробел? И что конкретно делает предпоследняя строчка?
Пробел - это для гарантии того, что ни при каких условиях старое значение элемента массива не сохранится.
А предпоследняя строчка делает вот что: если в процедуру передана константа N, равная размеру массива arr, то ничего не происходит, т.е. сразу же после прочтения из файла всех элементов массива выполнение процедуры заканчивается. А вот если мне нужно кроме строки прочесть еще и несколько символов, чтобы при следующем заходе опять спокойно считывать саму строку, то я передам в N не 10, а большее число, и процедура считает из файла дополнительно N - high(arr) символов. Кстати, high(arr) это верхняя граница массива Arr, то есть 10 Есть такая функция в Паскале.
Цитата(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' как признак типа комнаты, правда? А сами 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 ). Вот эту ошибку ОЧЕНЬ трудно найти, она никак компилятором не определяется
Как ее избежать? Правильно:
Var a, b: Word; c: LongInt; begin a := 300; b := 300; c := LongInt( a ) * b; WriteLn( c ); end.
Теперь результат будет заноситься в LongInt, как более емкий, и усечения не произойдет...