пятница, 16 декабря 2016 г.

Программа построения 4-х графиков

Задание:

1. Разработать подробный алгоритм построения 4х графиков на одном экране.
(4 функции для построения графиков придумать самостоятельно)

2. Алгоритм представить в содержательном виде, или в виде блок схемы, или в виде программного кода.

Решение:

Для разработки программы был выбран язык Delphi(Object Pascal).

Для разработки интерфейса использован кроссплатформенный фреймворк FMX (Fire-Monkey), что позволяет перекомпиляцией проекта получать рабочие бинарные файлы для следующих платформ: Windows32, Windows64, MacOS, Android, iOS.

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

Исходный код и скомпилированное приложение:

https://github.com/AnotherStudent/Draw4Graphics
https://raw.githubusercontent.com/AnotherStudent/Draw4Graphics/master/ProjectGraph.exe

Скриншоты работы:


Исходный текст:

Решение системы двух линейных уравнений методом Крамера (js)

Задание:

Ниже находится система двух линейных уравнений. Напишите программу, которая выводит в консоль значения x и y по заданным переменным a1,b1,c1,a2,b2,c2 с использованием формул Крамера (т.е. через определители)

Решение: 

Формулы для 2х неизвестных:

js код:


<p>
  <input type="text" id="a1" oninput="Change(event)" placeholder="0" pattern="^[+-]?[\d]+($|[\.][\d]+|([\.][\d]+[Ee]|[Ee])[+-]?\d+)$" size="8">X + 
  <input type="text" id="b1" oninput="Change(event)" placeholder="0" pattern="^[+-]?[\d]+($|[\.][\d]+|([\.][\d]+[Ee]|[Ee])[+-]?\d+)$" size="8">Y = 
  <input type="text" id="c1" oninput="Change(event)" placeholder="0" pattern="^[+-]?[\d]+($|[\.][\d]+|([\.][\d]+[Ee]|[Ee])[+-]?\d+)$" size="8">
  <div style="height: 4px;"></div>
  <input type="text" id="a2" oninput="Change(event)" placeholder="0" pattern="^[+-]?[\d]+($|[\.][\d]+|([\.][\d]+[Ee]|[Ee])[+-]?\d+)$" size="8">X + 
  <input type="text" id="b2" oninput="Change(event)" placeholder="0" pattern="^[+-]?[\d]+($|[\.][\d]+|([\.][\d]+[Ee]|[Ee])[+-]?\d+)$" size="8">Y = 
  <input type="text" id="c2" oninput="Change(event)" placeholder="0" pattern="^[+-]?[\d]+($|[\.][\d]+|([\.][\d]+[Ee]|[Ee])[+-]?\d+)$" size="8">
  <div style="height: 4px;"></div>
  <br>X = <span id="X">Please enter data!</span>
  <br>Y = <span id="Y">Please enter data!</span>
</p>
<script>
function Disp(X, Y)
{
  const Fail = 'Solive not found!';
  document.getElementById('X').innerHTML = !isNaN(X) ? X : Fail;
  document.getElementById('Y').innerHTML = !isNaN(Y) ? Y : Fail;
}

function Det2x2(Array)
{
  return Array[0] * Array[3] - Array[1] * Array[2];
}

function Change(e)
{
  let a1 = document.getElementById('a1').value;
  let b1 = document.getElementById('b1').value;
  let c1 = document.getElementById('c1').value;
  let a2 = document.getElementById('a2').value;
  let b2 = document.getElementById('b2').value;
  let c2 = document.getElementById('c2').value;
  
  let Det = Det2x2([a1, b1, a2, b2]); 
  let X = Det2x2([c1, b1, c2, b2]) / Det;
  let Y = Det2x2([a1, c1, a2, c2]) / Det;
  
  Disp(X, Y);
}
</script>

Данный код в работе:

X + Y =
X + Y =
X = Please enter data!
Y = Please enter data!

четверг, 15 декабря 2016 г.

Почему после вычисления выражений "let a = Math.sqrt(33)" получается undefined?

Почему после вычисления выражений "let a = Math.sqrt(33)" получается undefined?
Судя по всему возврат значений операторами let\var просто не предусмотрен, доказательством этого является код:
a = let b = 3
 
Вызывающий ошибку интерпретации:


"missing ; before statement"

понедельник, 28 ноября 2016 г.

Анимация

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

вторник, 15 ноября 2016 г.

RegExp

Регулярные выражения в JS

Задание: 
Разработать RegExp позволяющее определить валидность строки, параметры валидности:
Строка должна начинаться с 0 или 1, и состоять из последовательности трех или четырех 0 и 1, продолжение строки может состоять из любых символов.

Примеры:
101 - Валидна
1010 - Валидна
10100 - Не валидна
101-101 - Валидна
2111 - Не валидна

Был разработан следующий RegExp:
^[10]{3,4}([^10]+.*|[^10]*)$

Проверить правильность RegExp можно используя INPUT расположенный ниже, который окрашиваться в красный или зеленый цвет в зависимости от валидности введенной строки.


Код:

   <input type="text" id="Input" value="101" oninput="InputChange(event)">  
   
   <script>
     function IsValid(s)
     {
       return /^[10]{3,4}([^10]+.*|[^10]*)$/.test(s);
     }
     
     function InputChange(event)
     {
       if (IsValid(event.target.value))
         event.target.style.backgroundColor = 'green';
       else
         event.target.style.backgroundColor = 'red';
     }
     
     document.getElementById('Input').dispatchEvent(new Event('input'));
   </script> 

 

Аналогичная программа на ObjectPascal(Delphi):

Разметка формы:
object RegExpForm: TRegExpForm
  Left = 0
  Top = 0
  Caption = 'RegExpForm'
  ClientHeight = 53
  ClientWidth = 253
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  DesignSize = (
    253
    53)
  PixelsPerInch = 96
  TextHeight = 13
  object Input: TLabeledEdit
    Left = 8
    Top = 24
    Width = 237
    Height = 21
    Anchors = [akLeft, akRight, akBottom]
    AutoSelect = False
    Ctl3D = True
    EditLabel.Width = 26
    EditLabel.Height = 13
    EditLabel.Caption = 'Input'
    ParentCtl3D = False
    TabOrder = 0
    Text = '101'
    OnChange = InputChange
  end
end

Код:

unit Main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, System.UITypes;

type
  TRegExpForm = class(TForm)
    Input: TLabeledEdit;
    procedure InputChange(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  end;

var
  RegExpForm: TRegExpForm;

implementation

{$R *.dfm}

uses
  System.RegularExpressions;

function IsValid(S: string): Boolean;
begin
  Result := TRegEx.IsMatch(S, '^[10]{3,4}([^10]+.*|[^10]*)$');
end;

procedure TRegExpForm.FormCreate(Sender: TObject);
begin
  InputChange(Input);
end;

procedure TRegExpForm.InputChange(Sender: TObject);
begin
  if IsValid(TEdit(Sender).Text) then
    TEdit(Sender).Color := TColors.Lightgreen
  else
    TEdit(Sender).Color := TColors.Lightcoral;
end;

end.

Скриншоты работы:
Репозиторий программы, и скомпилированный EXE файл: https://github.com/AnotherStudent/RegExpValidationSample

суббота, 22 октября 2016 г.

Булеан

второй вариант:
язык - C++

#include "stdio.h"
#include "string.h"

void main()
{
    char s[32 + 1];

    scanf("%s", &s);
    int n = strlen(s);

    for(int i = 0; i < 2 << (n - 1); i++)
    {
        printf("\n%i: {", i);
        for(int j = 0; j < n; j++)
        {
            int mask = 1 << j;

            if(mask & i)
            {
                printf("%c", s[j]);

                int commaMask = 0xFFFFFFFF << (j + 1);
                if((commaMask & i) != 0)
                    printf(", ");
            }
        }
        printf("}");
    }
}

Пример работы:

abcd
0: {}
1: {a}
2: {b}
3: {a, b}
4: {c}
5: {a, c}
6: {b, c}
7: {a, b, c}
8: {d}
9: {a, d}
10: {b, d}
11: {a, b, d}
12: {c, d}
13: {a, c, d}
14: {b, c, d}
15: {a, b, c, d}

суббота, 15 октября 2016 г.

Вывод подмножеств

Задание:
Напишите программу, которая выводит все подмножества множества {a, b, c, d}

Решение:
Был выбран язык Delphi/Object Pascal из-за наличия встроенной работы с множествами.


1) Код "в лоб":
program Sets;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.Classes;

type
  TSet = set of (a, b, c, d);

var
  I: Byte;
  SetX: TSet;

begin
  for I := 0 to 15 do
  begin
    SetX := TSet(I);
    write('{');
    if a in SetX then
      write('A');
    if b in SetX then
      write('B');
    if c in SetX then
      write('C');
    if d in SetX then
      write('D');
    writeln('}');
  end;

  readln;
end.
Вывод:
{}
{A}
{B}
{AB}
{C}
{AC}
{BC}
{ABC}
{D}
{AD}
{BD}
{ABD}
{CD}
{ACD}
{BCD}
{ABCD}
Недостаток:
Плохое форматирование.


2) Код использующий операции над множествами для улучшенного вывода:

program Sets;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.Classes;

type
  TSet = set of (a, b, c, d);

var
  I: Byte;
  SetX: TSet;

begin
  for I := 0 to 15 do
  begin
    SetX := TSet(I);
    write('{');
    if a in SetX then
      if SetX - [a] = [] then write('A') else write('A, ');
    if b in SetX then
      if SetX - [a, b] = [] then write('B') else write('B, ');
    if c in SetX then
      if SetX - [a, b, c] = [] then write('C') else write('C, ');
    if d in SetX then
      write('D');
    writeln('}');
  end;

  readln;
end.

Вывод:

пятница, 14 октября 2016 г.

Реализация Online редактора фонового SVG изображения

 Реализация Online редактора фонового SVG изображения.

Для того чтобы отобразить SVG код введенный в textarea, был написан код который по таймеру преобразует SVG код введенный в textarea в base64 и подставляет в document.body.style.backgroundImage с соответствующим mime type: "data:image/svg+xml;base64". Преобразование в base64 необходимо чтобы некоторые символы не ломали загрузку изображения, пример: задание цвета с помощью конструкции #RRGGBB - символ '#'.

Drag and drop "окна" редактирования сделан с помощью JavaScript по причине того что установка атрибута draggable='true' не заставляла работать Drag and drop должным образом в используемом браузере - FireFox.
При быстром перемещении "окна" возможна потеря курсора, проблему можно решить функциями захвата мыши setCapture\releaseCapture от которых, к сожалению, пришлось отказаться, по причине того что реализованы они только в FireFox.

Ссылка на редактор: http://kodaktor.ru/73af581

Исходный код:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8"> 
    <title>SVG background editor</title>
    <meta name="Peter S." content="SVG background editor">
    <style>
      body
      { 
        margin-left: 0px;
      }
    
      #Panel
      {
        width: 420px;
        height: 240px;  
        position: absolute;
        background-color: #444444;
        cursor: move;
        left: 100px;
        top: 100px;
      }
      
      #ClickablePanel
      {
        width: 98%;
        height: 90%;
        margin: auto;
        padding-top: 20px; 
      }
      
      #Memo
      {
        width: 100%;
        height: 100%;
        border: 0px;
        padding: 0px;
      }
    </style>
  </head>
  <body>

    <div id="Panel" >
      <div id="ClickablePanel">
        <textarea id='Memo'><svg xmlns="http://www.w3.org/2000/svg" width="60" height="60">
<ellipse fill="#00FF00" stroke="#000000" opacity="0.4" stroke-width="5" cx="30" cy="30" rx="20" ry="20"/>
</svg></textarea>
      </div>
    </div>

  <script>
  Panel = document.getElementById('Panel');
  ClickablePanel = document.getElementById('ClickablePanel');
    
  ClickablePanel.onmousedown = OnMouseDown;
  ClickablePanel.onmousemove = OnMouseMove;
  ClickablePanel.onmouseup = OnMouseUp;  
  
  sx = 0;
  sy = 0;
  IsDrag = false; 
  
  function OnMouseDown(event)
  {
    if(event.target.getAttribute('id') == 'ClickablePanel')
    {
      IsDrag = true;
      sx = event.clientX - Panel.getBoundingClientRect().left;
      sy = event.clientY - Panel.getBoundingClientRect().top;
      Panel.style.opacity = 0.5;
    } 
  }
  
  function OnMouseMove(event)
  {
    if(IsDrag)
    {
      Panel.style.top = event.clientY - sy + 'px';
      Panel.style.left = event.clientX - sx + 'px';
    } 
  }
  
  function OnMouseUp(event)
  {
    IsDrag = false;
    Panel.style.opacity = 1;
  }
     
  Memo = document.getElementById('Memo');
 
  setInterval(function() {
    document.body.style.backgroundImage = 'url(\'data:image/svg+xml;base64,' + window.btoa(Memo.value) + '\')';
  }, 100);    
    
  </script>   
  </body>
</html>

пятница, 7 октября 2016 г.

ДЗ на 08.10.16

Задача 1. Множества.

Условие: 
  • Дрон - 3400
  • Квадракоптер - 5600
  • Дрон ИЛИ Квадракоптер - 8000
Найти:
Дрон и Квадракоптер

Правила:
A|B = A + B - A&B
A = A|B - B + A&B
B = A|B - A + A&B
A&B = A + B - A|B
Используя JavaScript получаем решение в виде кода:
<script>
var sets = {
       A:       3400,
       B:       5600,
       AorB:    8000,
       AandB:   0,
}
  
sets.AandB = sets.A + sets.B - sets.AorB;
$("div").html(sets.AandB);  
  
</script>
(http://hilite.me/)

Ответ:
1000

Задача 2.  iStore

В магазине iStore семь сотрудников,
которые дежурят у стенда парами.
Сколько вариантов пар существует?

Решение:
С(n, k) = n! / (k! * (n - k)!)
- количество сочетаний из n по к.
C(7, 2) = 7! / (2! * (7 - 2)!) = 5040 / (2 * 120) = 21

Задача 3.  Склад

На складе компьютерного магазина представлено 6 цветов сменных бамперов для смартфона.
В период акции к каждому смартфону прилагается по 2 разноцветных бампера.
Сколько может быть вариантов цветовых сочетаний для смартфона?
Решение:
С(n, k) = n! / (k! * (n - k)!)
- количество сочетаний из n по к.
C(6, 2) = 6! / (2! * (6 - 2)!) = 720 / (2 * 24) = 15

воскресенье, 25 сентября 2016 г.

Задача с "Пример М+"

Условие:
for (i = 1; i <= n; i++)
  for (j = i; j <= m; j++)
тело цикло выполняется m + ( m - 1) + ( m - 2 ) + ... + (  m - (n - 1) ) раз
Выведите формулу для этой суммы.
[Если m=n то это просто 1+2+...+n (ранее мы выводили это "диагоналями")]
Возможный исходный код(Object Pascal):

program MPlus;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

var
  Count: Integer = 0;
  m, n: Integer;
  i, j: Integer;

begin
  writeln('Enter m, n:');
  readln(m, n);

  for i := 1 to m do
    for j := i to n do
      Inc(Count);

  writeln('Count = ', Count);
end.


Возможны 3 варианта: 
  • m=n

     
  • m<n
  • m>n
При m=n, Count = (n * (n + 1)) / 2
При m<n, Count = (m * (m + 1)) / 2
При m>n, Count = (n * (n + 1)) / 2 + (m - n) * n

Упростим:
При m<=n, Count = (m * (m + 1)) / 2
При m>n, Count = (n * (n + 1)) / 2 + (m - n) * n

Итоговая формула:


В виде исходного кода:
function MPlus(n, m: Integer): Integer;
begin
  if n >= m then
    Result := (m * (m + 1)) div 2
  else
    Result := (n * (n + 1)) div 2 + (m - n) * n;
end;

Задача с модемом

Условие:
Модем, передающий информацию со скоростью 128000 бит/с, передал файл с несжатой стереофонической музыкой за 5 минуты и 30 секунд. Укажите продолжительность (в секундах) записанной в этот файл композиции, если известно, что она была оцифрована с частотой дискретизации 22000 Гц и 256 уровнями квантования. В ответе укажите целое число.
Решение:
256 уровней => 8bit
Всего преданно: 128000 * ((5 * 60) + 30)
=>
Продолжительность:
Length = (128000 * ((5 * 60) + 30)) / (22000 * 8 * 2) = 120

Ответ: 
120

среда, 21 сентября 2016 г.

Формальная грамматика


1) "в лоб"
[ C -> CC | (C) | {C} | e ]

2) "последовательный"
T := C -> CC | (C) | {C} | e
RESULT := [T]

суббота, 10 сентября 2016 г.

Задание 3. Кнопка










Задание 1. Юникод

ༀ།།
གནས་ཚུལ་།

Перевод: информация/положение вещей/способ бытия