program lab12;
var
ch,bu,tr,pi: ^char;
six,sev,eig,nin,ten,J,Q,K,A: ^string;
begin
new(six);
new(sev);
new(eig);
new(nin);
new(ten);
new(J);
new(Q);
new(K);
new(A);
new(ch);
new(bu);
new(tr);
new(pi);
six^:='6';
sev^:='7';
eig^:='8';
nin^:='9';
ten^:='10';
J^:='J';
Q^:='Q';
K^:='K';
A^:='A';
ch^:=#3;
bu^:=#4;
tr^:=#5;
pi^:=#6;
write(six^,ch^,' ',six^,bu^,' ',six^,tr^,' ',six^, pi^,' ');
write(sev^,ch^,' ',sev^,bu^,' ',sev^,tr^,' ',sev^, pi^,' ');
write(eig^,ch^,' ',eig^,bu^,' ',eig^,tr^,' ',eig^, pi^,' ');
write(nin^,ch^,' ',nin^,bu^,' ',nin^,tr^,' ',nin^, pi^,' ');
writeln(ten^,ch^,' ',ten^,bu^,' ',ten^,tr^,' ',ten^, pi^);
write(J^,ch^,' ',J^,bu^,' ',J^,tr^,' ',J^, pi^,' ');
write(Q^,ch^,' ',Q^,bu^,' ',Q^,tr^,' ',Q^, pi^,' ');
write(K^,ch^,' ',K^,bu^,' ',K^,tr^,' ',K^, pi^,' ');
write(A^,ch^,' ',A^,bu^,' ',A^,tr^,' ',A^, pi^);
readln
end.
Двунаправленный список (Pascal)
"Создать двунаправленный список и разместить в нём в определённом порядке данные о колоде карт. Разработать программу, проводящую перемешивание колоды путём сдвига и перестановки её частей, результаты перемешивания вывести на экран". Спасибо за внимание!
Вот с чего я начал: создал все элементы карт (вес карты и её масть) и разместил это в динамической памяти. Но проблема вот в чём: вес карты- это тип string, а её масть- char. Но вроде бы тип record (запись) поддерживает разные типы внутри себя. Так вот, сейчас, например, 6♥ -это 2 типа (строчный и символьный). Подскажите, как мне сделать, чтобы 6♥ был одним типом (record), чтобы я мог использовать 6♥ (перемещать) по списку. Ну чтобы у 6♥ был один адрес (указатель), а не два, как сейчас.
type TrData = record
suit : string;
rank : char;
end;
TpElm = ^TrElm;
TrElm = record
data : TrData;
next,
prev : TpElm;
end;
TrData - запись, хранящая информационную часть элемента. объявлена отдельным типом для удобства работы: в случае необходимости можно менять отдельно этот тип, не трогая основного элемента. К тому же намного удобнее написать отдельную процедуру ввода именно этой информационной части, которая будет весьма универсальна.
TpElm - тип указателя на элемент списка. Опять же введён для удобства написания и чтения программы, для улучшения наглядности.
TrElm - собственно сам элемент списка. Содержит информационную часть, описанную выше, а так же два указателя на объект типа TrElm - на два других элемента списка: prev - на предыдущий, next - на следующий. Необходимы они для перемещения по списку. У первого элемента списка prev указывает на nil, у последнего - next указывает на nil.
При работе двунаправленные списки намного удобнее однонаправленных из-за связей элемента с предшествующим ему и следующим за ним.
При желании можно обойтись без отдельных указателей на начало и конец такого списка, но лучше этого не делать. Удобно сделать отдельные переменные, содержащие адрес начала и конца списка. Это удобно для поиска и редактирования списка, для его создания. Например, если надо найти элемент по номеру, можно идти от начала или конца списка в зависимости от того, к чему искомый элемент ближе.
По поводу перемешивания - просто манипулируем указателями на элементы next и prev, для достижения нужного эффекта. Думаю, это автор может сделать сам.
К МОДЕРАТОРАМ. Прошу не удалять сообщение, ведь ответ так и не был дан, а тема двунаправленных списков весьма актуальна для студентов, ведь объясняют, как правило, однонаправленные, а работать удобнее с двунаправленными