Лабораторная работа № 6
Лабораторная работа №6
Задачи на разработку одномерных массивов и указателей
Теоретические сведения
Одномерный массив — это последовательность элементов одного типа, расположенных в памяти последовательно.
Указатель — это переменная, содержащая адрес памяти. Имя массива является константным указателем на первый элемент.
Задание 1: Поиск максимального элемента.
Напишите программу, которая находит максимальный элемент в одномерном массиве с использованием указателей. Массив должен быть заполнен случайными числами.
Цель: научиться находить максимальный элемент массива с помощью указателей.
Алгоритм:
1. Создать массив и заполнить его случайными числами
2. Использовать указатель для прохода по массиву
3. Сравнивать элементы через разыменование указателя
Пример кода:
pascal
program FindMaxElement;constSIZE =10;
type PInteger = ^Integer;vararr:array[1..SIZE]ofInteger;
i, max: Integer; p: PInteger;begin Randomize; writeln('Исходный массив:');
fori :=1toSIZEdo
begin
arri := Random(100);
write(arri:4);
end;
writeln; p := @arr[1];
max := p^; fori :=2toSIZEdo
begin
p := p + SizeOf(Integer);ifp^ > maxthen
max := p^;end;
writeln('Максимальный элемент: ', max);
end.
Задание 2: Удаление элементов из массива.
Создайте программу, которая удаляет из массива все элементы, равные заданному числу. Используйте указатели для работы с массивом.
Цель: освоить удаление элементов с использованием указателей.
Алгоритм:
1. Пройти по массиву через указатель
2. При нахождении нужного элемента сдвинуть все последующие элементы
3. Уменьшить размер массива
Пример кода:
pascal
program DeleteElements;constSIZE =10;
type PInteger = ^Integer;vararr:array[1..SIZE]ofInteger;
i, j, num: Integer; p, q: PInteger;begin Randomize; writeln('Исходный массив:');
fori :=1toSIZEdo
begin
arri := Random(10);
write(arri:4);
end;
writeln;
write('Введите число для удаления: ');
readln(num);
p := @arr[1];
q := @arr[1];
i :=1;
whilei <= SIZEdo
begin
ifp^ <> numthen
begin
q^ := p^; q := q + SizeOf(Integer);end;
p := p + SizeOf(Integer);i := i +1;
end;
writeln('Массив после удаления:');
fori :=1toq - @arr[1]divSizeOf(Integer)do
write(arri:4);
writeln;end.
Задание 3: Сортировка массива.
Напишите функцию, которая сортирует одномерный массив по возрастанию с использованием указателей.
Цель: реализовать сортировку с помощью указателей.
Алгоритм:
1. Использовать пузырьковую сортировку
2. Сравнивать элементы через указатели
3. При необходимости менять их местами
Пример кода:
cp pascal
program SortArray;constSIZE =10;
type PInteger = ^Integer;procedure Sort(var arr: array of Integer; size: Integer);var i, j: Integer; temp: Integer; p, q: PInteger;beginp := @arr[0];
fori :=0tosize -1do
begin
q := p;forj :=0tosize - i -2do
begin
ifq^ > 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; vararr:array[0..SIZE-1]ofInteger;
i: Integer;begin Randomize; writeln('Исходный массив:');
fori :=0toSIZE -1do
begin
arri := Random(100);
write(arri:4);
end;
writeln; Sort(arr, SIZE); writeln('Отсортированный массив:');
fori :=0toSIZE -1do
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. В чем преимущество использования указателей при работе с массивами