H1LM5

        Возможно я неверно понимаю задачу, но.. 
        Автоматик автоматизирует.. Всё.. Что возможно.
        Вперед, Технологическая Сингулярность уже позади.

Bведение в программирование микроконтроллеров и не только
=========================================================

        +------------------------------------------------------+
        | Ввод с клавиатуры и вывод в консоль -- всегда строки |
        |                                                      |
        | Ноль-Дадзибао.                                       |
        +------------------------------------------------------+
    
Компьютеры придумали на Западе. Используется более 20 видов кириллицы. Поэтому, если вы делаете что-то для себя, мне кажется полезнее выучить английский, чем всякий раз уродоваться с локализацией. Другое дело, если не для себя. Тут действует правило "Kлиент Всегда Прав", и у Вас остается две возможности.

  1. Убедить клиента, что 20 видов кириллицы это плохо. 
     Сделать это очень непросто.
     
  2. Уродоваться с локализацией.
     Деньги дадут.

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

  1. Автору учебника нравится его писать, и бросать никак не хочется.. 
     Однако, если за строчки не платят, текст получается, как правило, 
     короче.
  
  2. Передать информацию с помощью текста с учетом скорости чтения 
     занимает больше времени, чем, скажем, мультимедия. 
     (Однако писать текст быстрее, чем создавать мультик, клип, фильм..)
     
Сделаем компромиссный вариант: задаром писать сценарий мультика.

Эпизод I. Наглядная демонстрация работы ОЗУ.

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

  1. Вдоль обрыва: "Адресная шина"
  2. Посередине*:  "Шина управления"
  3. К скале:      "Шина данных"
  
*) У Бога это есть, а у короля -- нет. 
   У бобра это спереди, а у верблюда -- посередине
    
Включаем воображение и по демонстрации в Logisim или даже в Circuitmaker Student 6 (199x) рисуем сюжет, где бегуны в белых майках -- логические единицы, черных -- логические нули, на адресной шине залегли наблюдатели с биноклями, а на шине управления бегунам раздают пендали..

Лирическое отступление
----------------------

Что не так в Flowgorithm?

1. В чат окне исчезают собственные ответы
   (они справа или еще лучше выключите "bubbles" 
    на панели инструментов консоли)
2. Нехватает break и continue
   (см. "workaround" в "Raspberry Pi. Writing code..")
3. Нехватает глобальных и/или статических переменных
   Найден "workaround": x = foo( x)
     http://stackoverflow.com/questions/31096116
     /flowgorithm-importing-variables-and-modifying-their-values
4. Как работают аргументы по ссылке?
   (есть упоминание на сайте
    http://robatz.altervista.org/blog/flowcharts-book/, см.
    6. Addizionare due numeri usando la chiamata per valore
       e la chiamata per riferimento)
   (жду обратной связи..)
   "Also, an array of length 1 can be used to create a reference 
    if you really want to confuse people :)*. На Flowgorithm это
    работает так же как на Java. Например:
    
    Declare Integer x[1]        
    Set x[0] = 111
    Call side(x)
    Display x[0]

    Module side(Integer a[])
        Set a[0] = 222
    End Module
    
    напечатает
    222

5. Оценка логического выражения не ленивая 
   (logical expression evaluation is not lazy)
6. Необходимо поправлять работу конвертера вручную
   tokenize.fprg --> tokenize.java
       utf-8+bom                 ->  utf-8
    4: class JavaApplication {   ->  class tokenize {
   34: as.charAt(an).equals(" ") ->  as.charAt(an) == ' '
7. Функция не может отдать массив (посредством return)
...

--------

*) http://stackoverflow.com/questions/1068760
       /can-i-pass-parameters-by-reference-in-java
       
Короче, чтобы почувствовать программу ее надо пощупать.

Читаем документацию на

  http://www.flowgorithm.org/documentation/index.htm

и пишем матрешку для Arduino (далее экспорт в Gaddis..)

  Module main()
      Call setup()
      While true
          Call loop()
      End While
  End Module

  Function Boolean digitalRead(Integer aPin)
      Declare Integer v
      Declare Boolean b
      
      Do
          Display "enter value (0 or 1) on pin ", aPin, ": "
          Input v
      While v != 0 AND v != 1
      If v == 1 Then
          Set b = true
      Else
          Set b = false
      End If
      
      Return b
  End Function

  Module digitalWrite(Integer aPin, Boolean aValue)
  End Module

  Module loop()
      Declare Boolean r
      
      Set r = digitalRead(1)
      Display r, " now"
  End Module

  Module pinMode(Integer aPin, Integer aMode)
  End Module

  Module setup()
  End Module
  
Изучаем переменные
------------------

  Module main()
      Declare String vs
      
      Set vs = "Hello, World!"
      Call foo(vs)
  End Module

  Module foo(String as)
      // There is no such beast as  
      // global scope. This is sad  
      // coz if arduino's poor man set: 
      //  
      //   function pinMode( 
      //       integer aPin,  
      //       integer aMode 
      //   ) 
      //   
      //   function delay( integer aMilliseconds)
      //
      //   function boolean digitalRead(  
      //     integer aPin 
      //   ) 
      //  
      //   function integer analogWrite( 
      //     integer aPin, 
      //     integer aValue 
      //   ) 
      //  
      //   function digitalWrite( 
      //      integer aPin,  
      //      boolean aValue 
      //   ) 
      //  
      // can't have familiar signatures 
      // and can't remember, in what state 
      // pin is: INPUT OUTPUT INPUT_PULLUP 
      // simultaneously..
      Display as
  End Module

Еще о функциях
--------------

Аргументы бывают:

  + только для чтения  _In_
  + только для записи  _Out_
  + в обе стороны      _InOut_
 
У Микрософт это теперь называется Source Code Annotation Language (SAL), почитать на эту тему можно на сайте

  https://msdn.microsoft.com/en-us/library/jj159525.aspx

Перевод документации к Flowgorithm
----------------------------------

(Примеры даны в "GaddisEx". Отличия от оригинального Гаддиса (больше сходства с Flowgorithm):

  Display x, y      Output x & y
  
  Function foo()    Function foo() returns rc
    ..                ..
    return rc       End Function
  End Function
   
примечание переводчика)

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

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

Многие блок-схемы отображают слово "Старт" в верхнем терминале. Flowgorithm, однако, использует слово "Main". Большинство языков программирования начинаются с "Main" и Flowgorithm пытается следовать им.

  ( Main )
      |
  (  End )

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

Чтобы добавить фигуру, наведите курсор мыши на линию. Если имеете право добавить фигуру, линия станет оранжевой.

Теперь, дважды щелкните или щелкните правой кнопкой мыши, чтобы добавить фигуру.

  Clipboard             Miscellaneous

    Clipboard             Comment   Breakpoint

  Statement

    Input/Output    Variables   Control    Looping

    / Input /       |+Declare|  <  If  >   < While >
    / Output/       | Assign |  ||Call||   <  For  >
                                           <  Do   >

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

В блок-схемах, каждое действие, которое ваш компьютер может выполнить, представлено отдельной фигурой. Например, входные и выходные фигуры представлены параллелограммами (наклонными прямоугольниками). Кроме того, с помощью этого меню, фигуру можно вставить из буфера обмена.

Программа Hello World нуждается в фигуре вывода информации. Это позволит программе отображать данные на экране.

Наведите указатель мыши на зеленый параллелограмм с текстом "Output". Теперь он будет представлен синим цветом.

Нажмите на фигуру. Она будет добавлена к вашей схеме.

Теперь ваша блок-схема содержит фигуру вывода информации.

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

Вы должны сказать Flowgorithm, `что*0 вы хотите вывести. Это может быть что угодно, от результата расчета до текстового сообщения.

Теперь, дважды щелкните или щелкните правой кнопкой мыши по фигуре "Output", чтобы изменить ее.

Появится окно (form) с названием "Output Properties". С помощью этого окна можно указать, что будет отображаться на экране.

Фигура "Output" достаточно проста. Она будет выводить результат выражения. Это может быть что-то вроде текстового сообщения, переменной или результата вычисления*1.

В текстовом поле напечатайте "Hello, World!". Вы должны добавить двойные кавычки вокруг текста. В компьютерном программировании это называется строкой "string".

Теперь, нажмите на кнопку OK, чтобы продолжить. Вы можете получить окно ошибки, если вы не заполнили форму "Output Properties" правильно. Если это произойдет, просто подредактируйте форму снова и исправьте ее.

Фигура "Output" отображается теперь зеленым цветом.

         ( Main )
             |
  / Output "Hello, World" /
             |
         (  End )

Так как все фигуры стали цветными (серых фигур нет), ваша программа завершена. Теперь настало время, чтобы запустить ее.

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

Нажмите на эту иконку, чтобы запустить программу. Можно также нажать клавишу F5 на клавиатуре или выбрать пункт "Выполнить" из меню программы.

Новое окно должно появиться под названием "Console Screen". В компьютерном программировании, консоль используется для отображения и ввода текстовой информации.

Экран консоли в Flowgorithm был смоделирован по примеру чата на смартофоне. Таким образом, вы как бы переписываетесь в чате с Flowgorithm'ом.

Во всяком случае, вы закончили свою первую компьютерную программу. Поздравления!

Основы
======

Типы данных
-----------

Тип данных Integer
..................

Тип данных Integer (целое число) является одним из наиболее часто используемых типов в программировании. В Integer переменной можно хранить положительное или отрицательное целое число, но нельзя хранить дробные значения. Таким образом, такая переменная может хранить значения, такие как 5, 42, 1947, но не может хранить номера, такие как 3.2, 4.5, и т.д. ...

Если число с дробной частью хранится в Integer переменной, дробная часть будет отброшена. Следовательно, если 3.2 хранится как целое число, оно сохранит только 3.

Окно Watch Window отображает целые числа синим цветом.

Тип данных Real
...............

Тип данных Real (действительные числа) может хранить любые вещественные числа -- как целые числа, так и числа с дробной частью. Во многих языках, это называется "double" следуя стандарту, известному как "числа двойной точности с плавающей точкой".

Окно Watch Window отображает вещественные числа фиолетовым цветом.

Тип данных String
.................

Тип данных cтрока используется для хранения любых текстовых данных. Это включает в себя слова, буквы, или что-нибудь еще что Вы могли бы отправить в текстовом сообщении. В программировании, текст заключается в двойные кавычки. Например: "CSU, Sacramento", "computer", и "Year 1947" все это строки.

Окно Watch Window отображает строки красным цветом.

Тип данных Boolean
.................

Логический тип данных может хранить либо "true" (истина) либо "false" (ложь). Эти значения являются основой принятия решений в компьютерной программе.

Окно Watch Window отображает значения Булевых переменных сине-зеленым (чирок) цветом.

Сводная таблица
...............

  Тип данных  Примечания
  Boolean     для хранения Boolean true или false
  Real        для хранения целых чисел.
  Integer     для хранения вещественных чисел.
  String      для хранения текстовой информации.

Идентификаторы и ключевые слова
-------------------------------

Идентификаторы
..............

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

В Flowgorithm, идентификаторы должны отвечать следующим правилам:

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

Также обратите внимание:

  + Языки, такие как Visual Basic и C допускаюют также использовать
    символ подчеркивания "_". Flowgorithm, однако, не разрешает
    делать этого.
  + Идентификаторы не чувствительны к регистру.

Ниже приведены несколько простых примеров идентификаторов.

  Допустимые идентификаторы   Примечания
  х                           Идентификатором может быть одна буква.
  name
  noun2                       Числа разрешены после первой буквы

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

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

Зарезервированные слова
.......................

Flowgorithm имеет только несколько зарезервированных слов, которые используются в выражениях.

  and   not   true   false   or    mod   pi

Ключевые слова: типы данных
...........................

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

  boolean   real
  integer   string

Незаконные Ключевые слова (используемые в функциях)
...................................................

Flowgorithm не разрешает использовать в качестве идентификаторов имена встроенных функций.

  abs      int     sin     tofixed
  arccos   len     size    tointeger
  arcsin   log     sqrt    tostring
  arctan   log10   tan     toreal
  char     random  tochar
  cos      sgn     tocode

Зарезервировано для будущего использования
..........................................

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

  arccosh   cosh
  arcsinh   sinh
  arctanh   tanh

Константы
---------

В Flowgorithm предопределены три часто используемых константы. True и False часто используются для инициализации логических переменных. Pi обычно используется в математике.

  Постоянные   Примечания

  True         Булева истина
  False        Булева ложь
  Pi           Математическое PI. Приблизительно 3,1415.

Выражения
---------

Операторы
.........

Выражения используют операторы, используемые в двух основных семействах языков программирования. "BASIC-семья" содержит английские ключевые слова и операторы. В "С-семье" (которая включает в себя C, Java, C#) акцент делается на различные небуквенные символы (& ^ % @ ..)

Так как обе семьи поддерживаются, существует ряд избыточных операторов. Это:

  Оператор         C-Семья    BASIC-Семья
  Отрицание        !          not
  Остаток          %          mod
  Равенство        ==         =
  Неравенство      !=         <>
  Логическое И     &&         and
  Логическое ИЛИ   ||         or 

Flowgorithm также добавляет несколько уникальных операторов Visual Basic, так как у них полезная четко определенная семантика

  оператор Visual Basic       Наименование
   
  &                           Конкатенация строк
  ^                           Возведение в степень

В Java и C#, оператор "+" используется как для объединения строк так и для сложения чисел. (это очень хорошо, так как знакомит с понятием перегрузки операторов. прим. переводчика). Это может быть довольно запутанным, учитывая довольно сложную семантику. В Flowgorithm "+" будет работать только с числами. Амперсанд "&" используется для конкатенации.

Кроме того, в C# и Java отсутствует оператор возведения в степень -- полагаясь вместо этого на свои соответствующие классы типа "Math". Flowgorithm использует оператор "^" из Visual Basic.

Таблица приоритетов
...................

Ниже приведены уровни приоритета от высокого (вычисляется в первую очередь) к низкому уровню.

  Уровень  Наименование    Операторы   Примечания
  
  8        Унарные         -  !  not   в Visual Basic ", приоритет
                                       "not" намного ниже -- выше "and",
                                       но ниже всех операторов сравнения
  7        Степень         ^           Оператор степени не существуют в
                                       C# или Java.
  6        Мультипли-      *  /  %     результат деления всегда
                                       вещественное число
                                       
  5        Аддитивные      + -         "+" работает только с числами.
  4        Конкатенация    &           C# и Java используют "+"
                                       оператор как для сложения так и
                                       для конкатенации.
  3        Сравнения       > >= < <=
                           == =! = <>
  2        Логическое И    &&  and
  1        Логическое ИЛИ  ||  or

Примеры

  Выражение        Результат     Примечания
  
  1 + 3 ^ 2        10
  10 * 2 + 5 * 6   50            10 * 2 и 5 * 6 имеют более высокий
                                 приоритет чем сложение. Сложение
                                 делается в последним.
  7 * (4 - 1)      21            Скобки используются для подвыражений
  6 / 3 * 2        4             В математике, умножение и деление
                                 имеют одинаковые уровни приоритета.
                                 Таким образом, они вычисляются слев
                                 а направо.  Акроним "PEMDAS",
                                 используемый в средней школе,
                                 вводит немного в заблуждение.
  10 mod 3         1             Оператор остатка в математике 
                                 дает остаток от деления
  10 % 3           1             То же выражение, но с использованием
                                 оператора из семейства языков C

Встроенные функции
------------------

Математика

  Abs(n)      Абсолютное значение
  Arcsin(n)   Тригонометрический Арксинус
  Arccos(n)   Тригонометрический Арккосинус
  Arctan(n)   Тригонометрический Арктангенс
  Cos(n)      Тригонометрические косинус
  Int(n)      Целая часть вещественного числа
  Log(n)      Натуральный логарифм
  Log10(n)    Десятичный логарифм
  Sgn(n)      Математический знак (-1, если n имеет отрицательное
              значение, 0, если ноль, 1, если положительное)
  Sin(n)      Тригонометрический Синус
  Sqrt(n)     Квадратный корень
  Tan(n)      Тригонометрический тангенс

Строки

  Len(s)      Длина строки
  Char(s, i)  Возвращает символ из строки s с индексом i.
              Символы индексируются, начиная с 0.

Преобразование типов данных

  ToChar(n)      Преобразование кода символа "n" в символ
  ToCode(c)      Преобразование символа "с" в код символа
                 (Целое число).
  ToFixed(r, i)  Преобразовать вещественное число r в
                 строку с "i" цифрами после десятичной точки.
  ToInteger(n)   Преобразовать строку в целое число
  ToReal(n)      Преобразовать строку в вещественное число
  ToString(n)    Преобразовать число в строку

Другие

  Random(n)      Случайное число между 0 и (n - 1)
  Size(а)        Размер (число элементов) в массиве

Основной формат файла
---------------------

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

Программы в Flowgorithm довольно просты. Там нет больших элементов данных, которые требуют сжатия и не существует большого количества различных типов данных, подлежащих хранению. Это простая программа -- так же, можно написать что-либо написано в Java, C#, и т.д ... Так что, вместо того чтобы применять сложные двоичные файлы, файлы будет легко читать и портировать на другие системы. Идея заключается в том, что программы "написаные" с помощью Flowgorithm, можно легко использовать сторонними инструментами. Для достижения этой цели, файлы будут храниться в простом формате XML.

пример

Дана следующая программа ...

  Module main()
      Declare Integer age
      Output "Please enter your age"
      Input age
      If age > 21 Then
          Output "Kegger!"
      Else
          Output "Milk!"
      End If
  End Module
  
Программа будет сохранена в следующем формате:

  <?xml version="1.0"?>
  <flowgorithm fileversion="2.0">
      <attributes>
          <attribute name="name" value="Age"/>
          <attribute name="authors" value="Devin Cook"/>
          <attribute name="about" value="A simple example of an If Statement">
          <attribute name="saved" value="1/7/2015 11:27:10 PM"/>
      </attributes>
      <function name="Main" type="None" variable="">
          <parameters/>
          <body>
              <declare name="age" type="Integer" array="False" size=""/>
              <output expression="&quot;Please enter your age&quot;"/>
              <input variable="age"/>
              <if expression="age &gt;= 21">
                  <then>
                      <output expression="&quot;Kegger!&quot;"/>
                  </then>
                  <else>
                      <output expression="&quot;Milk!&quot;"/>
                 </else>
              </if>
          </body>
      </function>
  </flowgorithm>

Фигуры
------

Assignment (присвоение)
.......................

Внешний вид по умолчанию 

  | Assign |

Что оно делает

Фигура "Assign" (присвоить) используется для хранения результата вычисления в переменной. Это одна из наиболее распространенных задач, встречающихся в программах.

пример

  Module main()
      Declare Real area
      Declare Integer radius
      Set radius = 7
      Set area = Pi * radius ^ 2
      Output "The area is " & area
  End Module

В примере объявляются две переменные: area (площадь), которая хранит действительные числа и radius (радиус), в котором хранятся целые числа. Затем он использует оператор присваивания "=", чтобы установить радиус "radius" равным 7. Наконец, вычисляется площадь круга и сохраняется результат в "area".

Breakpoint (точка останова)
...........................

Внешний вид по умолчанию 

  (O) Breakpoint

Что оно делает

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

пример

  Module main()
    Declare Integer value
    Set value = 12
    Breakpoint
    Set value = value + 1
  End Module

Пример создает переменную с именем 'value' (значение)и присваивает ей начальное значение 12. Затем программа встречает точку останова  -- которая приостанавливает выполнение в этом месте.

Это позволит пользователю увидеть текущее значение 'value' в "окне отслеживания переменных (Variable Watch Window). После того, как выполнение будет продолжено (кнопка Play), будет выполнена вторая фигура присваивания (value=value+1).

Вызов (Call)
............

Внешний вид по умолчанию

  || Вызов ||

Что оно делает

Фигура Call передает управление функции. Информация передается в функцию с помощью "аргументов".

пример

  Module main()
    Call greeting
    Output "Goodbye!"
  End Module

  Module greeting()
    Output "Hello!"
  End Module

В следующем примере используется фигура Call, чтобы выполнить функцию под названием "greeting" (приветствие).

Когда программа выполняется, первая фигура будет вызывать приветствия функцию greeting. После того, как та выведет на экран сообщение "Hello!" (Привет!), выполнение вернется в основную функцию и она выведет "Goodbye!" (До свидания!).

Комментарий (Comment)
.....................

Внешний вид по умолчанию 

  ..:Comment:

Что оно делает

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

пример

  Module main()
    Output "Before the comment"
    Comment This comment doesn't change how the program executes
    Output "After the comment"
  End Module

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

Объявить (Declare)
..................

Внешний вид по умолчанию 

  | + Declare |

Что оно делает

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

пример

  Module main()
      Declare Real area
      Declare Integer radius
      Set radius = 7
      Set area = Pi * radius ^ 2
      Output "The area is " & area
  End Module

В примере объявляются две переменные: area (площадь), которая хранит действительные числа и radius (радиус), в котором хранятся целые числа. Затем он использует оператор присваивания "=", чтобы установить радиус "radius" равным 7. Наконец, вычисляется площадь круга и сохраняется результат в "area".

Do..While (Пока (пост-условие))
...............................

Внешний вид по умолчанию 

  <Do>

Что оно делает

Цикл Do..While подобен циклу While за исключением того, что блок операторов выполняется по крайней мере один раз, прежде чем выражение проверяется.

пример

  Module main()
    Declare Integer age
    Output "Enter a valid age"
    Do
      Input age
    Loop age < 0 or age > 110
  End Module

Пример показывает цикл Do, который принимает только правдоподобный ввод. Программа будет запрашивать ввод, пока переменной "age" (возраст) не будет присвоено целое значение от 0 до 110 включительно.

( Warning (предупреждение): Не пытайтесь вводить нечисловые знвчения. Пример написан с нарушением принципа "Zero Dazibao". Чтобы программа заработала, как надо, минимально допустимое значение переменной типа Integer должно восприниматься как NaN (not a number). Вызов встроенной функции ToInteger с нечисловым значением аргумента должен вернуть NaN. Но это уже тема для языков программирования, с которыми можно работать профессионально. Смотрите Инструменты -> Показать исходный код.. Язык:

   1. C#  
   2. C++  
   3. Java  
   4. JavaScript  
   5. Lua  
   6. Perl  
   7. Python  
   8. QBasic  
   9. Ruby  
  10. Swift-2  
  11. VBA  
  12. Visual Basic.NET 
  13. Gaddis Pseudocode 
  
примечание переводчика)

for (для)
.........

Внешний вид по умолчанию 

  <  For  >

Что оно делает

Цикл for изменяет переменную в диапазоне значений. Часто это полезная замена циклу while.

пример

  Module main()
    Declare Integer n
    For n=9 To 1 Step -2
      Output n
    End For
  End Module

Пример печатает нечетные числа от 9 до 1. Цикл выполняется 5 раз. Значение "n" начинается с 9 и уменьшается на 2 каждый раз, когда цикл выполняется. Цикл заканчивается, когда "n" достигает 1.

if (если)
.........

Внешний вид по умолчанию 

  <  If  >

Что оно делает

Предложение (statement) If проверяет логическое выражение, а затем выполняет истинную или ложную ветвь на основе результата.

пример

  Module main()
      Declare Integer age
      Output "Please enter your age"
      Input age
      If age > 21 Then
          Output "Kegger!"
      Else
          Output "Milk!"
      End If
  End Module
  
Пример объявляет целое число, называемое "age" возраст. Затем он считывает возраст с клавиатуры (cмотрите примечание Zero Dazibao выше).

И, наконец, в условии if проверяется, является ли возраст больше или равен 21. Исходя из этого, выполняется либо ложная ветвь и отображается "Milk!" (молоко), или истинная ветвь и отображается "Kegger!" (пиво).

Input (Ввод)
............

Внешний вид по умолчанию

  / Input /

Что оно делает

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

пример

  Module main()
      Declare Real area
      Declare Integer radius
      Set radius = 7
      Set area = Pi * radius ^ 2
      Output "The area is " & area
  End Module

Пример создает две переменные: area и radius. Затем используется оператор ввода для чтения радиуса с клавиатуры (cмотрите примечание Zero Dazibao выше). Последнее предложение

  output "The area is " & area 

отображает результат.

Вывод (output)
..............

Внешний вид по умолчанию

  / Output /

Что оно делает

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

пример

  Module main()
      Declare Real area
      Declare Integer radius
      Set radius = 7
      Set area = Pi * radius ^ 2
      Output "The area is " & area
  End Module

Пример создает две переменные: area и radius. Затем используется оператор ввода для чтения радиуса с клавиатуры. (cмотрите примечание Zero Dazibao выше). Последнее предложение

  output "The area is " & area
  
отображает результат.

While (Пока (пред-условие))
...........................

Внешний вид по умолчанию 

  < While >

Что оно делает

Цикл While оценивает логическое выражение и, если оно истинно, выполняет операторы. Он перепроверяет выражение и повторяет выполнение операторов, пока оно не станет ложным.

пример

  Module main()
    Declare Integer n
    Set n = 1
    While n<=100
      output n
      n = n + 1
    End While
  End Module

Пример печатает числа от 1 до 100. Оператор присваивания "n = n + 1" увеличивает переменную "n" на 1 для каждой итерации цикла.

....

Если Вы выбрали правильную (proper) скорость для чтения этого документа, то далее перевод Вам не потребуется, потому что your English is "good enough" now. Let's continue on flowgorithm homepage..

Словарик К..
------------

Hello World     Привет, мир!
terminal        терминал
start           старт
main            главный
end             конец
shape           фигура 
comment         комментарий
clipboard       буфер обмена
breakpoint      точка останова     
statement       утверждение 
input           вход
output          выход
variable        переменная
loop            цикл
declare         объявлять
if              если
while           покудова
call            вызов
for             для
do              делать
pop-up menu     всплывающее меню
flowchart       блок-схема
text box        текстовое поле
string          строка
form            форма
edit            редактировать
toolbar         панель инструментов
console         консоль
integer         целое

*0) Если неоднозначно, на каком слове делается акцент, 
    перед таким словом ставим `.
    
*1) Сложную строку можно образовать с помощью операции &

Приложение А. All Shapes
------------------------

shapes.txt (Gaddis Pseudocode)

  Module main()
      // This is comment
      Declare Integer i
      Declare Real d
      Declare Boolean b
      Declare String s
      Declare Integer a[10]
      
      Set i = 5
      Set d = 2.71828
      Set b = false
      Set s = "This is string"
      Display "Variables: ", toString(i), " ", toString(d), " ", toString(b), " ", toString(s)
      Input i
      If i == 0 Then
          Display "Zero"
      Else
          Display "Non Zero"
      End If
      While false
          Display "Never Reached"
      End While
      Do
          Display "Once Reached"
      While false
      For i = 0 To 10 Step 3
          Display toString(i ^ 2)
      End For
      Call moo()
      Set b = foo(s)
  End Module

  Function Boolean foo(String as)
      Declare Boolean vb
      
      Display as
      Set vb = true
      
      Return vb
  End Function

  Module moo()
      Display "Hi, Moo here"
  End Module

shapes.fprg

  <?xml version="1.0"?>
  <flowgorithm fileversion="2.0">
      <attributes>
          <attribute name="name" value=""/>
          <attribute name="authors" value=""/>
          <attribute name="about" value=""/>
          <attribute name="saved" value=""/>
          <attribute name="created" value=""/>
          <attribute name="edited" value=""/>
      </attributes>
      <function name="Main" type="None" variable="">
          <parameters/>
          <body>
              <comment text="This is comment"/>
              <declare name="i" type="Integer" array="False" size="" variables="i"/>
              <declare name="d" type="Real" array="False" size="" variables="d"/>
              <declare name="b" type="Boolean" array="False" size="" variables="b"/>
              <declare name="s" type="String" array="False" size="" variables="s"/>
              <declare name="a" type="Integer" array="True" size="10" variables="a[10]"/>
              <assign variable="i" expression="5"/>
              <assign variable="d" expression="2.71828"/>
              <assign variable="b" expression="False"/>
              <assign variable="s" expression="&quot;This is string&quot;"/>
              <output expression="&quot;Variables: &quot; &amp; ToString( i)  &amp; &quot; &quot; &amp; ToString( d)  &amp; &quot; &quot; &amp; ToString( b)  &amp; &quot; &quot; &amp; ToString( s)"/>
              <input variable="i"/>
              <if expression="i == 0">
                  <then>
                      <output expression="&quot;Zero&quot;"/>
                  </then>
                  <else>
                      <output expression="&quot;Non Zero&quot;"/>
                  </else>
              </if>
              <while expression="False">
                  <output expression="&quot;Never Reached&quot;"/>
              </while>
              <do expression="False">
                  <output expression="&quot;Once Reached&quot;"/>
              </do>
              <for variable="i" start="0" end="10" direction="inc" step="3">
                  <output expression="ToString( i^2)"/>
              </for>
              <call expression="moo"/>
              <assign variable="b" expression="foo( s)"/>
          </body>
      </function>
      <function name="foo" type="Boolean" variable="vb">
          <parameters>
              <parameter name="as" type="String" array="False"/>
          </parameters>
          <body>
              <declare name="vb" type="Boolean" array="False" size="" variables="vb"/>
              <output expression="as"/>
              <assign variable="vb" expression="True"/>
          </body>
      </function>
      <function name="moo" type="None" variable="">
          <parameters/>
          <body>
              <output expression="&quot;Hi, Moo here&quot;"/>
          </body>
      </function>
  </flowgorithm>
  
Приложение Б. Недостающие функции и баги (Flowgorithm, Gaddis Pseudocode)

1. ToInteger не работает с отрицательными целыми.
   Нарисовал функции string2Integer, isNatural, isInteger..
   
2. B примере library.fprg (~100 строк) конвертер в Гаддис ляпнул 
      Set vs = vs + substring(as, n, 1)
   вместо
      Set vs = vs + Char(as, n, 1)
      
3. Нет strcpy, нарисовал функцию subString
   ...

Задачки про календарь
---------------------

 1. Ввести число от 1 до 7
    Вывести название дня недели
    
 2. Ввести число от 1 до 12
    Вывести название месяца
    
 3. Ввести дату
    Вывести признаки года по китайскому календарю:
    "2017 -- год золотого петуха"
    
Задачки про то, как пухнет API
------------------------------
    
 4. Написать функции lPad и TESTlPad

 5. Написать функции rPad и TESTrPad

 6. Написать функции pad и TESTpad

 7. Написать функции str[] strTok( str) и TESTstrTOK

 8. Написать функции bool isDigit( str) и TESTisDigit

 9. Написать функции bool isNatural( str) и TESTisNatural

10. Написать функции bool isInteger( str) и TESTisInteger

11. Написать функции int toIntegerEx( str) и toIntegerEx

12. Написать функции bool isDouble( str) и TESTisDouble

13. Написать функции bool toDouble( str) и TESTtoDouble

14. Написать функции bool isBool( str) и TESTisBool
    str может принимать значения "0", "1", "true", "false"

15. Написать функции bool toBool( str) и TESTtoBool
    str может принимать значения "0", "1", "true", "false"
       
16. Написать функции bool isAlpha( str) и TESTisAlpha

17. Написать функции bool isHexDigit( str) и TESTisHexDigit

18. Написать функции bool isHex( str) и TESTisHex

19. Написать функции bool hexToInteger( str) и TESThexToInteger

20. Написать функции bool isOctDigit( str) и TESTisOctDigit

21. Написать функции bool isOct( str) и TESTisOct

22. Написать функции bool octToInteger( str) и TESToctToInteger

23. Написать функции bool isBinary( str) и TESTisBinary

24. Написать функции bool binaryToInteger( str) и TESTbinaryToInteger

Большие задачи
--------------

Конвертер из Gaddis в Flowgorithm

Парсер строки "калькулятор со скобками".

Старые задачи (2012)
--------------------

Арифметика
..........

0. A + B

Cложить два целых числа А и В.

Ввести оба числа в одном поле ввода. Вывести сумму чисел А и В, показав процесс сложения в столбик.
Пример
  7801 85859

    11 1
     7801 
  +
    85859
    -----
    93660

1. Возвести в квадрат целое число.

  - вывести на экран приглашение: ?>
  - проверить что введено положительное целое в десятичной системе. В случае ошибки повторить ввод числа.

Пример

  125 ** 2 = 15625
  
  125 \ 10 = 12
  12 * 13 = 156
  "156" + "25" = "15625"

2. Обработка изображений

Формат файлов PBM был придуман Джефом Посканзером (Jef Poskanzer) в восьмидесятые годы 20-го столетия для передачи черно белых рисунков в тексте e-mail сообщений.

  P1
  # This is an example bitmap of the letter "J"
  6 10
  0 0 0 0 1 0
  0 0 0 0 1 0
  0 0 0 0 1 0
  0 0 0 0 1 0
  0 0 0 0 1 0
  0 0 0 0 1 0
  1 0 0 0 1 0
  0 1 1 1 0 0
  0 0 0 0 0 0
  0 0 0 0 0 0

Создать файл с рисунком слона в формате PBM. C помощью пакета ImageMagick (есть в свободном доступе и в моей сборке portables) конвертировать в PNG (или любой другой формат изображений, показываемый без установки дополнительного soft'а)

  000000000000000000000000001111000000000000000
  000000000011111000000001111111111000000000000
  000000001111111111111111111111111111100000000
  000000111111111111111111111111111111110000000
  000001111111111111111111111111111111111000000
  000001111111111111111111111111111111111100000
  000011111111111111111111111111111111111100000
  000011111111111111111111111111111111111110000
  000111111111111111111111111111111111111110000
  000111111111111111111111111111111111111111000
  000111111111111111111111111111111111111111000
  000111111111111111111111111111111111111111100
  000111111111111111111111111111111111111111100
  000111111111111111111111111111111110011111111
  000111111111111111111111111111000000000111111
  000111111111111111111111111111000000000111110
  001111111111111111111111111111000000000011110
  001111111111111111111111111111000000000011110
  001111111111111111100011111111000000000001110
  001011111111101100000011111111100000000001110
  001011111111000000000011111111100000000001111
  001111111110000000110011111111100000000000111
  001111111100000000110011111111100000000000111
  011111111100000000000011111111110000000000111
  011111111100000000000011111111111000000000111
  001111111110000000000011111011111000000000011
  001111111110000000000011110011111100000000011
  011110011110000000000011110001111100000000011
  011110011111000000000011100000111100000000011
  111110011111100000000111100000111111000000011
  111110011111100000000111110000111111000000011
  000000011111100000001111110000000000000000000

Задачи по дигитальной технике

03. Написать функцию, требующую ввести число в 2-ной системе. Если введенная информация не соответствует запрашиваемой, потребовать повторить ввод.

04. Написать функцию, требующую ввести число в 8-ной системе. Если введенная информация не соответствует запрашиваемой, потребовать повторить ввод.

05. Написать функцию, требующую ввести число в 10-ной системе. Если введенная информация не соответствует запрашиваемой, потребовать повторить ввод.

06. Написать функцию, требующую ввести число в 16-ной системе. Если введенная информация не соответствует запрашиваемой, потребовать повторить ввод. 

07. Написать программу, иллюстрирующую ручной перевод числа из 2-ной системы в 8-ную. Не ограничивать длину ввода менее чем 64-мя символами. Проверять ввод (см. задачи 0 - 3)

08. Написать программу, иллюстрирующую ручной перевод числа из 2-ной системы в 10-ную. Не ограничивать длину ввода менее чем 64-мя символами. Проверять ввод (см. задачи 0 - 3)

09. Написать программу, иллюстрирующую ручной перевод числа из 2-ной системы в 16-ную. Не ограничивать длину ввода менее чем 64-мя символами. Проверять ввод (см. задачи 0 - 3)

10. Написать программу, иллюстрирующую ручной перевод числа из 8-ной системы в 2-ную. Не ограничивать длину ввода менее чем 64-мя символами. Проверять ввод (см. задачи 0 - 3)
 
11. Написать программу, иллюстрирующую ручной перевод числа из 8-ной системы в 10-ную. Не ограничивать длину ввода менее чем 64-мя символами. Проверять ввод (см. задачи 0 - 3)

12. Написать программу, иллюстрирующую ручной перевод числа из 8-ной системы в 16-ную. Не ограничивать длину ввода менее чем 64-мя символами. Проверять ввод (см. задачи 0 - 3)

13. Написать программу, иллюстрирующую ручной перевод числа из 10-ной системы в 2-ную. Не ограничивать длину ввода менее чем 64-мя символами. Проверять ввод (см. задачи 0 - 3)

14. Написать программу, иллюстрирующую ручной перевод числа из 10-ной системы в 8-ную. Не ограничивать длину ввода менее чем 64-мя символами. Проверять ввод (см. задачи 0 - 3)

15. Написать программу, иллюстрирующую ручной перевод числа из 10-ной системы в 16-ную. Не ограничивать длину ввода менее чем 64-мя символами. Проверять ввод (см. задачи 0 - 3)

16. Написать программу, иллюстрирующую ручной перевод числа из 16-ной системы в 2-ную. Не ограничивать длину ввода менее чем 64-мя символами. Проверять ввод (см. задачи 0 - 3)

17. Написать программу, иллюстрирующую ручной перевод числа из 16-ной системы в 8-ную. Не ограничивать длину ввода менее чем 64-мя символами. Проверять ввод (см. задачи 0 - 3)

18. Написать программу, иллюстрирующую ручной перевод числа из 16-ной системы в 10-ную. Не ограничивать длину ввода менее чем 64-мя символами. Проверять ввод (см. задачи 0 - 3)

19. Koнтролировать ввод булевой функции.

20. Выводить таблицу истинности введенной функции.

21. Выводить карту Карно введенной функции.

22. Выводить условное обозначение AND, OR, NOT, NAND, NOR, XOR, XNOR, D элементы начиная с заданной позиции. Запрашивать и проверять корректность ввода.

   +--+    +--+    +--+    +--+    +--+    +--+    +--+    +--+
  -| &|   -| 1|    |  |   -| &|   -| 1|   -| ^|   -| ^|   -| D|
   |  +-   |  +-  -|  o-   |  o-   |  o-   |  +-   |  o-   |  +-
  -|  |   -|  |    |  |   -|  |   -|  |   -|  |   -|  |   ->  |
   +--+    +--+    +--+    +--+    +--+    +--+    +--+    +--+

23. Написать программу выводящую доказательство закона отражения ( x = x ) таблицей истинности.

24. Написать программу выводящую доказательство закона отрицания отрицания ( x = !!x ) таблицей истинности.

25. Написать программу выводящую доказательство закона симметрии ( если x = у то у = x ) таблицей истинности.

26. Написать программу выводящую доказательство транзитивного закона ( если x = у и у = z то x = z ) таблицей истинности.

27. Написать программу выводящую доказательство правила пустого множества для коньюнкции ( x * 0 = 0 )

28. Написать программу выводящую доказательство правила пустого множества для дизьюнкции ( x + 0 = x )

29. Написать программу выводящую доказательство правила универсального множества для коньюнкции ( x * 1 = x )

30. Написать программу выводящую доказательство правила универсального множества для дизьюнкции ( x + 1 = 1 )

31. Написать программу выводящую доказательство правила дополнения для коньюнкции ( x * !x = 0 )

32. Написать программу выводящую доказательство правила дополнения для дизьюнкции ( x + !x = 1 )

33. Написать программу выводящую доказательство закона идемпотентности для четырех коньюнкций ( x * x * x * x = X )

34. Написать программу выводящую доказательство закона идемпотентности для четырех дизьюнкций ( x + x + x + x = X )

35. Написать программу выводящую доказательство коммутативного закона для коньюнкции ( x * y = y * x )

36. Написать программу выводящую доказательство коммутативного закона для дизьюнкции ( x * y = y * x )

37. Написать программу выводящую доказательство ассоциативного закона для коньюнкции ( x * y ) * z = x * ( y * z )

38. Написать программу выводящую доказательство ассоциативного закона для дизьюнкции ( x + y ) + z = x + ( y + z )

39. Написать программу выводящую доказательство дистрибутивного закона для коньюнкции x * ( y + z ) = x * y + x * z

40. Написать программу выводящую доказательство дистрибутивного закона для дизьюнкции x + ( y * z ) = ( x + y ) * ( x + z )

41. Написать программу выводящую доказательство формулы D'Morgan-a для 2-х переменных для дизьюнкции

    !( a + b ) = !a * !b

42. Написать программу выводящую доказательство формулы D'Morgan-a для 3-х переменных для дизьюнкции

    !( a + b + c ) = !a * !b * !c

43. Написать программу выводящую доказательство формулы D'Morgan-a для 4-х переменных для дизьюнкции

    !( a + b + c + d ) = !a * !b * !c * !d

44. Написать программу выводящую доказательство формулы D'Morgan-a для 2-х переменных для коньюнкции

    !( a * b ) = !a + !b

45. Написать программу выводящую доказательство формулы D'Morgan-a для 3-х переменных для коньюнкции

    !( a * b * c ) = !a + !b + !c

46. Написать программу выводящую доказательство формулы D'Morgan-a для 4-х переменных для коньюнкции

    !( a * b * c * d ) = !a + !b + !c + !d

Задачи по шифрованию
--------------------

47. Шифр Юлия Цезаря. Считается одним из самым примитивных видов шифрования. Набор символов cостоящий из заглавных букв английского алфавита (26) циклически сдвигается вправо на целое число (число является секретом, может быть как положительным так и отрицательным).

Зашифровать фразу "HELLOWORLD". Вывести на экран в столбик с левым выравниванием, шрифт моноширинный:

  исходный алфавит
  сдвинутый алфавит
  исходное сообщение
  зашифрованное сообщение
  число - ключ (сдвиг)
  
Пример

  ABCDEFGHIJKLMNOPQRSTUVWXYZ
  YZABCDEFGHIJKLMNOPQRSTUVWX
  
  ADVENTURE
  YBTCLRSPC
  
  +2
  
48. Вывод азбукой Морзе.
 
49. Ввод азбукой Морзе. 

Программа 1. Вывести на экран азбукой Морзе текст "HELLOWORLD" (либо другой). Скопировать полученный текст в буфер обмена (clipboard) и ввести его, как исходные данные в программу 2.
 
Программа  2. Вывести прочтенное сообщение прописными буквами.

  A   · –             N   – ·
  B   – · · ·         O   – – –
  C   – · – ·         P   · – – ·
  D   – · ·           Q   – – · –
  E   ·               R   · – ·
  F   · · – ·         S   · · ·
  G   – – ·           T   –
  H   · · · ·         U   · · –
  I   · ·             V   · · · –
  J   · – – –         W   · – –
  K   – · –           X   – · · –
  L   · – · ·         Y   – · – –
  M   – –             Z   – – · ·

50. Ссылки на задачники по программированию
    ---------------------------------------

  http://nelus.tpt.edu.ee/2012/20121205083000(tasksf).txt
  http://ru.wikibooks.org/wiki/Ruby/Практикум
  http://ru.wikibooks.org/wiki/Ruby/Задачник
  http://ptaskbook.com/ru/tasks/index.php
  http://codeforces.ru/problemset
  
Решение задачи должно содержать

  - описание задачи (условие)
  - исходный код решения
  - ответ, выдаваемый предложенным кодом.

На защите (при получении оценки) необходимо понимать написанное.
