Внешние базы данных.

      Комментарии к записи Внешние базы данных. отключены

Помечено: ,

В этой теме 1 ответ, 2 участника, последнее обновление  Васильев Владимир Сергеевич 3 мес., 3 нед. назад.

  • Автор
    Сообщения
  • #3822

    Egor Molchan
    Участник

    Задание: Выбрать из всей БД фамилии и имена (вывод каждой пары в отдельной строке), где длина фамилии меньше длины имени.

    Исходный код программы:

    DOMAINS 
      db_selector = mybd
      dd,gg = integer
      fam,name,pol,mm = string
      data = dat(dd,mm,gg)
      student = stud(fam,name,data,pol)
      studen = stu(fam,name)
    PREDICATES 
    	nondeterm rb(ref)
    	nondeterm rbb(ref)
    	nondeterm rbpol(string,ref)
    	nondeterm rbmes(string,ref)
    	nondeterm rbserch(char,ref)
    	nondeterm rbserch2(ref)
    	nondeterm rbserch3(ref)
    	nondeterm search(string, char)
    	nondeterm searchposlovy(string)
    	nondeterm process(char) 		 %обработка выбора
    	nondeterm menu 			       	 %вывод меню
    	nondeterm result 			 %проверка существования файла и загрузка БД
    CLAUSES
    
      %Извлечение термов из внешней БД
      rb(Ref):-
        ref_term(mybd,student,Ref,Term),
        Term = stud(Фам,Имя,dat(Д,М,Г),Pol),
        write(Фам," ",Имя," ",Д," ",М," ",Г," ",Pol),nl,fail.
      rb(Ref):-
        chain_next(mybd,Ref,Next),rb(Next).
        rb(_).
    
      %Поиск по буквам
      search("", _):- fail.
      search(Word,C):- 
        frontchar(Word,C1,_),
        C=C1;
        frontchar(Word,_,O),
        search(O,C).
    
      %Поиск по словам
      searchposlovy(""):- fail.
      searchposlovy(Word):- 
        frontchar(Word,C1,O),
        search(O,C1),!;
        frontchar(Word,_,O),
        searchposlovy(O).
    
    
      rbb(Ref):-
        ref_term(mybd,studen,Ref,Term),
        write(Term),nl,fail.
      rbb(Ref):-
        chain_next(mybd,Ref,Next),rbb(Next).
        rbb(_).
    
      %Поиск сведений о лицах определенного пола
      rbpol(P,Ref):-
        ref_term(mybd,student,Ref,Term),
        Term = stud(Фам,Имя,dat(_,_,_),Pol),
        Pol = P,
        write(" ",Фам,"  ",Имя),nl,fail.
      rbpol(P,Ref):-
        chain_next(mybd,Ref,Next),
        rbpol(P,Next).
        rbpol(_,_).
    
    
      rbserch(P,Ref):-
        ref_term(mybd,student,Ref,Term),
        Term = stud(Фам,Имя,dat(_,_,_),_),
        upper_lower(Фам,Фам1),search(Фам1,P),
        write(" ",Фам,"  ",Имя),nl,fail.
      rbserch(P,Ref):-
        chain_next(mybd,Ref,Next),
        rbserch(P,Next).
    
    
      rbserch2(Ref):-
        ref_term(mybd,student,Ref,Term),
        Term = stud(Фам,Имя,dat(_,_,_),_),
        upper_lower(Фам,Фам1),searchposlovy(Фам1),
        write(" ",Фам,"  ",Имя),nl,fail.
      rbserch2(Ref):-
        chain_next(mybd,Ref,Next),
        rbserch2(Next).
    
      rbserch3(Ref):-
        ref_term(mybd,student,Ref,Term),
        Term = stud(Фам,Имя,dat(_,_,_),_),
        str_len(Фам,N1),
        str_len(Имя,N2),N1<N2,
        write(" ",Фам,"  ",Имя),nl,fail.
      rbserch3(Ref):-
        chain_next(mybd,Ref,Next),
        rbserch3(Next).
    
    
      rbmes(P,Ref):-
        ref_term(mybd,student,Ref,Term),
        Term = stud(Фам,Имя,dat(_,Мес,_),_),
        Мес = P,
        write(" ",Фам,"  ",Имя),nl,fail.
      rbmes(P,Ref):-
        chain_next(mybd,Ref,Next),
        rbmes(P,Next).
    
      menu:- 
        write("1 - Из первой цепочки определенного пола"),nl,
        write("2 - Из обеих цепей студентов определенного месяца "),nl,
        write("3 - Добавление"),nl, 
        write("4 - просмотр цепочки"),nl, 
        write("5 - Удаление терма"),nl,
        write("6 - Повторяющиеся буквы"),nl,
        write("7 - Поиск по букве"),nl,
        write("8 - Длина фамилии меньше длины имени"),nl,
        write("0 - Выход"),nl,
        readchar(C),
        process(C).
    
      process('1'):- 
        write("Введите пол: "), readln(P),
        chain_first(mybd,"gr215",Ref),
        rbpol(P,Ref),
        menu,nl.
    
      process('2'):-
        write("Введите месяц: "), readln(Mm),nl,
        db_chains(mybd,Ср),
        chain_first(mybd,Ср,Ref),
        rbmes(Mm,Ref),nl,
        menu,nl.
    
      process('3'):- 
        write("Введите название цепочки: "), readln(Цепь),
        write("Фамилию: "), readln(Fam),
        write("Имя: "), readln(Name),
        write("пол: "), readln(Pol),
        write("Дату: День: "), readint(D),
        write("Дату: месяц: "), readln(Mes),
        write("Дату: год: "), readint(G),
        chain_insertz(mybd,Цепь,student,stud(Fam,Name,dat(D,Mes,G),Pol),_), nl, %добавление в БД
        menu,nl.
    
    
      process('4'):- 
        write("Введите имя цепочки для просмотра: "),readln(Цепь),
        nl,%db_chains(mybd,Ch),
        chain_first(mybd,Цепь,Ref),
        rb(Ref),nl,
        menu,nl.
    
      process('5'):- 
        db_chains(mybd,Ch),
        chain_first(mybd,Ch,Ref), 
        term_delete(mybd,Ch,Ref),
        menu,nl.
    
      process('6'):-
        db_chains(mybd,Ср),
        chain_first(mybd,Ср,Ref),
        rbserch2(Ref),nl, 
        menu,nl.
    
      process('7'):-
        write("Введите букву: "), readchar(Бук),nl,
        db_chains(mybd,Ср),
        chain_first(mybd,Ср,Ref),
        rbserch(Бук,Ref),nl, 
        menu,nl.
    
      process(8):-
        write("Фамилии и имена ,где длина фамилии меньше длины имени: "),nl,
        db_chains(mybd,Chain),
        chain_first(mybd,Chain,Ref),
        rbserch3(Ref), nl,
        menu,nl.
    
      process('0'):- 
        db_close(mybd). %сохранение в файл
    
      process(_):- 
        menu. %защита от некорректного ввода
    
      result:-
        existfile("words1.dat"),!, %проверка на существование
        db_open(mybd,"words1.dat",in_file), %загрузка в БД
        %db_chains(mybd,gr215),
        menu. 
    
      result:-
        db_create(mybd,"words1.dat",in_file), %создание файлая
        menu.
    
    GOAL 
      result.

    Не работает process(«8») — нахождение имен и фамилий во внешней БД, где длина фамилии меньше длины имени

    Вложения:
  • #3829

    Можете объяснить что происходит в этой программе вообще?
    Вот у вас есть база данных, вы с ней работаете через селектор:
    db_selector = mybd
    Где эта база открывается и в каком именно файле она хранится? (не нашел сходу в программе).
    Что хранится в этой базе? — у вас есть две разных структуры:

          student = stud(fam,name,data,pol)
          studen = stu(fam,name)

    И есть два предиката, выполняющих чтение с нее — rb и rbb, в одном выполняется:
    ref_term(mybd,student,Ref,Term),
    В другом:
    ref_term(mybd,studen,Ref,Term),

    Теперь, чтобы решить последнюю задачу нужно просто по-очереди извлекать из базы запись (как это делается в предикате вывода содержимого базы на экран) и перед выводом выполнять что-то типа:

    length(Name, NameLen),
    length(Surname, SurLen),
    NameLen > surLen

Для ответа в этой теме необходимо авторизоваться.