Лабораторная работа «Массивы», задание №30.
Задание.
Даны два массива x[1]<=..<=x[n] и y[1]<=..<=y[n]. Найти их «пересечение», т.е. массив z[1]<=..<=z[m], содержавший их общие элементы, причём кратность каждого элемента в массиве z равняется минимуму из его кратностей в массивах x и y. Число действий должно быть порядка k+1.
Описание алгоритма решения.
В методе Sort() мы сортируем данные в массивах т.к. есть условие x[1]<=..<=x[n]. Затем в методе Union and Multiplicity мы объединяем в массиве z наши массивы a и b. Длина массива z равен длине обоих массивов: a.Length + b.Length. Затем идёт цикл do-while в котором мы ищем индексности кратности элементов. Попутно отлавливаем ошибки в методе catch.
Листинг программы.
void Sort(int[] A)
{
for (int i = 0; i < A.Length; i++)
{
for (int j = i+1; j < A.Length; j++)
{
if (A[j] < A[i])
{
var temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
}
}
public int[] Union and Multiplicity (int[] a, int[] b)
{
int[] z = new int[a.Length+b.Length];
for(int i = 0; i < a.Length; i++)
z[i] = a[i];
for(int j = 0; j < b.Length; j++)
z[a.Length + j] = b[j];
do
{
z[a.Length + j] = Convert.ToInt32(Console.ReadLine());
if (Math.Abs(z[a.Length + j]) > n) {
Console.WriteLine("Нет индексов кратных", k);
}
else i = 0;
}
while ((i < n) || (n > nmax));
catch (Exception e) {
Console.WriteLine(e.ToString());
}
}
Лабораторная работа «Списки», задание №9.
Задание.
Проверка списка на пустоту.
Напечатать список в обратном порядке.
Определить имеется ли в списке два подряд элемента одинаковых.
Описание алгоритма решения.
В первом задании мы создаём список при помощи класса с полями дата – текущее значение в списке и next – это ссылка на следующий элемент. Затем проверяем при помощи Assert(head <> nil) пустой ли список. Во втором задании перебираем элементы при помощи конструкции while last <> nil do и last := last.prev с последующим выводом на экран. В третьем задании перебираем элементы и сравниваем значения полей data текущего элемента и следующего:Result := head.data; If (Result = head.data.next) для поиска одинаковых значений, когда находим выходим при помощи exit .
Листинг программы.
{Сформировать линейный односвязный список, состоящий из трёх целых чисел 12, 34 и 56 в указанном порядке.}
type
N1<T> = class
data: Char;
next: N1<Char>;
//prev: N1< Char >;
constructor(data: Char; next: N1< Char >);
begin
Self.data := data;
//Self.prev := prev;
Self.next := next;
end;
end; {конец списка}
function CreateList(n: Char): N1< Char >;
begin
Assert(n > 0);
Writeln('Введите элемент');
var x := ReadChar;
var head := new N1< Char >(x, nil);
var Start := head;
for var i := 1 to n - 1 do
begin
Writeln('Введите элемент');
Read(x);
head.next := new N1< Char >(x, nil);
head := head.next;
end;
Result := Start;
end;
{ Дана ссылка на первый элемент линейного списка. Вывести его содержимое.}
procedure Print(head: N1< Char >);
begin
Writeln('Список имеет вид');
Assert(head <> nil); // проверка списка на не пустоту!!! Задание 1.
while head <> nil do
begin
Writeln(head.data);
head := head.next;
end;
end;
begin
var t := CreateList(12, 34, 56);
Print(t);
end.
{ Дана ссылка на последний элемент линейного двусвязного списка. Вывести его содержимое в обратном порядке.}
procedure PrintBack(last: N1< Char >);
begin
Writeln('Список : ');
while last <> nil do
begin
Writeln(last.data);
last := last.prev;
end;
end;
{Определяем есть ли в списке два подряд одинаковых элемента}
function Equals(head: N1< Char >): boolean;
begin
Assert(head <> nil);
while head <> nil do
begin
Result := head.data;
// сравниваем текущее значение элемента списка со следующим
If (Result = head.data.next)
begin
writeln(‘Мы нашли одинаковые элементы, они равны - ’, head.data);
exit;
end;
head := head.next;
end;
end;
