База данных студентов. Вычисление среднего балла

Главная Форумы Программирование Помощь с решением задач на Prolog Работа с базами данных в Prolog База данных студентов. Вычисление среднего балла

Помечено: ,

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

Просмотр 6 сообщений - с 1 по 6 (из 6 всего)
  • Автор
    Сообщения
  • #1769

    questioner
    Участник

    Нужна программа на SWI Prolog, которая:

    выдает список студентов – отличников
    вычисляет средний балл студентов
    выдает список студентов, средний балл которых, удовлетворяет заданному ключу

    #1770

    Что хранится в базе?
    Чтобы можно было вычислить средний балл — в базе должны храниться несколько оценок.
    Не понятно как балл может «удовлетворять ключу».
    Опишите пример базы данных и ожидаемые результаты от выполнения каждого из запросов задания.
    Выкладывайте наработки.

    #1771

    questioner
    Участник

    студент(Курс,Группа,Фамилия,Баллы).
     
    %Список студентов по ключу
    печать:-
        read(Курс), read(Группа),
        студент(Курс,Группа,Фамилия,Баллы),
        write(Фамилия), write(" "), write(Баллы), nl.
     
    %Список неуспевающих студентов
    неуспевающие_студенты(Ф):-
        read(Курс), read(Группа),
        студент(Курс,Группа,Фамилия,Баллы),
        Баллы<40.  %работает,но это не список
     
    список_студентов(Список):-
      read(Курс), read(Группа),
      findall(Фамилия,студент(Курс,Группа,Фамилия,Баллы), Список),!.
     
    %не знаю где проверять условие на Баллы,чтоб добавлял в список только тех,баллы которых %меньше 40. Наподобие можно сформировать список отличников.
    список_неуспевающих_студентов(Список):-
      read(Курс), read(Группа),
      студент(Курс, Группа, _Фамилия, Баллы),
      Баллы<40, findall(Фамилия, студент(Курс,Группа,Фамилия,Баллы), Список),!.
     
    %ещё так пробовал, просто не могу понять куда это
    %условие вставить
    список_неуспевающих_студентов(Список):-
      read(Курс), read(Группа),
      findall(Фамилия, студент(Курс, Группа, Фамилия, Баллы), Список),
      Баллы<40,!.
     
    список_баллов(Баллы):-
      read(Курс), read(Группа),
      findall(Баллы, студент(Курс, Группа, _Фамилия, Баллы), Баллы),!.
     
    сумма([],0).
    сумма([H|T],S):-
      number(H), сумма(T,S1),
      S is S1+H.
     
    среднее_арифметическое([],0).
    среднее_арифметическое(Список, Среднее_арифметическое).
      сумма(Список, Сумма),
      length(Список, Длина),
      Среднее_арифметическое is Сумма / Длина.

    #1772

    Я чуть-чуть поправил Ваш код. Не проверял что получилось, но в предикате вычисления суммы у вас была ошибка — использовалась неинициализированная переменная.
    При вычислении среднего арифметического вы не использовали результат вычислений, и вообще, для непустого списка ничего вычисляться бы не стало… (я исправил)

    Я не знаю что вы там пробуете, мне кажется база данных должна быть примерно такой:

    оценка(математика, 'Петров', 3).
    оценка(физика, 'Петров', 4).
    оценка(химия, 'Петров', 5).
    оценка(математика, 'Сидоров', 4).

    Если база уже содержит балл студента, то можно выкинуть лишнюю информацию — группа и курс у тебя ведь все равно нигде не используются….
    Выглядеть это может так:

    	
    студент(петров, 40).
    студент(сидоров, 90).
    студент(иванов, 20).
     
    градация(все, 0, 100).
    градация(двоечник, 0, 39).
    градация(троечник, 40, 60).
    градация(хорошист, 61, 80).
    градация(отличник, 81, 100).
     
    список_студентов(Градация, Студенты):-
      градация(Градация, Нижний_балл, Верхний_балл), !,
      findall(
        Фамилия, (
          студент(Фамилия, Балл),
          Балл >= Нижний_балл,
          Балл =< Верхний_балл
        ),
        Студенты
      ).

    Примеры запросов:

    ?- список_студентов(двоечник, Студенты).
    Студенты = [иванов].
     
    ?- список_студентов(все, Студенты).
    Студенты = [петров, сидоров, иванов].

    #1773

    questioner
    Участник

    Большое спасибо. Очень помогли.
    Сильно измениться решение если у каждого студента будет по 4 оценки?

    #1774

    Смотря что вы собираетесь с этими оценками делать. Если вычислять среднюю и использовать ее — то не сильно. Ниже схематично изобразил для двух оценок, если надо больше — поправите по образцу.
    список_студентов(Градация, Студенты):-

      градация(Градация, Нижний_балл, Верхний_балл), !,
      findall(
        Фамилия, (
          средний_балл_студента(Фамилия, Балл),
          Балл >= Нижний_балл,
          Балл =< Верхний_балл
        ),
        Студенты
      ).

    средний_балл_студента(Фамилия, Балл):-
    студент(Фамилия, Оценка_физика, Оценка_математика), !,
    Балл is (Оценка_физика + Оценка_математика) / 2.

    Но может быть все должно работать не так, ведь троечник — это не тот, у кого средний балл какой-то определенный, а тот, у кого нет двоек и есть хоть одна тройка.

Просмотр 6 сообщений - с 1 по 6 (из 6 всего)

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