Опубликован: 12.02.2014 | Доступ: свободный | Студентов: 924 / 239 | Длительность: 11:22:00
Тема: Программирование
Специальности: Программист
Лекция 12:
Язык запросов
Вывод данных на печать
Далее создается класс printData с одноименным интерфейсом, предназначенный для вывода данных на печать (листинги 12.10–12.12).
properties
db : dbrel.
predicates
printRel: (unsigned, unsigned).
printDb: ().
printDb: (string Sex).
getName: (unsigned) -> string.
getNamesStr: (unsigned*) -> string.
Пример
12.10.
Интерфейс printData
constructors
new: (dbrel).
Пример
12.11.
Декларация класса printData
open core, console
facts
db : dbrel.
clauses
new(Db):-
db := Db.
printRel(Id1, Id2):-
writef("% - %\n", getName(Id1), getName(Id2)).
printDb():-
printDb("").
printDb(S):-
db:person_nd(Id, Name, Surname, Sex, IdF, IdM),
checkSex(S, Sex),
SpList = getSpouses(Id, Sex),
Spouses = getNamesStr(SpList),
writef("%-3%-10%-12%-3%-20%-20%\n", Id, Name,
Surname, Sex, getName(IdF), getName(IdM), Spouses),
fail.
printDb(_).
getName(Id) = string::format("% %", Name, Surname):-
db:person_nd(Id, Name, Surname, _, _, _),
!.
getName(_) = "-".
getNamesStr(IdL) = string::concatWithDelimiter(NL, ", "):-
NL = list::map(IdL, {(Id) = getName(Id)}).
predicates
checkSex: (string, string Sex) determ.
getSpouses: (unsigned Id, string Sex) -> unsigned*.
clauses
checkSex("", _):- !.
checkSex(S, S).
getSpouses(Id, dbrel::male) = [IdS || db:spouse_nd(Id, IdS)]:- !.
getSpouses(Id, _) = [IdS || db:spouse_nd(IdS, Id)].
Пример
12.12.
Имплементация класса printData
Считывание данных
Теперь создается класс readData с одноименным интерфейсом, который используется для получения сведений от пользователя (листинги 12.13–12.15).
properties
pd : printData.
predicates
readName: () -> string determ.
readSurname: () -> string determ.
readSex: () -> string determ.
readFather: () -> unsigned.
readMother: () -> unsigned.
readSpouse: (string Sex) -> unsigned.
readStr: () -> string.
readNonEmptyStr: () -> string determ.
getIdFromStr: (string) -> unsigned.
getIdFromUser: () -> unsigned determ.
Пример
12.13.
Интерфейс readData
constructors
new: (printData).
Пример
12.14.
Декларация класса readData
open core, console
facts
pd : printData.
clauses
new(PD):-
pd := PD.
readName() = Name:-
write("Введите имя: "),
Name = readNonEmptyStr().
readSurname() = Surname:-
write("Введите фамилию: "),
Surname = readNonEmptyStr().
readSex() = Sex:-
writef("Введите пол (%/%): ", dbrel::male, dbrel::female),
Sex = string::toLowerCase(readNonEmptyStr()),
(Sex = dbrel::male; Sex = dbrel::female),
!.
readFather() = IdF:-
write("Все мужчины:\n"),
pd:printDb(dbrel::male),
write("Укажите номер отца (или нажмите Enter): "),
IdF = getIdFromStr(readStr()).
readMother() = IdM:-
write("Все женщины:\n"),
pd:printDb(dbrel::female),
write("Укажите номер матери (или нажмите Enter): "),
IdM = getIdFromStr(readStr()).
readSpouse(Sex) = IdS:-
S = if Sex = dbrel::male then "и" else "а" end if,
writef("Укажите номер супруг% (или нажмите Enter): ", S),
IdS = getIdFromStr(readStr()).
readStr() = string::trim(readLine()).
readNonEmptyStr() = Str:-
Str = readStr(),
Str <> "".
getIdFromStr(S) = Id:-
Id = tryToTerm(unsigned, S),
pd:getName(Id) <> "-",
!.
getIdFromStr(_) = 0.
getIdFromUser() = Id:-
Name = readName(),
Surname = readSurname(),
NamesakeList = getNamesakes(Name, Surname),
Id = getId(NamesakeList).
predicates
getNamesakes: (string Name, string Surname) ->
tuple{unsigned, string, string, string, unsigned, unsigned}*.
getId: (tuple{unsigned, string, string, string, unsigned,
unsigned}*) -> unsigned determ.
printPersons: (tuple{unsigned, string, string, string, unsigned,
unsigned}*).
clauses
getNamesakes(Name, Surname) = [tuple(I, N, S, Sex, F, M) ||
pd:db:person_nd(I, N, S, Sex, F, M),
string::equalIgnoreCase(Name, N),
string::equalIgnoreCase(Surname, S)].
getId([tuple(Id, _, _, _, _, _)]) = Id:- !.
getId([]) = _:- !,
write("\nТаких сведений нет в базе данных\n"),
fail.
getId(L) = Id:-
printPersons(L),
write("\nУкажите номер: "),
Id = getIdFromStr(readStr()).
printPersons(L):-
list::forAll(L, {(tuple(Id, Name, Surname, Sex, F, M)):-
writef("% - % - % - % - % - %\n", Id, Name, Surname,
Sex, pd:getName(F), pd:getName(M))}).
Пример
12.15.
Имплементация класса readData
Предикат equalIgnoreCase проверяет, равны ли строки с точностью до регистра символов.