Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 10.03.2023
Сообщений: 4
1

Обобщение процедур

18.02.2024, 16:01. Показов 741. Ответов 5

Author24 — интернет-сервис помощи студентам
Всех приветствую. Подскажите, пожалуйста, как можно обобщить данные процедуры и функции для очередей. Видно, что в повторяющихся проц/фун меняются только переменные, но эти переменные разных типов. Нужно ввести новый тип указателя и менять, то на что он указывает? (
Pascal
1
DataPtr = Pointer
)
Кликните здесь для просмотра всего текста

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
type
 
    CharItemPtr = ^CharItem;
    CharItem = record
        data: char;
        next: CharItemPtr;
    end;
    QueueOfChars = record
        first, last: CharItemPtr;
    end;
 
    PointerQOC = ^QueueOfChars;
 
    ItemPtr = ^Item;
    Item = record
        data: PointerQOC;
        next: ItemPtr;
    end;
 
    MainQueue = record
        first, last: ItemPtr;
    end;
 
 
procedure MQInit(var queue: MainQueue);
begin
    queue.first := nil;
    queue.last := nil
end;
 
procedure MQPut(var queue: MainQueue; queuech: PointerQOC);
begin
    if queue.first = nil then
    begin
        new(queue.first);
        queue.last := queue.first
    end
    else
    begin
        new(queue.last^.next);
        queue.last := queue.last^.next
    end;
    queue.last^.data := queuech;
    queue.last^.next := nil
end;
 
procedure MQGet(var queue: MainQueue; var queuech: PointerQOC);
var
    tmp: ItemPtr;
begin
    queuech := queue.first^.data;
    tmp := queue.first;
    queue.first := queue.first^.next;
    if queue.first = nil then
        queue.last := nil;
    dispose(tmp)
end;
 
function MQIsEmpty(var queue: MainQueue): boolean;
begin
    MQIsEmpty := queue.first = nil
end;
 
procedure QOCInit(var queuech: QueueOfChars);
begin
    queuech.first := nil;
    queuech.last := nil
end;
 
procedure QOCPut(var queuech: QueueOfChars; ch: char);
begin
    if queuech.first = nil then
    begin
        new(queuech.first);
        queuech.last := queuech.first
    end
    else
    begin
        new(queuech.last^.next);
        queuech.last := queuech.last^.next
    end;
    queuech.last^.data := ch;
    queuech.last^.next := nil
end;
 
procedure QOCGet(var queuech:QueueOfChars; var ch: char);
var
    tmp: CharItemPtr;
begin
    ch := queuech.first^.data;
    tmp := queuech.first;
    queuech.first := queuech.first^.next;
    if queuech.first = nil then
        queuech.last := nil;
    dispose(tmp)
end;
 
function QOCIsEmpty(var queuech: QueueOfChars): boolean;
begin
    QOCIsEmpty := queuech.first = nil
end;
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.02.2024, 16:01
Ответы с готовыми решениями:

Обобщение двух процедур в одну
Вот задание: Реализуйте процедуру доступа к произвольному элементу последовательности...

Найти максимальнй элемент матрицы третьего порядка с использованием процедур процедур.
Заданы матрицы А и В третьего порядка. Переменной S присвоить -1, если максимальный элемент матрицы...

Обобщение
Надо сделать сортировку вставка ( тут сам алгоритм http://algolist.manual.ru/sort/insert_sort.php )...

Обобщение закона Ампера
Всем привет!Помогите разобраться,не понимаю шаг перехода \int{rotH-\frac{4\pi }{c}j}ds=0 ...

5
 Аватар для vlisp
1046 / 967 / 153
Регистрация: 10.08.2015
Сообщений: 5,237
18.02.2024, 16:46 2
шаблоны
1
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7797 / 4620 / 2831
Регистрация: 22.11.2013
Сообщений: 13,125
Записей в блоге: 1
18.02.2024, 17:37 3
У вас есть 2 очевидных пути.
Первый уже назвали выше -- шаблоны (generic). Нужно понимать, что в этом случае объем исполнимого бинарного кода не изменится, просто процедуры для отдельных типов за программиста создаст сам компилятор по образу и подобию (шаблону).

Второй -- немного поправить расположение полей элемента списка и научить список работать с данными разных размеров.
Существенный минус такого подхода -- теряем контроль типов со стороны компилятора.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
type
  PNode = ^TNode;
  TNode = record
    next: PNode;
    data: record end;  // "поле" нулевого размера
  end;
 
  TQueue = record
    first, last: PNode;
    DataSize: Word;
  end;
 
procedure qInit(var q: TQueue; ADataSize: Word);
begin with q do begin
  first:=nil; last:=nil; DataSize:=ADataSize;
end; end;
 
procedure qEnqueue(var q: TQueue; constref Item);
var p: Pointer;
begin with q do begin
  GetMem(p,DataSize+SizeOf(TNode));
  p^.next:=nil;
  Move(Item,p^.data,DataSize);  // data:=Item
  if first=nil then
    first:=p
  else
    last^.next:=p;
  last:=p;
end; end;
 
procedure qDequeue(var q: TQueue; var Item);
var p: Pointer;
begin with q do begin
  Move(first^.data,Item,DataSize);  // Item:=data
  p:=first; first:=first^.next;
  if first=nil then
    last:=nil;
  FreeMem(p,DataSize+SizeOf(TNode));
end; end;
 
function qIsEmpty(constref q: TQueue): Boolean;
begin
  Result:=q.first=nil;
end;
Добавлено через 4 минуты
И самое главное: зачем вам очередь на указателях?
Динамический массив с дисциплиной кольцевого буфера под капотом выглядит куда предпочтительнее. И накладных расходов существенно меньше.
1
0 / 0 / 0
Регистрация: 10.03.2023
Сообщений: 4
18.02.2024, 18:54  [ТС] 4
Изучаю программирование по трехтомнику А.В.Столярова. Сейчас на теме односвязных списков, и вдобавок, по его же книге с задачами, прорешиваю соответствующие задания к этим темам. Вот и столкнулся с таким)) очередь с указателями на другие очереди)
вот собственно сама задача)
Кликните здесь для просмотра всего текста

Напишите программу, которая читает из стандартного потока ввода строки, состоящие из слов (слова могут разделятся произвольными группами пробельных символов), и в ответ на каждую прочитанную строку печатает слова из этой строки "вертикально", то есть сначала печатает первые буквы всех слов, переводит строку, печатает вторые буквы слов и т.д., пока буквы во всех словах не кончатся. Для слов, которые короче других, вместо недостающих букв нужно выводить пробелы. Пример: "Happy New Year to everyone"
Код
HNYte
aeeov
pwa e
p r r
y   y
    o
    n
    e
Вводить ограничения на длины строк, слов и др. нельзя; в частности, недопустимо использовать тип string для хранения читаемых строк и/или отдельных слов. Вся выделенная динамическая память должна быть корректно освобождена сразу после обработки очередной строки.

Динамические массивы в части про Pascal не рассматриваются.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7797 / 4620 / 2831
Регистрация: 22.11.2013
Сообщений: 13,125
Записей в блоге: 1
18.02.2024, 19:58 5
Ок, ограничения искусственно-методические

Тогда есть для частного случая и третий вариант -- запись с вариантом:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
type
  PQueue = ^TQueue;
 
  TData = record
    case Integer of
    0: (Queue: PQueue);
    1: (Sym: Char);
  end;
 
  PNode = ^TNode;
  TNode = record
    next: PNode;
    data: TData;
  end;
 
  TQueue = record
    first, last: PNode;
  end;
 
// . . .
Добавлено через 8 минут
Или вовсе четвертый:
Pascal
1
2
3
4
5
6
7
8
type
  PQueue = ^ TQueue;
 
  PNode = ^TNode;
  TNode = record
    next: PNode;
    data: PQueue;
  end;
А для помещение/извлечение символа использовать приведение типов:
Pascal
1
2
3
qEnqueue(q,Pointer(c));  //упакуем символ в указатель
qDequeue(q,p);   //достанем указатель,
Write(Char(p));  //извлечем из его значения символ
1
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7797 / 4620 / 2831
Регистрация: 22.11.2013
Сообщений: 13,125
Записей в блоге: 1
18.02.2024, 20:36 6
Возвращаясь к накладным расходам.

Цепочка, у которой вместо одного символа на указатель блок, скажем, из 1024, 2048, ... символов все равно выглядит эфективнее. По задаче достаточно чуть длиннее,чем основная масса слов
Пусть чуть сложнее в реализации, зато ближе к реальности
1
18.02.2024, 20:36
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.02.2024, 20:36
Помогаю со студенческими работами здесь

Обобщение типов в функциях
у меня есть три функции которые делают одно и тоже как можно было бы превратить их в одну public...

Обобщение возвращаемый тип
Доброго времени суток господа. Помогите понять как вернуть обобщенный тип public T...

Обобщение параметра Func
привет. как сделать обобщение параметра Func? ANY может иметь разных тип. func<int , double> f...

Обобщение регулярного выражения
Доброго времени суток! Как правильно научиться составлять регулярное выражение? Например, если...

Сравнение точек [Обобщение]
Объявите обобщенный класс Point<T> - точка c двумя однотипными открытыми свойствами X и Y, тип...

Обобщение чисел Фибоначчи
Программа вычисляет числа, заданные рекуррентной формулой An = An-1 + An-2 + An-3 , где A1 = A2 =...

Анализ и обобщение данных в excel
Дан список непродовольственных товаров. Для каждого товара известны наименование, дата...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Элементы алгоритмизации
hw_wired 28.01.2025
Основы алгоритмизации В современном мире алгоритмы играют фундаментальную роль в развитии информационных технологий и программирования. Понимание основ алгоритмизации является ключевым элементом в. . .
Человек и информация
hw_wired 28.01.2025
Введение: роль информации в познании мира В современном мире информация играет фундаментальную роль в процессе познания окружающей действительности. Она представляет собой совокупность сведений об. . .
Компьютер и информация
hw_wired 28.01.2025
Эволюция вычислительных машин История развития вычислительной техники начинается задолго до появления первых электронных устройств. Человечество всегда стремилось упростить процесс вычислений и. . .
Информационные технологии
hw_wired 28.01.2025
Введение в современные технологии работы с информацией В современном мире информационные технологии стали неотъемлемой частью практически всех сфер человеческой деятельности. Они существенно. . .
Информация вокруг нас
hw_wired 28.01.2025
Основные понятия информации В современном мире понятие информации является фундаментальным и охватывает практически все сферы человеческой деятельности. Информация представляет собой совокупность. . .
Компьютер для начинающих
hw_wired 28.01.2025
Введение в мир компьютерных технологий В современном мире информация стала одним из важнейших ресурсов человечества, определяющим развитие общества и технологий. Наша жизнь неразрывно связана с. . .
[golang] 189. Rotate Array
alhaos 28.01.2025
Повороты рукоятки, целочисленный слайс нужно сдвинуть на целое положительное число. Мне очень нравится решение на GO / / https:/ / leetcode. com/ studyplan/ top-interview-150/ package topInterview . . .
КуМир: решение задач на матрицы
bytestream 28.01.2025
КуМир представляет собой среду для обучения программированию, которая включает в себя мощные инструменты для работы с матрицами. Матрица в программировании - это двумерный массив, состоящий из. . .
КуМир: решение задач на строки
bytestream 28.01.2025
В системе программирования КуМир работа со строковыми данными является одним из важнейших аспектов создания программ. Строки представляют собой последовательности символов, заключенные в кавычки,. . .
КуМир: решение геометрических задач
bytestream 28.01.2025
Программирование геометрических задач в среде КуМир становится всё более актуальным в обучении школьников и студентов. КуМир — это разработанная в России обучающая программная среда, предназначенная. . .
КуМир, исполнитель Водолей: Задачи и решения
bytestream 28.01.2025
КуМир — это образовательная среда для обучения программированию. Она предлагает пользователям разнообразные инструменты для разработки и отладки программ, что особенно ценно для студентов и. . .
КуМир, исполнитель Чертежник: Решение задач
bytestream 28.01.2025
КуМир (Комплект Учебных МИРов) представляет собой образовательную среду для обучения основам программирования и алгоритмизации. Исполнитель Чертежник работает на координатной плоскости, где может. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru