Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на языке Pascal


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

lamed
Статус: Профессионал
Рейтинг: 2707
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2420
∙ повысить рейтинг »
star9491
Статус: Профессионал
Рейтинг: 2087
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Программирование / Pascal (Паскаль)

Номер выпуска:1093
Дата выхода:29.05.2010, 18:00
Администратор рассылки:Boriss, Академик
Подписчиков / экспертов:222 / 180
Вопросов / ответов:1 / 1

Вопрос № 178478: Добрый вечер,уважаемые эксперты! Помогите пожалуйста решить задачу: Создать два списка. Выдать списки. Добавить поэлементно элементы второго списка после каждого элемента первого списк...



Вопрос № 178478:

Добрый вечер,уважаемые эксперты!
Помогите пожалуйста решить задачу:
Создать два списка. Выдать списки. Добавить поэлементно элементы второго списка после каждого элемента первого списка. Если во втором списке количество элементов больше, чем количество элементов в первом, оставшиеся элементы не добавлять

Отправлен: 19.05.2010, 03:01
Вопрос задал: angel.nero, Посетитель
Всего ответов: 1
Страница вопроса »


Отвечает lamed, Профессионал :
Здравствуйте, angel.nero! Программа проверена на ABC. Комментарии в тексте программы. Если что-то требует уточнения, задавайте вопросы в мини-форуме.
Код:

program p178478;
{ Создать два списка. Выдать списки. Добавить поэлементно элементы второго
списка после каждого элемента первого списка. Если во втором списке количество
элементов больше, чем количество элементов в первом,
оставшиеся элементы не добавлять
}
{ RFPRO, lamed }

// Программирование на языке Pascal. Задачник. Под ред. Усковой О.Ф.
// СПб: Питер, 2003
// В программе рассматриваются списки с заглавным звеном, или, "со сторожем"
// Процедуры ZLIst_Init, ZList_AddLast, BList_Print, ZList_Print, List_Clear
// принадлежат Усковой О.Ф. Глава 15. Задание 1
// Префикс Z относится к обработке с заглавным звеном
// Префикс B - без заглавного звена

const
ERROR = -MaxInt - 1; // Возвращаемая ошибка, если не найден элемент списка
// только для целых чисел
name_a = 'a.dat'; // файлы данных для первого
name_b = 'b.dat'; // и второго списков
type
TElem = integer; // Тип информационной части
TList = ^TNode; // Представление списка
TNode = record // Звено списка
info: TElem; // Информационная часть
next: TList; // Следующий элемент
end;
TElemFile = file of TElem; // Тип файла для хранения информационных частей

procedure Files_Create(name_a, name_b: string);
// Создание файлов
// для удобства тестирования в файл a записываются нечетные числа,
// в файл b - четные
var
i, n: integer;
file_a, file_b : TElemFile;
begin
assign(file_a, name_a);
assign(file_b, name_b); Randomize;

// Количество элементов задается случайным образом
rewrite(file_a);
for i:= 1 to Random(20)+1 do
write(file_a,i*2-1);
close(file_a);

rewrite(file_b);
for i:= 1 to Random(20)+1 do
write(file_b,i*2);
close(file_b);
end;

procedure ZList_Init(var L: TList);
// Инициализация списка с заглавным звеном
var
n: TList;
begin
new(n);
n^.next := nil;
l:= n;
end;

procedure ZList_AddLast(L:TList; e: TElem);
// Добавление элемента в конец списка с заглавным звеном
begin
while L^.next <> nil do L:= L^.next;
new(L^.next);
L:=L^.next;
L^.info := e;
L^.next := nil;
end;

procedure Insert_After(L:TList; n: integer; e: TElem);
// Вставка элемента в список с заглавным звеном
// после элемента с номером n
var
i: integer;
p: TList;
tmp: TList;
begin
i:= 0;
p:= L;
while (i<n) and (p^.next &l t;> nil) do
begin
inc(i);
p:= p^.next;
end;
if (i<n) then
begin
writeln('неудача');
exit;
end
else if (p^.next = nil) then
begin
new(p^.next);
p:=p^.next;
p^.info := e;
p^.next := nil;
end
else
begin
new(tmp);
tmp^.info := e;
tmp^.next := p^.next;
p^.next := tmp;
end;
end;

function Get_Item(L:TList; n: integer): TElem;
// Получение элемента списка с заглавным звеном по номеру
var
i: integer;
p: TList;
begin
i:= 0;
p:= L;
while (i<n) and (p^.next <> nil) do
begin
inc(i);
p:= p^.next;
end;
if (i<n) then
Get_Item := ERROR
else
Get_Item := p^.info;
end;

function List_Length(L:TList): integer;
// Вычисление длины списка с заглавным звеном
var
i: integer;
be gin
i:= 0;
L:= L^.next;
while (L <> nil) do
begin
L:= L^.next;
inc(i);
end;
List _Length := i;
end;

procedure BList_Print(L:TList);
// Печать списка без заглавного звена
begin
write('<');
while (L <> nil) do
begin
write(L^.info);
if (L^.next <> nil) then write('.');
L:= L^.next;
end;
writeln('>');
end;

procedure ZList_Print(L: TList);
// Печать списка c заглавным звеном
begin
BList_Print(L^.next);
end;

procedure List_Clear(var L:TList);
// Удаление списка
var
n: TList;
begin
while (L <> nil) do
begin
n:= L;
L := L^.next;
dispose(n);
end;
end;

procedure FileToList(fname: string; var L: TList);
// Чтение файла в список
var
e: TElem;
f: TElemFile;
begin
assign(f, fname);
if not FileExists(fname) then
exit;
reset(f);
while not eof(f) do
begin
read(f, e);
ZList_AddLast(L, e );
end;
close(f);
end;

var
a, b: TList; // списки
e: TElem; // элемент типа информационной части
i: integer; // счетчик припроходе по циклу слияния списков
len_a: integer; // длина первого списка

begin // главная программа
Files_Create(name_a, name_b);

ZList_Init(a);
FileToList(name_a, a);

ZList_Init(b);
FileToList(name_b, b);

writeln('Начальные значения');
write('a=>');
ZList_Print(a);

write('b=>');
ZList_Print(b);

len_a := List_length(a);
i:= 1;
e:= Get_Item(b,i);
while (i<=len_a) and (e <> ERROR) do
begin
Insert_After(a,2*i-1,e);
inc(i);
e:= Get_Item(b,i);
end;

writeln('После вставки');
write('a=>');
ZList_Print(a);

List_Clear(a);
List_Clear(b);

readln;
end.

Пример рабо ты
Код:
Начальные значения
a=><1.3.5.7.9.11.13.15.17.19.21.23.25>
b=><2.4.6.8.10.12.14.16.18.20.22>
После вставки
a=><1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.25>

Ответ отправил: lamed, Профессионал
Ответ отправлен: 23.05.2010, 11:55
Номер ответа: 261582

Оценка ответа: 5

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 261582 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.16 от 26.05.2010

    В избранное