Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [пролог]структурная схема программы  
:(
    Опции темы
Zolotce
Дата 15.11.2011, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 21.4.2008

Репутация: нет
Всего: нет



помогите сделать структурную схему программы на прологе!!!!!!
Код

DOMAINS /* раздел описания доменов */
F_N = String
file=f
N,C, M = integer
database -db
files(string)
database -summ
summ(integer)
database -summ1
summ1(integer)
database -shot
shot(string)
database -viv
timer(integer)

PREDICATES
m(char) /* этот предикат реализует выполнение
соответствующего пункта меню */
menu /* этот предикат реализует вывод меню и
обработку выбора пользователя */
start(String) /* этот предикат проверяет наличие файла
с базой на диске и либо загружает
факты из нее во внутреннюю базу данных,
если такой файл существует, либо создает
этот файл, если его не было */
write_file(string)
write_file_main()
nakop(char,char)
file_rek(file,char)
sbor(char)
fwriteF(char,integer)
rep(FILE)
readline(FILE)
sb
malen
readshot(FILE)
prov(string)
sh(string)
muStr(integer)
viv(FILE,integer)
stroka(integer,string,integer)
chis
chisla(file)
chis_sr(char)
chet(char)
chis_v

CLAUSES
menu:-
makewindow(1,2,7,"Работа с файлом",0,0,25,80),
clearwindow, /* очистка текущего окна */
write("1 - Вывести файл"),nl,
write("2 - Число вхождений символа"),nl,
write("3 - Число строк в файле"),nl,
write("4 - Самая короткая строка"),nl,
write("5 - Вывести заданную строку"),nl,
write("6 - Вывести все строки в которых есть числа"),nl,
write("0 - Выйти"),nl,
readchar(C), /* читаем символ с клавиатуры */
m(C). /* вызываем выполнение соответствующего пункта
меню */
m('6'):-
clearwindow,
chis,
chis_v,
retractall(_,summ1),
readchar(_), /*Ждем ввода любого символа*/
menu.
m('2'):-
clearwindow,
write("Введите символ"),nl,
readchar(C),
sbor(C),
readchar(_),
menu.
m('3'):- /*считает количество строк*/
clearwindow,
sb,
readchar(_),
menu.
m('4'):-
clearwindow,
malen,
readchar(_),
menu.
m('1'):-
clearwindow,
write_file_main(),
readchar(_),
menu.
m('5'):-
clearwindow,
write("Введите номер строки"),
readint(I),
muStr(I),
readchar(_),
menu.
m('0'):-
clearwindow,
removewindow.
m(_):-
menu. /* если пользователь по ошибке нажал клавишу,
отличную от тех, реакция на которые
предусмотрена, ничего плохого
не произойдет, будет отображено меню
еще раз */
write_file(f):-
not(eof(f)),!, /*пока не конец файла выполняем ...*/
readchar(C),/*Cчитываем символ*/
write(C), /*выводим символ*/
write_file(f). /*повторям*/
write_file(_).
write_file_main():- /*Предикат вывода файла*/
files(F_N), /*Читаем в переменную имя файла*/
openread(f,F_N), /*Открываем файл на чтение*/
readdevice(f), /*Перенаправляем устройство чтения, из файла*/
write_file(f), /*Вызываем выше описаный предикат*/
closefile(f), /*Закрываем файл*/
readdevice(keyboard). /*Перенаправляем устройство чтения, с клавиатуры*/
write_file_main().
/***********************************************/
nakop(_,_).
nakop(C,Ch):-
C=Ch,!, /*Если символ введеный пользователем совпал с символом в файле*/
summ(M), /*берем значение из БЗ*/
NewM=M+1, /*Увелчиваем на 1*/
retract(summ(M)), /*удаляем предыдущее значение*/
assert(summ(NewM)). /*записываем новое*/
file_rek(f,C):-
rep(f), /*Предикат осуществляющий повторение действий до тех пор пока не закончится файл*/
readchar(Ch), /*Читаем символ из файла*/
nakop(C,Ch),
fail.
file_rek(_,_).
fwriteF(C,M):-
write("Символ '",C,"' встречается ",M ," раз"), /*выводим на экран результат*/
fail.
fwriteF(_,_).
sbor(C):- /*Предикат вывода числа вхождений символа в файл*/
files(F_N),
assert(summ(0)), /*вводим во внутреннюю БЗ 0*/
openread(f,F_N),
readdevice(f),
file_rek(f,C),
summ(M),
fwriteF(C,M), /*предикат для вывода результатов*/
closefile(f),
retract(summ(_),summ), /*обнуляем БЗ*/
readdevice(keyboard).
sbor(_).
/*************************************************/
sb:- /*Предикат подсчета количества строк в файле*/
files(F_N),
assert(summ(0)),
openread(f,F_N),
readdevice(f),
readline(f),
summ(Int),
write("Количество строк в файле: ", Int), /*Вывод результатов на экран*/
closefile(f),
retract(summ(_),summ),
readdevice(keyboard).
sb.
readline(f):-
rep(f),
readln(_), /*читаем строку из файла*/
summ(Int),
NeM=Int+1, /*Увеличиваем предыдущее значение на 1*/
retract(summ(Int)),
assert(summ(NeM)), /*Записываем новое значение*/
fail.
readline(_).
rep(_). /*предикат для осуществления цикла перемещения по файлу*/
rep(f):- not(eof(f)),rep(f).
/*************************************************/
malen:- /*Предикат определения самой короткой строки*/
files(F_N),
assert(summ(0)),
assert(shot("")), /*Задаем начальное значение*/
openread(f,F_N),
readdevice(f),
readshot(f),
shot(Str),
write("Самая короткая строка: ", Str),
closefile(f),
retract(shot(_),shot),
retract(summ(_),summ),
readdevice(keyboard).
malen.
prov(_).
prov(Ln):-
str_len(Ln,Int), /*Узнем длину строки*/
summ(Sum), /*Берем текущее значение строки*/
Sum>Int,!, /*Если строка короче то записываем ее и ее длину в соотв. БЗ*/
retract(summ(Sum)),
assert(summ(Int)),
shot(Str),
retract(shot(Str)),
assert(shot(Ln)).
sh(Ln):- /*Проверяем, если в базе нет строк, то записываем текущую, и ее длинну*/
shot(Str),
Str="",!,
retract(shot(Str)),
assert(shot(Ln)),
summ(Int),
retract(summ(Int)),
str_len(Ln,Sum),
assert(summ(Sum)).
sh(_).
readshot(f):-
rep(f),
readln(Ln), /*Читаем строку*/
sh(Ln),
prov(Ln),
fail.
readshot(_).
/**********************************************/
muStr(I):- /*предикат вывода строки по номеру*/
files(F_N),
assert(summ(1)),
assert(shot("")),
openread(f,F_N),
readdevice(f),
viv(f,I),
shot(Str),
write("Строка номер ",I," :",Str),
write('\n'),
closefile(f),
retract(shot(_),shot),
retract(summ(_),summ),
readdevice(keyboard).
muStr(_).
stroka(I,Ln,Int):-
I=Int,!, /*Если номер строки совпадает с введенным то записываем ее в БЗ*/
shot(Str),
retract(shot(Str)),
assert(shot(Ln)).
stroka(_,_,_).
viv(f,I):-
rep(f),
readln(Ln),
summ(Int), /*берем номер текущей строки*/
stroka(I,Ln,Int),
Nint=Int+1, /*увеличиваем счетчик текущей строки на 1*/
retract(summ(Int)),
assert(summ(Nint)),
fail.
viv(_,_).
/*******************************************/
chis:- /*Предикат вывода строк с числовыми данными*/
files(F_N),
assert(timer(0)),
openread(f,F_N),
readdevice(f),
chisla(f),
closefile(f),
retract(timer(_),viv),
readdevice(keyboard).
chis.
chis_v:- /*Предикат вывода найденных строк*/
summ1(I), /*Берем значение из БЗ*/
muStr(I), /*Подставляем в описаный ранее предикат Нахождения строки по заданному номеру*/
fail. /*и переходим к следующему значению БЗ*/
chis_v.
chet(C):-
C='\n',!, /*Проверяем , если текущий символ конец строки то увеличиваем счетчик строк на 1*/
timer(Int),
M=Int+1,
retract(timer(Int)),
assert(timer(M)).
chet(_).
chis_sr(C):-
char_int(C,Num), /*Берем его числовой код*/
chet(C),
Num>=48,Num<=57,!, /*если текущий символ является цифрой*/
readln(_), /*считываем всю оствщуюся строку*/
timer(Int),
retract(timer(Int)), /*увеличиваем счетчик текущей строки на 1, и записываем номер строки в БЗ*/
M=Int+1,
assert(timer(M)),
assert(summ1(Int)).
chis_sr(_).
chisla(f):-
rep(f),
readchar(C),/*читаем символ*/
chis_sr(C),
fail.
chisla(_).
/*******************************************/
start(F_N):-
existfile(F_N),!, /* если файл существует */
assert(files(F_N),db),
menu. /* вызываем меню */
start(_):-
write("Файл не найден, попробуйте еще раз"),nl,
readln(F_N1),
start(F_N1).
GOAL /* раздел внутренней цели*/
write("Input file name"),nl,
readln(F_N),
start(F_N).
 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0589 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.