Пример готового оформления отчета № 1.11 и № 4.26

advertisement
МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ИНСТИТУТ
РАДИОТЕХНИКИ, ЭЛЕКТРОНИКИ И АВТОМАТИКИ
(ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ)
_____________________________________________________________________________
Кафедра «Математическое обеспечение вычислительных систем»
ОТЧЕТ
по лабораторному практикуму
по дисциплине «Структуры и алгоритмы обработки данных»
(часть 1)
Учебная группа ВСМ-6-05
Студент Овсянникова М.Е.
Руководитель Сыромятников В.П.
Москва – 2007
Лабораторная работа №1
«ЛИНЕЙНЫЕ ОДНОСВЯЗНЫЕ СПИСКИ»
(Вариант 1.11)
1. Постановка задачи
Составить процедуру для включения исходного линейного односвязного списка (ЛОС) –
первогоЛОС, в конец другого ЛОС (второго ЛОС).
Произвести распечатку списков и результатов работы программы.
type
2. Описание типов используемых структур данных
TE=integer;
PE=^EL; // указатель на элемент списковой структуры
EL=record // элемент списка
inf:TE; // информационное поле
next:PE // адресное поле «следующий»
end;
3. Описание пользовательского интерфейса
3.1. Начало и окончание работы программы
Пользовательский интерфейс реализован в консольном режиме работы. Тем не менее, при
этом отработаны основные положения «дружественного интерфейса». Так, работа
программы начинается с приветствия и приглашения к началу работы:
Полный цикл работы с программой завершается вопросом пользователю:
В зависимости от выбранного пользователем ответа, программа, либо выполняет новый
цикл работы, либо завершает свою работу.
3.2. Описание диалога
Сначала необходимо ввести элементы исходного (первого) ЛОС, элементы которого
вводятся пользователем с клавиатуры (ввод текущего элемента ЛОС (обязательно
целочисленного значения) осуществляется нажатием клавиши «Enter»). Признаком конца
ЛОС является ввод пользователем нулевого значения.
После завершения ввода исходного (первого) ЛОС, необходимо произвести ввод второго
ЛОС по тому же принципу.
После завершения ввода двух ЛОС производится вывод их содержимого на экран.
Затем осуществляется вставка первого ЛОС в конец второго ЛОС.
Объединённый ЛОС выводится на экран.
Диалог завершается сообщением «Желаете продолжить работу с программой? (д/н)».
2
3.3. Контроль исходных данных
При обнаружении ошибки во входных данных, на экран выводиться сообщение:
«Вы ввели недопустимое значение!!!»
и пользователю предлагается произвести ввод корректных исходных данных (см. раздел
7.3).
4. Описание алгоритма
Ввод исходных данных осуществляется процедурой SLOS (создание ЛОС), которая
преобразует их в ЛОС в динамической памяти.
Также в процедуре SLOS при вооде данных проводится проверка правильности типа
входных исходных данных с использованием функции «err».
Вывод введённых списков на экран, выполняет процедура RLOS (распечатка ЛОС). При
этом, если список пуст, выводиться сообщение «ЛОС пустой – выводить нечего».
Соббственно вставку исходного ЛОС в конец другого ЛОС выполняет процедура ALLOS,
результат работы которой выводится на экран с использованием всё той же процедуры
RLOS.
5. Исходный код программы
program DSD_LOS11;
{$APPTYPE CONSOLE}
// Составить процедуру для включения исходного линейного
// односвязного списка в конец другого ЛОС
uses
SysUtils;
type TE=integer;
PE=^EL;
EL=record
inf:TE;
next:PE
end; //pe
var
p1,p2:PE;
s:Char;
function RUS(s:string):string;// русификатор
var i:longint;
begin
for i:=1 to length(s) do
begin
if ord(s[i]) in [192..239] then
s[i]:=chr(ord(s[i])-64);
if ord(s[i]) in [240..255] then
s[i]:=chr(ord(s[i])-16);
end;
RUS:=s
end; // function RUS
function err(s:string):TE; // функция проверки ввода допустимых данных
3
var a, code:integer ;
begin
val(s,a,code);
while code<>0 do
begin
writeln(rus('Вы ввели недопустимое значение!!!'));
readln(s); val(s,a,code);
end;
err:=a;
end;//err
procedure SLOS(var sag:PE); // ввод списка
var q:PE;
a:TE;
s:string;
begin
New(sag);
q:=sag; q^.next:=nil;
readln(s); a:=err(s);
while a<>0 do
begin
New(q^.next); q:=q^.next;
q^.inf:=a; q^.next:=nil; readln(s);
a:=err(s);
end;
end; //SLOS
procedure RLOS(sag:PE); // вывод списка
var q:PE;
begin
q:=sag^.next;
if q=nil then writeln(rus('ЛОС пустой - выводить нечего')) else
begin
while q<>nil do
begin
write(q^.inf,' ' );
q:=q^.next;
end; end;
writeln;
end; //RLOS
procedure ALLOS(sag,p:PE); // вставка исх. списка в конец другого
var q:PE;
begin
q:=sag;
while q^.next<>nil do q:=q^.next; // запоминание последнего эл-та списка
q^.next:=p^.next; // q-адрес посл. эл-та, p-добавляемый список
end; //ALLOS
begin
writeln(rus('Здравствуйте уважаемый пользователь!')) ;
writeln(rus('Данная программа предназначена для:'));
4
writeln(rus(вставки первого ЛОС в конец второго ЛОС.'));
writeln;
repeat
writeln(rus('Введите элементы первого ЛОС (целые числа), ввод завершите 0:'));
SLOS(p1); // ввод первого ЛОС
writeln(rus('Введите элементы второго ЛОС (целые числа), ввод завершите 0:'));
SLOS(p2); // ввод второго ЛОС
writeln;
write(rus('Первый ЛОС: '));
RLOS(p1); // вывод первого ЛОС на экран
write(rus('Второй ЛОС: '));
RLOS(p2);// вывод второго ЛОС на экран
writeln;
ALLOS(p2,p1); // вставка первого ЛОС в конец второго
writeln(rus('Вывод объединенных списков '));
writeln(rus('(первый ЛОС вставлен в конец второго ЛОС):'));
RLOS(p2); // вывод объединенного списка на экран
readln;
write(rus('Желаете продолжить работу с программой? (д/н) ')); read(s);
Dispose(p1); Dispose(p2) ; readln
until s=rus('н') ;
readln;
writeln(rus('Пользование программой завершено, для выхода нажмите Enter'));
readln;
end.
6. Описание тест-примеров
Тест-примеры , используемые при отладке настоящей программы, разбиты на 3 группы:
Корректные входные данные (2 тест-примера), пустые ЛОС (3 примера), некорректные
входные данные (3 тест-примера).
Описание тест-примеров приведено в следующем разделе «Результаты контрольного
прогона»
7. Результаты контрольного прогона программы
7.1. Корректные входные данные (начало)
5
Корректные входные данные (продолжение)
7.2. Пустые ЛОС (начало)
6
Пустые ЛОС (продолжение)
7.3. Некорректные входные данные (начало)
7
Некорректные входные данные (продолжение)
8
Лабораторная работа №2
«Деки»
(Вариант 4.26)
1. Постановка задачи
Составить программу построения дека, содержащего целые числа. Вычислить количество
содержащихся в деке чисел, свободных от квадратов. Число называется свободным от квадратов,
если оно не делится ни на один квадрат простого числа.
Произвести распечатку результатов работы программы.
type
2. Описание типов используемых структур данных
TE=integer;
PE=^EL; // указатель на элемент списковой структуры
EL=record // элемент списка
inf:TE; // информационное поле
next:PE // адресное поле «следующий»
end;
3. Описание пользовательского интерфейса
3.1. Начало и окончание работы программы
Пользовательский интерфейс реализован в консольном режиме работы. Тем не менее, при
этом отработаны основные положения «дружественного интерфейса». Так, работа
программы начинается с приветствия и приглашения к началу работы:
Полный цикл работы с программой завершается вопросом пользователю:
В зависимости от выбранного пользователем ответа, программа, либо выполняет новый
цикл работы, либо завершает свою работу.
3.2. Описание диалога
Сначала необходимо ввести элементы дека, элементы которого вводятся пользователем с
клавиатуры (ввод текущего элемента дека (обязательно целочисленного значения)
осуществляется нажатием клавиши «Enter»). Признаком конца дека является ввод
пользователем нулевого значения.
После завершения ввода дека производится вывод их содержимого на экран.
Затем осуществляется подсчёт количества чисел в деке, свободных от квадратов и вывод
на экран.
Диалог завершается сообщением «Желаете продолжить работу с программой? (д/н)».
9
3.3. Контроль исходных данных
При обнаружении ошибки во входных данных, на экран выводиться сообщение:
«Вы ввели недопустимое значение!!!»
и пользователю предлагается произвести ввод корректных исходных данных (см. раздел
7.3).
4. Описание алгоритма
Ввод исходных данных осуществляется процедурой SD (создание дека), которая
преобразует их в дек в динамической памяти.
Также в процедуре SD при вводе данных проводится проверка правильности типа
входных исходных данных с использованием функции «err».
Вывод введённого дека на экран, выполняет процедура RD (распечатка дека). При этом,
если список пуст, выводиться сообщение «Дек пустой – выводить нечего».
Собственно вычисление количества чисел в деке, свободных от квадратов выполняет
функция CSK, для работы которой используются функция next_prost, определяющая
значение следующего простого числа и процедура sv, присваивающая значение 1
переменной k, если число свободно от квадратов.
5. Исходный код программы
program DSD_DEC ;
{$APPTYPE CONSOLE}
{Составить программу построения дека, содержащего
целые числа. Вычислить количество содержащихся в деке чисел,
свободных от квадратов. (Число называется свободным от квадратов,
если оно не делится ни на один квадрат простого числа.)}
uses
SysUtils;
type TE=integer ;
PE=^EL;
EL=record
inf:TE;
next:PE
end; //pe
var
p ,pleft,pright:PE;
s:Char;
k:integer;
{pleft - указатель на левый крнец дека}
{pright - указатель на правый конец дека}
function RUS(s:string):string;// русификатор
var i:longint;
begin
for i:=1 to length(s) do
begin
if ord(s[i]) in [192..239] then
s[i]:=chr(ord(s[i])-64);
if ord(s[i]) in [240..255] then
s[i]:=chr(ord(s[i])-16);
end;
10
RUS:=s
end; // function RUS
function err(s:string):TE; // функция проверки ввода допустимых данных
var a, code:integer ;
begin
val(s,a,code);
while code<>0 do
begin
writeln(rus('Вы ввели недопустимое значение!!!'));
readln(s); val(s,a,code);
end;
err:=a;
end;//err
procedure VR(a:TE);// вставка эл-ов дека справа
var q:PE;
begin
New(q);
q^.inf:=a;
q^.next:=pright;
pright:=q;
end;//VR
procedure SD(p:PE); // создание целочисленного дека
var q:PE;
a:TE;
s:string;
begin
New(q);
writeln(rus('Создание целочисленного дека'));
writeln(rus('Вводите эл-ты (целые числа), ввод завершите 0 '));
readln(s); a:=err(s);
if a<>0 then
begin
q^.inf:=a; // создание заглавного эл-та
q^.next:=nil;
pleft:=q;
pright:=q;
readln(s); a:=err(s);
while a<>0 do
begin
VR(a); readln(s); a:=err(s);// вставка эл-ов справа
end;end
else begin pleft:=nil; pright:=nil; end;
end; //SD
11
procedure RD(p:PE); // вывод эл-ов дека
var q:PE;
begin
New(q);
q:=pright;
if q=nil then writeln(rus('Дек пустой-выводить нечего'))
else
begin
writeln(rus('Вывод дека на экран: '));
while q<>nil do
begin
write(q^.inf,' ');
q:=q^.next;
end;
end;//else
end;//RD
{p-введённое целое число.
ф-ия выводит первое простое число, которое больше p}
function next_prost(p:integer):integer;
var n:integer;
begin
inc(p);
n:=p-1;
while n>1 do
begin
if (p mod n)<>0 then dec(n)
else begin inc(p); n:=p-1; end;//else
end;//while
next_prost:=p;
end;//next_prost
{процедура, увеличивающая значение к на единицу, если число является свободным от
квадратов}
procedure sv(a:TE);
var n:integer;
begin
n:=2;
if (abs(a)>4) then
begin
while ((abs(a)) mod (sqr(n))<>0)do
begin
n:=next_prost(n);
if (abs(a))<(sqr(n))then begin inc(k); exit; end;
end;//while2
end;//if
end; //sv
12
{ф-ия, вычисляющая количество чисел, свободных от квадратов}
function CSK(p:PE):integer;
var q:PE;
begin
New(q);
q:=pright;
while q<>nil do
begin
sv(q^.inf);
q:=q^.next;
end;//while
CSK:=k;
end; //CSK
begin
k:=0;
writeln(rus('Здравствуйте уважаемый пользователь!')) ;
writeln(rus('Данная программа предназначена для :'));
writeln(rus('вычисления количества чисел в деке, свободных от квадратов'));
writeln;
repeat
New(p);
SD(p); writeln; //создание целочисленного дека
RD(p);
// вывод дека на экран
writeln;
writeln(rus('Количество чисел, свободных от квадратов = '),CSK(p));
readln;
write(rus('Желаете продолжить работу с программой? (д/н) ')); read(s);
k:=0; writeln; Dispose(p);
readln
until s=rus('н') ;
readln;
writeln(rus('Пользование программой завершено, для выхода нажмите Enter'));
readln;
end.
6. Описание тест-примеров
Тест-примеры , используемые при отладке настоящей программы, разбиты на 3 группы:
Корректные входные данные (2 тест-примера), пустой дек (1 пример), некорректные
входные данные (2 тест-примера).
Описание тест-примеров приведено в следующем разделе «Результаты контрольного
прогона»
13
7. Результаты контрольного прогона программы
7.1. Корректные входные данные
7.2. Пустой дек
14
7.3. Некорректные входные данные
8. Список использованной литературы
1. Сыромятников В.П., «Структуры и алгоритмы обработки данных», лекции, М.,
МИРЭА, 2007/2008 уч. год.
2. Меженный О.А., «Turbo Pascal», М., «Диалектика», 2006г.
3. Флёнов М.Е., «Библия Delphi», Санкт-Петербург, «БХВ-Петербург», 2004г.
15
Download