Опубликован: 12.02.2014 | Доступ: свободный | Студентов: 922 / 238 | Длительность: 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 проверяет, равны ли строки с точностью до регистра символов.