Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод ПРОЛОГ ДОМ Назаров июнь 2014.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
179.71 Кб
Скачать

5. Примеры выполнения домашней работы

Пример 1.

Задание: Написать программу поиска среднеобеспеченных семей. Среднеобеспеченной считается семья, на одного человека которой приходится в месяц от Хmin до Xmax рублей.

Хmin, Xmax задаются пользователем.

Информация хранится в виде:

описание_семьи(отец, мать, ребенок1, ребенок2).

данные_о_члене_семьи(ФИО, пол, возраст, зарплата).

Для простоты считаем, что в семье не более двух детей. При отсутствии запрашиваемых сведений предусмотреть соответствующий ответ.

Описание используемых предикатов:

описание_семьи(string, string,string,string).

данные_о_члене_семьи(string,string,integer,integer).

поиск_среднеоб_семей(integer,integer).

/*поиск_среднеоб_семей(Хmin, Xmax)предназначен для поиска результата*/

старт1. /* предназначен для вывода заголовка*/

старт2. /*предназначен для ввода данных для поиска */

поиск_среднеоб_семей2(string,string,string,string,real).

/*поиск_среднеоб_семей2(отец,мать,ребенок1,ребенок2,усредн_сумма_зарплат_членов_семьи)*/

открыть_файл(file,string). /* предназначен для проверки наличия файла открыть_файл(file,исх_файл)*/

возврат(string). /* предназначен для поиска новых сведений по другим данным

Хmin и Xmax, возврат на старт2 */

В программе эти предикаты имеют следующий вид:

opissem(string,string, string, string).

svedsem(string,string,integer,real).

poisk(real,real).

start1.

start2.

poisk2(string,string,string,string,real).

openFile(file,string).

runotv(string).

Исходные данные:

Исходными данными в рассматриваемом примере являются значения Хmin и Xmax, которые вводит пользователь, а также сведения из базы данных, которая хранится в текстовом файле «sem.dat».

Содержание файла «sem.dat»:

opissem("Иванов Олег Васильевич","Иванова Ольга Ивановна","Иванов Кирилл Олегович","Иванова Ирина Олеговна").

opissem("Карпович Иван Васильевич","Карпович Ольга Вадимовна","Карпович Ольга Ивановна","Карпович Ирина Ивановна").

opissem("Васин Олег Федорович","Иванова Елена Ивановна","Васин Николай Олегович","Васина Лидия Олеговна").

opissem("Ферсев Олег Васильевич","Ферсева Инга Ивановна","Ферсев Кирилл Олегович","Ферсев Иван Олегович").

opissem("Фалиев Федор Васильевич","-","Фалиев Кирилл Федорович","-").

opissem("-","Лапушкина Любовь Валентиновна","Васенкин Кирилл Олегович","Покушкина Ирина Леонидовна").

svedsem("Иванов Олег Васильевич","м",29,40000).

svedsem("Иванова Ольга Ивановна","ж",28,25000).

svedsem("Иванов Кирилл Олегович","м",5,0).

svedsem("Иванова Ирина Олеговна","ж",3,0).

svedsem("Карпович Иван Васильевич","м",50,25000).

svedsem("Карпович Ольга Вадимовна","ж",45,25000).

svedsem("Карпович Ольга Ивановна","ж",20,25000).

svedsem("Карпович Ирина Ивановна","ж",15,0).

svedsem("Васин Олег Федорович","м",60,20000).

svedsem("Иванова Елена Ивановна","ж",45,35000).

svedsem("Васин Николай Олегович","м",25,45000).

svedsem("Васина Лидия Олеговна","ж",16,0).

svedsem("Ферсев Олег Васильевич","м",25,40000).

svedsem("Ферсева Инга Ивановна","ж",25,15000).

svedsem("Ферсев Кирилл Олегович","м",3,0).

svedsem("Ферсев Иван Олегович","м"1,0).

svedsem("Фалиев Федор Васильевич","м",45,25000).

svedsem("Фалиев Кирилл Федорович","м",10,0).

svedsem("Лапушкина Любовь Валентиновна","ж",35,25000).

svedsem("Васенкин Кирилл Олегович","м",19,0).

svedsem("Покушкина Ирина Леонидовна","ж",10,0).

Выходные данные:

Выходными данными являются сведения о семье (в виде ФИО всех членов семьи), средний доход которой принадлежит интервалу от Хmin до Xmax.

Описание запросов пользователя:

После того как пользователь вводит значения Хmin и Xmax, ему выдается результат:

Средне обеспеченной считается семья, на одного человека которой

приходится в месяц от Хmin до Xmax рублей.

Хmin= <Xmin>

Xmax= <Xmax>

После того как результат будет найден, у пользователя программа запросит о продолжении в виде следующего диалога:

Найти еще ?(yes/no) <Otv>

Если Otv= yes, то пользователь сможет снова задать значения Хmin и Xmax, и найти среднеобеспеченные семьи. Если Otv=no, то пользователь завершает работу с программой.

Описание выдаваемых пользователю сообщений:

Если исходный файл «sem.dat» не найден в папке, в которой находится программа, то программа выдает сообщение:

Файл с именем <<N>> не найден!

Листинг программы:

domains

sarpl=real

sex=string

woman=string

man=string

childs1=string

childs2=string

vosr=integer

sum=real

file=dbase

database

opissem(man,woman,childs1,childs2)

svedsem(string,sex,vosr,sarpl)

predicates

poisk(real,real).

start1.

start2.

poisk2(string,string,string,string,sum).

openFile(file,string).

runotv(string).

goal

start1.

clauses

start1:-nl,nl,write("Пример1 . Автор: Полятыкина Т.И."),

openFile(dbase,"sem.dat"),consult("sem.dat"),start2.

start2:-nl,write(" Среднеобеспеченной считается семья,

на одного человека которой "),nl,

write(" приходится в месяц от Хmin до Xmax рублей."),nl,

write(" Xmin="),readreal(Xmin),nl,

write(" Xmax="),readreal(Xmax),nl,

write("К таким относятся:"),

poisk(Xmin,Xmax),nl,nl,

write(" Найти еще ?(yes/no) "),

readln(Otv),runotv(Otv).

runotv(Otv) :-Otv="yes", start2.

runotv(Otv) :-Otv="no",!.

poisk(Xmin,Xmax):-opissem(M,V,C1,C2),poisk2(M,V,C1,C2,Sum),

Sum>=Xmin,Sum<=Xmax,nl,

write("Отец: ",M," Мать: ",V," Ребенок1: ",C1," Ребенок2: ",C2),fail.

poisk(Xmin,Xmax):-nl,write("Конец.").

poisk2(M,V,C1,C2,Sum):-M<>"-",svedsem(M, "м",_,S1),V<>"-",

svedsem(V, "ж",_,S2),

svedsem(C1,_,VO1,S3),VO1<18,C2<>"-",

svedsem(C2,_,VO2,S4),VO2<18,

Sum=(S1+S2+S3+S4)/4.

poisk2(M,V,C1,C2,Sum):-M<>"-",svedsem(M, "м",_,S1),V<>"-",

svedsem(V, "ж",_,S2),

svedsem(C1,_,VO1,S3),VO1<18,C2="-",

Sum=(S1+S2+S3)/3.

poisk2(M,V,C1,C2,Sum):-M<>"-",svedsem(M, "м",_,S1),V="-",

svedsem(C1,_,VO1,S3),VO1<18,C2<>"-",

svedsem(C2,_,VO2,S4),VO2<18,

Sum=(S1+S3+S4)/3.

poisk2(M,V,C1,C2,Sum):-M<>"-",svedsem(M, "м",_,S1),V="-",

svedsem(C1,_,VO1,S3),VO1<18,C2="-",

Sum=(S1+S3)/2.

poisk2(M,V,C1,C2,Sum):-M<>"-",svedsem(M, "м",_,S1),V="-",

svedsem(C1,_,VO1,S3),VO1>=18,C2="-",

Sum=S1.

poisk2(M,V,C1,C2,Sum):-M<>"-",svedsem(M, "м",_,S1),V="-",

svedsem(C1,_,VO1,S3),VO1>=18,C2<>"-",

svedsem(C2,_,VO2,S4),VO2<18,Sum=(S1+S4)/2.

poisk2(M,V,C1,C2,Sum):-M<>"-",svedsem(M, "м",_,S1),V="-",

svedsem(C1,_,VO1,S3),VO1<18,C2<>"-",

svedsem(C2,_,VO2,S4),VO2>=18,Sum=(S1+S3)/2.

poisk2(M,V,C1,C2,Sum):-M<>"-",svedsem(M, "м",_,S1),V="-",

svedsem(C1,_,VO1,S3),VO1>=18,C2<>"-",

svedsem(C2,_,VO2,S4),VO2>=18,Sum=S1.

poisk2(M,V,C1,C2,Sum):-M="-",V<>"-",svedsem(V, "ж",_,S2),

svedsem(C1,_,VO1,S3),VO1<18,C2<>"-",

svedsem(C2,_,VO2,S4),VO2<18,

Sum=(S2+S3+S4)/3.

poisk2(M,V,C1,C2,Sum):-M="-",V<>"-",svedsem(V, "ж",_,S2),

svedsem(C1,_,VO1,S3),VO1<18,C2="-",

Sum=(S2+S3)/2.

poisk2(M,V,C1,C2,Sum):-M="-",V<>"-",svedsem(V, "ж",_,S2),

svedsem(C1,_,VO1,S3),VO1>=18,C2="-",

Sum=S2.

poisk2(M,V,C1,C2,Sum):-M="-",V<>"-",svedsem(V, "ж",_,S2),

svedsem(C1,_,VO1,S3),VO1>=18,C2<>"-",

svedsem(C2,_,VO2,S4),VO2<18,Sum=(S2+S4)/2.

poisk2(M,V,C1,C2,Sum):-M="-",V<>"-",svedsem(V, "ж",_,S2),

svedsem(C1,_,VO1,S3),VO1<18,C2<>"-",

svedsem(C2,_,VO2,S4),VO2>=18,

Sum=(S2+S3)/2.

poisk2(M,V,C1,C2,Sum):-M="-",V<>"-",svedsem(V, "ж",_,S2),

svedsem(C1,_,VO1,S3),VO1>=18,C2<>"-",

svedsem(C2,_,VO2,S4),VO2>=18,Sum=S2.

openFile(dbase,"sem.dat"):- existfile("sem.dat"),!.

openFile(_,N):-nl,write("Файл с именем ",N," не найден!").

Контрольный пример:

Среднеобеспеченной считается семья, на одного человека которой

приходится в месяц от Хmin до Xmax рублей.

Xmin=12000

Xmax=24000

К таким относятся:

Отец:Иванов Олег Васильевич Мать:Иванова Ольга Ивановна Ребенок1:Иванов Кирилл Олегович Ребенок2:Иванова Ирина Олеговна

Отец:Карпович Иван Васильевич Мать:Карпович Ольга Вадимовна Ребенок1:Карпович Ольга Ивановна Ребенок2:Карпович Ирина Ивановна

Отец:Васин Олег Федорович Мать:Иванова Елена Ивановна Ребенок1:Васин Николай Олегович Ребенок2:Васина Лидия Олеговна

Отец:Ферсев Олег Васильевич Мать:Ферсева Инга Ивановна Ребенок1:Ферсев Кирилл Олегович Ребенок2:Ферсев Иван Олегович

Отец:Фалиев Федор Васильевич Мать:- Ребенок1: - Фалиев Кирилл Федорович Ребенок2: -

Отец: - Мать:Лапушкина Любовь Валентиновна Ребенок1:Васенкин Кирилл Олегович Ребенок2:Покушкина Ирина Леонидовна

Найти еще ?(yes/no) no

Пример 2.

Задание: Имеется база данных, содержащая информацию: Имя человека, возраст, дата рождения, пол, годовой доход, количество лет в браке, профессия, время работы на последнем рабочем месте. Составить запросы, позволяющие определить, кто зарабатывает больше заданной суммы и каков точный годовой доход; каковы имена пенсионеров, чей годовой доход менее заданного числа.

Описание используемых предикатов:

человек(string,integer,string,string,real,integer,string,string).

/*человек(имя_человека, возраст, дата_рождения, пол, годовой_доход, количество_лет_в_браке,профессия,

время_работы_на_последнем_рабочем_месте)*/

старт. /*старт программы и вывод заголовка*/

выполнить. /*основная программа, содержит запросы*/

выполнить_возобновить(string). /*возврат к основной программе,

выбору запросов*/

выполнить_запрос(integer). /*обрабатывает выбранный запрос и запрашивает данные для поиска*/

поиск1(real). /*выдает результат по запросу*/

поиск2(real). /*ищет результат по запросу*/

мужчины_пенсионеры(real). /*выдает результат по запросу для мужчин пенсионеров*/

женщины_пенсионерки(real). /*выдает результат по запросу для женщин пенсионерок*/

открыть_файл(file,string). /*предназначен для проверки наличия файла открыть_файл(file,исх_файл)*/

В программе эти предикаты имеют следующий вид:

menschen(string,integer,string,string,real,integer,string,string ).

start.

run.

runotv(string).

runsap(integer).

poisk1(real).

poisk2(real).

man(real).

woman(real).

openFile(file,string).

Исходные данные:

Исходными данными в рассматриваемом примере являются: годовой доход, который вводит пользователь, после выбора соответствующего запроса, а также сведения из базы данных, которая хранится в текстовом файле «menschen.dat».

Содержание файла «menschen.dat»:

menschen("Иванов Феликс Леонидович",68,"1942","м",140000,35,"инженер", 35).

menschen("Петров Иван Леонидович",38,"1972","м",340000,9,"инженер",5).

menschen("Иванова Мария Петровна",65,"1945","ж",140000,35,"инженер",30).

menschen("Ионова Мария Алексеевна",35,"1975","ж",540000,5,"инженер",10).

menschen("Ануфриев Павел Леонидович",25,"1985","м",640000,0,"инженер-экономист",4).

Выходные данные:

Выходными данными является список людей, годовой доход которых удовлетворяет доходу, введенному пользователем для соответствующего запроса.

Описание запросов пользователя:

Исходя из условия задачи были выделены следующие запросы:

  1. Определить тех, кто зарабатывает больше заданной суммы и каков точный доход.

  2. Определить имена пенсионеров, чей годовой доход менее заданного числа.

Выбрать=> <Sap>

Если пользователь выбирает 1-ый запрос, то ему потребуется ввести сумму дохода:

Введите сумму дохода = <Sd1>

Если пользователь выбирает 2-ый запрос, то ему потребуется ввести сумму дохода:

Введите сумму дохода = <Sd2>

После того как результат будет найден, у пользователя программа запросит о продолжении в виде следующего диалога:

Найти еще ?(yes/no) <Otv>

Если Otv= yes, то пользователь сможет снова выбрать нужный запрос (из предложенных выше) и посмотреть результат поиска. Если Otv=no, то пользователь завершает работу с программой.

Описание выдаваемых пользователю сообщений:

Если исходный файл «menschen.dat» не найден в папке, в которой находится программа, то программа выдает сообщение:

Файл с именем <<N>> не найден!

Листинг программы:

domains

imya=string

vosr=integer

data=string

pol=string

dohod=real

brak=integer

prof=string

vremrab=real

file=dbase

database

menschen(imya,vosr,data,pol,dohod,brak,prof,vremrab)

predicates

start.

run.

runotv(string).

runsap(integer).

poisk1(real).

poisk2(real).

man(real).

woman(real).

openFile(file,string).

goal

start.

clauses

start:-write("Пример2 . Автор: Полятыкина Т.И."),

openFile(dbase," menschen.dat"),

consult("menschen.dat"), nl,run.

run:-nl,write("Определить:"),nl,write("1- тех, кто зарабатывает больше

заданной суммы и каков точный доход"), nl,

write("2- имена пенсионеров, чей годовой доход менее заданного числа"), nl,

write("Выбрать=>"),readint(Sap),nl,runsap(Sap), nl,

write("Найти еще ?(yes/no)"),readln(Otv),nl,runotv(Otv).

runotv(Otv):-Otv="yes",run.

runotv(Otv):-Otv="no",!.

runsap(Sap):-Sap=1,nl,write("Введите сумму дохода = "),

readreal(Sd1),poisk1(Sd1).

runsap(Sap):-Sap=2,nl,write("Введите сумму дохода = "),

readreal(Sd2),poisk2(Sd2).

runsap(Sap):-Sap>2,write("Недопустимое число"),nl,run.

runsap(Sap):-Sap<1,write("Недопустимое число"),nl,run.

poisk1(Sd1):-menschen(Imya,Vosr,Data,Pol,Dohod,Brak,Prof,Vremrab),

Dohod>=Sd1, nl,

write(Imya," Возраст:",Vosr," Год рождения:"),

write(Data,"Пол:",Pol,"годовой доход: ",Dohod,

" Кол-во лет в браке:"),

write(Brak," Профессия:",Prof,

" Время работы на последнем рабочем месте:"),

poisk1(Sd1):-!,nl,write("------------------------"),nl,

write("Конец").

poisk2(Sd2):-man(Sd2),woman(Sd2),nl,write("------------------------"),nl,

write("Конец").

man(Sd2):-menschen(Imya,Vosr,Data,Pol,Dohod,Brak,Prof,Vremrab),

Pol="м", Vosr>=60,Dohod<=Sd2,nl,

write(Imya," Возраст:",Vosr," Год рождения:"),

write(Data," Пол:",Pol,"годовой доход: ",Dohod,

" Кол-во лет в браке:"),

write(Brak," Профессия:",Prof,

" Время работы на последнем рабочем месте:"),

write(Vremrab),fail.

man(Sd2):-!.

woman(Sd2):-menschen(Imya,Vosr,Data,Pol,Dohod,Brak,Prof,Vremrab),

Pol="ж",Vosr>=55,Dohod<=Sd2,nl,

write(Imya," Возраст:",Vosr," Год рождения:"),

write(Data," Пол:",Pol,"годовой доход: ",Dohod,

" Кол-во лет в браке:"),

write(Brak," Профессия:",Prof,

" Время работы на последнем рабочем месте:"),

write(Vremrab),fail.

woman(Sd2):-!.

openFile(dbase," menschen.dat"):- existfile("menschen.dat"),!.

openFile(_,N):-nl,write("Файл с именем ",N," не найден!").

Контрольный пример:

Определить:

1-кто зарабатывает больше заданной суммы и каков точный доход

2-имена пенсионеров, чей годовой доход менее заданного числа

Выбрать=> 1

Введите сумму дохода =100000

Иванов Феликс Леонидович Возраст:68 Год рождения:1942 Пол:м Годовой доход:140000 Кол-во лет в браке:35 Профессия:инженер Время работы на последнем рабочем месте: 35

Петров Иван Леонидович Возраст:38 Год рождения:1972 Пол:м Годовой доход:340000 Кол-во лет в браке:9 Профессия:инженер Время работы на последнем рабочем месте:5

Иванова Мария Петровна Возраст:65 Год рождения:1945 Пол:ж Годовой доход:140000 Кол-во лет в браке:35 Профессия:инженер Время работы на последнем рабочем месте:30

Ионова Мария Алексеевна Возраст:35 Год рождения:1975 Пол:ж Годовой доход:540000 Кол-во лет в браке:5 Профессия:инженер Время работы на последнем рабочем месте:10

Ануфриев Павел Леонидович Возраст:25 Год рождения:1985 Пол:м Годовой доход:640000 Кол-во лет в браке:0 Профессия:инженер-экономист Время работы на последнем рабочем месте:4

------------------------

Конец

Найти еще ?(yes/no) yes

Определить:

1-кто зарабатывает больше заданной суммы и каков точный доход

2-имена пенсионеров, чей годовой доход менее заданного числа

Выбрать=> 2

Введите сумму дохода =150000

Иванов Феликс Леонидович Возраст:68 Год рождения:1942 Пол:м Годовой доход:140000 Кол-во лет в браке:35 Профессия:инженер Время работы на последнем рабочем месте: 35

Иванова Мария Петровна Возраст:65 Год рождения:1945 Пол:ж Годовой доход:140000 Кол-во лет в браке:35 Профессия:инженер Время работы на последнем рабочем месте:30

------------------------

Конец

Найти еще ?(yes/no) no