Примеры языков программирования (1161130), страница 2
Текст из файла (страница 2)
public Cylinder(double radius, double length) {super(radius);this.length = length;}
public double getArea() { return 2*super.getArea()+2*Math.PI*radius*length;}
}
//================================================================================================
Пример работающей программы
package Program;
import java.lang.System;
import java.lang.String;
class X
{
public void g() { System.out.print("1 "); }
public void f() { g();}
}
class Y extends X
{
public void g() { System.out.print("2 "); }
public void f() { g(); }
}
class Z extends Y
{
public void g() { System.out.print("3 "); }
public void f() { g(); }
}
public class Program
{
static X x = new X();
static Y y = new Y();
static Z z = new Z();
public static void main(String[] args)
{
Out(); x = y;
Out(); y = z;
Out();
}
static void Out()
{
x.f(); x.g();
y.f(); y.g();
System.out.print("\n");
}
}
Выдаёт
1 1 2 2
2 2 2 2
2 2 3 3
//================================================================================================
C++
//================================================================================================
[ capture ] ( params ) mutable exception attribute -> ret { body }
mutable - позволяет body изменять параметры, захваченные копированием, и вызывать их неконстантные функции-члены
exception - обеспечивает спецификацию исключения или опцию noexcept для оператора () типа замыкания
attribute - обеспечивает спецификацию атрибута для оператора () типа замыкания
capture - определяет, какие символы, видимые в области, где функция объявлена, будут видны внутри тела функции. Список символов может быть передан следующим образом:
-
[a,&b] где a захвачена по значению и b захвачена по ссылке.
-
[this] захватывает указатель this по значению.
-
[&] захват всех символов по ссылке
-
[=] захват всех символов по значению
-
[] ничего не захватывает
//================================================================================================
Вычисление факториала на стадии компиляции
#include <iostream>
template<int n>
class Factorial {
public:
static const int f = Factorial<n - 1>::f * n;
};
template<>
class Factorial<0> {
public:
static const int f = 1;
};
int main() {
std::cout << Factorial<5>::f << std::endl; // 120
}
//================================================================================================
Python
Типы данных бывают -
строки, числа (целые, не целые)
list - список [1,2,3, [4,2,"каждый элемент - это свой тип"]]
dict - словарь {"1" : 23, 34 : ["dd", 23]} - ключём в словаре может случить исключительно hash-able тип, т.е. тип который не изменяем, например - строка или кортеж, ещё бывают frozen_set, …
Вообще про изменяемось это целая песня
tuple - неизменяемый список, или "кортеж" (1,2,3, (3,2))
Если в функцию передать неизменяемый тип, то любые преобразования над ним в самой функции не будут сохранены, если передать изменяемый - то это как передать по ссылке.
Слова True и False должны писаться с большой буквы
//================================================================================================
my_func = lambda x, y, z: x+y+x
//================================================================================================
my_list = [1,2,3,4]
my_new_list = [c какого элемента включительно : по какой элемент не включительно : шаг (может быть и отрицателен)]
my_new_list = my_list[3:1:-1] # == [4,3]
my_new_list[0] # это элемент 4
В словарях обращение идёт my_dict[Тут пишем ключ]
//================================================================================================
try
raise Exception ("Hello World")
except Exception as e:
print ("hifi") # Такой принт в python 3.0 - в нём все строки unicode
except :
print "This will catch everything" # Такой принт в python 2.7 - этот с русским не дружит совсем
else:
print "Это выполнится, если ни один except не случился, т.е. не было исключений"
finally:
print "Это выполнится вообще всегда"
//================================================================================================
Пример класса
import itertools # Импортирование модуля itertools, чтобы к чему-то достучаться нужно писать "itertools."
from math import sqrt # импортирвоние символа sqrt из модуля math
from math import * # Это вывалит все имена из модуля math прямо в эту же область видимости (что даст возможность вызвать cos без math.cos)
class Dot (object): # Класс с наследованием (Отдельно заметим, что класс унаследованный из object является классом "нового типа", разницу спросят очень вряд ли)
def __init__ (self, *l, **II): # Конструктор, (звёздочки не обязательны), конструкторы базовых типов нужно вызывать вручную
self.l = list(l)
def __str__(self): # пример переопределения оператора str(), который возвращает строку
return ",".join([str(i) for i in self.l])
def __add__ (self, a2) # пример переопределения оператора "+"
...
def distance(self, d):
if len(self.l) != len(d.l):
raise ValueError()
else:
return sqrt (sum(map((lambda x1, x2: (x2 - x1)**2), self.l, d.l)))
def middle(self, d):
if len(self.l) != len(d.l):
raise ValueError()
else:
return Dot(*map((lambda x1, x2: ((x1+x2)*1.0)/2), self.l, d.l))
//================================================================================================
def __find_max():
for parameters in [0,1,2,3]: # Второе должно быть чем-то итерабельным, т.е. у него должен быть реализован метод __iter__
try:
yield MY_LAMBDA(*parameters)
except:
pass
//================================================================================================
my_list = [i*i for i in range(23)] # Генератор списка - т.е мы по списку range(23) (это специальная функция, которая генерит список [0, 1, 2, 3, …, 22]) генерируем новый список - из квадратов этих чисел.
Аналогично можно и для словаря
range даст нам список, но если нам список не нужен, а нужен только итератор, то нужно пользовать xrange - ибо он негенерирует список и потому не есть памяти
for i in xrange(len(l)):
if i % 2 == 0:
if любое условие, без круглых скобок! : # пользуются and or not и ()
# Ещё можно использовать all([список, где для успеха должны быть все True]) и any ([список где хоть один должен быть True])
print "NO"
break
else:
print "YES" - это будет напечатано, если for закончится и при этом не случится break
//================================================================================================
JavaScript
//================================================================================================
Функцию можно объявить следующим образом, что является лямбдой
var my_func = function (int x) {
return x*x
};
либо
var my_func = x => return x*x;
var my_func = () => alert(1);
//================================================================================================
Так же существуют генераторы (сопрограммы)
function*a(){
var b = 0; while(true) { yield b++}
}
a = a();
console.log(a.next().value); // 0
console.log(a.next().value); // 1
console.log(a.next().value); // 2
//================================================================================================
Ada
3 смысла with:
- импортирование модуля (with package; после чего можно иметь доступ к полям по package.field) (эквивалентно #include)
- Охрана типа (ограничения в шаблонах)
- with - в случае наследования, в конце добавляет дополнительные поля
use - включение всего содержимого модуля (точнее всего интерфейса), это как в python "from package import *" (или же это эквивалент using namespace), либо выделение памяти на куче
aliased - тоже умеет размещать данные в пуле
access - указатель, который указывает только на кучу
access all - это указатель, который доступен и для записи и для чтения (может указывать не только на кучу, но и static и стек)
access constant - это указатель, который доступен только для чтения
task - поддерживает многопоточность (можно объявлять как задачи, так и типы задач)
accept - по синтаксису - как поцедура, это сервис, который работа (task) может предоставить кому-то ещё
Если в работе в ходе её выполнения в коде встречается accept - то работа зависает и ждёт, пока кто-нибудь вызовет.
select - (select <accept> or <accept> or … end select) - работа будет ждать не каждого accept по очереди, а лишь хотя бы одного из описанных в select
Разница в in, out и in out в 83 и 95 в том, что out - только для записи в 83, а в 95 (вероятно, не факт что ответ правльный) - мы можем записать в out переменную значение, которое потом можно прочесть оттуда же.
private используется когда описываются "приватные типы" в пакете, "Private child packages" (когда есть слово private перед package - то этот пакет может пользовать только equally private client units), "Private Part in Package Specification" (приватная часть пакета (это целый блок программы package … private … end package))
Package Shelf … - это пакет
Package Shelf.Bool... - это дочерний пакет (он видит всё, что в shelf)
limited - означает, что у новоявленного типа нет стандартных операций до тех пор, пока программист сам их не опишет. (моделировать в java невозможно)
Штрих в ада используется для указания "тип'значение" (например для перечислимого типа, если в разных перечислимых типах используется одна литера (в других языках где литера выпадает в общую область видимости подобное запрещено))
aliased указывает, что к переменной применима адресная операция
//================================================================================================
function F return Some_Type is
... -- declations (1)
begin
... -- statements (2)
exception -- handlers start here (3)
when Name_1 | Name_2 => ... -- The named exceptions are handled with these statements
when others => ... -- any other exceptions (also anonymous ones) are handled here
// others - ключевое слово, перехватывающее всё на свете
end F;
кинуть исключение - raise Name_1;
//================================================================================================
with persons; use persons;
package managers is
// Наследуемся от person и с дополнительными полями
type manager is new person with
record
master_key_code :string(1..10);
end record;
// Дальше пример метода класса manager
procedure allocate_master_key(
someone:in out manager;
code :in string);
procedure pay_rise(someone:in out person);
end managers;
//================================================================================================
use Smth_Package.Entity;
type Entity_Access is access Entity;
A1, A2 : Entity_Access;
begin
A1 := new Entity;
A1 := new Entity; -- Образовался мусор
A2 := A1;
Free_Entity (A1); -- A1 теперь null
-- A2 теперь - висячая ссылка
end
//================================================================================================
generic
type T is private;
with function “+”(x,y:T) return T (<>);
with function “*”(x,y:T) return T (<>);
type Matrix is private;
function G_MatMult(A,B: Matrix) return Matrix;
//================================================================================================
generic
type T is private;
Size : integer;
package G_Queueis
type Queueis limited private;
procedure Enqueue(Q: inout Queue; X:T);
procedure Dequeue(Q: inout Queue; X:T);
procedure Init(Q: out Queue);
procedure Destroy(Q: inout Queue);
function IsFull(Q: Queue);
function IsEmpty(Q: Queue);
–- другие процедуры ...
private
type Queueis record
Left, Right: integer;
body : array(1..Size) of T;
end record;
end G_Queue;
//================================================================================================
"Указание типа"
type RGBCOLOR is (... Red ...);
type TrafficColor is (Red, Green, Blue);
P(RGBColor'Red) - указание использовать тип RGBColor.
//================================================================================================
Двусторонняя связь
procedure Outer is
–- заглушка
procedure Inner is separate;
. . .
end Outer;
separate(Outer)
procedure Inner is
. . .
end Inner
//================================================================================================
function SCAL(X, Y : TARR) return T;