Лабораторная работа № 6

Лабораторная работа №6

 Задачи на разработку одномерных массивов и указателей

Теоретические сведения

Одномерный массив — это последовательность элементов одного типа, расположенных в памяти последовательно. 

Указатель — это переменная, содержащая адрес памяти. Имя массива является константным указателем на первый элемент.

Задание 1: Поиск максимального элемента.

Напишите программу, которая находит максимальный элемент в одномерном массиве с использованием указателей. Массив должен быть заполнен случайными числами.

Цель: научиться находить максимальный элемент массива с помощью указателей.

Алгоритм:

1.                  Создать массив и заполнить его случайными числами

2.                  Использовать указатель для прохода по массиву

3.                  Сравнивать элементы через разыменование указателя

Пример кода:

pascal

program FindMaxElement;
const
 SIZE = 10;
type
 PInteger = ^Integer;
var
 arr: array[1..SIZE] of Integer;
 i, max: Integer;
 p: PInteger;
begin
 Randomize;
 
 writeln('Исходный массив:');
 for i := 1 to SIZE do
 begin
 arri := Random(100);
 write(arri:4);
 end;
 writeln;
 
 p := @arr[1];
 max := p^;
 
 for i := 2 to SIZE do
 begin
 p := p + SizeOf(Integer);
 if p^ > max then
 max := p^;
 end;
 
 writeln('Максимальный элемент: ', max);
end.

Задание 2: Удаление элементов из массива.

Создайте программу, которая удаляет из массива все элементы, равные заданному числу. Используйте указатели для работы с массивом.

Цель: освоить удаление элементов с использованием указателей.

Алгоритм:

1.                  Пройти по массиву через указатель

2.                  При нахождении нужного элемента сдвинуть все последующие элементы

3.                  Уменьшить размер массива

Пример кода:

pascal

program DeleteElements;
const
 SIZE = 10;
type
 PInteger = ^Integer;
var
 arr: array[1..SIZE] of Integer;
 i, j, num: Integer;
 p, q: PInteger;
begin
 Randomize;
 
 writeln('Исходный массив:');
 for i := 1 to SIZE do
 begin
 arri := Random(10);
 write(arri:4);
 end;
 writeln;
 
 write('Введите число для удаления: ');
 readln(num);
 
 p := @arr[1];
 q := @arr[1];
 i := 1;
 
 while i <= SIZE do
 begin
 if p^ <> num then
 begin
 q^ := p^;
 q := q + SizeOf(Integer);
 end;
 p := p + SizeOf(Integer);
 i := i + 1;
 end;
 
 writeln('Массив после удаления:');
 for i := 1 to q - @arr[1] div SizeOf(Integer) do
 write(arri:4);
 writeln;
end.

Задание 3: Сортировка массива.

Напишите функцию, которая сортирует одномерный массив по возрастанию с использованием указателей.

Цель: реализовать сортировку с помощью указателей.

Алгоритм:

1.                  Использовать пузырьковую сортировку

2.                  Сравнивать элементы через указатели

3.                  При необходимости менять их местами

Пример кода:

cp pascal

program SortArray;
const
 SIZE = 10;
type
 PInteger = ^Integer;
procedure Sort(var arr: array of Integer; size: Integer);
var
 i, j: Integer;
 temp: Integer;
 p, q: PInteger;
begin
 p := @arr[0];
 for i := 0 to size - 1 do
 begin
 q := p;
 for j := 0 to size - i - 2 do
 begin
 if q^ > q + SizeOf(Integer)^ then
 begin
 temp := q^;
 q^ := q + SizeOf(Integer)^;
 q + SizeOf(Integer)^ := temp;
 end;
 q := q + SizeOf(Integer);
 end;
 p := p + SizeOf(Integer);
 end;
end;
 
var
 arr: array[0..SIZE-1] of Integer;
 i: Integer;
begin
 Randomize;
 
 writeln('Исходный массив:');
 for i := 0 to SIZE - 1 do
 begin
 arri := Random(100);
 write(arri:4);
 end;
 writeln;
 
 Sort(arr, SIZE);
 
 writeln('Отсортированный массив:');
 for i := 0 to SIZE - 1 do
 write(arri:4);
 writeln;

end.

Задание 4: Сумма элементов массива.

Создайте программу, которая вычисляет сумму всех элементов массива, используя указатели.

ЦельНаучиться вычислять сумму элементов массива с использованием указателей.

Теоретические сведения

Указатель — переменная, хранящая адрес памяти. При работе с массивами указатель позволяет перемещаться по элементам, изменяя адрес.

Алгоритм решения

1.                  Инициализировать указатель на начало массива

2.                  Создать переменную для хранения суммы

3.                  Пройти по всем элементам массива

4.                  Суммировать значения через разыменование указателя

5.                  Вывести результат

Пример кода

pascal

program SumArrayWithPointers;

const

  SIZE = 10;  // Размер массива

type

  PInteger = ^Integer;  // Тип указателя на целое число

var

  arr: array[1..SIZE] of Integer;  // Массив

  sum: Integer;  // Сумма элементов

  i: Integer;  // Счетчик

  p: PInteger;  // Указатель

begin

  // Заполнение массива случайными числами

  Randomize;

  writeln('Исходный массив:');

  for i := 1 to SIZE do

  begin

    arr[i] := Random(100);  // Случайное число от 0 до 99

    write(arr[i]:4);

  end;

  writeln;

 

  // Инициализация указателя и суммы

  p := @arr[1];  // Указатель на первый элемент

  sum := 0;

 

  // Подсчет суммы через указатель

  for i := 1 to SIZE do

  begin

    sum := sum + p^;  // Суммируем значение по указателю

    p := p + SizeOf(Integer);  // Переходим к следующему элементу

  end;

 

  writeln('Сумма элементов массива: ', sum);

end.

Пояснение работы программы

1.                  Инициализация:

o         Создается массив фиксированного размера

o         Объявляется указатель на тип Integer

o         Инициализируется переменная для суммы

2.                  Заполнение массива:

o         Используется генератор случайных чисел

o         Выводится исходный массив для контроля

3.                  Работа с указателем:

o         Указатель устанавливается на первый элемент массива

o         В цикле происходит:

§           Разыменование указателя (получение значения)

§           Добавление значения к сумме

§           Перемещение указателя на следующий элемент

Важные моменты

·                     При перемещении указателя используется SizeOf(Integer), чтобы перейти к следующему элементу

·                     Разыменование указателя происходит через символ ^

·                     Необходимо следить за границами массива при работе с указателями

Возможные улучшения

·                     Добавить ввод размера массива с клавиатуры

·                     Реализовать проверку на пустоту массива

·                     Добавить форматированный вывод результата

·                     Создать функцию для подсчета суммы через указатели

Задание 5: Поиск элемента в массиве.

Напишите функцию, которая ищет заданный элемент в массиве и возвращает его индекс. Используйте указатели для доступа к элементам массива.

ЦельНаучиться осуществлять поиск элемента в массиве с использованием указателей и возвращать его индекс.

Теоретические сведения

Поиск элемента — это базовая операция обработки массивов. При использовании указателей мы можем эффективно перемещаться по элементам массива и сравнивать их значения.

Алгоритм решения

1.                  Создать функцию поиска с параметрами:

o         указатель на начало массива

o         размер массива

o         искомое значение

2.                  Использовать указатель для прохода по массиву

3.                  Сравнивать значения элементов с искомым

4.                  Возвращать индекс найденного элемента

5.                  Возвращать специальное значение (-1), если элемент не найден

Пример кода

pascal

program SearchElementInArray;

const

 SIZE = 10; // Размер массива

type

 PInteger = ^Integer; // Тип указателя на целое число

 

// Функция поиска элемента

function SearchElement(arr: PInteger; size: Integer; value: Integer): Integer;

var

 i: Integer;

 p: PInteger;

begin

 p := arr; // Устанавливаем указатель на начало массива

 Result := -1; // Значение по умолчанию (элемент не найден)

 

 for i := 0 to size - 1 do

 begin

 if p^ = value then

 begin

 Result := i; // Возвращаем индекс найденного элемента

 Exit;

 end;

 p := p + SizeOf(Integer); // Переходим к следующему элементу

 end;

end;

 

var

 arr: array[0..SIZE-1] of Integer;

 i, index, searchValue: Integer;

begin

 // Заполнение массива случайными числами

 Randomize;

 writeln('Исходный массив:');

 for i := 0 to SIZE - 1 do

 begin

 arri := Random(100); // Случайное число от 0 до 99

 write(arri:4);

 end;

 writeln;

 

 // Ввод искомого значения

 write('Введите число для поиска: ');

 readln(searchValue);

 

 // Поиск элемента

 index := SearchElement(@arr0, SIZE, searchValue);

 

 // Вывод результата

 if index <> -1 then

 writeln('Элемент найден по индексу: ', index)

 else

 writeln('Элемент не найден в массиве');

end.

Пояснение работы программы

1.                  Функция поиска:

o         Принимает указатель на начало массива

o         Принимает размер массива

o         Принимает искомое значение

o         Возвращает индекс найденного элемента или -1

2.                  Работа с указателем:

o         Указатель устанавливается на начало массива

o         В цикле происходит:

§           Разыменование указателя

§           Сравнение значения с искомым

§           Перемещение указателя к следующему элементу

3.                  Обработка результата:

o         Если элемент найден, возвращается его индекс

o         Если элемент не найден, возвращается -1

Важные моменты

·                     Указатель перемещается с шагом SizeOf(Integer)

·                     Функция возвращает индекс, начиная с 0

·                     Необходимо проверять границы массива

·                     При отсутствии элемента возвращается специальное значение (-1)

Возможные улучшения

·                     Добавить поиск всех вхождений элемента

·                     Реализовать бинарный поиск (для отсортированного массива)

·                     Добавить обработку ошибок ввода

·                     Создать версию функции с возвратом нескольких индексов

Контрольные вопросы

1.                  Что такое указатель и как он связан с массивом?

2.                  Как осуществляется доступ к элементам массива через указатель?

3.                  В чем преимущество использования указателей при работе с массивами


Последнее изменение: четверг, 23 Октябрь 2025, 09:42