Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.14.142.115] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Здравствуйте! Не работает сортировка списка ни одним способом. Пробовал и вставками и пузырьком. Когда делаю вставками, вылезает exitcode 216 при начале обмена. В общем вот код:
type el=^opisanie; opisanie= record model: string[20]; ves: integer; tip_corp: string[20]; diag_d: string[10]; dif: string[10]; f_mem: string[5]; cam: string[10]; ovpam: integer; next,prev: el; end; var SE: opisanie; s: file of opisanie; n,x,r,i: integer; kolsymb: integer; search1, search2: string[15]; h,p,p1,first: el; tmp: string; procedure sort2; {собственно 1 вариант} var i,j: integer; begin for i:=1 to (n-1) do begin p:=h; for j:=1 to (n-1) do begin p1:=p^.next; if p^.model > p1^.model then begin tmp:=p^.model; p^.model:=p1^.model; p1^.model:=tmp; end; p:=p1; end; end; p:=h; for i:=1 to n do begin writeln(p^.model); p:=p^.next; end; end; function sortvib (var first: el):el; {2 вариант} var l,p:el; tmp: string; begin l:=first; while l^.next <> nil do begin p:=l^.next; while p<>nil do begin if l^.model>p^.model then begin tmp:=l^.model; l^.model:=p^.model; p^.model:=tmp; end; p:=p^.next; end; l:=l^.next; end; end; procedure sortvs (var first: el); {3 вариант} var i,j: el; t: string; begin i:= first; while i<>nil do begin t:=i^.model; j:=i^.prev; while (j<>nil) and (t<j^.model) do begin j^.next^.model:=j^.model; j:=j^.prev; end; if j=nil then first^.model:=t else j^.next^.model:=t; i:=i^.next; end; end; procedure sort1 (first: el); {4 вариант} var sn,nd: el; tmp: string; begin getmem(sn, sizeof(opisanie)); nd:=first; while nd<nil do {>} begin sn:=nd^.next; while sn<>nil do begin if sn^.model < nd^.model then begin tmp:=sn^.model; sn^.model:=nd^.model; nd^.model:=tmp; end; sn:=sn^.next; end; nd:=nd^.next; end; end; begin sortvs (first); {последним этот пробовал} end; Уже больше двух недель вожусь с этим. Надо уже курсач защищать, а у меня эта сортировка неработает. PS. Поиском прользовался, подобное находил, от туда кстати тоже есть способ. Просьба ответить как можно быстрее.. Прикреплённый файлSony2.rar (1,57 Кбайт, скачиваний: 272) Добавлено Забыл совсем пользуюсь FreePascal. |
Сообщ.
#2
,
|
|
|
Собственно, сразу же следует вопрос: а где хоть как-то инициализируется First? Он же у тебя неинициализирован, как ты хочешь, чтоб список сортировался? Списка-то фактически и нет...
|
Сообщ.
#3
,
|
|
|
В том-то и дело, что я незнаю как его сортировать. Процедуру sort1 я взял в одной работе, там работает. Хотя переписал все учитывая, не помогло.
|
Сообщ.
#4
,
|
|
|
Еще раз: ЧТО сортировать? Чтоб что-то сортировать, надо сначала это что-то СОЗДАТЬ. Где создается список по-твоему?
|
Сообщ.
#5
,
|
|
|
вот здесь:
|
Сообщ.
#6
,
|
|
|
if n=1 then begin clrscr; new (p); writeln ('Введите описание телефона'); writeln; writeln ('модель: '); readln (p^.model); for i:=1 to length(SE.model) do SE.model[i]:=upcase(SE.model[i]); writeln ('вес: '); readln (p^.ves); writeln ('тип корпуса: '); readln (p^.tip_corp); writeln ('диагональ дисплея: '); readln (p^.dif); writeln ('разрешение: '); readln (p^.diag_d); writeln ('встроенная память: '); readln (p^.ovpam); writeln ('поддержка флеш-карт: '); readln (p^.f_mem); writeln ('камера: '); readln (p^.cam); p^.next:=nil; assign (s, 'D:\fp\test.txt'); reset (s); seek (s, filesize (s)); write (s, p^); close (s); writeln ('Данные записаны.'); readln; end; Добавлено сортировать надо по полю model, по алфавиту. Добавлено разобрался, кажется... У меня нет добавления в список елементов. Я правильно понимаю? |
Сообщ.
#7
,
|
|
|
Цитата MrSmmiT @ Наконец то Да, ты правильно понимаешь. У меня нет добавления в список елементов. Я правильно понимаю? |
Сообщ.
#8
,
|
|
|
можно сделать так?
procedure ad (var spis1: el; zhach1: string); var tmp: el; begin if spis1=nil then begin new(spis1); tmp:= spis1; end else begin tmp:= spis1; while tmp^.next <> nil do new(tmp^.next); tmp:=tmp^.next; end; tmp^.next:=nil; tmp^.model:=zhach1; end; Только как сделать, чтобы добавлялись все поля (model, ves, tip_corp и т.д.)? Добавлено в лекции у меня написано так: procedure Create_New_Elem(var p: el); begin New (p); Writeln ('введите значение первого информационного поля: '); Readln ( p^.inf1 ); Writeln ('введите значение второго информационного поля: '); Readln ( p^.inf2 ); p^.next := nil; {все поля элемента должны быть инициализированы} end; Добавлено Разьве оно не совпадает с моим Цитата begin clrscr; new (p); writeln ('Введите описание телефона'); writeln; writeln ('модель: '); readln (p^.model); for i:=1 to length(SE.model) do SE.model[i]:=upcase(SE.model[i]); writeln ('вес: '); readln (p^.ves); writeln ('тип корпуса: '); readln (p^.tip_corp); writeln ('диагональ дисплея: '); readln (p^.dif); writeln ('разрешение: '); readln (p^.diag_d); writeln ('встроенная память: '); readln (p^.ovpam); writeln ('поддержка флеш-карт: '); readln (p^.f_mem); writeln ('камера: '); readln (p^.cam); p^.next:=nil; assign (s, 'D:\fp\test.txt'); reset (s); seek (s, filesize (s)); write (s, p^); close (s); writeln ('Данные записаны.'); readln; end; Добавлено Хотя скорее всего так что-то не так. Потому что в другой работе елементы не создавались. |
Сообщ.
#9
,
|
|
|
Вроде бы сделал запись елементов.
procedure ad (var first: el); var p: el; model, tip_corp, diag_d, dif, f_mem, cam: string[20]; ves, ovpam: integer; begin if first=nil then writeln ('Введите описание телефона'); writeln; writeln ('модель: '); readln (model); writeln ('вес: '); readln (ves); writeln ('тип корпуса: '); readln (tip_corp); writeln ('диагональ дисплея: '); readln (diag_d); writeln ('разрешение: '); readln (dif); writeln ('встроенная память: '); readln (ovpam); writeln ('поддержка флеш-карт: '); readln (f_mem); writeln ('камера: '); readln (cam); begin new(p); p^.next:=nil; p^.model:=model; p^.ves:=ves; p^.tip_corp:=tip_corp; p^.diag_d:=diag_d; p^.dif:=dif; p^.ovpam:=ovpam; p^.f_mem:=f_mem; p^.cam:=cam; { read(model); \ read(ves); | read(tip_corp); | read(diag_d); | непонимаю зачем это, оно вроде выше есть,но и без него работает (вроде) read(dif); | read(ovpam); | read(f_mem); | read(cam);} / end; writeln; end; только теперь незнаю как записать елемент в файл. |
Сообщ.
#10
,
|
|
|
Вроде бы сделал запись елементов.
procedure ad (var first: el); var p: el; model, tip_corp, diag_d, dif, f_mem, cam: string[20]; ves, ovpam: integer; begin if first=nil then writeln ('Введите описание телефона'); writeln; writeln ('модель: '); readln (model); writeln ('вес: '); readln (ves); writeln ('тип корпуса: '); readln (tip_corp); writeln ('диагональ дисплея: '); readln (diag_d); writeln ('разрешение: '); readln (dif); writeln ('встроенная память: '); readln (ovpam); writeln ('поддержка флеш-карт: '); readln (f_mem); writeln ('камера: '); readln (cam); begin new(p); p^.next:=nil; p^.model:=model; p^.ves:=ves; p^.tip_corp:=tip_corp; p^.diag_d:=diag_d; p^.dif:=dif; p^.ovpam:=ovpam; p^.f_mem:=f_mem; p^.cam:=cam; { read(model); \ read(ves); | read(tip_corp); | read(diag_d); | непонимаю зачем это, оно вроде выше есть. если убрать скобки, read(dif); | то после записи всех ел-ов пустые строки и если что-то ввести, то exicode 216. read(ovpam); | read(f_mem); | read(cam);} / end; writeln; end; только теперь незнаю как записать елемент в файл. После процедуры пишу: assign (s, 'D:\fp\test.txt'); reset (s); seek (s, filesize (s)); write (s, p^); close (s); writeln ('Данные записаны.'); readln; но ругается на p^ в строке write (s, p^); |
Сообщ.
#11
,
|
|
|
MrSmmiT, смотри:
type el=^titem; opisanie= record model: string[20]; ves: integer; tip_corp: string[20]; diag_d: string[10]; dif: string[10]; f_mem: string[5]; cam: string[10]; ovpam: integer; end; // тысячу раз говорил - повторяю еще раз: Мухи отдельно, котлеты - отдельно. // Какое отношение имеют поля prev/next к телефону? Никакого, это доп. информация. // Вот и храни эту доп. информацию там, где она нужна - это элемент списка!!! // На кой ее пихать в файл? Все равно там будет записан мусор, при следующем запуске // все адреса, которые были записаны раньше, поменяются, и твои prev/next будут // указывать "в космос". titem = record data : opisanie; next,prev: el; end; // ... procedure GetPhone(var Op : opisanie); begin with Op do begin writeln ('Введите описание телефона'); writeln; writeln ('модель: '); readln (model); writeln ('вес: '); readln (ves); writeln ('тип корпуса: '); readln (tip_corp); writeln ('диагональ дисплея: '); readln (diag_d); writeln ('разрешение: '); readln (dif); writeln ('встроенная память: '); readln (ovpam); writeln ('поддержка флеш-карт: '); readln (f_mem); writeln ('камера: '); readln (cam); end; end; // Добавляем данные очередного элемента к списку procedure Add(var first, last : el; const Op : opisanie); var p : el; begin new(p); p^.data := Op; p^.next := nil; p^.prev := last; if first = nil then first := p else last^.next := p; last := p; end; |
Сообщ.
#12
,
|
|
|
Спасибо! Заработало!
Только при сравнении элемнтов пишет: Operator is not overloaded: "opisanie" < "opisanie". procedure sortvs (var first: el); var i,j: el; t: opisanie; begin i:= first; while i<>nil do begin t:=i^.data; j:=i^.prev; while (j<>nil) and (t<j^.data) do begin j^.next^.data:=j^.data; j:=j^.prev; end; if j=nil then first^.data:=t else j^.next^.data:=t; i:=i^.next; end; end; |
Сообщ.
#13
,
|
|
|
Цитата MrSmmiT @ Естественно. Ты не можешь сравнивать сразу всю запись с другой записью. Надо ж отсортировать по значению какого-то поля? Вот эти поля и сравнивай между собой. Только при сравнении элемнтов пишет: Operator is not overloaded: "opisanie" < "opisanie". |
Сообщ.
#14
,
|
|
|
Цитата volvo877 @ Вот эти поля и сравнивай между собой. то есть? Добавлено можно пример? если не сложно. |
Сообщ.
#15
,
|
|
|
Ну, если тебе надо упорядочить список по названию модели - то так:
// ... while (j<>nil) and (t.model<j^.data.model) do // ... |