Официальный новостной канал криптобиржи OKX | www.okx.com на русском языке.
💬 Комьюнити: t.me/okx_russian
👨💻 Поддержка: [email protected]
АДМИН: @DaniiOKX
Маркетинг: @CoffeeTrends
Last updated 2 weeks, 5 days ago
Here in simple language about TON and crypto
Founder: @metasalience
contact : @deftalk_bot
Last updated 3 months, 3 weeks ago
Канал о TON и все что с ним связано:
1. Аналитика
2. Инсайды
3. Авторское мнение
Ведро для спама: @ton_telegrambot
Бот с курсами криптовалют: @TonometerBot
Чат: @chaTON_ru
Админ: @filimono
Last updated 3 weeks ago
Решение задачи к посту.
```
void MagicMatrix(int size)
{
if (size < 2) throw new ArgumentOutOfRangeException("Размер матрицы слишком мал");
var matrix = Create(size);
Print(matrix, size);
}
int[,] Create(int size)
{
int[,] matrix = new int[size, size];
Random random = new();
const int targetSum = 100;
for (int row = 0; row < size; row++)
{
for (int column = 0; column < size; column++)
{
int columnsSum = 0;
for (int i = row \- 1; i != \-1; i\-\-) columnsSum += matrix[i, column];
if (row + 1 == size)
{
matrix[row, column] = targetSum \- columnsSum;
continue;
}
int rowsSum = 0;
for (int i = column \- 1; i != \-1; i\-\-) rowsSum += matrix[row, i];
int maxValue = targetSum + 1 \- columnsSum \- rowsSum;
matrix[row, column] = column + 1 == size
? targetSum \- rowsSum
: maxValue < 2
? 0
: random.Next(maxValue);
}
}
return matrix;
}
void Print(int[,] matrix, int size)
{
for (int row = 0; row < size; row++)
{
Console.WriteLine();
for (int column = 0; column < size; column++) Console.Write($"{matrix[row, column]}\t");
}
}
```
🖥 Задача: магическая матрица (*⭐️*)
Написать метод, который принимает размер (N^2), генерирует магическую матрицу и выводит результат на экран. Магическая матрица — это двухмерный массив, в котором сумма элементов в каждом ряду и столбце равна числу 100. Ниже приведены примеры.
MagicMatrix(6);
👉 93 1 5 1 0 0
👉 2 3 74 3 15 3
👉 1 3 2 19 53 22
👉 2 17 0 55 0 26
👉 2 73 0 0 0 25
👉 0 3 19 22 32 24
MagicMatrix(2);
👉 89 11
👉 11 89
MagicMatrix(3);
👉 42 50 8
👉 33 16 51
👉 25 34 41
MagicMatrix(4);
👉 95 1 1 3
👉 0 51 5 44
👉 2 20 34 44
👉 3 28 60 9
Пишите варианты в комментариях. Решение будет сегодня вечером новым постом в канале.
? Unsafe code: указатели на структуры, члены классов и массивы
Продолжаем разбор предыдущей темы.
➡️ Указатели на типы и операция ->
Кроме указателей на простые типы можно использовать указатели на структуры. А для доступа к полям структуры, на которую указывает указатель, используется операция ->:
```
unsafe
{
Point point = new Point(0, 0);
Point* p = &point;
p\->X = 30;
Console.WriteLine(p\->X); // 30
(*p).Y = 100;
Console.WriteLine((*p).Y); // 100
Console.WriteLine(point); // X: 30 Y: 100
}
struct Point
{
public int X { get; set; }
public int Y { get; set; }
public Point(int x, int y)
{
X = x;
Y = y;
}
public override string ToString() => $"X: {X} Y: {Y}";
}
```
Обратите внимание, что просто написать p.X = 30 мы не можем, так как p — это не структура Point, а указатель на структуру. Альтернативой служит операция разыменования (*p).X = 30.
Стоит отметить, что указатель может указывать только на те структуры, которые не имеют полей ссылочных типов (в том числе полей, которые генерируются компилятором автоматически для автосвойств).
➡️ Указатели на массивы и stackalloc
С помощью ключевого слова stackalloc можно выделить память под массив в стеке. Смысл выделения памяти в стеке в повышении быстродействия кода. Посмотрим на примере вычисления квадратов чисел:
```
unsafe
{
const int size = 7;
int square = stackalloc int[size]; // Выделяем память в стеке под семь объектов int
int p = square;
// Считаем квадрат числа
for (int i = 1; i <= size; i++, p++) *p = i * i;
for (int i = 0; i < size; i++) Console.WriteLine(square[i]);
}
```
Оператор stackalloc принимает после себя массив, на который будет указывать указатель.
Для манипуляций с массивом создаем указатель int* p = square, который указывает на первый элемент массива, в котором всего 7 элементов. С помощью указателя p мы сможем перемещаться по массиву square (этакий индексатор).
Далее в цикле происходит подсчёт квадратов чисел от 1 до 7. В цикле для установки значения по адресу, который хранит указатель, выполняется выражение *p = i * i.
Затем происходит инкремент указателя p++, и указатель p смещается вперёд на следующий элемент в массиве square.
➡️ Оператор fixed и закрепление указателей
Кроме структур есть ещё и классы, которые помещают все связанные значения в куче. В работу данных классов может в любой момент вмешаться сборщик мусора, периодически очищающий кучу. Дабы фиксировать на всё время работы указатели на объекты классов используется оператор fixed.
Допустим, у нас есть класс Point:
```
class Point
{
public int x;
public int y;
public override string ToString() => $"x: {x} y: {y}";
}
```
Зафиксируем указатель с помощью оператора fixed:
```
unsafe
{
Point point = new Point();
fixed (int* pX = &point.x) *pX = 30;
fixed (int* pY = &point.y) *pY = 150;
// Можно совместить оба блока
/*fixed (int* pX = &point.x, pY = &point.y)
{
*pX = 30;
*pY = 150;
}*/
Console.WriteLine(point); // x: 30 y: 150
}
```
Оператор fixed создаёт блок, в котором фиксируется указатель на поле объекта person. После завершения блока fixed закрепление с переменных снимается и они могут быть подвержены сборке мусора.
Кроме адреса переменной можно также инициализировать указатель, используя массив, строку или буфер фиксированного размера:
```
unsafe
{
int[] nums = { 0, 1, 2, 3, 7, 8 };
string str = "Привет мир";
fixed (int* p = nums)
{
int num = *(p + 2); // Получим третий элемент
Console.WriteLine(num); // 2
}
fixed (char* p = str)
{
char sym = *(p + 3); // Получим четвёртый элемент
Console.WriteLine(sym); // в
}
}
```
При инициализации указателей на строку следует учитывать, что указатель должен иметь тип char*.
Решение задачи к посту.
```
void CharacterFrequencyAnalyzer(string text)
{
var chars = text.ToLower()
.GroupBy(q => q)
.Select(q => new { Sym = q.Key, Count = q.Count() })
.OrderByDescending(q => q.Count);
foreach (var c in chars) Console.WriteLine($"'{c.Sym}': {c.Count}");
}
```
? Задача: анализ частоты символов (*⭐️*)
Написать метод, который принимает строку, анализирует частоту появления каждого символа в этой строке, сортирует по убыванию частоты и выводит результат на экран. Ниже приведены примеры.
CharacterFrequencyAnalyzer("Привет, мир! Как дела?");
? ' ': 3
? 'р': 2
? 'и': 2
? 'е': 2
? 'к': 2
? 'а': 2
? 'п': 1
? 'в': 1
? 'т': 1
? ',': 1
? 'м': 1
? '!': 1
? 'д': 1
? 'л': 1
? '?': 1
CharacterFrequencyAnalyzer("Сообщение");
? 'о': 2
? 'е': 2
? 'с': 1
? 'б': 1
? 'щ': 1
? 'н': 1
? 'и': 1
CharacterFrequencyAnalyzer("IRON MAN");
? 'n': 2
? 'i': 1
? 'r': 1
? 'o': 1
? ' ': 1
? 'm': 1
? 'a': 1
CharacterFrequencyAnalyzer("Character");
? 'c': 2
? 'a': 2
? 'r': 2
? 'h': 1
? 't': 1
? 'e': 1
Пишите варианты в комментариях. Решение будет сегодня вечером новым постом в канале.
? Задача: N-й элемент арифметической прогрессии (*⭐️*)
Написать метод, который находит N-й элемент арифметической прогрессии. Функция принимает первый элемент прогрессии, шаг (разность) прогрессии и порядковый номер элемента, который нужно вернуть. Ниже приведены примеры.
ArithmeticProgression(firstElem: 5, dif: 3, n: 5)
? 17
ArithmeticProgression(firstElem: 10, dif: \-5, n: 7)
? -20
ArithmeticProgression(firstElem: 1999, dif: 101, n: 3)
? 2201
ArithmeticProgression(firstElem: 1, dif: 1, n: 10)
? 10
Пишите варианты в комментариях. Решение будет сегодня вечером новым постом в канале.
Официальный новостной канал криптобиржи OKX | www.okx.com на русском языке.
💬 Комьюнити: t.me/okx_russian
👨💻 Поддержка: [email protected]
АДМИН: @DaniiOKX
Маркетинг: @CoffeeTrends
Last updated 2 weeks, 5 days ago
Here in simple language about TON and crypto
Founder: @metasalience
contact : @deftalk_bot
Last updated 3 months, 3 weeks ago
Канал о TON и все что с ним связано:
1. Аналитика
2. Инсайды
3. Авторское мнение
Ведро для спама: @ton_telegrambot
Бот с курсами криптовалют: @TonometerBot
Чат: @chaTON_ru
Админ: @filimono
Last updated 3 weeks ago