45088 (Отчет по лабораторной работе №2)
Описание файла
Документ из архива "Отчет по лабораторной работе №2", который расположен в категории "". Всё это находится в предмете "информатика" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "рефераты, доклады и презентации", в предмете "информатика, программирование" в общих файлах.
Онлайн просмотр документа "45088"
Текст из документа "45088"
МОСКОВСКИЙ ИНСТИТУТ РАДИОТЕХНИКИ,
ЭЛЕКТРОНИКИ И АВТОМАТИКИ
(ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ)
Отчет по лабораторной работе №2
Программирование на языках В/У
Студент:
Группа:
Москва 2003
СОДЕРЖАНИЕ
1 ЗАДАНИЕ 3
2 БЛОК-СХЕМА ПРОГРАММЫ 3
3 ТЕКСТ ПРОГРАММЫ 5
4 ОПИСАНИЕ РАБОТЫ ПРОГРАММЫ 6
5 РУКОВОДСТВО ОПЕРАТОРА 10
1 ЗАДАНИЕ
Многочлен с целыми коэффициентами представить в виде списка. Программа должна проверять на равенство многочлены P и Q.
2 БЛОК-СХЕМА ПРОГРАММЫ
Write('Kol. Elementov P:> ');
ReadLn(k);
m:=1
New(P);
Write('Koef. :> ');
ReadLn(P^.a);
Write('Step. :> ');
ReadLn(P^.n);
P^.p:=nil;
m:=m+1
FstP:=P;
LP:=P;
да
LP^.p:=P;
LP:=P;
нет
нет
да
Write('Kol. Elementov Q:> ');
ReadLn(k);
m:=k
New(Q);
Write('Koef. :> ');
ReadLn(Q^.a);
Write('Step. :> ');
ReadLn(Q^.n);
Q^.p:=nil;
m:=m+1
FstQ:=Q;
LQ:=Q;
да
нет
LQ^.p:=Q;
LQ:=Q;
нет
да
P:=FstP;
Q:=FstQ;
Нет
Да
Write('P <> Q');
b:=true;
Нет Да
Нет
Да
Write('P = Q');
b:=true;
Write('P <> Q');
b:=true;
Нет Да
Нет
Да
ReadLn
Да Нет
P:=P^.p; Q:=Q^.p;
Write('P <> Q');
b:=true;
3 ТЕКСТ ПРОГРАММЫ
Program Project1;
{$APPTYPE CONSOLE}
Uses SysUtils;
type
spisok=^s;
s=record a,n:Integer; p:spisok; end;
var
k,m:word; b:boolean; P,Q,FstP,LP,FstQ,LQ:spisok;
BEGIN
{ФОРМИРОВАНИЕ СПИСКОВ P и Q}
Write('Kol. Elementov P:> '); ReadLn(k);
FOR m:=1 to k do BEGIN
New(P);
Write('Koef. :> '); ReadLn(P^.a); Write('Step. :> '); ReadLn(P^.n);
P^.p:=nil;
IF m=1 THEN begin FstP:=P; LP:=P; end
ELSE begin LP^.p:=P;LP:=P; end;
END;
Write('Kol. Elementov Q:> '); ReadLn(k);
FOR m:=1 to k do BEGIN
New(Q);
Write('Koef. :> '); ReadLn(Q^.a);
Write('Step. :> '); ReadLn(Q^.n);
Q^.p:=nil;
IF m=1 THEN begin FstQ:=Q; LQ:=Q; end
ELSE begin LQ^.p:=Q;LQ:=Q; end;
END;
{ПРОГРАММА}
P:=FstP;Q:=FstQ;
REPEAT
If ((P^.p<>nil) and (Q^.p=nil)) or ((P^.p=nil) and (Q^.p<>nil)) Then
Begin Write('P <> Q'); b:=true; End;
If (P^.p=nil) and (Q^.p=nil) Then Begin
If (P^.a=Q^.a) and (P^.n=Q^.n) Then Begin Write('P = Q'); b:=true; End
Else Begin Write('P <> Q'); b:=true; End;
End;
If (P^.p<>nil) and (Q^.p<>nil) Then BEGIN
If (P^.a=Q^.a) and (P^.n=Q^.n) Then Begin P:=P^.p; Q:=Q^.p; End
Else Begin Write('P <> Q'); b:=true; End;
END;
UNTIL b=true;
ReadLn;
END.
4 ОПИСАНИЕ РАБОТЫ ПРОГРАММЫ
ТАБЛИЦА ТИПОВ, ИСПОЛЬЗУЕМЫХ ПРОГРАММОЙ
Имя типа | Тип | Назначение |
spisok | Динамическая переменная со структурой s | |
s | record | Запись, содержащая переменные типа integer (а, n) и ссылку (p). а используется для записи значения коэффициента многочлена, а n для степени при которой стоит этот коэффициент |
ТАБЛИЦА ПЕРЕМЕННЫХ, ИСПОЛЬЗУЕМЫХ ПРОГРАММОЙ
Имя | Тип | Назначение |
m | Word | Счетчик циклов |
k | Word | Количество элементов в многочленах |
b | boolean | Признак нахождения результата сравнения списков P и Q |
P | spisok | Указатель, содержащий адрес произвольного элемента списка Р |
Q | spisok | Указатель, содержащий адрес произвольного элемента списка Q |
FstP | spisok | Указатель, содержащий адрес первого элемента списка Р |
FstQ | spisok | Указатель, содержащий адрес первого элемента списка Q |
LP | spisok | Указатель, содержащий адрес последнего элемента списка Р |
LQ | spisok | Указатель, содержащий адрес последнего элемента списка Q |
Вначале работы программа выводит на экран строку "Kol. Elementov P:>", после чего необходимо ввести значение количества элементов, которые будут записываться в список P. Затем происходит считывание этого значения и переменной k присваивается это значение.
Далее организуется цикл для ввода коэффициентов (а) и степеней каждого отдельного элемента (n) списка Р, начиная с элемента имеющего наибольшую степень и заканчивая коэффициентом элемента имеющего наименьшую степень. Цикл организуется операторами FOR и TO. Начиная с m, принимающего значение 1, до значения переменной k (количество элементов в списке) программа выполняет следующее:
- С помощью процедуры New резервирует место в памяти ЭВМ под динамическую переменную, адрес которой содержит указатель P.
- Выводит на экран строку, в которой написано "Koef. :>". После вывода строки программа ждет ввода значения коэффициента элемента. После ввода значения оно присваивается в поле а динамической переменной структуры s, на которую ссылается указатель Р.
- Выводит на экран строку, в которой написано "Step. :>". После вывода строки программа ждет ввода значения степени элемента. После ввода значения оно присваивается в поле n динамической переменной структуры s, на которую ссылается указатель Р. В поле p записывается значение nil.
- Проверяется условие: если m равно 1, что соответствует первому элементу списка, тогда программа присваивает значение указателя Р указателям FstР (указатель, содержащий адрес первого элемента списка) и LР (указатель, содержащий адрес последнего элемента списка). То есть указатель FstL будет содержать адрес первого элемента списка. А иначе если m не равно 1, что соответствует второму и последующим элементам списка, программа присваивает ссылке последнего элемента списка, на который указывает указатель LР значение указателя Р, и указателю LР присваивает адрес указателя Р. Элемент, на который ссылается указатель Р становится последним в списке.
На этом цикл оператора FOR завершается. Таким образом происходит заполнение списка Р, который содержит значения коэффициентов и степеней всех элементов многочлена вида .
После этого программа выводит на экран строку "Kol. Elementov Q:>", после чего необходимо ввести значение количества элементов, которые будут записываться в список Q. Затем происходит считывание этого значения и переменной k присваивается это значение.
Далее организуется цикл аналогичный циклу записи элементов списка Р. Вместо Р здесь используется указатель Q, вместо FstP указатель FstQ, который содержит адрес первого элемента списка Q, а вместо LP используется LQ, который содержит адрес последнего элемента списка Q. Таким образом формируется два списка Р и Q.
Указателям Р и Q присваивается адрес первого элемента списков Р и Q, которые содержатся соответственно в указателях FstР и FstQ. Затем организуется цикл с помощью операторов REPEAT и UNTIL, который выполняется до тех пор пока переменная b (признак нахождения результата сравнения списков P и Q) не станет равным true.
1) Проверяется условие с помощью оператора IF. Если значение поля р динамической переменной структуры s, на которую указывает указатель Р, не равно значению nil и это же поле динамической переменной структуры s, на которую указывает указатель Q, равно значению nil ИЛИ наоборот значение поля р динамической переменной структуры s, на которую указывает указатель Р, равно значению nil и это же поле динамической переменной структуры s, на которую указывает указатель Q, не равно значению nil, то тогда выполняется следующее. На экран выводится строка "P <> Q" и переменной b присваивается значение true. Это соответствует тому, что один из списков содержит меньшее количество элементов, чем в другом. Соответственно многочлены не могут быть равны друг другу.
2) Проверяется условие с помощью оператора IF. Если значение поля р динамической переменной структуры s, на которую указывает указатель Р, равно значению nil и это же поле динамической переменной структуры s, на которую указывает указатель Q, равно значению nil, что соответствует адресам последних элементов двух списков, то тогда проверяется равенство коэффициентов и степеней последних элементов списков Р и Q. Если значения полей а динамических переменных структуры s, на которые указывают указатели Р и Q, равны друг другу, что соответствует тому что все предыдущие элементы этих списков были равны и последние элементы тоже равны. Тогда на экран выдается строка "P = Q" и переменной b присваивается значение true. А иначе на экран выводится строка "P <> Q" и переменной b присваивается значение true. Это соответствует тому, что все элементы кроме последних в списках равны.
3) Проверяется условие с помощью оператора IF. Если значение поля р динамической переменной структуры s, на которую указывает указатель Р, не равно значению nil и это же поле динамической переменной структуры s, на которую указывает указатель Q, не равно значению nil, что соответствует адресам не последних элементов двух списков, то тогда проверяется равенство коэффициентов и степеней последних элементов списков Р и Q. Если они равны, то тогда указателям присваивается значение следующих элементов списка, т. е. значения полей р динамической переменной структуры s, на которую они в данный момент ссылаются. И программа будет сравнивать в следующем цикле следующие элементы списка. Иначе на экран выводится строка "P <> Q" и переменной b присваивается значение true. Это соответствует тому, что какой-то элемент из одного списка отличается от соответствующего ему элемента другого списка. Соответственно многочлены не могут быть равны друг другу.