
Шустрый

Профиль
Группа: Участник
Сообщений: 125
Регистрация: 1.1.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).
|
TURBO PROLOG 2.0 Это сообщение отредактировал(а) kresh - 19.2.2011, 23:54
Присоединённый файл ( Кол-во скачиваний: 26 )
FILEF1.PRO 8,59 Kb
--------------------
Спросит вас продавец в магазине формулу Гаусса-Остроградского... А вы ее не знаете!
|