(1 курс ФИИТ) CS101. Основы программирования — лекции (2016-17гг)


#1

В этом топике обсуждаются вопросы, связанные с лекциями.

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


#2

1)Fantom - объектно ориентированный язык программирования созданный Брайаном и Энди Фрэнком в 2005 году. Главной целью является предоставление стандартного API в JRE или CLR. 2)Opa — веб-ориентированная платформа разработки, состоящая из языка программирования (со средой исполнения), веб-сервера и СУБД. ЯП был создан в 2010. 3) F#- язык программирования из семейства языков .NET Framework поддерживающий функциональное программирование в дополнение к объектно-ориентированному программированию. Язык был разработан Доном Саймом в 2005 году. 4)Ceylon- объектно-ориентированный язык программирования высокого уровня,разрабатываемый компанией Red Hat в 2011 году. Ceylon наследует большую часть синтаксиса Java.Язык ориентированный на командную разработку крупных приложений. 5) Dart- язык программирования, созданный Google в 2011 году. Этот язык был создан потому что JavaScript имеет изъяны, которые невозможно исправить. Dart гибкий и упрощенный язык, который имеет высокую производительность. 6)Go-компилируемый, многопоточный язык программирования, разработанный компанией Google в 2009 году. Язык Go разрабатывался как язык системного программирования для создания высокоэффективных программ, которые работают на современных системах и многоядерных процессорах. Он может рассматриваться как попытка создать замену языку Си. При разработке уделялось особое внимание обеспечению высокоэффективной компиляции. 7)Swift-Свободный язык общего назначения, созданный компанией Apple для разработки под iOS и OS X. Swift заимствовал идеи из множества уже существующих языков самого разного направления: от C++ до Haskell. Официальное представление языка произошло в июне 2014 года.Язык взял очень многое из Objective-C; в то же время он позиционируется как более безопасный и быстрый 8)Type Script-Еще один язык,созданный в 2012 году компанией Microsoft,который позиционирует себя как замена JavaScript. Разработчиком нового языка стал знаменитый Андерс Хейлсберг, автор Delphi, C# и Turbo Pascal. Type Script является открытым языком, обратно совместимым с Java Script. . В отличие от JS новый язык поддерживает все возможности объектно-ориентированного программирования. 9)Hack-Язык, разработанный компанией Facebook в 2011 году; внешне похожий на PHP. Программный код на Hack исполняется на специальной виртуальной машине, поддерживающей также PHP. Язык является открытым – исходные коды Hack открыты для всех желающих принять участие в его усовершенствовании. 10)Julia- Новый язык для математических вычислений,созданный в 2012 году Стефаном Карпинским и Джеффом Безансоном. Сам язык написан на C и C++; программный код языка выполняется на виртуальной машине LLVM, для чего Julia снабжена JIT-компилятором. Благодаря компиляции была достигнута высокая скорость работы приложений, сравнимая с программами, написанными на C++.Основная задача Julia: работа с большим объемом вычислений при сохранении высокой производительности.


#3

Дополню список менее известными ЯП, но они по-своему интересны.

1) Zimbu Синтаксис Zimbu уникален и специфичен, но в то же время обладает большим количеством функций. Он использует выражения и операторы, похожие на те, которые используются в C, но со своими ключевыми словами, типами данных и блочными структурами. Он поддерживает управление памятью, потоки и конвейеры. Единственной проблемой является портативность. Хотя Zimbu и является компилируемым языком, его компилятор выдаёт ANSI C код, а двоичные файлы могут быть созданы лишь на платформах со встроенным C-компилятором. К сожалению, проект Zimbu находится на стадии разработки. Компилятор и несколько программ-примеров могут быть созданы самостоятельно, но не весь действительный Zimbu-код будет компилироваться и выполняться должным образом. Не все заявленные функции ещё разработаны, а некоторые из уже представленных работают некорректно. Спецификация языка также, возможно, со временем изменится: по мере необходимости добавятся ключевые слова, типы и синтаксис.

2) X10 Язык, созданный специально для современных параллельных архитектур, который нацелен на увеличение производительности разработчиков “в десять раз”. Код X10 больше всего похож на Java. По сути, среда выполнения X10 доступна как в качестве встроенных исполнимых файлов, так и как классовые файлы для JVM. Компилятор X10 может выдавать исходные коды либо на C++, либо на Java. В будущем планируется разработать прямую совместимость с Java.

3) haXE Это мультиплатформенный язык, который может использоваться в различных операционных средах, начиная от встроенных двоичных систем до интерпретаторов и виртуальных машин. Синтаксис haXe похож на C и обладает богатым набором функций. Главным преимуществом является способность устранения проблем, свойственных каждой из платформ. К примеру, в haXe строгая типизация используется там, где она не используется в JavaScript; к ActionScript добавляются параметры настройки и выведение типа; также полностью исключается плохо разработанный, непродуманный синтаксис PHP. Несмотря на то, что haXe всё ещё находится в разработке, он уже используется в коммерческих целях своим создателем, игровой студией Motion Twin, так что всё серьёзно.

4) Chape Синтаксис Chapel составлен из синтаксисов нескольких языков. В дополнение к наиболее часто используемым (C, C++, Java), в нём заимствованы понятия из таких языков научного программирования, как Fortran и Matlab. На его функции параллельной обработки данных повлияли ZPL и High-Performance Fortran, а также предыдущие проекты Cray. Одной из наиболее притягательных функций Chapel является его поддержка “программирования с переменным разрешением”, что позволяет разработчикам создавать приложения с очень абстрактным кодом и делать дополнения по мере того, как реализация становится более определённой.

5) Plange Plange объединяет в себе язык, библиотеки и среду разработки. Основная цель новой системы — позволить программисту не задумываться о возможностях языка. Разработчик сможет создавать программы любого назначения и любой сложности.


#4

Whitespace. Очень удобен для написания ЕГЭ, рекомендую.


#5

Rust

Базисные принципы ровно те же, что и Swift; по опросу портала StackOverFlow Rust – самый любимый разработчиками язык; в плане изучения и применения он не слишком прост, зато понятен и безопасен. По темпу роста популярности Rust немного уступает Go и Swift, но это никак не связано с качеством проработки или синтаксиса. Просто Google и Apple немного лучше продвигают свои продукты, чем Mozilla.

Scala (не совсем 10 лет, чуть больше)

Относительно вышеперечисленных языков, Scala относительно стар, первая версия увидела свет в 2003 году. Он является симбиозом Java и C#, причём близость к первому порой настолько сильна, что Scala-программы могут свободно взаимодействовать с Java-программами. Кстати, это является и огромным преимуществом для тех, кто знает и активно использует Java – изучить Scala для них не составит никакого труда, синтаксис очень схож.

Вроде бы все перечислили


#6

Удалось найти ещё некоторые языки.

  1. Nemerle - гибридный язык высокого уровня со статической типизацией, сочетающий в себе возможности функционального и объектно-ориентированного программирования, для платформ .NET и Mono (язык компилируется в CIL и является CLS-совместимым). Главная особенность языка — развитая система метапрограммирования. Позиционируется как язык общего назначения. Он сочетает в себе несколько парадигм программирования: объектно-ориентированное программирование, императивное программирование, функциональное программирование и метапрограммирование. Из-за такого сочетания концепций, возможно использование различных стилей программирования.

  2. CoffeeScript — язык программирования, транслируемый в JavaScript. CoffeeScript добавляет "синтаксический сахар "в духе Ruby, Python, Haskell и Erlang для того, чтобы улучшить читаемость кода и уменьшить его размер. CoffeeScript позволяет писать более компактный код по сравнению с JavaScript. JavaScript-код, получаемый трансляцией из CoffeeScript, полностью проходит проверку JavaScript Lint. CoffeeScript был радушно воспринят в Ruby-сообществе.

  3. Vala — язык программирования, предназначенный для прикладного и системного программирования на основе библиотек GLib Object System (GObject) рабочей среды GNOME/GTK+. Язык был разработан Йюргом Биллетером (Jürg Billeter) и Раффаэле Сандрини (Raffaele Sandrini) с версии 3.1. Особенность системы разработки состоит в том, что программа на Vala транслируется в программу на языке C, которая в свою очередь компилируется в исполняемый код целевой платформы со стандартными библиотеками C, Glib и выполняется со скоростью откомпилированного в объектный код целевой платформы приложения C. Чтобы получить транслируемый код на языке С нужно указать параметр -C компилятору Vala. При наличии в программе графического интерфейса пользователя во время компиляции используется библиотека GTK+ (параметр --pkg gtk±3.0 компилятора). Благодаря такому подходу откомпилированный код на Vala бинарно совместим с системными библиотеками, написанными на C. Для подключения сторонних библиотек к программам на языке Vala используются специальные vapi-файлы, в которых даётся описание интерфейса библиотеки. Для многих библиотек уже существуют vapi-файлы, входящие в штатную поставку компилятора Vala. Кроме того, имеются vapi-файлы для библиотек, поддерживаемые сторонними пользователями, пока не включенные в штатную поставку.


#7
  • LOLCODE — эзотерический язык программирования, созданный под влиянием интернет-мемов.

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

“Hello World!” на LOLCODE:

HAI CAN HAS STDIO? VISIBLE "HAI WORLD!" KTHXBYE

  • Idris - чисто-функциональный язык программирования общего назначения с haskell-подобным синтаксисом и поддержкой зависимых типов. Система типов подобна системе типов языка Agda.

“Hello World!” на Idris:

module Main

import Effects import Effect.StdIO

hello : Eff () [STDIO] hello = putStrLn “Hello world!”

main : IO () main = run hello


#8

Отличное исследование - спасибо всем!

Некоторые языки я не знал вовсе.

Некоторые из перечисленных - малозначимы.

Некоторым языкам - я считал - более 10 лет. Например, Nemerle и Scala. Ошибался :slight_smile:


#9

TypeScript


#10

Давайте будем точными: 12 с половиной.

Отличный пример, спасибо!


#11

На лекции было дано домашнее задание: написать программу,которая вычисляет число в n степени,где n >0 и целое. вот мой вариант:

{программа возводит число х в степень n,когда n∈N}
program task1;

begin
  writeln('Введи основание степени');
  var x := ReadInteger;
  writeln('введи показатель степени');
  var n := ReadInteger;
  writeln('Значение выражения =  ', exp(ln(x) * n))
end.

еще есть вариант менее эффективной программы через цикл for: 

program task2; 

begin
  writeln('Введи основание степени'); 
  var x := ReadInteger; 
  writeln('введи показатель степени'); 
  var n := ReadInteger; 
  var k, i: integer; 
  k := 1; 
  for i := 1 to n do 
    k := k * x; 
  writeln('Искомое число =  ', k)
end.

#12

Задание было другое - сделать это за наименьшее количество умножений


#14

То же задание. Найти a в натуральной степени n за минимальное число умножений. Использован рекурентный алгоритм:

// Задание с лекции. Нахождение a в натуральной степени n за наименьшее число умножений на основе рекурентного алгоритма.

program TaskPower;

function powerm(a, n: integer; var i: integer): biginteger ;
// a - исходное число. n - желаемая степень числа. i - счётчик затраченных умножений.
begin
  if n = 1 then     // Точка выхода из рекурсии. 
    result := a
  else
  if (n mod 3) = 0  then    // Случай для n кратно 3
  begin
    var f := powerm(a, n div 3, i);
    i += 2;
    result := f * f * f;        
  end else
  if (n mod 2) = 0 then     // Случай для n кратно 2
  begin
    var f := powerm(a, n div 2, i);
    i += 1;
    result := f * f;
  end else
  begin// Случай для n не кратно 2 или 3
    i += 1;
    result := powerm(a, n - 1, i) * a;
  end;
end;

begin
  var a := readlninteger('Введите исходное число: a=');
  var n := readlninteger('Введите степень числа ( n<= 0 - запуск демонстрационного режима): n=');
  var ni := 0;             // счётчик умножений
  
  if n > 0 then
  begin
    
    
    var r := powerm(a, n, ni);
    writelnformat('Исходное число: a={0}; Степень числа: n={1}; Кол-во использованных умножений: {2}; Результат вычислений:{3}; ', a, n, ni, R);
    
  end else
  
  begin
    
    Writeln('Для заданного числа будут выведены 100 первых степеней.');
    sleep(2000);
    
    for var i := 1 to 100 do
    begin
      
      var R := powerm(a, i, ni);
      
      writelnformat('Исходное число: a={0}; Степень числа: n={1}; Кол-во использованных умножений: {2}; Результат вычислений:{3}; ', a, i, ni, R);
      ni := 0;
      
    end;
    
  end;
  
end.

Task-Power.pas (1,6 КБ)


#15

Иные разложения делаются оптимально для n кратных 5 а не 3 То есть, этот алгоритм - неоптимальный, хотя и лучше степеней 2


#16
begin
  writeln('Введите число ');
  var a := readreal;
  writeln('Введите степень ');
  var b := readinteger;
 var itog:= 1.0;
  var count:=0;
  var b1:=b;//сохранить степень для вывода
  while b > 0 do
  begin
    if (b mod 2 = 0) then
    begin
      a *= a;
      b := b div 2;
      count+=1;
    end
    else
    begin
       itog*= a;  
      dec(b);;
      count+=1;
    end;
  end;
  WriteFormat('Число - {0} степень - {1} результат - {2} минимальное количество операций - {3}',a,b1,itog,count-1);
end.

#17

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


begin writeln('Введите число '); var a := readreal; writeln('Введите степень '); var b := readinteger; var itog := 1.0; var count := 0;//количество a( кол-во умножений минус 1) var b1 := b;//сохранить степень для вывода var a1:=a; while b > 0 do begin if (b mod 2 = 0) then begin a *= a; b := b div 2; count += 1; end else if (b mod 3 = 0) then begin a *= a*a; b := b div 3; count += 2; end else begin itog *= a; dec(b); count += 1; end; end; WriteFormat('Число - {0} степень - {1} результат - {2} минимальное количество операций - {3}', a1, b1, itog, count - 1); end.


#18

Еще один вариант, использован метод динамического программирования

[code]function pow(a:integer; n:integer; var col:integer):int64; //Return a^n (a and n - integers), push to ‘col’ the count of operations begin var arr: array [1…100] of int64; //В массиве будем хранить уже вычисленные степени var res:int64 := a; //Здесь будем накапливать результат arr[1] := a; var st := n; //Сколько степеней нам еще осталось var i := 1; //Текущая степень var j := 1; //Индекс в массиве степеней while (i+i<=n) do //Пока можем вычислять степени, являющиеся квадратами предыдущих степеней - вычисляем begin j+=1; arr[j] := arr[j-1]*arr[j-1]; //Вычисляем следующую степень col+= 1; i+=i; //Удваиваем степень, т.к мы нашли квадрат end; st-= i; //Сколько еще осталось res := arr[j]; //Результат предыдущих вычислений while (st > 0) do begin i := 1; j := 1; while (i+i < st) do begin i +=i; j +=1; end; res *= arr[j]; col+=1; st-=i; end; result := res; end;

begin var i,a,b:integer; writeln(‘Введите число’); read(a); writeln(‘Введите степень’); read(b); writeformat(’{0}^{1}={2}, количество операций - {3}’, a, b, pow(a,b,i), i); end.[/code]


#19

Замена n-ого бита на 1.

 begin

var b,a,n:byte;
read(a,n); // вводим число и номер бита

n:=1 shl (n-1); // находим десятичное число, которое в двоичной записи имеет только один бит       равный единице на n-ом месте
b:=a or n; // при этом n-ый бит исходного числа в двоичном коде станет равным 1

write(b);
end. 

Замена n-ого бита на 0.

begin

var b,a,n:byte;
read(a,n);
n:=1 shl (n-1);
n:= not(n); // всё до этого так же, как и в прошлый раз, но теперь инвертируем полученое число,   получая значение, которое в двоичной c.c представляет собой последовательность, состоящую только из единиц, кроме n-ого бита
b:=a and n; 
write(b);
end.

Инвертирование n-ого бита.

begin

var b,a,n,m:byte;
read(a,n);

m:=1 shl (n-1);

if a shr (n-1) mod 2 = 0 then // если исходное число при битовом смещении вправо на n-1 становиться четным, значит, n-ый бит равен 0 и мы с помощью or делаем его равным 1
                     b:=a or m
                      else
                      begin
                      m:= not(m);// а если число при смещении получилось нечетным, мы заменяем нужный бит на о
                      b:=a and m;
                      end;
                     
write(b);
end.

#20

Так как на изменение бита на 1 и на 0 уже есть решения. Я предложу решение на инвертирование(немного другое).

[code]program byteinvert;

var b: byte; n: integer;

begin writeln(‘введите число и бит ,который нужно изменить’); read(b, n); var a := 1 shl (n - 1); a := not (a); b := (not (a) or b) and (not (b) or a);//эквиваленция writeln(b); end.[/code]


#21

Решение задачи про треугольник. Кратко опишу алгоритм, возможно он не самый лучший. Если точка находится внутри треугольника, то, если провести к ней из вершин треугольника отрезки, то получится, что она разбила треугольник на 3. Следовательно, сумма площадей этих треугольников равна площади большого. Применяя несколько раз формулу Герона, получим искомый результат.

Function Def(var a,b,c,d:real):real; begin Def:=sqrt((b-a)(b-a) + (c-d)(c-d)) end; Function S(var a,b,c,p: real):real; begin S:=sqrt(p*(p-a)(p-b)(p-c)) end; begin var Xa:=ReadReal; var Ya:=ReadReal; var Xb:=ReadReal; var Yb:=ReadReal; var Xc:=ReadReal; var Yc:=ReadReal; var Xs:=ReadReal; var Ys:=ReadReal; var AB:=Def(Xa,Xb,Ya,Yb); var BC:=Def(Xc,Xb,Yc,Yb); var AC:=Def(Xa,Xc,Ya,Yc); var SA:=Def(Xa,Xs,Ya,Ys); var BS:=Def(Xs,Xb,Ys,Yb); var SC:=Def(Xs,Xc,Ys,Yc); var Pabc:=(AB+BC+AC)/2; var Sabc:=S(Pabc,AB,AC,BC); var Psab:=(AB+BS+SA)/2; var Ssab:=S(Psab,SA,AB,BS); var Psac:=(AC+SC+SA)/2; var Ssac:=S(Psac,SA,AC,SC); var Pscb:=(BC+BS+SC)/2; var Sscb:=S(Pscb,BS,BC,SC); writeln(Sabc=Ssac+Sscb+Ssab) end.