Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2009, 12:36   #1
rainbow
Форумчанин
 
Регистрация: 06.09.2008
Сообщений: 156
По умолчанию

Помогите пожалуйста отсортировать информацию обменом в типизированном файле
Код:
type
Stud=Record
FIO:String[20];
INYAZ:String[10];
MATEM:String[9];
Первая строка содержит фамилии, вторая изучаемый язык (либо английский, либо немецкий), третья строка - рейтинг по математике (трехзначное число).
Надо отсортировать обменом, сначало изучающих английский язык, по возрастанию рейтинга по математике,
затем то же самое, но изучающих немецкий язык.
Ужас, как я устал от тупизны...
rainbow вне форума Ответить с цитированием
Старый 05.03.2009, 12:42   #2
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

А в чем проблема?
1. Не умеете сортировать обменом?
2. Не умеете сортировать записи по полю?
3. Не умеете сортировать непосредственно в файле, используя Seek, Pead, Write?
puporev вне форума Ответить с цитированием
Старый 05.03.2009, 13:08   #3
rainbow
Форумчанин
 
Регистрация: 06.09.2008
Сообщений: 156
По умолчанию

Цитата:
Сообщение от puporev Посмотреть сообщение
А в чем проблема?
1. Не умеете сортировать обменом?
2. Не умеете сортировать записи по полю?
3. Не умеете сортировать непосредственно в файле, используя Seek, Pead, Write?
1. Умею сортировать только целые значения, но не строки.
2. Записи по полю сортировать умею, но только на Delphi и то только в базах данных Access и т.п, а в типизированных файлах не понимаю как, вот и хочу научиться.
3. Сортировать непосредственно в файле умею, но только с перестановкой по номеру записи, а не по полю.
Ужас, как я устал от тупизны...

Последний раз редактировалось rainbow; 05.03.2009 в 13:11.
rainbow вне форума Ответить с цитированием
Старый 06.03.2009, 07:50   #4
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

1. Поле математика по условию число из 3 цифр, поэтому это не строковый тип, а нужно объявить пользовательский тип
type Tchsl=100..999; и дальше пользоваться им. А если уж надо string, то string[3];
2.Создаем массив записей sp:array[1..100] of Stud;
Сортировка хоть в массиве хоть в файле идет по такому принципу:
Код:
var x:Stud;
................................
for i:=1 to n-1 {to filesize(f)-2}
for j:=i+1 to n {to filesize(f)-1}
if (sp[i].inyaz=inglish) and (sp[j].inyaz=inglish) and(sp[i].matem>sp[j].matem)
then begin
  x:=sp[i];
  sp[i]:=sp[j];
  sp[j]:=x;
end;
Причем алгоритм сортировки не зависит от того, рейтинг число или строка, строки сравниваются также как и числа.
В файле конечно сам переход по элементам не так пишется,
Код:
Seek(f,i);
Read(f,a);
Seek(f,j);
Read(f,b);
if (a.inyaz=inglish) and (b.inyaz=inglish) and(a.matem>b.matem)
then begin
x:=a;a:=b;b:=x;
 Seek(f,i);
  write(f,a);
  Seek(f,j);
  write(f,x);
Вот примерно так, попробуйте разобраться.
puporev вне форума Ответить с цитированием
Старый 06.03.2009, 10:14   #5
rainbow
Форумчанин
 
Регистрация: 06.09.2008
Сообщений: 156
По умолчанию

puporev Спасибо за код
но остались некоторые вопросы:
Цитата:
Сообщение от puporev Посмотреть сообщение
1. Поле математика по условию число из 3 цифр, поэтому это не строковый тип, а нужно объявить пользовательский тип
type Tchsl=100..999; и дальше пользоваться им.
А можно сделать так ?
Код:
type
Tchsl=100..999;
Stud=record
FIO:String[20];
INYAZ:String[10];
MATEM:Tchsl;
end;
Во втором коде
Код:
Seek(f,i);
Read(f,a);
Seek(f,j);
Read(f,b);
if (a.inyaz=inglish) and (b.inyaz=inglish) and(a.matem>b.matem)
then begin
x:=a;a:=b;b:=x;
 Seek(f,i);
  write(f,a);
  Seek(f,j);
  write(f,x);
Я так понимаю, мы считываем две строки в переменные a и b должны быть типа Stud. i , j - соответственно номера записи строк типа byte или integer, потом сравниваем их по условию, и если условие выполняется, то меняем их местами, или не так? Если так, то надо загнать все в цикл, чтобы программа до конца файла прогулялась.
Ужас, как я устал от тупизны...

Последний раз редактировалось rainbow; 06.03.2009 в 10:24.
rainbow вне форума Ответить с цитированием
Старый 06.03.2009, 15:27   #6
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Цитата:
А можно сделать так ?
А почему нельзя? Вы сделайте и проверьте, сами увидите, потом проверьте как сначала хотели, тоже посмотрите, может и так можно. Все познается в опытах. Читайте Пушкина.
Цитата:
Я так понимаю, мы считываем две строки в переменные a и b должны быть типа Stud. i , j - соответственно номера записи строк типа byte или integer, потом сравниваем их по условию, и если условие выполняется, то меняем их местами, или не так? Если так, то надо загнать все в цикл, чтобы программа до конца файла прогулялась.
Вы абсолютно правы!
Код:
reset(f);
for i:=0 to filesize(f)-1 do{в файле счет от ноля, а filesize-количество компонент}
  begin
    ......
  end;
puporev вне форума Ответить с цитированием
Старый 07.03.2009, 09:26   #7
rainbow
Форумчанин
 
Регистрация: 06.09.2008
Сообщений: 156
По умолчанию

Сделал вот чего:
sv:array[1..100] of Stud;
Код:
Procedure Delete; {удаление строки из типизированного файла}
const
temp:string='temp';
var
st:stud;
delstr:string;
s:boolean;
begin
ClrScr;
Writeln('Введите Фамилию удаляемого');
Readln(delstr);
{$I+}
Reset(F);
{$I-}
while not eof(F) do
begin
read(F,st);
s:=false;
if st.FIO=delstr then
begin
Num:=0;
repeat
inc(Num);
until st.FIO=delstr;
seek(F,Filesize(f)-1);
read(F,st);
seek(F,Num);
write(F,st);
seek(F,Filesize(F)-1);
truncate(F);
zapis(temp);
erase(F);
zagr(Filename,Num);
s:=true;
end;
end;
if not s then
begin
Writeln ('С такой фамилией не найден');
readln;
end;
Close(F);
Print;
end;

procedure Dobavl; {добаление в типизированный файл сделано} 
                         {через текстовый файл, как по другому я не знаю}
const
temp:string='temp';
var
T1:text;
st:stud;
begin
Zapis_t(temp);
Assign(T1,temp);
Append(T1);
vvod;
for i:=1 to Num do
With Sv[i] do
begin
Writeln(T1,FIO);
Writeln(T1,INYAZ);
Writeln(T1,MATEM);
end;
Close(T1);
Zagr_t(temp,Num); {загрузка с текстового формата}
Zapis(Filename); {запись в типизированный файл}
Erase(T1);
Print;
end;

Procedure Sort; {сортировка в типизированном файле}
var
a,b,x:stud; {i,j:integer}
begin
assign(F,Filename+'.dat');
reset(F);
for i:=1 to filesize(f)-2 do
for j:=i+1 to filesize(f)-1 do
if (sv[i].INYAZ='english') and (sv[j].INYAZ='english') and (sv[i].MATEM>sv[j].MATEM) then
begin
x:=sv[i];
sv[i]:=sv[j];
sv[j]:=x;
end;
for i:=0 to filesize(f)-1 do
begin
Seek(F,i);
Read(F,a);
Seek(F,j);
Read(F,b);
if (a.INYAZ='english') and (b.INYAZ='english') and (a.MATEM>b.MATEM) then
begin
x:=a; a:=b; b:=x;
Seek(F,i);
Write(F,a);
Seek(F,j);
Write(F,x);
end;
end;
ClrScr;
Print; {вывод информации на экран}
end;
Но удаление не работает на удаление нескольких одинаковых строк, если встречается несколько одинаковых строк, то программа удаляет то чего не надо, а сортировка вообще не работает.
Ужас, как я устал от тупизны...

Последний раз редактировалось rainbow; 07.03.2009 в 10:41.
rainbow вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Расчет числа строк в типизированном файле 1234 Паскаль, Turbo Pascal, PascalABC.NET 6 20.05.2008 11:14
Отсортировать по алфавиту Rio309 Помощь студентам 2 09.03.2008 22:52
Как узнать информацию о PE файле Smoke Win Api 5 02.10.2007 13:10
поток, который по завершению (Terminate) передает в основную форму информацию о файле 1Andrey1 Общие вопросы Delphi 5 10.09.2007 19:40
info video - получить информацию о видео файле Toxa Общие вопросы Delphi 1 04.12.2006 17:02