Помощь - Поиск - Пользователи - Календарь
Полная версия: Сложно.Трудно.Помогите.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Archie
13.22 type слово=packed array[1..9] of char;
номер телефона=100000...999999;
знакомый=record фамилия:слово;
номер:номертелефона;
end;
страница=array[1..20] of знакомый;
запясная книжка=array['A'..'Z'] of страница;
Считая, что на каждой странице записной книжки указаны фамилии, начинающиеся с одной и той же буквы - индекса этой страницы, описать логическую функцию:
а) номера (ЗК,НТ,Ф), определяющую, есть ли в записной книжке ЗК сведения о знакомом с фамилией Ф, и, если есть, присваивающую параметру Ф фамилию этого знакомого.
14.33 Описать логическю функцию Path (G,N,K,D), которая определяет, есть ли в ориентированном графе G путь из вершины N в вершину K, и, если есть, присваивает параметру D длину (число дуг) кратчайшего пути из N в K.
Использовать следующее представление графа:
type вершина = (b1,b2,b3,b4,b5,b6,b7,b8);
соседи = set of вершина;
граф = array[вершина] of соседи;
(G[x] - множество вершин, которые ведут дуги из вершины x)

Помогите пожалуйста...в субботу сдавать эту лабораторную, а сделать не получсется...жду ответов.
Lapp
Цитата(Archie @ 13.12.2007 21:22) *

сделать не получсется...жду ответов.

Покажи, что сделал.

Желательно, по одной задаче на тему.
Archie
program _13_22;

type
slovo = array[1..9] of char;
nomer_telefona = 100000..999999;
znakomiy = record
fam: slovo;
nomer: nomer_telefona;
end;
stranica = array[1..20] of znakomiy;
zapisnay_knigka = array['A'..'Z'] of stranica;

var
zk: zapisnay_knigka;
nt: nomer_telefona;
fam: slovo;
i: byte;
s: string;

procedure dobavit(fam: string; nt: nomer_telefona; var zk: zapisnay_knigka);
var
i, j: byte;
begin
for i := 1 to 20 do
if zk[fam[1], i].fam[1] = #0 then
begin
for j := 1 to length(fam) do
zk[fam[1], i].fam[j] := fam[j];
zk[fam[1], i].nomer := nt;
break;
end;
end;

function familia(zk: zapisnay_knigka; fam: slovo; var nt: nomer_telefona): boolean;
var
i: byte;
j: char;
begin
for j := 'A' to 'Z' do
for i := 1 to 20 do
if zk[j, i].fam = fam then
begin
nt := zk[j, i].nomer;
familia := true;
break;
end;
end;

begin
dobavit('Alena', 111111, zk);
dobavit('Vika', 222222, zk);
dobavit('Genia', 333333, zk);
dobavit('Nadia', 444444, zk);
dobavit('Masha', 555555, zk);
s := 'Masha';
for i := 1 to length(s) do
fam[i] := s[i];
if familia(zk, fam, nt) = true then writeln('Masha ', nt)
else writeln('Takogo znakomogo net');
readln;
end.


Хз - верно или нет...по суи да, но как то коряво. а вторую даж не понял. помогите плиз.
Lapp
Цитата(Archie @ 14.12.2007 7:41) *

но как то коряво. а вторую даж не понял. помогите плиз.

Коряво, да.. но бывает намнооооого корявее! smile.gif

Что касается второй - интересная задача. Думаю, тут можно использовать рекурсивный перебор.
1. Заводишь array[все вершины]of вершина - это путь P.
2. Такой же массив для хранения минимального пути, Pmin.
3. Заводишь глобальную переменную типа вершина для длины пути L.
4. Такую же переменную для хранения длины минимального пути Lmin.
5. Для удобства можно завести еще и множество S из вершин для обозначения пройденных (хотя они уже есть в пути, но проверка множества будет происходить быстрее).
6. Заводишь булевскую переменную Found.
7. Делаешь процедуру, в которую передаешь как параметр исходную вершину (а). В этой процедуре увеличиваешь длину пути L на 1, добавляешь вершину а к пути P[L]:=a. Потом проверяешь:
- если а=х (х = это конечная вершина), то Found:=true и проверяешь - если L<Lmin, то кладешь Pmin:=P и Lmin:=L, затем выходишь. Если а не равно х, то добавляешь вершину в множество S пройденных вершин и проходишь по всем соседям этой вершины (то есть вызываешь эту же процедуру с соседом качестве параметра), исключая уже пройденные. Потом выходишь, удаляя эту вершину из P и из S, а также уменьшая L на единицу.

Эту процедуру вызываешь из главной программы, предварительно присвоив L:= и Lmin:=High(вершины)

Коряво, конечно, описал.. smile.gif Но примерно так. Отладка - после кодиррования алгоритма smile.gif

Если хочешь затравку: вот начало той процедуры (не исключено, что его нужно будет корректировать).
procedure Search(a:tVertex);
begin
Inc(L);
P[L]:=a;
if a=x then begin
Found:=true;
if L<Lmin then begin
Lmin:=L;
Pmin:=P
end
end
else for v:=Low(tVertex) to High(tVertex) do begin
if v in Neighbors-S then Search(v)
Archie
У меня не получается...а завтра лабу сдавать. напиши пожалуйста всё решение второй задачи.
Lapp
Не получается - выложи хотя бы то, что пытался сделать.
Пойми - все решать за тебя я не буду. Даже не надейся. Помочь - помогу.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.