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

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

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

> Поиск однофамильцев в типизированном файле
сообщение
Сообщение #1


Новичок
*

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

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


Нужно вывести из типизированного ф-ла однофамильцев. Типизированный файл состоит из типа запись.

Например: при запросе фамилии Петрова выводились все стоки с фамилиями Петрова и Петров.
или при запросе : Петров выводились и Петров и Петрова.
Как можно сделать проверку на подстановку или отброс окончаний?

Всем заранее спасибо!

procedure print_usl;
begin
reset(F);
if (filesize(F) <> 0) then
begin
repeat
clrscr;
Writeln('Введите ФИО студента ');
readln(Str_v);
{cp:=copy()}
Chek_DL_SL(Str_v, 15);
Chek_FIO(Str_v);
if f1 = false then
write(' ');
until (f1 = true) and (f2=true);
str_v:=str_v;

K:=0;
While not EoF (F) do begin
read(F,S);

IF str_v[length(str_v)]= 'а' then
begin
s.fio_stud:=copy(str_v, 1, length(str_v)-1);
end else
begin
s.fio_stud:=str_v;

print_shapka;
k:=1;

writeln;
Write( #179);
Write( S.FIO_Stud:16);
Write( #179);
Write( S.Stip:9);
Write( #179);
Write( S.FIO_mum:14);
Write( #179);
Write( S.zp_mum:8);
Write( #179);
Write( S.FIO_ot:14);
Write( #179);
Write( S.zp_ot:8);
Write( #179);
writeln;

end;
end;
if k=0 then writeln('Студентов с фамилией ',str_v, ' не найдено' );
readkey;
clrscr;
close(F);
Osh;

end
else
begin
clrscr;
Writeln('Файл пуст. Записи не найдены');
close(F);
osh;
readkey;
clrscr;
end;
end;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

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


Ну вот и сделай так:

IF str_v[length(str_v)]= 'а' then
test_fio:=copy(str_v, 1, length(str_v)-1);
else
test_fio:=str_v;


, а потом в цикле сравнивай test_fio с текущей фамилией:

if (F.FIO_Stud = test_fio) or (F.FIO_Stud = test_fio + 'a') then
begin
Inc(k);
end;
(Можно было бы искать через if pos(F.FIO_Stud, test_fio) > 0 then, но будут ложные срабатывания: "Петров" и "Петровский" будут считаться похожими, а это не так).

Но это не самая хорошая идея, сравнивать напрямую. Очень много несоответствий начнется. Скажем, фамилия "Ланская" - как сравнить ее с "Ланской"? smile.gif Проверять на 'ая'? Найдется несколько других примеров, с которыми ни проверка на "а", ни проверка на "ая" не сработают. Т.е., тебе придется делать много проверок. У меня есть более интересная идея. Есть такое понятие, как "расстояние Левенштейна" - т.е., мера похожести двух строк. (Это не важно сейчас, но высчитывается эта мера как количество шагов, которые нужно проделать для преобразования одной строки в другую. Чем меньше это количество - тем строки ближе. Будет логично предположить, что для мужских/женских фамилий дистанция Левенштейна не будет больше 2, т.е., максимум за 2 шага из одной фамилии можно получить другую). Я бы все-таки подумал в эту сторону. Чем добавлять десятки проверок, и не факт, что будут учтены все сочетания, проще сделать подсчет этой дистанции, и проверять ее. Подумай над этим. Это из области Fuzzy Search, т.е., Нечеткого Поиска, а у тебя как раз поиск нечеткий, у тебя не жестко заданная строка, которую надо найти, а нужно "найти что-то, очень похожее вот на это".
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

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

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


Не получилось. Или я не понял куда подставить этоsad.gif

Вот весь проект.. Конечно сложно там во всем наверное будет быстро разобраться.. Но может получится.

Эта процедура в модуле под названием PECHAT а запуск происходит через MENU

Сообщение отредактировано: alex9910 -


Прикрепленные файлы
Прикрепленный файл  PR2.zip ( 103.81 килобайт ) Кол-во скачиваний: 230
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


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

 





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