Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Метод резолюций в исчислении высказываний.

Автор: Unknown 8.02.2007 1:27

Задание такое:
Написать программу для определения, кто из четырех студентов сдал экзамен, если известно:
а) если первый сдал, то и второй сдал;
б) если второй сдал, то третий сдал или первый не сдал;
в) если четвертый не сдал, то первый сдал, а третий не сдал;
г) если четвертый сдал, то и первый сдал.
По-моему, в условии ошибка... Из в и г следует, что первый сдал в любом случае, а, следовательно, сдал и второй, откуда в свою очередь следует, что сдал и третий (т.к. первый сдал), а т.к. третий сдал, то четвертый не мог не сдать (т.е. тоже сдал)...

Автор: hardcase 11.02.2007 20:38

Цитата(Unknown @ 7.02.2007 21:27) *
Задание такое:
Написать программу для определения, кто из четырех студентов сдал экзамен

Из интересу написал вот такой код:
Код

program Stud;

{$APPTYPE CONSOLE}

uses
  SysUtils;

const
  MAX_STUDENTS = 4;

type
  TStudents = array[1..MAX_STUDENTS] of boolean;

function AssertRules(const students: TStudents): boolean;

    //a) если первый сдал, то и второй сдал;
    function AssertA: boolean;
    begin
      if students[1] then
          Result := students[2]
      else
          Result := true
    end;

    //б) если второй сдал, то третий сдал или первый не сдал
    function AssertB: boolean;
    begin
      if students[2] then
          Result := students[3] or not students[1]
      else
          Result := true
    end;

    //в) если четвертый не сдал, то первый сдал, а третий не сдал
    function AssertC: boolean;
    begin
      if not students[4] then
         Result := students[1] and not students[3]
      else
         Result := true
    end;

    //г) если четвертый сдал, то и первый сдал
    function AssertD: boolean;
    begin
      if students[4] then
         Result := students[1]
      else
         Result := true
    end;

begin
  Result := AssertA and AssertB and AssertC and AssertD
end;

procedure PrintStudents(const students: TStudents);
const RESULT: array[false..true] of string = ('failed', 'passed');
var i: integer;
begin
  WriteLn('students:');
  for i:=Low(students) to High(students) do begin
      WriteLn('  student ', i, ': ', RESULT[students[i]]);
  end;
  WriteLn;
end;

procedure FindResult();
var students: TStudents;

    procedure _FindResult(cur: integer);
    var i: integer;
    begin
      if cur > High(students) then begin
          if AssertRules(students) then
              PrintStudents(students);
      end else begin
          students[cur] := false;
          _FindResult(cur + 1);

          students[cur] := true;
          _FindResult(cur + 1);
      end;
    end;

begin
  _FindResult(Low(students));
end;

begin
  FindResult();
  ReadLn;
end.

Программа генерирует все комбинации студентов и проверяет 4 правила для каждой.
Если правила срабатывают, то комбинация допустимая и печатается.

output программы: сдали все cool.gif

з.Ы. в первом варианте кода была ошибка blink.gif

Автор: Unknown 24.02.2007 22:18

hardcase, спасибо, но это не совсем то, что нужно... Нужно найти ответ, именно исходя из условия...
Но за

Цитата
output программы: сдали все
спасибо smile.gif