Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Прогу на Паскале

Автор: raven
Дата сообщения: 19.10.2002 11:33
Даны имена трех призеров:

КОНСТАНТИН, ДМИТРИЙ, СВЕТЛАНА
ЭЛЬЗА, ВЛАДИМИР, ДМИТРИЙ
ГРИГОРИЙ, МАКСИМ, БОГДАН
СВЕТЛАНА, ЖАННА, ДМИТРИЙ
ГРИГОРИЙ, ЖАННА, ПАВЕЛ
ЭЛЬЗА, МАКСИМ, ПАВЕЛ
ВЛАДИМИР, ПАВЕЛ, ЭЛЬЗА

Известно, что:
1.В одном ответе все три имени названы правильно;
2.В одном ответе одно имя названо правильно;
3.В двух ответах два имени названы правильнож;
4.В остальных трех все имена неправильны.

Требуется написать прогу на TP для определения имен призеров!

Автор: qwd
Дата сообщения: 19.10.2002 16:16
raven
Опиши подробнее, я пока не понял, что дано, а что надо найти, и на каких условиях.
Автор: woffer
Дата сообщения: 19.10.2002 17:35
Логическая задача. Тут бы prolog использовать
Автор: qwd
Дата сообщения: 19.10.2002 17:49
woffer
для начаал надо условия уточнить. А на паскале, думаю, не проблема выполнить.
Автор: woffer
Дата сообщения: 19.10.2002 19:15
qwd

Цитата:
woffer
для начаал надо условия уточнить. А на паскале, думаю, не проблема выполнить.


А чего их уточнять ? Они вполне нормально написаны
На паскале не знаю, никогда такими вещами не занимался, а вот на prologe это делал в свое время (такая я же тестовая задачка)
Автор: qwd
Дата сообщения: 19.10.2002 20:11
woffer
Можешь объяснить мне другими словами? Я пока непонял чего дано, а что надо сделать
Автор: raven
Дата сообщения: 19.10.2002 23:22
Есть три призера. Они неизвестны, но известно, что в следующем списке:

1)КОНСТАНТИН, ДМИТРИЙ, СВЕТЛАНА
2)ЭЛЬЗА, ВЛАДИМИР, ДМИТРИЙ
3)ГРИГОРИЙ, МАКСИМ, БОГДАН
4)СВЕТЛАНА, ЖАННА, ДМИТРИЙ
5)ГРИГОРИЙ, ЖАННА, ПАВЕЛ
6)ЭЛЬЗА, МАКСИМ, ПАВЕЛ
7)ВЛАДИМИР, ПАВЕЛ, ЭЛЬЗА

1.В одной строчке все три имени названы правильно;
2.В одной строчке одно имя названо правильно;
3.В двух строчках два имени названы правильнож;
4.В остальных трех все имена неправильны.

Добавлено
Надо найти верную строчку, то есть имена призеров!
Автор: woffer
Дата сообщения: 20.10.2002 00:30
qwd прочти еще раз условия
Автор: qwd
Дата сообщения: 20.10.2002 07:09
raven
Понял, я думал указывается на выбор одно из условий!
Автор: raven
Дата сообщения: 20.10.2002 08:05
qwd
Ну как сможешь помочь?

Автор: Romero
Дата сообщения: 20.10.2002 10:26
=)
Автор: qwd
Дата сообщения: 20.10.2002 10:31
raven
У меян сейчас завал, сколько у тебя есть времени?
Автор: raven
Дата сообщения: 20.10.2002 16:31
qwd

До понедельника 22.00-24.00!
Во вторник надо сдать!

Если не можешь то хотя бы на этой неделе!

Romero
Говори по существу!
Автор: qwd
Дата сообщения: 20.10.2002 18:10
raven
Не успею никак. Только если в воскресенье, и то не обещаю.
Автор: raven
Дата сообщения: 20.10.2002 18:38
Ну ладно, как есть!
Если не понадобится, я тебе напишу.
Спасибо все равно!
Автор: qwd
Дата сообщения: 20.10.2002 19:05
Итак сегодня не один час убил на задачу из соседней ветки
Автор: raven
Дата сообщения: 20.10.2002 19:15
qwd
Посторайся и мне решить, в долгу не останусь
или хотя бы поделись мыслями или алгоритмом!
Хотя бы какие-нибудь зацепки!

Автор: qwd
Дата сообщения: 20.10.2002 19:38
Думать надо.
Автор: IntenT
Дата сообщения: 20.10.2002 21:14
Da chto tut sobstvenno dumat'?
ODNO iz pravilnyx imen povtoryaetsya MINIMUM 3 RAZA.
Iz etogo - ishim imena, povtoryaushiesya minimum 3 raza, naxodim v kakix strokax oni vstrechalis, i kazhduyu iz etix strok po-ocheredi v cikle proveryaem na PRAVILNOST (uslovie pravilnosti smotri v uslovii zadachi)
Full stop.
Автор: raven
Дата сообщения: 20.10.2002 21:47
IntenT
Поподробнее можно
Автор: qwd
Дата сообщения: 21.10.2002 06:48
IntenT
Не 3, 2 два.
Автор: f_serg
Дата сообщения: 21.10.2002 07:34
raven
Алгоритм, IMHO, должен быть такой:
1) Считаем, что правильная строка №1 (2, 3, ... 7). Исключаем ее из дальнейшего рассмотрения.
2) Ищем три строки, в которых имена не совпадают со строкой из 1). Если находим, то исключаем их, иначе переходим к 1).
3) Ищем 2 строки (из трех ), в которых только два имени совпадают со строкой из 1). Если не находим, то переход к 1).
4) Проверяем оставшуюся строку на соответсвие правилу 2 условий задачи. Если соответсвует, то задача решена. Иначе на 1).

Вроде так.
Автор: qwd
Дата сообщения: 21.10.2002 07:38
f_serg
возможно. надо пробовать на деле.
Автор: raven
Дата сообщения: 21.10.2002 13:24
Спасибо всем пробую, но все-таки выкладывайте исходники
Посмотрим у кого будет интереснее и рациональнее!

Добавлено
Код почти написал, но нужно использовать лейблы(labels)!
Помогите найти инфу или подскажите!
Автор: MaxValue
Дата сообщения: 22.10.2002 01:49
raven
я слшиком поздно заметил твою тему, так бы помог чем....
а вот на счет алгоритма f_serg'а - работает.
У меня получились победители седьмой строки
А у тебя чего?
Да, покажи исходники, интересно...
А если я успею закончить сегодня выложу свои - опять же ради интереса и развития....
Удачи!
Автор: raven
Дата сообщения: 22.10.2002 16:13
Наконец-то я написал прогу вот исходники:

Код: program olimp;

uses
CRT;
var
A:array[1..7,1..3] of string;
b:array[1..3] of integer;
q:array[1..8] of integer;
v:array[1..2] of integer;
I,J,l,m,s,c,w,k,result:integer;
label X;

BEGIN
CLRSCR;

{Prisvoenie znachenii}
A[1][1]:='KOHCT';
A[1][2]:='DMITR';
A[1][3]:='SVET';
A[2][1]:='ELZ';
A[2][2]:='VLAD';
A[2][3]:='DMITR';
A[3][1]:='GRIG';
A[3][2]:='MAX';
A[3][3]:='BOG';
A[4][1]:='SVET';
A[4][2]:='ZHAN';
A[4][3]:='DMITR';
A[5][1]:='GRIG';
A[5][2]:='ZHAN';
A[5][3]:='PAV';
A[6][1]:='ELZ';
A[6][2]:='MAX';
A[6][3]:='PAV';
A[7][1]:='VLAD';
A[7][2]:='PAV';
A[7][3]:='ELZ';

for i:=1 to 7 do
begin
for j:=1 to 7 do
begin
if j=i then j:=j+1;
for l:=1 to 3 do
begin
if ((A[i][1] <> A[j][l]) or (A[i][2] <> A[j][l])
or (A[i][3] <> A[j][l])) and (b[m]<>j) then
begin
m:=m+1;
b[m]:=j;
end;
if (m=3) and ((b[1]<>b[2]) and (b[2]<>b[3]) and (b[1]<>b[3])) then
begin
for s:=1 to 7 do
begin
if (s=i) or (s=b[1]) or (s=b[2]) or (s=b[3]) then
s:=s+1;
if ((a[i][1]=a[s][1]) and (a[i][2]=a[s][2]))
or ((a[i][1]=a[s][2]) and (a[i][2]=a[s][1]))
or ((a[i][1]=a[s][1]) and (a[i][3]=a[s][3]))
or ((a[i][1]=a[s][3]) and (a[i][3]=a[s][1]))
or ((a[i][2]=a[s][2]) and (a[i][3]=a[s][3]))
or ((a[i][2]=a[s][3]) and (a[i][3]=a[2][1])) then
begin
k:=k+1;
v[k]:=s;
end;
if (k=2) and (v[1]<>v[2]) then
begin
for w:=1 to 7 do
begin
if (w=i) or (w=b[1]) or (w=b[2]) or (w=b[3]) or (w=s) then w:=w+1;
if (A[i][1]=A[w][1]) or (A[i][1]=a[w][2]) or (A[i][1]=A[w][3])
or (A[i][2]=A[w][1]) or (A[i][2]=a[w][2]) or (A[i][2]=A[w][3])
or (A[i][3]=A[w][1]) or (A[i][3]=a[w][2]) or (A[i][3]=A[w][3]) then
begin
result:=i;
WriteLn('Iskomaya stroka - ',result,
' Soderzhit imena ',A[result][1],',',A[result][2],',',A[result][3]);
goto X;
end;
end;
end;
end;
end;
end;
k:=0;
end;
m:=0;
end;
if result=0 then WriteLn('Reshenii net');
X:
readln;
END.
Автор: IntenT
Дата сообщения: 22.10.2002 16:47
qwd
Vse-taki 3 raza
Автор: MaxValue
Дата сообщения: 22.10.2002 17:14
raven
Молодца!
Мне твоя задача понравилась - сегодня весь день не мог выкинуть ее из головы.
У меня тоже получился кое-какой исходник - почти копия твой, притом что я твой увидел только сейчас (с другой стороны - естественно, ведь алгоритм один )
Короче доделаю последние шрихи и покажу...
Сравним, обсудим
На что сдал?
Автор: raven
Дата сообщения: 22.10.2002 18:03
Завтра понесу!
Не знаю, че будет - у нас как-то через матрицы делали и т. д.

MaxValue
Если че мыль мне или заходи по АСЕ!
Автор: MaxValue
Дата сообщения: 22.10.2002 19:38
raven
вот мой вариант решения твоей задачи - примитивно , но работает
даже если строки менять местами (я менял только две строки местами остальные не стал - торопился)

Код:
PROGRAM raven;
USES crt;
TYPE
Mas=array[1..7,1..3] of String;
VAR
ppl: Mas;
iskl:array[1..4] of Integer;
rest:array[1..3] of Integer;
i,j,k,l,m,n,o,p: integer;
last: integer;
pass1, pass2, pass3, ok: boolean;

FUNCTION Check(ppl:Mas; a,c:integer): boolean;
Begin
if ((
(ppl[a,1]=ppl[c,1])or
(ppl[a,1]=ppl[c,2])or
(ppl[a,1]=ppl[c,3])
)
and
(
(ppl[a,2]=ppl[c,1])or
(ppl[a,2]=ppl[c,2])or
(ppl[a,2]=ppl[c,3])
))
OR
((
(ppl[a,1]=ppl[c,1])or
(ppl[a,1]=ppl[c,2])or
(ppl[a,1]=ppl[c,3])
)
and
(
(ppl[a,3]=ppl[c,1])or
(ppl[a,3]=ppl[c,2])or
(ppl[a,3]=ppl[c,3])
))
OR
((
(ppl[a,2]=ppl[c,1])or
(ppl[a,2]=ppl[c,2])or
(ppl[a,2]=ppl[c,3])
)
and
(
(ppl[a,3]=ppl[c,1])or
(ppl[a,3]=ppl[c,2])or
(ppl[a,3]=ppl[c,3])
))
then Check:=True
else Check:=False;
End;

BEGIN
clrscr;
ppl[1,1]:='Konstantin';
ppl[1,2]:='Dmitrij';
ppl[1,3]:='Svetlana';
ppl[2,1]:='Elza';
ppl[2,2]:='Vladimir';
ppl[2,3]:='Dmitrij';
ppl[3,1]:='Grigorij';
ppl[3,2]:='Maxim';
ppl[3,3]:='Bogdan';
ppl[4,1]:='Svetlana';
ppl[4,2]:='Zhanna';
ppl[4,3]:='Dmitrij';
ppl[5,1]:='Grigorij';
ppl[5,2]:='Zhanna';
ppl[5,3]:='Pavel';
ppl[6,1]:='Elza';
ppl[6,2]:='Maxim';
ppl[6,3]:='Pavel';
ppl[7,1]:='Vladimir';
ppl[7,2]:='Pavel';
ppl[7,3]:='Elza';


for k:= 1 to 7 do begin
iskl[4]:=k;
pass1:=false;
pass2:=false;
pass3:=false;
for i:= 1 to 3 do begin
iskl[i]:=0;
rest[i]:=0;
end;

for i:= 1 to 7 do begin
if k<>i then begin
if ((ppl[i,1]<>ppl[k,1]) and (ppl[i,1]<>ppl[k,2]) and (ppl[i,1]<>ppl[k,3])) and
((ppl[i,2]<>ppl[k,1]) and (ppl[i,2]<>ppl[k,2]) and (ppl[i,2]<>ppl[k,3])) and
((ppl[i,3]<>ppl[k,1]) and (ppl[i,3]<>ppl[k,2]) and (ppl[i,3]<>ppl[k,3]))
then begin
{заполняем мисключающий массив стркоми имена в который не совпадают с именами в строке k}
if (iskl[1]<>0) and (iskl[2]<>0) and (iskl[3]<>0) then
pass1:=false
else begin
if iskl[1]=0 then iskl[1]:=i
else if iskl[2]=0 then iskl[2]:=i
else if iskl[3]=0 then iskl[3]:=i;
if (iskl[1]<>0) and (iskl[2]<>0) and (iskl[3]<>0) then pass1:=true;
end;
end;
end;
end;

{если нашли три строки - заполняем массив оставшимися элементами т.е. без строки k и строк в исключающем массиве}
if pass1 then begin
for l:= 1 to 7 do begin
if (l<>iskl[1]) and (l<>iskl[2]) and (l<>iskl[3]) and (l<>iskl[4]) and (rest[1]=0) then rest[1]:=l
else if (l<>iskl[1]) and (l<>iskl[2]) and (l<>iskl[3]) and (l<>iskl[4]) and (rest[2]=0) then rest[2]:=l
else if (l<>iskl[1]) and (l<>iskl[2]) and (l<>iskl[3]) and (l<>iskl[4]) and (rest[3]=0) then rest[3]:=l;
end;
if (rest[1]<>0) and (rest[2]<>0) and (rest[3]<>0) then pass2:=true;
end;

{проверяем есть ли среди оставшихся строк две в которых 2 имени совпадают со строкой k}
if pass2 then begin
if ( (Check(ppl,rest[1],k)) and (Check(ppl,rest[2],k)) )
OR
( (Check(ppl,rest[2],k)) and (Check(ppl,rest[3],k)) )
OR
( (Check(ppl,rest[1],k)) and (Check(ppl,rest[3],k)) )
then
if pass3<>true then pass3:=true;
if (Check(ppl,rest[1],k)) and (Check(ppl,rest[2],k)) then last:=3;
if (Check(ppl,rest[2],k)) and (Check(ppl,rest[3],k)) then last:=1;
if (Check(ppl,rest[1],k)) and (Check(ppl,rest[3],k)) then last:=2
else
pass3:=false;
end;
{если такие две строки нашлись то третью проверяем на соответствие одного имени строки k}
if pass3 then begin
ok:=false;
if (ppl[last,1]=ppl[iskl[4],1]) or
(ppl[last,1]=ppl[iskl[4],2]) or
(ppl[last,1]=ppl[iskl[4],3]) or
(ppl[last,2]=ppl[iskl[4],1]) or
(ppl[last,2]=ppl[iskl[4],2]) or
(ppl[last,2]=ppl[iskl[4],3]) or
(ppl[last,3]=ppl[iskl[4],1]) or
(ppl[last,3]=ppl[iskl[4],2]) or
(ppl[last,3]=ppl[iskl[4],3])
then begin
if ok=false then ok:=true
else ok:=false;
end;
if ok then begin
Writeln('Winners (in string #',k,'):');
for n:=1 to 3 do writeln(n,'. ',ppl[iskl[4],n]);
readkey;
halt;
end;
end;
end;
Writeln('No winners!');
Readkey;
END.

Страницы: 12

Предыдущая тема: Альтернатива Database Desktop


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.