From cb1a40665db995079952eb78b3186dd63f4482ef Mon Sep 17 00:00:00 2001 From: Alexander Zhirov Date: Fri, 26 Nov 2021 13:11:56 +0300 Subject: [PATCH] example 10 --- src/example_10/.gitignore | 15 ++++ src/example_10/dub.json | 9 +++ src/example_10/source/app.d | 156 ++++++++++++++++++++++++++++++++++++ 3 files changed, 180 insertions(+) create mode 100644 src/example_10/.gitignore create mode 100644 src/example_10/dub.json create mode 100644 src/example_10/source/app.d diff --git a/src/example_10/.gitignore b/src/example_10/.gitignore new file mode 100644 index 0000000..48908c2 --- /dev/null +++ b/src/example_10/.gitignore @@ -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 diff --git a/src/example_10/dub.json b/src/example_10/dub.json new file mode 100644 index 0000000..d12699b --- /dev/null +++ b/src/example_10/dub.json @@ -0,0 +1,9 @@ +{ + "authors": [ + "alexander" + ], + "description": "Массивы, ассоциативные массивы и строки", + "license": "proprietary", + "name": "example_10", + "targetPath": "bin" +} diff --git a/src/example_10/source/app.d b/src/example_10/source/app.d new file mode 100644 index 0000000..212f922 --- /dev/null +++ b/src/example_10/source/app.d @@ -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(); + } +}