K1F00

          ..But it is good old language C that wins the award this time
          with an yearly increase of 2.4%. Runners up are C# (+2.1%),
          Python (+1.4%) and Swift (+0.6%). Why is the programming
          language C still hot? The major drivers behind this trend are
          the Internet of Things (IoT) and the vast amount of small
          intelligent devices that are released nowadays. C excels when
          it is applied to small devices that are performance-critical.
          It is easy to learn and there is a C compiler available for
          every processor. Congratulations to C!

          January 2020, https://www.tiobe.com/tiobe-index/

# ВМЕСТО ПРЕДИСЛОВИЯ

  o  Словарный запас Шекспира 47000 разных слов. (посчитать*0)
 
  o  В английском языке 16 времен*1. 

  o  В эстонском языке 14 падежей*2.

  o  Множественное число: 
     один/соло, пара/дуэт, трио, квартет, квинтет, секстет..

Есть добрые дяди которые взяли на себя труд максимально упростить язык, сделав его легким в изучении, сохранив достаточность и пригодность. Это:

  o Charles Kay Ogden (Basic English, 800 Words)
  o Devin Cook (Flowgorithm)
  o Stephen C. Johnson (lint, ну, это уже не слишком просто..)
  o Ben Fry и Casey Reas*3*5 (Processing)
  o Massimo Banzi*4, Hernando Barragán*5 (Arduino/Wiring).
  
И многие другие..

Простое и понятное начало -- это Flowgorithm. Поскольку планируется со временем совершить запрыг в мир Arduino, возьму Flowgorithm как пример простоты. Даже еще меньше.. кирпич DO-WHILE в Фловгоритме работает несколько странно, а кирпич INPUT должен уметь вводить только строки. (следует дописать explode, валидаторы isBool, isInteger, isReal, isToken и конвертер toBool, (конвертеры toInteger, toReal, toString уже имеются).

И еще. В наши дни роботы все еще плохо понимают рисунки, поэтому скетчи для Flowgorithm хочется писать а не рисовать. Воспользуемся тем, что C++ можно обучать (дописывая header'ы и библиотеки), упрощая первый прыжок в мир программирования.

ЗАМЕЧАНИЕ: Проблема не в том, что язык С++ слишком сложный для изучения, можно писать очень просто: "моя твоя не понимать.."

Проблема в том, что как C++ не упрощай, он все равно кушает слишком много памяти, поэтому писать код для древних Arduino (старее, чем Arduino Portenta ) нужно с оглядкой на объем доступной памяти. Понять смысл этого предложения, находясь на уровне "very beginner", достаточно сложно, поэтому самые первые шаги сделаем на Windows, Linux, MacOS компьютере, Android iOS планшете либо телефоне.


# КОММЕНТАРИИ

Пример комментария:

  // Microsoft рекомендовала четырехстам миллионам пользователей 
  // купить новый ПК вместо обновления Windows.
  //
  // https://3dnews.ru/1001324

 
# БЛОКИ

C, Java, PHP: От "{" до "}". Блок ограничивает видимость данных в адресном пространстве. Kcтати, иногда блоку можно дать свое имя. Получится struct, if, while, do, for, функция, класс. 


# ПЕРЕМЕННЫЕ, ТИПЫ ДАННЫХ

Типы данных нужны для ручной оптимизации скорости работы программы. Если скорость не очень важна, то все читается, записывается и передается в понятном человеку виде -- в виде строк из символов. Таков язык BASH (и все сетевые протоколы UNIX). 

  bool     true false
  
  int      целые числа в диапазоне 
           от -2147483648 = -2^31 до 2147483647 = 2^31 - 1
           
  double   От очень больших до очень маленьких чисел с дробной частью.
           Вычисления приблизительные. Формат чисел scientific
           (например, 8.50705917302346E+137) признается кирпичем
           OUTPUT, но не INPUT.

  string   Символьные строки (вроде "Привет, мир!")

Чтобы при хранении данных уменьшить хаос, используются массивы, кортежи, списки, хеши (т.н. ассоциативные массивы), структуры и классы. Данные видны не дальше блока в котором они объявлены. Короче -- целая наука.

Массив -- это как улица. Нужный элемент находят по названию улицы и индексу (номеру дома). Индекс начинается с нуля.

  дом номер 0 по Вишневой улице: Cherry[0] 


# ОПЕРАЦИИ

При совершении операций, придется следить за типами учавствующих в операции данных -- операндов. Также может пригодиться понимание того, что такое lazy evaluation (true || .. дальше считать нет смысла, результат уже и так известен ). В Flowgorithm допустимы следующие операции:

Арифметика:

  сложение   +
  вычитание  -
  умножение  *
  деление    /
  остаток*   %
  степень    ^
  
  *) остаток от деления нацело.

Логика:
  
  Отрицание  !
  И          &&
  ИЛИ        ||
  
Сравнения

  равно             ==
  не равно          !=
  меньше            <
  меньше или равно  <=
  больше или равно  >=
  больше            >

Строки

  сложение строк    &
  
Порядок выполнения задается скобками либо таблицей приоритетов:

  +---------+----------------------+
  | уровень | операторы            |
  +---------+----------------------+
  | 8       | -n  !                |
  | 7       | ^                    |
  | 6       | *  /  %              |
  | 5       | +  -                 |
  | 4       | &                    |
  | 3       | >  >=  <  <=  ==  != |
  | 2       | &&                   |
  | 1       | ||                   |
  +---------+----------------------+

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

 
# КИРПИЧИ

    0. OUTPUT     печатать
    1. INPUT      ввести
    2. DECLARE    int, real, string
    3. ASSIGN     =
    4. IF         Если
    5. CALL       Функции
    6. WHILE      Покуда
    7. FOR        Для


# КИРПИЧ OUTPUT: (HELLO, WORLD)

Нужно уметь: 

  #include "helper.h"

  int main() {
    Output( "Hello, World");
    return 0;
  }
  
Нужно иметь: 

  helper.h из приложения 1.


# КИРПИЧ INPUT (ВВОД ДАННЫХ):

Кирпич INPUT должен уметь вводить только строки. (следует дописать explode, валидаторы isBool, isInteger, isReal, isToken и конвертер toBool, (конвертеры toInteger, toReal, toString уже имеются).


# КИРПИЧ CALL (ФУНКЦИИ)

                Функцию, которая ничего не возвращает мы будем 
                называть функцией, которая ничего не возвращает.
                Иногда ее называют процедурой, но мы будем ее
                называть функцией, которая ничего не возвращает.

                мем "Назойливый"

Если массивы, кортежи, списки, хеши и структуры помогают нам организовать данные, то код делают более коротким и понятным с помощью функций и классов. Электрическая аналогия -- вход, выход, микросхема. Основные понятия от простого к сложному -- аргумент и передача функции его адреса либо значения, возвращаемое значение, область видимости и время жизни или почему надо быть внимательным при передаче адреса переменной в качестве возвращаемого значения (static, где объявлена,..), сторонние эффекты (side effects или грязные функции), лямбда-функции и замыкания (closures), метод, property, класс, инкапсуляция, наследование и полиморфизм, области видимости private, protected, public, published..

Главное, не стоит забывать, что программирование это всего лишь средство достижения цели (tool) а не самоцель.


# КИРПИЧ DECLARE

Kласть данные на хранение и извлекать их по их адресу в RAM -- не слишком удобно. Объявление переменной дает адресу хранения имя, задает объем, область видимости, время жизни и способы использования: только чтение, чтение-запись.


# КИРПИЧИ ASSIGN, IF, WHILE, FOR

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

# ГЛАВНОЕ, ЧТО НАДО ЗНАТЬ О ПРОГРАММЕ FLOWGORITHM:

  0. как ввести кучу данных: copy-paste из текстового файла в Unix формате (новая строка -- 0x0a)
  
  1. несколько переменных одного и того же типа можно объявить одним кирпичем DECLARE, записав их через запятую.
  
  2. Monospace -- кнопочка "BUBBLES" на toolbar'е окна console типа.
  
  3. "SOURCE CODE VIEWER.." -- самая правая кнопочка на toolbar'е главного окна Flowgorithm.
  
  4. Выбрать язык общения ( En ) -- кнопочка в правом нижнем углу (status bar).
  
  5. Параметры (аргументы) функций типа Boolean, Integer, Real, String передаются по значению (копируется содержимое ячейки-дома*). Параметры функций типа Boolean Array, Integer Array, Real Array, String Array передаются по ссылке (копируется адрес дома*).
  
*) Дом, который построил Джек.

     https://ru.wikipedia.org/wiki/Дом,_который_построил_Джек


# КАК ИЗУЧАТЬ C++ C ПОМОЩЬЮ ФЛОВГОРИТМА?

1. Осваиваем Flowgorithm

2. Делаем переводы с C на Flowgorithm вручную и с Flowgorithm на C с используя средства автоперевода (п.3)

3. Оставаясь в C++ выходим за рамки возможностей Flowgorithm

4. Выходим за рамки возможностей C++, изучаем новый язык, скажем из списка:

  TPT+me: C, Wiring/C++, C#, PHP, Python, Powershell, Processing/Java, Bash, Ruby, Javascript, SQL, HTML, CSS, XML, Assembler,

  AAV+EAV: LD, FBD, ST,

  cool: Go, Swift, Perl, Lisp, F#, Julia, Haskel, Ada.

  obsolete+me: Pascal/Delphi, Basic, Fortran.


# ЗАДАЧИ

1. Написать ввод целого числа с валидацией

2. Написать ввод действительного числа с валидацией

3. Трехкнопочная клавиатура:

      0    -- ноль при отпускании кнопки
      
      1    -- единица при отпускании кнопки
      
      RET  -- один раз после ноля или единицы --
                показать набранный символ
              два нажатия подряд --
                показать набранную строку
              три нажатия подряд --
                ввести набранную строку
              
      0 + RET RET при нажатой кнопке "0" -- 
                backspace
                
      1 + RET RET при нажатой кнопке "1" --
                clear


# ССЫЛКИ

  0. The Complete Works of William Shakespeare

       http://www.gutenberg.org/files/100/100-0.txt

  1. http://englishfox.ru/verb-tanses.html)

  2. http://slovar.vrukah.info/ru/эстонский-язык
       /падежи-эстонского-языка/10-падежи-эстонского-языка

  3. https://processing.org/people/
       
  4. https://arduino-tech.ru/sample-page/

  5. https://arduinohistory.github.io/

  6. https://www.brainkart.com/article/C---Function-overloading_36679/


# ПРИЛОЖЕНИЕ 1. helper.h

  #include <iostream>

  using namespace std;

  string Input( void) {
    string s;
    cin.seekg(0,ios::end);
    cin.clear();
    getline(cin, s);
    return s;
  } 

  void Output(bool b) {
    cout << (b ? "true" : "false") << endl; 
  } 

  void Output(int i) { 
    cout << i << endl; 
  } 

  void Output(double  f) { 
    cout << f << endl; 
  } 

  void Output(string c) { 
    cout << c << endl; 
  } 
    
  void containerOutput() {
    Output( true);
    Output( 123);
    Output( 2.718281828);
    Output( "Hello, World");
  }

  void containerInput() {
    string s = Input(); Output( s);
  }

  // int main() { containerOutput() }

  int main() { containerInput(); }

----------------------

Приложение 2. UNO_LCD_SHIELD

#include <LiquidCrystal.h>

// select the pins used on the LCD panel
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);           
 
// define some values used by the panel and buttons
int lcd_key     = 0;
int adc_key_in  = 0;
 
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5
 
int read_LCD_buttons() {
    // read the value from the sensor
    adc_key_in = analogRead(0);
 
    // my buttons when read are centered at these valies: 
    // 0, 144, 329, 504, 741
    // we add approx 50 to those values and check to see 
    // if we are close
    // We make this the 1st option for speed reasons 
    // since it will be the most likely result
 
    if (adc_key_in > 1000) return btnNONE;
 
    // For V1.1 us this threshold
    if (adc_key_in < 50)   return btnRIGHT; 
    if (adc_key_in < 250)  return btnUP;
    if (adc_key_in < 450)  return btnDOWN;
    if (adc_key_in < 650)  return btnLEFT;
    if (adc_key_in < 850)  return btnSELECT; 
 
    // For V1.0 comment the other threshold and use the one below:
    /*
      if (adc_key_in < 50)   return btnRIGHT; 
      if (adc_key_in < 195)  return btnUP;
      if (adc_key_in < 380)  return btnDOWN;
      if (adc_key_in < 555)  return btnLEFT;
      if (adc_key_in < 790)  return btnSELECT;  
    */
 
    // when all others fail, return this.
    return btnNONE;
}
 
void setup() {
   // start the library
   lcd.begin(16, 2);
   // set the LCD cursor position
   lcd.setCursor(0,0);
   // print a simple message on the LCD
   lcd.print("Push the buttons");
}
  
void loop() {
   // move cursor to second line "1" and 9 spaces over
   lcd.setCursor(9,1);
   // display seconds elapsed since power-up
   lcd.print(millis()/1000);
   // move to the begining of the second line
   lcd.setCursor(0,1);
   // read the buttons
   lcd_key = read_LCD_buttons();
   
   // depending on which button was pushed, we perform an action
   switch (lcd_key) {
       case btnRIGHT: {             
            lcd.print("RIGHT ");
            break;
       }
       case btnLEFT: {
             lcd.print("LEFT   ");
             break;
       }   
       case btnUP: {
             lcd.print("UP    ");
             break;
       }
       case btnDOWN: {
             lcd.print("DOWN  ");
             break;
       }
       case btnSELECT: {
             lcd.print("SELECT");
             break;
       }
       case btnNONE: {
             lcd.print("NONE  ");
             break;
       }
   }
}

-------------------

# ЧЕРНОВИК

C++ Rules for function overloading

1) The overloaded function must differ in the number of its arguments or data types

2) The return type of overloaded functions are not considered for overloading same data type

3) The default arguments of overloaded functions are not considered as part of the parameter list in function overloading.


Где лежит компилятор:

  C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.24.28314\bin\Hostx64\x64
  C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.24.28314\bin\Hostx64\x86


Кое-что нарыл в архивах:

$ find . -name '*.simu'
./afterMath-iA/src/e-begin/SI-and.simu
./afterMath-iA/src/e-begin/SI-or.simu
./afterMath-iA/src/e-begin/SI-relay.simu
./afterMath-iA/src/SimulIDE/D.simu
./afterMath-iA/src/SimulIDE/SR.simu
./G-ALL/src/SimulIDE/Succeed/427-04.simu
./G-ALL/src/SimulIDE/Succeed/displays .simu
./G-ALL/src/SimulIDE/Succeed/meter01.simu
./HF/src/SimulIDE-015RC1/CD16x4.simu
./HF/src/SimulIDE-015RC1/Lock.simu
./HF/src/SimulIDE-015RC1/radio16.simu
./HF/src/SimulIDE-015RC1/radio2.simu
./HF/src/SimulIDE-015RC1/radio4.simu
./HF/src/SimulIDE-015RC1/radio8.simu
./HF/src/SimulIDE-015RC1/veks.simu
./HS/src/PyLi-H4I/PyLi/tronMatrix/tronMatrix.simu
./HS/src/PyLi-H4I/PyLi/tronMatrix00/tronMatrix00.simu
./HS/src/PyLi-H4I/PyLi/tronMatrix01/tronMatrix01.simu
./HS/src/PyLi-H4I/PyLi/tronMatrix02/tronMatrix02.simu
./HS/src/PyLi-H4I/PyLi/tronPCINT/tronPCINT.simu
./HS/src/PyLi-H4I/PyLi/tronPCINT00/tronPCINT00.simu
./HS/src/PyLi-H4I/PyLi/tronSerial/tronSerial.simu
./HS/src/PyLi-H4I/PyLi/tronSerialEcho/tronSerialEcho.simu
./HS/src/PyLi-timeless/elements.simu
./HS/src/PyLi-timeless/tronMatrix/tronMatrix.simu
./HS/src/PyLi-timeless/tronMatrix00/tronMatrix00.simu
./HS/src/PyLi-timeless/tronMatrix01/tronMatrix01.simu
./HS/src/PyLi-timeless/tronMatrix02/tronMatrix02.simu
./HS/src/PyLi-timeless/tronPCINT/tronPCINT.simu
./HS/src/PyLi-timeless/tronPCINT00/tronPCINT00.simu
./HS/src/PyLi-timeless/tronSerial/tronSerial.simu
./HS/src/PyLi-timeless/tronSerialEcho/tronSerialEcho.simu
./HS/src/SimulIDE/Blin.simu
./HS/src/SimulIDE/ideMatrix.simu
./HS/src/SimulIDE/ideMatrix0.simu
./HS/src/SimulIDE/ideMatrix1.simu
./HS/src/SimulIDE/makett88.simu
./HS/src/SimulIDE/TrafficLights.simu
./iF/e-begin/SI-and.simu
./iF/e-begin/SI-or.simu
./iF/e-begin/SI-relay.simu
./iF/src/Arduino-Mega/MegaBlink/megaBlink.simu
./iF/src/EA-17-iA8/L/L.simu
./iF/src/SimulIDE/NOT_AND_OR.simu
./iF/src/SimulIDE/RS-LD.simu
./iF/src/SimulIDE/RS.simu
./iF/src/SimulIDE/stimulus-4.simu
./iF/src/SimulIDE/stimulus-8.simu
./iS/src/Arduino-LCD/8544/PCD8544.simu
./iS/src/Arduino-LCD/GLCD/KS0108AVR.simu
./iS/src/Arduino-LCD/HD44780/HD44780.simu
./iS/src/Arduino-LCD/KS0108/KS0108.simu
./iS/src/Arduino-LCD/KS0108/KS0108AVR.simu
./iS/src/Arduino-LCD/LCD-METER/LCD-METER.simu
./iS/src/Arduino-LCD/LCD-SHIELD/LCD-SHIELD.simu
./JFr/src/Arduino-LCD/8544/PCD8544.simu
./JFr/src/Arduino-LCD/GLCD/KS0108AVR.simu
./JFr/src/Arduino-LCD/HD44780/HD44780.simu
./JFr/src/Arduino-LCD/KS0108/KS0108.simu
./JFr/src/Arduino-LCD/KS0108/KS0108AVR.simu
./JFr/src/Arduino-LCD/LCD-METER/LCD-METER.simu
./JFr/src/Arduino-LCD/LCD-SHIELD/LCD-SHIELD.simu
./JFr/src/nelus-J65/tmp/kee-1.simu
./JFr/src/nelus-J65/tmp/kee-2.simu
./JFr/src/traff/circ-1.simu
./JSo/src/nelus-J9S/tmp/kee-1.simu
./JSo/src/nelus-J9S/tmp/kee-2.simu
./JSo/src/nelus-J9T/tmp/kee-1.simu
./JSo/src/nelus-J9T/tmp/kee-2.simu
./KWi/src/HelloAVR/Hello.simu
./KWi/src/nelus-K0D/tmp/kee-1.simu
./KWi/src/nelus-K0D/tmp/kee-2.simu
./KWi/src/SimulIDE/0-blink/0-blink.simu

$ find . -name '*.simu' | wc -l
73
