Проект №5. Преобразование (трансляция) программ КОНЦЕПТ в JavaScript

Если вас заинтересовал этот проект - пишите на conceptscript@yandex.ru и вам будет выслан демонстрационный пример и актуальная дополнительная информация.

Современное развитие информационных технологий не возможно без поддержки стандартов (в том числе стандартов "де-факто").
HTML, CSS, JavaScript, SQL, HTTP, XML, SVG лежат в основе множества программ и надолго вошли в нашу жизнь.
КОНЦЕПТ не является изолированным или статичным решением и поддерживает указанные технологии и стандарты, что позволяет использовать КОНЦЕПТ в качестве инструмента (в стеке) передовых ИТ технологий.
Данный проект посвящен тому, как программы, написанные на КОНЦЕПТ, могут буть преобразованы к JavaScript.
Это фактически означает, что написанная вами программа на КОНЦЕПТ будет выполняться на любом компьютере (устройстве), где есть любой браузер Интернет, а не только на компьютер с операционной системой Windows.
Ниже представлено несколько примеров работы разрабатываемого транслятора КОНЦЕПТ->JavaScript.

Пример 1. Генерация примеров из таблицы умножения

Посмотреть как это работает

Листинг КОНЦЕПТ (исходный) Листинг JavaScript, полученный автоматически
* Генерация примеров из таблицы умножения.
* Программа КОНЦЕПТ, 26.01.2016, www.gendoc.ru

количество_примеров = 20

>Примеры из таблицы умножения

список сгенерить список_чисел 1 10
номер = 1
пока [номер] <= [количество_примеров]
  список выбратьСлучайный множитель1 [список_чисел]
  список выбратьСлучайный множитель2 [список_чисел]
  вычислить * произведение [множитель1] [множитель2]

  >[номер]) [множитель1] x [множитель2] = [произведение]

  увеличить номер
цикл

*показать сообщение 'Программа завершена.'
/* Генерация примеров из таблицы умножения.*/
/* Программа КОНЦЕПТ, 26.01.2016, www.gendoc.ru*/

kolichestvo_primerov = 20;

document.write("Примеры из таблицы умножения"+"
"); spisok_chisel=ConceptListGen( 1, 10,1); nomer = 1; while ( nomer <= kolichestvo_primerov) { mnozhitel1=ConceptListRandom( spisok_chisel); mnozhitel2=ConceptListRandom( spisok_chisel); proizvedenie= mnozhitel1 *mnozhitel2; document.write(nomer+") "+mnozhitel1+" x "+mnozhitel2+" = "+proizvedenie+"
"); nomer++; }; /*показать сообщение 'Программа завершена.'*/

Пример 2. Расчет индекса массы тела (насколько вес соответсвует росту)

Посмотреть как это работает

Листинг КОНЦЕПТ (исходный) Листинг JavaScript, полученный автоматически
* Расчет индекса массы тела (ИМТ).
* Программа КОНЦЕПТ, 15.07.2015, www.gendoc.ru
* Что такое индекс массы тела:
* https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D0%B4%D0%B5%D0%BA%D1%81_%D0%BC%D0%B0%D1%81%D1%81%D1%8B_%D1%82%D0%B5%D0%BB%D0%B0

>Программа расчета индекса массы тела
>====================================
>

ввести переменная ВЕС 'Укажите вес в килограммах' 98
ввести переменная РОСТ 'Укажите рост в сантиметрах' 185

РОСТ = [РОСТ] / 100
РОСТ_В_КВАДРАТЕ = [РОСТ] * [РОСТ]
ИМТ = [ВЕС] / [РОСТ_В_КВАДРАТЕ]
*вычислить округлить ИМТ $ -1

ДИАГНОЗ = 'не определен'
если [ИМТ] < 16
  ДИАГНОЗ = 'Дефицит массы'
конец
если [ИМТ] >= 16
  если [ИМТ] < 18.5
    ДИАГНОЗ = 'Недостаточная масса тела'
  конец
конец
если [ИМТ] >= 18.5
  если [ИМТ] < 25
    ДИАГНОЗ = 'Норма'
  конец
конец
если [ИМТ] >= 25
  если [ИМТ] < 30
    ДИАГНОЗ = 'Избыточная масса тела'
  конец
конец
если [ИМТ] >= 30
  если [ИМТ] < 35
    ДИАГНОЗ = 'Ожирение первой степени'
  конец
конец
если [ИМТ] >= 35
  если [ИМТ] < 40
    ДИАГНОЗ = 'Ожирение второй степени'
  конец
конец
если [ИМТ] >= 40
  ДИАГНОЗ = 'Ожирение третьей степени'
конец

>Вес: [ВЕС] кг. Рост: [РОСТ] метра.
>
>Индекс массы тела = [ИМТ]
>Диагноз: [ДИАГНОЗ].
/* Расчет индекса массы тела (ИМТ).*/
/* Программа КОНЦЕПТ, 15.07.2015, www.gendoc.ru*/
/* Что такое индекс массы тела: https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D0%B4%D0%B5%D0%BA%D1%81_%D0%BC%D0%B0%D1%81%D1%81%D1%8B_%D1%82%D0%B5%D0%BB%D0%B0*/

document.write("Программа расчета индекса массы тела"+"
"); document.write("===================================="+"
"); document.write("
"); VES=prompt( 'Укажите вес в килограммах' ,98); ROST=prompt( 'Укажите рост в сантиметрах' ,185); ROST = ROST / 100; ROST_V_KVADRATE = ROST * ROST; IMT = VES / ROST_V_KVADRATE; /*вычислить округлить ИМТ $ -1*/ DIAGNOZ = 'не определен'; if ( IMT < 16) { DIAGNOZ = 'Дефицит массы'; }; if ( IMT >= 16) { if ( IMT < 18.5) { DIAGNOZ = 'Недостаточная масса тела'; }; }; if ( IMT >= 18.5) { if ( IMT < 25) { DIAGNOZ = 'Норма'; }; }; if ( IMT >= 25) { if ( IMT < 30) { DIAGNOZ = 'Избыточная масса тела'; }; }; if ( IMT >= 30) { if ( IMT < 35) { DIAGNOZ = 'Ожирение первой степени'; }; }; if ( IMT >= 35) { if ( IMT < 40) { DIAGNOZ = 'Ожирение второй степени'; }; }; if ( IMT >= 40) { DIAGNOZ = 'Ожирение третьей степени'; }; document.write("Вес: "+VES+" кг. Рост: "+ROST+" метра."+"
"); document.write("
"); document.write("Индекс массы тела = "+IMT+"
"); document.write("Диагноз: "+DIAGNOZ+"."+"
");

Пример 3. Рисование в стиле ЛОГО

Посмотреть как это работает

Листинг КОНЦЕПТ (исходный) Листинг JavaScript, полученный автоматически
* Реализация некоторых команд ЛОГО. Версия для исполнения в JavaScript.
* Программа КОНЦЕПТ, 28.01.2016, www.gendoc.ru 
* За основу взято: http://fio.wl.dvgu.ru/images/Vipusk22/Lopatnuk/Logo/Lessons/raznoe.htm

*********** Начало программы **********

Подготовка_к_рисованию_в_стиле_ЛОГО

Квадрат

рисовать присвоить 200 0
Три_квадрата

рисовать присвоить 00 200
Салфетка

рисовать присвоить 200 200
Цветок  

*********** Примеры фигур с использованием "черепашьих" команд ЛОГО **********

функция Квадрат
  вперед 20
  вправо 90  
  вперед 20
  вправо 90
  вперед 20
  вправо 90
  вперед 20
  вправо 90
возврат

функция Три_квадрата
  для 1;2;3
    для 1;2;3;4
      вперед 20
      влево 90
    следующий
    вправо 90
    не_рисовать
    вперед 30
    влево 90
    снова_рисовать
  следующий
возврат

функция Салфетка
  для 1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30;31;32;33;34;35;36
    для 1;2;3;4
      вперед 50
      вправо 90
    следующий
    вправо 10
  следующий
возврат

функция Цветок
  для 1;2;3;4;5;6;7;8
    влево 45
    вперед 20
    вправо 45
    вперед 50
    вправо 45
    вперед 20
    вправо 90
    вперед 20
    вправо 45
    вперед 50
    вправо 45
    вперед 20
  следующий
возврат

***************************************************
*** РЕАЛИЗАЦИЯ МЕХАНИЗМА РИСОВАНИЯ В СТИЛЕ ЛОГО ***
***************************************************

*********** Инициализация внутренних переменных ЛОГО ***********

функция Подготовка_к_рисованию_в_стиле_ЛОГО
  присвоить _УГОЛ_ 0                        // Угол направления черепашки в градусах
  присвоить _УГОЛ_РАДИАНЫ_ 0                // Угол направления черепашки в радианах
  присвоить _ЦВЕТ_ 10                       // Цвет следа черепашки
  присвоить _Х_ 100 _У_ 100                 // Текущие координаты черепашки
  присвоить _СМЕЩЕНИЕ_Х_ 20 _СМЕЩЕНИЕ_У_ 200 // Смещение осей координат
  присвоить _РИСОВАНИЕ_ 1                   // Режим рисования включен
  присвоить _ПИ_ 3.141592653589             // Число "Пи"
возврат

*********** Вспомогательная функция ***********

функция рисовать_линию х1 у1 х2 у2
  увеличить х1 [_СМЕЩЕНИЕ_Х_]
  увеличить х2 [_СМЕЩЕНИЕ_Х_]
  вычислить - у1 [_СМЕЩЕНИЕ_У_] [у1]
  вычислить - у2 [_СМЕЩЕНИЕ_У_] [у2]
  рисовать линия [х1] [у1] [х2] [у2]
возврат  

*********** Реализаця "черепашьих" команд ЛОГО ***********

функция вперед число
  вычислить косинус врем [_УГОЛ_РАДИАНЫ_]
  вычислить * врем [число] [врем]
  вычислить + _Х2_ [_Х_] [врем]

  вычислить синус врем [_УГОЛ_РАДИАНЫ_]
  вычислить * врем [число] [врем]
  вычислить + _У2_ [_У_] [врем]

*  >******
*  >_УГОЛ_=[_УГОЛ_] _УГОЛ_РАДИАНЫ_=[_УГОЛ_РАДИАНЫ_]
*  >_Х_=[_Х2_] _У_=[_У2_]

  если [_РИСОВАНИЕ_]
    рисовать_линию [_Х_] [_У_] [_Х2_] [_У2_]
  конец  
  присвоить _Х_ [_Х2_] _У_ [_У2_]
возврат

функция назад число
  вычислить косинус врем [_УГОЛ_РАДИАНЫ_]
  вычислить * врем [число] [врем]
  вычислить - _Х2_ [_Х_] [врем]

  вычислить синус врем [_УГОЛ_РАДИАНЫ_]
  вычислить * врем [число] [врем]
  вычислить - _У2_ [_У_] [врем]

  если [_РИСОВАНИЕ_]
    рисовать_линию [_Х_] [_У_] [_Х2_] [_У2_]
  конец
  присвоить _Х_ [_Х2_] _У_ [_У2_]
возврат

функция влево число
  увеличить _УГОЛ_ [число]
  вычислить остаток _УГОЛ_ [_УГОЛ_] 360
  вычислить / врем [_УГОЛ_] 180  
  вычислить * _УГОЛ_РАДИАНЫ_ [врем] [_ПИ_]  
возврат

функция вправо число
  вычислить - _УГОЛ_ [_УГОЛ_] [число]
  вычислить остаток _УГОЛ_ [_УГОЛ_] 360
  вычислить / врем [_УГОЛ_] 180  
  вычислить * _УГОЛ_РАДИАНЫ_ [врем] [_ПИ_]  
возврат

функция снова_рисовать
  присвоить _РИСОВАНИЕ_ 1
возврат

функция не_рисовать
  присвоить _РИСОВАНИЕ_ 0
возврат
/* Реализация некоторых команд ЛОГО. Версия для исполнения в JavaScript.*/
/* Программа КОНЦЕПТ, 28.01.2016, www.gendoc.ru */
/* За основу взято: http://fio.wl.dvgu.ru/images/Vipusk22/Lopatnuk/Logo/Lessons/raznoe.htm*/

/*********** Начало программы ***********/

Podgotovka_k_risovaniju_v_stile_LOGO();

Kvadrat();

ConceptDrawSet( 200 ,0);
Tri_kvadrata();

ConceptDrawSet( 00 ,200);
Salfetka();

ConceptDrawSet( 200 ,200);
Cvetok(  );

/*********** Примеры фигур с использованием "черепашьих" команд ЛОГО ***********/

function  Kvadrat() {
  vpered( 20);
  vpravo( 90  );
  vpered( 20);
  vpravo( 90);
  vpered( 20);
  vpravo( 90);
  vpered( 20);
  vpravo( 90);
};

function  Tri_kvadrata() {
  for  (var ConceptLoopObj1=1;ConceptLoopObj1<=3;ConceptLoopObj1++) {
    for  (var ConceptLoopObj2=1;ConceptLoopObj2<=4;ConceptLoopObj2++) {
      vpered( 20);
      vlevo( 90);
    };
    vpravo( 90);
    ne_risovat();
    vpered( 30);
    vlevo( 90);
    snova_risovat();
  };
};

function  Salfetka() {
  for  (var ConceptLoopObj1=1;ConceptLoopObj1<=36;ConceptLoopObj1++) {
    for  (var ConceptLoopObj2=1;ConceptLoopObj2<=4;ConceptLoopObj2++) {
      vpered( 50);
      vpravo( 90);
    };
    vpravo( 10);
  };
};

function  Cvetok() {
  for  (var ConceptLoopObj1=1;ConceptLoopObj1<=8;ConceptLoopObj1++) {
    vlevo( 45);
    vpered( 20);
    vpravo( 45);
    vpered( 50);
    vpravo( 45);
    vpered( 20);
    vpravo( 90);
    vpered( 20);
    vpravo( 45);
    vpered( 50);
    vpravo( 45);
    vpered( 20);
  };
};

/****************************************************/
/*** РЕАЛИЗАЦИЯ МЕХАНИЗМА РИСОВАНИЯ В СТИЛЕ ЛОГО ****/
/****************************************************/

/*********** Инициализация внутренних переменных ЛОГО ************/

function  Podgotovka_k_risovaniju_v_stile_LOGO() {
   _UGOL_= 0;                        /* Угол направления черепашки в градусах*/
   _UGOL_RADIANY_= 0;                /* Угол направления черепашки в радианах*/
   _CVET_= 10;                       /* Цвет следа черепашки*/
   _H_= 100; _U_= 100;                 /* Текущие координаты черепашки*/
   _SMESHCHENIE_H_= 20; _SMESHCHENIE_U_= 200; /* Смещение осей координат*/
   _RISOVANIE_= 1;                   /* Режим рисования включен*/
   _PI_= 3.141592653589;             /* Число "Пи"*/
};

/*********** Вспомогательная функция ************/

function  risovat_liniju( h1 ,u1 ,h2 ,u2) {
   h1 +=_SMESHCHENIE_H_;
   h2 +=_SMESHCHENIE_H_;
   u1= _SMESHCHENIE_U_ -u1;
   u2= _SMESHCHENIE_U_ -u2;
  ConceptDrawLine( h1 ,u1 ,h2 ,u2);
};  

/*********** Реализаця "черепашьих" команд ЛОГО ************/

function  vpered( chislo) {
   vrem=Math.cos( _UGOL_RADIANY_);
   vrem= chislo *vrem;
   _H2_= _H_ +vrem;

   vrem=Math.sin( _UGOL_RADIANY_);
   vrem= chislo *vrem;
   _U2_= _U_ +vrem;

/*  >*******/
/*  >_УГОЛ_=[_УГОЛ_] _УГОЛ_РАДИАНЫ_=[_УГОЛ_РАДИАНЫ_]*/
/*  >_Х_=[_Х2_] _У_=[_У2_]*/

  if ( _RISOVANIE_) {
    risovat_liniju( _H_ ,_U_ ,_H2_ ,_U2_);
  };  
   _H_= _H2_; _U_= _U2_;
};

function  nazad( chislo) {
   vrem=Math.cos( _UGOL_RADIANY_);
   vrem= chislo *vrem;
   _H2_= _H_ -vrem;

   vrem=Math.sin( _UGOL_RADIANY_);
   vrem= chislo *vrem;
   _U2_= _U_ -vrem;

  if ( _RISOVANIE_) {
    risovat_liniju( _H_ ,_U_ ,_H2_ ,_U2_);
  };
   _H_= _H2_; _U_= _U2_;
};

function  vlevo( chislo) {
   _UGOL_ +=chislo;
   _UGOL_= _UGOL_ %360;
   vrem= _UGOL_ /180 ;
   _UGOL_RADIANY_= vrem *_PI_ ;
};

function  vpravo( chislo) {
   _UGOL_= _UGOL_ -chislo;
   _UGOL_= _UGOL_ %360;
   vrem= _UGOL_ /180 ;
   _UGOL_RADIANY_= vrem *_PI_ ;
};

function  snova_risovat() {
   _RISOVANIE_= 1;
};

function  ne_risovat() {
   _RISOVANIE_= 0;
};