example 10
This commit is contained in:
parent
3f11e9e2df
commit
cb1a40665d
|
@ -0,0 +1,15 @@
|
||||||
|
.dub
|
||||||
|
docs.json
|
||||||
|
__dummy.html
|
||||||
|
docs/
|
||||||
|
/example_10
|
||||||
|
example_10.so
|
||||||
|
example_10.dylib
|
||||||
|
example_10.dll
|
||||||
|
example_10.a
|
||||||
|
example_10.lib
|
||||||
|
example_10-test-*
|
||||||
|
*.exe
|
||||||
|
*.o
|
||||||
|
*.obj
|
||||||
|
*.lst
|
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"authors": [
|
||||||
|
"alexander"
|
||||||
|
],
|
||||||
|
"description": "Массивы, ассоциативные массивы и строки",
|
||||||
|
"license": "proprietary",
|
||||||
|
"name": "example_10",
|
||||||
|
"targetPath": "bin"
|
||||||
|
}
|
|
@ -0,0 +1,156 @@
|
||||||
|
import std.stdio, std.random;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
// Динамические массивы
|
||||||
|
|
||||||
|
{
|
||||||
|
int[] arr1 = new int[20];
|
||||||
|
auto arr2 = new int[20];
|
||||||
|
assert(arr1 == arr2);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto arr = new double[uniform(1, 128)];
|
||||||
|
foreach (i; 0 .. arr.length)
|
||||||
|
{
|
||||||
|
arr[i] = uniform(0.0, 1.0);
|
||||||
|
}
|
||||||
|
writeln(arr);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto arr = new double[uniform(1, 128)];
|
||||||
|
foreach (ref i; arr)
|
||||||
|
{
|
||||||
|
i = uniform(0.0, 1.0);
|
||||||
|
}
|
||||||
|
writeln(arr);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto arr = new int[100];
|
||||||
|
auto copy = arr.dup;
|
||||||
|
assert(arr !is copy);
|
||||||
|
assert(arr == copy);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto arr = new int[10];
|
||||||
|
arr[9] = 42;
|
||||||
|
assert(arr[$ - 1] == 42);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
|
||||||
|
writeln(arr[$ / 2 .. $]);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto a = [1.0, 2.5, 3.6];
|
||||||
|
auto b = [4.5, 5.5, 1.4];
|
||||||
|
auto c = new double[3];
|
||||||
|
c[] = 4 * (a[] + b[]);
|
||||||
|
writeln(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Статические массивы
|
||||||
|
|
||||||
|
{
|
||||||
|
int[3] a;
|
||||||
|
assert(a == [0, 0, 0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
int[4] a = -1;
|
||||||
|
assert(a == [-1, -1, -1, -1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// Неинициализированный массив
|
||||||
|
int[1024] a = void;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Многомерные массивы
|
||||||
|
|
||||||
|
{
|
||||||
|
auto array = new int[][5];
|
||||||
|
foreach (i, ref e; array)
|
||||||
|
{
|
||||||
|
e = new int[array.length - i];
|
||||||
|
}
|
||||||
|
writeln(array);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
enum size_t rows = 64, columns = 128;
|
||||||
|
// Выделить память под матрицу с 64 строками и 128 столбцами
|
||||||
|
double[columns][rows] matrix;
|
||||||
|
// Вообще не нужно выделять память под массив – это значение
|
||||||
|
foreach (ref row; matrix)
|
||||||
|
{
|
||||||
|
// Использовать строку типа double[columns]
|
||||||
|
}
|
||||||
|
|
||||||
|
// В объявлении типа массива размеры измерений указаны «справа налево» (то есть double[столбцы][строки]),
|
||||||
|
// а при обращении к элементам массива индексы указываются «слева на право».
|
||||||
|
// Это объясняется тем, что [] и [n] в типах привязываются справа налево, а в выражениях – слева направо.
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ассоциативные массивы
|
||||||
|
|
||||||
|
{
|
||||||
|
int[string] aa = ["здравствуй": 42, "мир": 75];
|
||||||
|
writeln(aa["здравствуй"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto aa = ["здравствуй": 42, "мир": 75];
|
||||||
|
writeln(aa["мир"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto coffeePrices = [
|
||||||
|
"французская ваниль": 262,
|
||||||
|
"ява": 239,
|
||||||
|
"французская обжарка": 224
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach (kind, price; coffeePrices)
|
||||||
|
{
|
||||||
|
writefln("%s стоит %s руб. за 100 г", kind, price);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
string a = "hello";
|
||||||
|
string b = a; // Переменная b теперь тоже указывает на значение "hello"
|
||||||
|
string c = b[0 .. 4]; // Переменная c указывает на строку "hell"
|
||||||
|
// Если бы такое присваивание было разрешено, это изменило бы a, b, и c:
|
||||||
|
// a[0] = 'H';
|
||||||
|
// Конкатенация оставляет переменные b и c нетронутыми:
|
||||||
|
a = 'H' ~ a[1 .. $];
|
||||||
|
assert(a == "Hello" && b == "hello" && c == "hell");
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
string a = "Независимо от представления \u03bb стоит \u20AC20.";
|
||||||
|
wstring b = "Независимо от представления \u03bb стоит \u20AC20.";
|
||||||
|
dstring c = "Независимо от представления \u03bb стоит \u20AC20.";
|
||||||
|
writeln(a, '\n', b, '\n', c);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
string str = "Hall\u00E5, V\u00E4rld!";
|
||||||
|
foreach (c; str)
|
||||||
|
{
|
||||||
|
write('[', c, ']');
|
||||||
|
}
|
||||||
|
writeln();
|
||||||
|
foreach (dchar c; str)
|
||||||
|
{
|
||||||
|
write('[', c, ']');
|
||||||
|
}
|
||||||
|
writeln();
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue