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

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

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

> Сортировка записей, где ошибка??
сообщение
Сообщение #1


Пионер
**

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

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


такая задача:
есть типизированный файл, сначала ввод данных, потом вывод в отсортированном виде по признакам(код отдела, код лаборатории, табельный номер).

uses crt;
TYPE
TZ=RECORD
code_otd:integer;
code_lab:integer;
TN: INTEGER;
data:integer;
code_nach:integer;
sum_nach:integer;
END;
mas=array[1..100] of tz;
tmas=^mas;
mas1=array [1..100] of string;
tmas1=^mas1;
VAR
ZAP: TZ;
f3: FILE OF TZ;
fl3: BOOLEAN;
FILENAME: string;
ANS,ans1: string;
Z:tmas;
st: tmas1;
c:tz;
st1,st2,st3: string;
k,t,i,j: integer;

BEGIN
clrscr;
writeLN('enter file name');
READLN(FILENAME);
ASSIGN (f3,FILENAME);
rewrite(f3);
ans:='y';
while (ans='y') do
begin
writeln ('kod otdela');
readln (zap.code_otd);
writeln ('kod laboratorii');
readln (zap.code_lab);
writeLN('tab nomer sotrudnika');
READLN(ZAP.TN);
writeLN('data');
READLN(ZAP.data );
writeLN('kod nachisleniya');
READLN(ZAP.code_nach);
writeLN('summa nachisleniya');
READLN(ZAP.sum_nach);
write (f3, ZAP);
writeLN('again? ( Y-da )');
READLN(ANS);
end;
close(f3);

reset(f3);
t:=filesize(f3);
getmem(Z,t*sizeof(zap));
k:=0;
while not(eof(f3)) do
begin
read(f3,zap);
inc(k);
Z^[k]:=zap;
end;
close(f3);
for i:=1 to k do
begin
str(z^[i].code_otd,st1);
str(z^[i].code_lab,st2);
str(z^[i].tn,st3);
st^[i]:=st1+st2+st3;
end;
for j:=1 to k-1 do
for i:=1 to k-j do
if st^[i]>st^[i+1] then
begin
c:=z^[i]; // <----------------тут было выделено
z^[i]:=z^[i+1]; // <---------- тут было выделено
z^[i+1]:=c; // <-------------тут было выделено
end;
rewrite(f3);
for i:=1 to t do
write(f3,z^[i]);
close(f3);
reset(f3);
while (not eof(f3)) do
begin
READ(f3,ZAP);
writeLN(ZAP.code_otd:5,ZAP.code_lab:5,zap.tn:7,ZAP.data:12,zap.code_nach:8,zap.sum_nach:8);
end;
close(f3);
readkey;
readln;
end.


М
Пользуйтесь тегами [ code = pas ] [ / code ]



и в том месте, где выделено жирным загвоздка! не пойму почему не сортируются записи...они же идут соответственно с st

заранее спасибо

Сообщение отредактировано: klem4 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 7)
сообщение
Сообщение #2


Гость






Тебе же уже показывали, как сортируются записи: Сортировка записей
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

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

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


это я вижу и помню!!
но я прошу посмотреть что у меня не так в этой программе...конкретно в выделенном месте! что если я сортирую по трем полям одновременно??
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

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


 for j:=1 to k-1 do
for i:=1 to k-j do
if st^[i]>st^[i+1] then
begin
c:=z^[i]; // <----------------тут было выделено
z^[i]:=z^[i+1]; // <---------- тут было выделено
z^[i+1]:=c; // <-------------тут было выделено
end;

а ты не меняешь st^[i] и st^[i+1]? может, имеет смысл этот массив тоже сортировать?


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

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

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


но я ведь его потом нигде не использую, просто каждому st[i] соответствует свой элемент в массиве записей z[i] с таким же номером
вот я и хочу поменять записи в массиве z
но не получается!!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

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


просто сортировка-то идет по сравнению этих строк...
в общем, я бы начала с того, чтобы попробовала их отсортировать.


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Пионер
**

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

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


и что потом делать когда только строки будут отсортированными??
я сделала и строки у меня сортируются правильно
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Пионер
**

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

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


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


procedure sortirovka;
Var
t,k,j,i:integer;
z:tmas;
c:TZ;
Begin
assign(osnov,'osnov');
reset(osnov);
t:=filesize(osnov);
getmem(z,t*sizeof(Zap));
k:=0;
while not(eof(osnov)) do
begin
read(osnov,Zap);
inc(k);
z^[k]:=zap;
end;
close(osnov);
For j:=1 to k-1 do
For i:=1 to k-j do
if z^[i].Tabnomr > z^[i+1].Tabnomr then
begin
c:=z^[i];
z^[i]:=z^[i+1];
z^[i+1]:=c;
end;
rewrite(osnov);
For i:=1 to t do
write(osnov,z^[i]);
close(osnov);
For j:=1 to k-1 do
For i:=1 to k-j do
if z^[i].CodeLab > z^[i+1].CodeLab then
begin
c:=z^[i];
z^[i]:=z^[i+1];
z^[i+1]:=c;
end;
rewrite(osnov);
For i:=1 to t do
write(osnov,z^[i]);
close(osnov);
For j:=1 to k-1 do
For i:=1 to k-j do
if z^[i].CodeOTD > z^[i+1].CodeOTD then
begin
c:=z^[i];
z^[i]:=z^[i+1];
z^[i+1]:=c;
end;
rewrite(osnov);
For i:=1 to t do
write(osnov,z^[i]);
close(osnov);
reset(osnov);
End;



Вот эта процедура делает то что тебе и мне надо )
VAR и TIPE оставляешь свои.
Ну там название файла переименуешь и т.д...


Предлагаю Модерам сделать эту процедурку универсальной и в FAQ по файлам, а то по всему форуму темы эти искать...бр....

Сообщение отредактировано: Renbo -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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