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

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

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

Помечено: ,

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

  • Автор
    Сообщения
  • #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.

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

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