Ida pro: 11 советов, которые вы (может быть) не знали

Обучение основам программирования

В этих целях студентам стал предлагаться курс алгоритмизации, в котором для описания алгоритмов стал использоваться структурный псевдокод вместо блок-схем для документирования программ для ЭВМ.

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

Обучение программированию с использованием структурного псевдокода проводилось с использованием целой серии языков программирования — Фортран, ПЛ1, Бейсик, Паскаль и на ЕС ЭВм и на персональных ЭВМ.

В 1984 году технология структурного проектирования программ с использованием структурного псевдокода была внедрена в МИЭМ на всех факультетах для обучения всех студентов.

В 1985 году технология структурного проектирования программ с использованием псевдокода была внедрена в курс информатики для средних школ и в преподавание информатики во всех московских школах.

Машинная компиляция языков в стиле псевдокода

Грамматика естественного языка в языках программирования

Различные попытки привнести элементы грамматики естественного языка в компьютерное программирование привели к появлению таких языков программирования, как HyperTalk , Lingo , AppleScript , SQL , Inform и в некоторой степени Python . В этих языках круглые скобки и другие специальные символы заменены предлогами, что приводит к довольно разговорчивому коду. Эти языки обычно динамически типизированы , что означает, что объявления переменных и другой шаблонный код можно опустить. Такие языки могут облегчить человеку без знания языка понимание кода, а также, возможно, выучить язык. Однако сходство с естественным языком обычно скорее косметическое, чем подлинное. Правила синтаксиса могут быть такими же строгими и формальными, как и в обычном программировании, и не обязательно облегчают разработку программ.

Математические языки программирования

Альтернативой использованию математического псевдокода (включающего нотацию теории множеств или матричные операции) для документирования алгоритмов является использование формального математического языка программирования, который представляет собой смесь математической нотации, отличной от ASCII, и структур управления программой. Затем код может быть проанализирован и интерпретирован машиной.

Некоторые формальные языки спецификации включают обозначения теории множеств с использованием специальных символов. Примеры:

  • Обозначение Z
  • Венский язык спецификации методов разработки (VDM-SL).

Некоторые языки программирования массивов включают векторизованные выражения и матричные операции как формулы, отличные от ASCII, смешанные с обычными управляющими структурами. Примеры:

  • Язык программирования (APL) и его диалекты APLX и A + .
  • MathCAD .

Как написать псевдокод

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

Давайте построим ключевые слова с помощью операторов псевдокода для построения алгоритмов.

Conditionals

Условные операторы имеют решающее значение для программирования. Эти операторы являются операторами IF или IF / ELSE, которые могут добавить логику в ваш код. Эти операторы написаны в псевдокоде с использованием:

Вот программа, которая выполняет простой оператор IF / ELSE, написанный в псевдокоде. Посмотрите, сможете ли вы определить, что этот код пытается сделать, просто прочитав.

Это довольно простая программа. Он запрашивает у пользователя число и делает что-то в зависимости от того, является ли число нечетным или четным.

итерация

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

Этот алгоритм предназначен для программы, которая будет печатать «Hello» 12 раз, что немного излишне, но показывает, насколько просто написать цикл в псевдокоде.

В то время как петли также пишутся очень легко

Еще один довольно простой алгоритм, использующий цикл while для вывода «Hello». Оба примера цикла имеют четкое начало и конец итерации.

, Ключевые слова в псевдокоде отличаются: REPEAT и UNTIL.

Так же, как делать пока цикл, это будет выполнять действие, пока не будут выполнены определенные критерии. Как только оно выполнено, цикл завершится.

функции

Функции – лучший друг программиста. Они содержат код, который можно вызывать снова и снова и используются во всех языках программирования высокого уровня. Добавление функций в ваш псевдокод очень просто.

Вы можете вызывать функции в псевдокоде.

Там не так много функций; они очень просты, и вы можете добавить любую логику, которая вам нравится.

Обработка ошибок

Возможность разработки кода, который реагирует на ошибки, очень важна при разработке приложений. Таким образом, вы можете включить эти уловки в свой псевдокод.

Вы можете обрабатывать ошибки и исключения, используя ключевое слово: ИСКЛЮЧЕНИЕ. Вот простой алгоритм, который ловит ошибку

Код исключения поймает неверный ввод от пользователя

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

Чем полезен псевдокод?

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

Пример JavaScript легко прочитать, если вы знаете язык. Но что, если вы просто читаете это и пытаетесь определить логику? Конкретные термины, такие как или не рассказывать много об алгоритме.

они не ожидают, что вы запомните синтаксис. Они спросят о ваших знаниях алгоритмов и структуры. Вы напишите намного лучший код, если создадите свои алгоритмы и структуру до того, как начнете кодировать.

Псевдокод

Псевдокод состоит только из операторов действия — тех операторов, которые будут выполняться после преобразования программы из псевдокода в С и ее запуска. Объявления не являются исполняемыми операторами. Они представляют собой сообщения компилятору.

Псевдокод по своему характеру является промежуточным между естественным ( в нашем случае русским) языком и алгоритмическим языком. Чем дальше продвигается разработка, тем больше в используемом псевдокоде появляется черт алгоритмического языка, как в отношении его операторов, так и обрабатываемых данных.

Псевдокод — система команд абстрактной машины, реализуемая с помощью программного интерпретатора.

Соответствующий псевдокод для тертл-графики мы рассмотрим ниже в этом параграфе. Список порождающих правил для различных L-систем, которые упоминаются в тексте, можно найти в конце этого параграфа.

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

Псевдокод для задачи о результатах экзаменов.

Теперь псевдокод является достаточно детализированным для преобразования его в код С. Программа на С и два примера ее выполнения показаны на рис. 3.10

Обратите внимание, что мы воспользовались свойством языка С, позволяющим инициализацию объединять с объявлениями. Подобного рода инициализация происходит во время компиляции.

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

Этот псевдокод может быть легко реализован через массив гейтов. Для того чтобы это сделать, нам необходимо использовать довольно сложный массив гейтов в качестве подпрограммы. Напомним, что х2 mod n может быть классически вычислена и после этого встроена в структуру квантовых гейтов. К счастью, этот случай нам и нужен для алгоритма факторизации.

Команды псевдокода почти полностью совпадают с командами системы dBASE III Plus.

Синтаксис псевдокода может быть гораздо более свободным, чем у алгоритмических языков, поскольку главным его назначением является выражение общих черт разрабатываемого алгоритма) подвергаемых в дальнейшем уточнению. На этой стадии формулировки алгоритма не важны синтаксические детали конструкций, которые в реальных алгоритмических языках играют существенную роль. Разработчик выбирает такие понятия и конструкции для псевдокода, которые по его мнению помогут выразить алгоритм решения в максимально простой форме отвечающей специфике решаемой задачи. Желательно, конечно, чтобы конструкции псевдокода были похожи на типовые конструкции реальных алгоритмических языков, чтобы алгоритмы, выраженные на псевдокоде, могли без пояснений понимать многие программисты в ходе дальнейшей разработки или модернизации.

Соглашения псевдокода представляют собой одно из технологических инструментальных средств, призванных облегчить и стимулировать освоение и использование того комплексного подхода к достижению названных целей, который получил в настоящее время широкую известность как структурное программирование. В свою очередь основные идеи структурного программирования составляют тот базис, при последовательном использовании которого применение псевдокода оказывается наиболее продуктивным.

Если применялся псевдокод, то, как уже говорилось, может оказаться нужным переписать полученное решение на псевдокоде, подставляя соответствующее расширение вместо каждой уточняемой строки. Такой текст будет очень близок к используемому языку программирования. Например, в ПЛ / 1 и ФОРТРАНе повторение будет часто представлено циклом DO.

Блок-схема структуры повторения while.

Давайте используем псевдокод, чтобы сформировать список действий, которые должны быть выполнены, и определить последовательность их выполнения. Мы используем повторение, контролируемое счетчиком, для поочередного ввода оценок. Эта технология использует переменную, называемую counter, для задания числа повторений выполнения группы операторов. В следующем разделе мы покажем, как разрабатываются псевдокоды алгоритмов. Повторение, контролируемое счетчиком, часто называют повторением с заданным числом циклов, поскольку число повторений известно до того, как цикл начнет исполняться.

Синтаксис

Псевдокод обычно фактически не подчиняется правилам синтаксиса какого-либо конкретного языка; не существует систематической стандартной формы. Некоторые авторы заимствуют стиль и синтаксис управляющих структур из некоторых традиционных языков программирования, хотя это не рекомендуется. Некоторые источники синтаксиса включают Fortran , Pascal , BASIC , C , C ++ , Java , Lisp и ALGOL . Объявления переменных обычно опускаются. Вызовы функций и блоки кода, такие как код, содержащийся в цикле, часто заменяются однострочными предложениями на естественном языке.

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

Это пример псевдокода (для математической игры fizz buzz ):

Псевдокод в стиле Fortran

program fizzbuzz
  Do i = 1 to 100 
    set print_number to true
    If i is divisible by 3
      print "Fizz"
      set print_number to false
    If i is divisible by 5
      print "Buzz" 
      set print_number to false
    If print_number, print i
    print a newline
  end do

Псевдокод в стиле Паскаля

procedure fizzbuzz
  For i := 1 to 100 do
    set print_number to true;
    If i is divisible by 3 then
      print "Fizz";
      set print_number to false;
    If i is divisible by 5 then
      print "Buzz";
      set print_number to false;
    If print_number, print i;
    print a newline;
  end

Псевдокод в стиле C:

void function fizzbuzz {
  for (i = 1; i <= 100; i++) {
    set print_number to true;
    If i is divisible by 3 {
      print "Fizz";
      set print_number to false; }
    If i is divisible by 5 {
      print "Buzz";
      set print_number to false; }
    If print_number, print i;
    print a newline;
  }
}

Псевдокод в стиле Structured Basic

Sub fizzbuzz()
  For i = 1 to 100
    print_number = True
    If i is divisible by 3 Then
      Print "Fizz"
      print_number = False
    End If
    If i is divisible by 5 Then
      Print "Buzz"
      print_number = False
    End If
    If print_number = True Then print i
    Print a newline
  Next i
End Sub

Выравнивание структур

В изучаемой программе могут использоваться структуры, которые используют «нестандартное» выравнивание, скажем, по одному байту. Такие структуры можно без проблем создать в виде структур (Shift + F9), а в случае использования вида локальных типов нужно воспользоваться директивой pragma, а точнее pragma pack. pragma pack (n) задает выравнивание членов структур (чаще всего по умолчанию используется выравнивание 4 или 8 байт).

Например, если мы имеем дело с такой структурой

и знаем, что ее члены идут один за другим (т.е. сам экземпляр структуры занимает 5 байт), то при ее наложении на данные получим такую картину:

Видно, что между ch1 и qword образовалось неиспользуемое пространство, на месте которого по задумке должен был быть сам qword. Но если перепишем структуру следующим образом:

то получим корректный результат:

Преимущества Структурного Псевдокода

Практика использования Псевдокода в корпорации IBM показала, что число ошибок в программах и программном обеспечении ИБМ сократилось в десять раз с 2-3 ошибок на 100 операторов до 2-3 ошибок на 1000 тысячу операторов.

На олимпиадах и экзаменах по информатике и программированию объемы программ редко превышают 200—300 операторов и поэтому решения задач на ЭВМ при структурном проектировании алгоритмов и программ обычно достигаются за 2-3 пуска на ЭВМ.

При обучении программированию объемы программ редко превышают 100 операторов и обычно составляют 20-30 операторов, поэтому для структурированных алгоритмов и программ такого объема программы редко содержат ошибки и легко выявляются в текстах алгоритмов на родном русском языке.

Операторы

Операторы это инструкции, предписывающие
компьютеру выполнить определенное
действие.

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

Математические операторы

Математические операторы — неотъемлемая
часть разработки решения. Они позволяют
нам производить различные манипуляции
с хранимыми значениями. Вот как
используются распространенные
математические символы:

Ключевые слова

Ключевое слово это слово, «зарезервированное»
за программой и имеющее специальное
значение. Ключевые слова могут быть
командами или параметрами. В каждом
языке программирования есть свои
ключевые (зарезервированные) слова. Они
не могут использоваться в качестве имен
для переменных.

В псевдокоде ключевые слова используются,
чтобы показать обычный input-output и
процедурные операции. Эти слова пишутся
исключительно в верхнем регистре.

Ida pro: 11 советов, которые вы (может быть) не зналиPhoto by ThisisEngineering RAEng on Unsplash

Строковые литералы в декомпиляторе

Часто может встречаться ситуация, когда read-only данные перемешаны в одном сегменте с read-write данными (например, при использовании старых компиляторов, компиляторов для RTOS и др.). При этом при использовании декомпилятора можно наблюдать следующее:

Как мы видим, вместо строковых литералов подставляются названия переменных. Это отрицательно сказывается на читабельности псевдокода. Для исправления этой неурядицы можем изменить тип строковых переменных с char на const char.

В результате строковая переменная с исправленным типом будет действительно отображаться в псевдокоде как строковый литерал.

Второй вариант — это настроить декомпилятор на отображение всех строк как литералов (а не только неизменяемых). Для этого убираем галку «Print only constant strings literals» в настройках декомпилятора.

В результате получаем красивый вывод:

И еще про gdbserver

И еще поворчу про работу с gdbserver (в этот раз — в случае присоединения к удаленному процессу). Если на целевой машине включен ASLR, то у IDA может не получиться понять реальное расположение образа отлаживаемого файла в памяти. В результате IDA будет пытаться работать с адресами, которые указывают в какое-то невалидное пространство памяти. Для борьбы с этим можно еще до присоединения к удаленному процессу сделать rebase idb на актуальный адрес, и только потом присоединяться к процессу.

Сбор мусора в IDAPython

Интерпретатор Python, встроенный в IDA работает всегда и не закрывается до закрытия самой IDA. Поэтому сущности вашего Python-скрипта или плагина не будут автоматически удаляться. Кроме очевидных последствий вроде внезапных для автора утечек памяти, это может привести и к более забавным побочным эффектам, как, например, во время использования модуля logging.

Если написать такой скрипт

и запустить его два раза подряд, увидим такой вывод:

Происходит это потому, что функция getLogger либо создает, либо получает из глобального кэша уже существующий объект класса Logger. Далее к полученному инстансу логгера (одинаковому при каждом запуске скрипта) добавляется еще один хэндлер. Проверить это можно просто: выводим кэш (словарь) логгеров и список хэндлеров:

Есть как минимум два способа бороться с этим:

или

Описание Структурного Псевдокода

Набор структурных композиций

  1. Последовательности действий
  2. Альтернативный выбор действий
  3. Циклический повтор действий
  4. Выделение функций и подпрограмм

Альтернативный выбор действий:

если (условие) то
действия1
иначе
действия2
к-если

цикл-пока

пока (условие) цикл
действия
к-цикл

Дополнительные композиции

Цикл с счетчиком:

от k=1 до k=n цикл
действия
кцикл

Цикл с выходами:

цикл
действия1;
при (условие) выход
действия2;
кцикл

Многоальтернативный выбор действий:

если (условие1) то
действия1
инесли (условие2) то
действия2
иначе
действия3
кесли

Приношу извинения — местный редактор срезает ступенчатую запись.
Правильно оформленные алгоритмы на структурном псевдокоде
а также примеры программ на Бейсике и Javascript нужно смотреть в текстах учебников по информатике.

Об этой статье

Соавтор(ы):
Штатный редактор wikiHow

В создании этой статьи участвовала наша опытная команда редакторов и исследователей, которые проверили ее на точность и полноту. wikiHow тщательно следит за работой редакторов, чтобы гарантировать соответствие каждой статьи нашим высоким стандартам качества. Количество просмотров этой статьи: 46 011.

Категории: Программирование

English:Write Pseudocode

Español:escribir pseudocódigo

Português:Escrever um Pseudocódigo

Italiano:Scrivere dello Pseudocodice

Deutsch:Pseudocode schreiben

Français:écrire du pseudocode

العربية:الكتابة بلغة السودوكود

한국어:의사코드 작성법

हिन्दी:स्यूडोकोड (Pseudocode) लिखें (Write Pseudocode)

Tiếng Việt:Viết mã giả

中文:编写伪代码

Печать

Программное представление алгоритма

При записи алгоритма в словесной форме,
в виде блок-схемы или на псевдокоде
допускается определенный произвол при
изображении команд. Вместе с тем такая
запись точна настолько, что позволяет
человеку понять суть дела и исполнить
алгоритм.

На практике в качестве исполнителей
алгоритмов используются специальные
автоматы — компьютеры. Алгоритм,
предназначенный для исполнения на
компьютере, должен быть записан на
«понятном» ему языке. На первый план
выдвигается необходимость точной записи
команд, не оставляющей места для
произвольного толкования их исполнителем.
Следовательно, язык для записи алгоритмов
должен быть формализован. Такой язык
принято называть языком программирования,
а запись алгоритма на этом языке —
программой для компьютера.

Псевдокод (pseudocode)

При обучении псевдокоду многие авторы стараются как-то формализовать псевдокод и сделать его похожим на какой-то язык программирования, обычно, Pascal (фу, отстой). Я же буду использовать немного другой подход — псевдокодом у нас будут обычные предложения.

Что такое псевдокод? Это запись команд компьютеру обычным человеческим языком. В итоге программист получает промежуточную форму между повседневным языком и языком программирования.

Давайте разберём пример. Обычно, в качестве примеров выбирают ситуации, с практикой не имеющие ничего общего. Мы же рассмотрим совсем другой пример, который постоянно встречается на практике. Допустим у нас в стратегической игре есть карта размером 64 на 64 клетки. Для каждого персонажа игры нужно проверить, чтобы он не выходил за пределы карты. Координаты обозначим как x (по горизонтали), y (по вертикали). Очевидно, что координаты любого персонажа должны находиться в диапазоне . Предыдущее предложение — это мысль, которую нужно выразить на языке программирования.

Так как мы ещё не начали изучать C++, то давайте запишем эту мысль с помощью псевдокода. При этом предложения нужно строить только с помощью базовых конструкций, которые мы изучили в предыдущем уроке:

Если координата x юнита меньше единицы, то сделать x равным единице.
Если координата y юнита меньше единицы, то сделать y равным единице.
Если координата x юнита больше 64, то сделать x равным 64.
Если координата y юнита больше 64, то сделать y равным 64.

Данные четыре предложения ограничивают движение персонажа. Это и есть псевдокод. Всю задачу мы смогли реализовать с помощью четырёх ветвлений с одной ветвью, в каждой из которых по одному оператору. Теперь этот псевдокод можно легко перевести на любой язык программирования. Давайте сделаем это для C++. Для этого в псевдокоде нужно заменить некоторые слова на английские эквиваленты, а математические действия нужно записать на математическом языке. Слово если на английском будет if (читается как иф):

if x  64, x = 64.
if y > 64, y = 64.

Это тоже псевдокод, правда, уже более близкий к языкам программирования. В данном варианте псевдокода мы кое-что потеряли. Чьи координаты здесь проверяются? Чтобы обозначить, что x,y — координаты персонажей игры, мы запишем их через точку: unit.x, unit.y. Здесь видно, что x и y принадлежат юниту, а не зданию или дереву. Посмотрим на новый вариант:

if unit.x  64, unit.x = 64.
if unit.y > 64, unit.y = 64.

Это всё ещё псевдокод, но здесь уже не содержится никакой избыточности — мы избавились от всех лишних слов. Данный вариант очень близок к языкам программирования. На C++ финальный код будет выглядеть вот так:

if (unit.x  64) unit.x = 64;
if (unit.y > 64) unit.y = 64;

Этот код на С++ полностью рабочий! Кстати, очень похожий код мы будем использовать в арканоиде для контроля шара.

Здесь я показал три варианта псевдокода. Первое время вы будете пользоваться первым вариантом, записывая код в виде предложений на русском языке. Если достаточно плотно заниматься, то псевдокод становится ненужным уже недели через три, когда удаётся усвоить базовые конструкции языка программирования, но на начальном этапе это довольно полезная штука.

Простой пример, который мы разобрали выше, наглядно показывает нам чем занимается программист.

Что должен уметь делать программист?

Основная задача программиста состоит в следующем: перевод мыслей на язык, понятный компьютерам. Давайте ещё раз проследим, как это происходит.

Сначала мы захотели создать стратегию, далее мы начинаем обдумывать отдельные части будущей программы. Так, мы хотим, чтобы действие игры происходило на ограниченном поле размером 64*64 клетки. Отсюда вытекает следующее правило: любой персонаж игры должен находиться в пределах этого поля. У каждого персонажа есть координаты, которые задают его местоположение на карте. Чтобы точно удостовериться, что персонаж находится внутри поля, нужно проверить, не пересёк ли персонаж какую-либо из четырёх сторон поля. Теперь мы можем написать псевдокод (или сразу код, если достаточно хорошо знаем какой-нибудь язык программирования):

Если координата x юнита меньше единицы, то сделать x равным единице.
Если координата y юнита меньше единицы, то сделать y равным единице.
Если координата x юнита больше 64, то сделать x равным 64.
Если координата y юнита больше 64, то сделать y равным 64.

В итоге из одного предложения: «Любой персонаж игры должен находиться в пределах поля 64*64» — получилось четыре ветвления, каждое из которых будет состоять из одного оператора.

Самое сложное и важное на начальном этапе обучения программированию — научиться переводить мысли с человеческого языка на языки программирования (основные средства которых мы обсудили в прошлом уроке)

заявка

В учебниках и научных публикациях, связанных с информатикой и численными вычислениями, часто используется псевдокод при описании алгоритмов, чтобы все программисты могли их понять, даже если не все они знают одни и те же языки программирования. В учебниках обычно есть сопроводительное введение, объясняющее конкретные используемые условные обозначения. Уровень детализации псевдокода может в некоторых случаях приближаться к уровню детализации формализованных языков общего назначения.

Программист , который должен реализовать алгоритм специфического, особенно незнакомые один, часто начинает с описанием псевдокода, а затем «перевести» , что описание в целевом языке программирования и изменить его , чтобы правильно взаимодействовать с остальной частью программы. Программисты также могут начать проект с наброска кода в псевдокоде на бумаге, прежде чем писать его на его фактическом языке, в качестве подхода к структурированию сверху вниз с процессом шагов, которые следует выполнять в качестве уточнения.