Стандарты для псевдокода?
Мне нужно перевести некоторые подпрограммы python и java в псевдокод для моей магистерской диссертации, но у меня возникнут проблемы с синтаксисом/стилем, который:
- соответствует
- легко понять
- не слишком подробный
- не слишком близко к естественному языку
- не слишком близко к конкретному языку программирования.
Как вы пишете псевдокод? Существуют ли какие-либо стандартные рекомендации?
Ответы
Ответ 1
Я рекомендую посмотреть книгу "Введение в алгоритмы" (Cormen, Leiserson и Rivest). Я всегда находил его псевдокод описание алгоритмов очень ясным и последовательным.
Пример:
DIJKSTRA(G, w, s)
1 INITIALIZE-SINGLE-SOURCE(G, s)
2 S ← Ø
3 Q ← V[G]
4 while Q ≠ Ø
5 do u ← EXTRACT-MIN(Q)
6 S ← S ∪{u}
7 for each vertex v ∈ Adj[u]
8 do RELAX(u, v, w)
Ответ 2
Отвечая на мой собственный вопрос, я просто хотел привлечь внимание к записи часто задаваемых вопросов по TeX псевдокоду в LaTeX. Он описывает ряд различных стилей, перечисляя преимущества и недостатки. Между прочим, существуют две таблицы стилей для написания псевдокода способом, использованным Cormen в "Введении в алгоритмы", как рекомендовано выше: newalg
и clrscode
. Последний был написан самим Корменом.
Ответ 3
Я предлагаю вам взглянуть на Язык программирования Fortress.
Это реальный язык программирования, а не псевдокод, но он был разработан как можно ближе к исполняемому псевдокоду. В частности, для разработки синтаксиса они читали и анализировали сотни CS и математических статей, курсов, книг и журналов, чтобы найти общие шаблоны использования для псевдокода и других вычислительных/математических обозначений.
Вы можете использовать все эти исследования, просто взглянув на исходный код Fortress и абстрагируясь от того, что вам не нужно, поскольку ваша целевая аудитория - человек, тогда как Fortress - это компилятор.
Вот пример использования кода Fortress из NAS (суперкомпьютер NASA Advanced Supercomputing). Для забавного опыта сравните спецификацию эталона с реализацией в Fortress и обратите внимание на то, что существует почти 1:1 соответствие. Также сравните реализацию на нескольких других языках, таких как C или Fortran, и обратите внимание на то, что они абсолютно не имеют отношения к спецификации (а также часто на порядок больше, чем спецификация).
Я должен подчеркнуть: это не псевдокод, это фактический рабочий код крепости! Пример кода крепости http://ProjectFortress.Sun.Com/Projects/Community/raw-attachment/wiki/FortressQuestions/NAS-CG.png
Изменить: ссылка на код выше кода мертва. Вероятно, подобный пример можно найти здесь: https://umbilicus.wordpress.com/2009/10/16/fortress-parallel-by-default/
Ответ 4
Если код является процедурным, нормальный псевдокод, вероятно, легко (Wikipedia имеет несколько примеров).
Объектно-ориентированный псевдокод может быть более сложным. Рассмотрим:
- с использованием диаграмм классов UML для отображения классов/наследования
- с использованием диаграмм последовательности UML для отображения последовательности кода
Ответ 5
Я не понимаю вашего требования "не слишком близко к конкретному языку программирования".
Python обычно считается хорошим кандидатом для написания псевдокода. Возможно, немного упрощенная версия python будет работать для вас.
Ответ 6
Паскаль всегда был традиционно наиболее похож на псевдокод, когда речь идет о математических и технических областях. Я не знаю, почему, это всегда было так.
У меня есть некоторые (о, я не знаю, 10, может быть, книги на полке, которые конкретизируют эту теорию).
Python, как и было предложено, может быть хорошим кодом, но он также может быть нечитаемым, что это чудо само по себе. Старые языки сложнее сделать нечитаемыми - их "проще" (с осторожностью), чем сегодня. Возможно, им будет сложнее понять, что происходит, но легче читать (для понимания того, что делает программа, требуется меньше синтаксических/языковых функций).
Ответ 7
Этот пост старый, но, надеюсь, это поможет другим.
Книга "Введение в алгоритмы" (написанная Корменом, Лизерсоном и Ривестом) - хорошая книга для чтения об алгоритмах, но "псевдокод" ужасен. Такие вещи, как Q [1... n], бессмысленны, когда нужно понять, что подразумевается под Q [1... n]. Который должен быть отмечен за пределами "псевдокода". Более того, такие книги, как "Введение в алгоритмы", любят использовать математический синтаксис, который нарушает одну из целей псевдокода.
Псевдокод должен делать две вещи. Абстрагироваться от синтаксиса и быть легко читаемым. Если фактический код является более описательным, чем псевдокод, а фактический код является более описательным, то это не псевдокод.
Скажем, вы писали простую программу.
Дизайн экрана:
Welcome to the Consumer Discount Program!
Please enter the customers subtotal: 9999.99
The customer receives a 10 percent discount
The customer receives a 20 percent discount
The customer does not receive a discount
The customer total is: 9999.99
Список переменных:
TOTAL: double
SUB_TOTAL: double
DISCOUNT: double
Псевдо-код:
DISCOUNT_PROGRAM
Print "Welcome to the Consumer Discount Program!"
Print "Please enter the customers subtotal:"
Input SUB_TOTAL
Select the case for SUB_TOTAL
SUB_TOTAL > 10000 AND SUB_TOTAL <= 50000
DISCOUNT = 0.1
Print "The customer receives a 10 percent discount"
SUB_TOTAL > 50000
DISCOUNT = 0.2
Print "The customer receives a 20 percent discount"
Otherwise
DISCOUNT = 0
Print "The customer does not a receive a discount"
TOTAL = SUB_TOTAL - (SUB_TOTAL * DISCOUNT)
Print "The customer total is:", TOTAL
Обратите внимание, что это очень легко читать и не ссылается на какой-либо синтаксис. Это поддерживает все три структуры управления Бома и Якопини.
Последовательность:
Print "Some stuff"
VALUE = 2 + 1
SOME_FUNCTION(SOME_VARIABLE)
Выбор:
if condition
Do one extra thing
if condition
do one extra thing
else
do one extra thing
if condition
do one extra thing
else if condition
do one extra thing
else
do one extra thing
Select the case for SYSTEM_NAME
condition 1
statement 1
condition 2
statement 2
condition 3
statement 3
otherwise
statement 4
Репетиция:
while condition
do stuff
for SOME_VALUE TO ANOTHER_VALUE
do stuff
сравните это с этим псевдокодом N-Queens (https://en.wikipedia.org/wiki/Eight_queens_puzzle):
PlaceQueens(Q[1 .. n],r)
if r = n + 1
print Q
else
for j ← 1 to n
legal ← True
for i ← 1 to r − 1
if (Q[i] = j) or (Q[i] = j + r − i) or (Q[i] = j − r + i)
legal ← False
if legal
Q[r] ← j
PlaceQueens(Q[1 .. n],r + 1)
Если вы не можете объяснить это просто, вы не понимаете это достаточно хорошо. - Альберт Эйнштейн
Ответ 8
Python, как и было предложено, может быть хорошим кодом, но он также может быть нечитаемым, что это чудо само по себе. Старые языки сложнее сделать нечитаемыми - их "проще" (с осторожностью), чем сегодня. Возможно, им будет сложнее понять, что происходит, но легче читать (для понимания того, что делает программа, требуется меньше синтаксических/языковых функций).