example 10

This commit is contained in:
Alexander Zhirov 2021-11-26 13:11:56 +03:00
parent 3f11e9e2df
commit cb1a40665d
3 changed files with 180 additions and 0 deletions

15
src/example_10/.gitignore vendored Normal file
View File

@ -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

9
src/example_10/dub.json Normal file
View File

@ -0,0 +1,9 @@
{
"authors": [
"alexander"
],
"description": "Массивы, ассоциативные массивы и строки",
"license": "proprietary",
"name": "example_10",
"targetPath": "bin"
}

156
src/example_10/source/app.d Normal file
View File

@ -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();
}
}