Автор: 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 программы: сдали все
з.Ы. в первом варианте кода была ошибка
Автор: Unknown 24.02.2007 22:18
hardcase, спасибо, но это не совсем то, что нужно... Нужно найти ответ, именно исходя из условия...
Но за
Цитата
output программы: сдали все
спасибо