Задача такова:
Надо соединить 3 кнопки, 3 лампочки и 1звонок так, чтобы
при нажатии кнопки1 ( Кн1 ) загарается лампочка1 ( Л1 ) и звенит звонок,
при нажатии Кн2 загарается Л2 и звенит звонок,
и при нажатии Кн3 загарается Л3 и звени звонок.
Главная загвостка в том, что Лампочки(в последовательности) и звонок должны работать в полную силу.
Напряжение 220В
Кнопки с самовозвратом, 4 контактные (2 контакта на вкл состояние, и 2 на выкл)
Нельзя добавлять ничего лишнего(т.е конденсаторы, рэле, сопротивление и таму подобное)
Это всё будет ставится якобы в камуналке
Эскизы прикрепленных изображений
Ко всем, кто находит удовольствие в решении чисто программистских задач, просьба - дочитать этот мессадж до конца .
uses
CRT;
var
n: integer; // Суммарное число контактов всех элементов
t: integer; // Номер следующего соединения при сборке
type
tVolt= (None,v1,v2); // Напряжение: не подано, v1, v2
tPin= array[1..255] of byte; // Массив выводов
tElement= object
mp: integer; // Число выводов
Pin: ^tPin; // Выводы
procedure Clear; // Отсоединение от всех шин
procedure Connect(p,b: byte); // Параметры: вывод, шина
function Connected: string; // Возвращает строку номеров шин по пинам
constructor Create(ip: integer);
end;
// Устройство с двумя выводами (лампа, звонок)
tDevice= object(tElement)
function Active: boolean; // Возвращает true, если на приборе есть полное напряжение
constructor Create;
end;
// Переключатель с двумя парами контактов
tSwitch= object(tElement)
Pos: byte; // Состояние переключателя: 0, 1
procedure Connect(p,b:byte);
constructor Create;
end;
// Источник (батарея или розетка)
tPower= object(tElement) // Напряжение на выводах
Volt: array[1..2]of tVolt;
procedure Connect(p,b: byte);
constructor Create;
end;
var
Bus: array[1..255]of tVolt; // Массив шин (соединительных проводов)
Shorting: boolean; // Индицирует состояние короткого замыкания в схеме
procedure tElement.Clear;
var
i: byte;
begin
for i:=1 to mp do Pin^[i]:=0
end;
procedure tElement.Connect(p,b: byte);
begin
if p<=mp then Pin^[p]:=b;
Inc(t);
end;
function tElement.Connected: string;
var
i: integer;
s,t: string;
begin
s:='';
for i:=1 to mp do begin
Str(Pin^[i]:5,t);
s:=s+t;
end;
Connected:=s
end;
constructor tElement.Create(ip: integer);
var
i: integer;
begin
mp:=ip;
Inc(n,mp);
GetMem(Pin,mp);
for i:=1 to mp do Pin^[i]:=0;
end;
constructor tDevice.Create;
begin
tElement.Create(2);
end;
function tDevice.Active: boolean;
begin
Active:=(Pin^[1]>0)and(Pin^[2]>0)and(Bus[Pin^[1]]<>None)and(Bus[Pin^[2]]<>None)and(Bus[Pin^[1]]<>Bus[Pin^[2]])
end;
constructor tSwitch.Create;
begin
tElement.Create(4);
end;
procedure tSwitch.Connect(p,b:byte);
var
i:byte;
begin
tElement.Connect(p,b);
case p of
1,2: i:=Pin^[3-p];
3,4: i:=Pin^[7-p]
end;
if Pos=(p-1)div 2 then begin
if i>0 then
if Bus[b]=None then Bus[b]:=Bus[i]
else if Bus[i]=None then Bus[i]:=Bus[b]
else Shorting:=Shorting or(Bus[b]<>Bus[i]);
end
end;
constructor tPower.Create;
begin
tElement.Create(2);
Volt[1]:=v1;
Volt[2]:=v2
end;
procedure tPower.Connect(p,b: byte);
begin
tElement.Connect(p,b);
if Bus[b]=None then Bus[b]:=Volt[p] else Shorting:=Bus[b]<>Volt[p]
end;
const
nn=100; // Максимально возможное суммарное число контактов всех элементов
m= 2; // Число ламп (равно числу переключателей)
var
Lamp: array[1..m]of tDevice;
Switch: array[1..m]of tSwitch;
Bell: tDevice;
Power: tPower;
Sw: tSwitch;
c: array[1..nn]of integer;
Correct: boolean;
k: integer;
procedure Show;
var
i: integer;
begin
for i:=1 to n do Write(c[i]:3);
WriteLn
end;
// Перебор всех возможных комбинаций подключений
procedure Next;
var
i,j: integer;
b: boolean;
begin
repeat
b:=false;
repeat
i:=0;
repeat
Inc(i);
if c[i]=k then c[i]:=1 else Inc(c[i])
until (c[i]<>1)or(i=n);
if Odd(i) and(c[i]=c[i+1]) then for j:=1 to i-1 do c[j]:=k else b:=true
until b;
for j:=1 to (i-1)div 2*2 do if Odd(j) then c[j]:=2;
j:=0;
for i:=1 to n do if c[i]=k then begin
Inc(j);
if j=2 then break
end
until j>1
end;
var
s: string;
i,j,p,a,t0: byte;
h: char;
Debug: boolean;
begin
Debug:=true;
Power.Create;
for i:=1 to m do begin
Lamp[i].Create;
Switch[i].Create;
end;
Bell.Create;
Power.Connect(1,2);
Power.Connect(2,1);
k:=2;
repeat
Inc(k);
WriteLn('Buses: ',k);
// Начальная конфигурация соединений
c[1]:=k;
c[2]:=1;
c[3]:=k;
for i:=3 to n do c[i]:=i mod 2+1;
// Основной цикл перебора
repeat
if Debug or KeyPressed then begin
h:=ReadKey;
if h=#13 then Debug:=not Debug;
Show
end;
// Разборка схемы
for i:=1 to m do Lamp[i].Clear;
Bell.Clear;
// Сборка схемы (лампы и звонок)
t:=1;
for i:=1 to m do begin
Lamp[i].Connect(1,c[t]);
Lamp[i].Connect(2,c[t]);
end;
Bell.Connect(1,c[t]);
Bell.Connect(2,c[t]);
t0:=t;
Shorting:=false;
Correct:=true;
// Цикл по состояниям кнопок (0 - ничего не нажато)
for a:=0 to m do if not Shorting then begin
for i:=3 to k do Bus[i]:=None;
for i:=1 to m do if i=a then Switch[i].Pos:=1 else Switch[i].Pos:=0;
for i:=1 to m do Switch[i].Clear;
for j:=1 to m do begin
t:=t0;
for i:=1 to m do {if not Shorting then} begin
Switch[i].Connect(1,c[t]);
Switch[i].Connect(2,c[t]);
Switch[i].Connect(3,c[t]);
Switch[i].Connect(4,c[t]);
end
end;
Correct:=Correct and not Shorting;
// Проверка работы схемы
for i:=1 to m do Correct:=Correct and (Lamp[i].Active=(a=i));
Correct:=Correct and (Bell.Active=(a>0))
end;
if not Correct then Next;
until Correct or (c[n-1]=3) or (h=#27)
until Correct or (h=#27);
if Correct then begin
Show;
WriteLn('Power: ',Power.Connected);
for j:=1 to m do begin
WriteLn('Lamp',j,': ',Lamp[j].Connected);
WriteLn('Switch',j,': ',Switch[j].Connected);
end;
WriteLn('Bell: ',Bell.Connected)
end
else WriteLn('Interrupted')
end.
Хочу отметить, что в условии не оговорено ни одного из следующих условий:
1. Возможности функционирования схемы при нажатии нескольких кнопок одновременно.
2. Сотношения между напряжением в сети и номинальными напряжениями лампочек и звонка.
Предлагаю схему:
Три цепочки из лампочки и последовательно соединенного с ней звонка включены в параллель.
Вся эта конструкция последовательно соединена со звонком.
При этом, естественно, номинальные токи лампочки и звонка должны быть равны, а напряжение в сети - сумме их номинальных напряжений.
Режим одновременного нажатия на кнопки схема не предусматривает так же, как и оба варианта, опубликованные ранее.
Достоинства схемы:
1. Легкость обобщения на произвольное количество лампочек и кнопок.
2. В конструкции допустимо использование "стандартных" кнопок, т.е. имеющих лишь одну пару контактов на замыкание (без размыкающих контактов).
Схема не лишена недостатков, в частности, перегрузка звонка в нештатном режиме работы (при замыкании нескольких кнопок одновременно). Но мне это кажется меньшим недостатком, чем то, что опережение замыкания перед размыканием (в штатном режиме) ведет к КЗ.
Узнаю "раннего" andriano, готового спорить до бесконечности из-за никому неинтересных деталей..
varЯ бы не стал называть глобальную переменную однобуквенным идентификатором, но это в данном случае неважно, по крайней мере. на данном этапе еще не помешало погиманию, а вот это:
n: integer; // Суммарное число контактов всех элементов
t: integer; // Номер следующего соединения при сборкея действительно не могу понять. Из 4-х слов понимаю смысл только первого. Что такое соединение? Каким образом они нумеруются? (хотя бы в пределах одной схемы или в процессе перебора по разным вариантам схем) Что такое сборка?
typeПравильно ли я перевел на "свой" язык?
tVolt= (None,v1,v2); // Напряжение: не подано, v1, v2
type
tVolt= (None, LoV, HiV); // Напряжение на контакте: не подключен, низкий уровень, высокий уровень
tPin= array[1..255] of byte; // Массив выводовКак соотносятся между собой выводы и контакты?
constructor Create(ip: integer);Что обозначает входная переменная?
Pos: byte; // Состояние переключателя: 0, 1Почему переменная, принимающая только два значения, имеет тип byte, а не boolean?
Схема не будет работать. При включении любой из кнопок, гореть будут все лампочки так как питание будет проходить через лампочки.