C#Hive: Projects & Progress | Программирование

Description
Сообщество единомышленников C#: решаем задачи, учимся, развиваемся и общаемся вместе. Советы по работе на фрилансе, готовые проекты, код ревью, рекомендации и исследования.

Вопросы/сотрудничество: @tel_phil9
Advertising
We recommend to visit

Официальный новостной канал криптобиржи OKX | www.okx.com на русском языке.

💬 Комьюнити: t.me/okx_russian

👨‍💻 Поддержка: [email protected]

АДМИН: @DaniiOKX
Маркетинг: @CoffeeTrends

Last updated 6 Tage, 8 Stunden her

Здесь простым языком про TON, DFC и крипту.

Принимаем автоматически.
Ссылка для друзей: https://t.me/+-EOfWx2pRKhmNGE6
Связь: @deftalk_bot

Last updated 2 Monate her

Реклама: @kingygmads / Платформа: ton.org.in
Чат: t.me/+QzoGJS7ktps1NOzh
Приватный канал: t.me/investkingyru/417
Помощь: @tonorgin_bot
EN: @investkingyru_en

Last updated 4 Monate her

1 Woche, 5 Tage her
2 Wochen, 2 Tage her

Решение задачи к посту.

```
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");
}
}
```

#Задача #Решение #Полезно

2 Wochen, 2 Tage her

🖥 Задача: магическая матрица (*⭐️*)

Написать метод, который принимает размер (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

Пишите варианты в комментариях. Решение будет сегодня вечером новым постом в канале.

#Задача #Lvl1

3 Monate her

? 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*.

#Полезно #Unsafe #Pointers

3 Monate her

Решение задачи к посту.

```
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}");

}
```

#Задача #Решение #Полезно #LINQ

3 Monate her

? Задача: анализ частоты символов (*⭐️*)

Написать метод, который принимает строку, анализирует частоту появления каждого символа в этой строке, сортирует по убыванию частоты и выводит результат на экран. Ниже приведены примеры.

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

Пишите варианты в комментариях. Решение будет сегодня вечером новым постом в канале.

#Задача #Lvl1

5 Monate, 3 Wochen her
5 Monate, 3 Wochen her

Решение задачи к посту.

int ArithmeticProgression(int firstElem, int dif, int n) => firstElem + (n \- 1) * dif;

#Задача #Решение #Полезно

5 Monate, 3 Wochen her

? Задача: 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

Пишите варианты в комментариях. Решение будет сегодня вечером новым постом в канале.

#Задача #Lvl1

We recommend to visit

Официальный новостной канал криптобиржи OKX | www.okx.com на русском языке.

💬 Комьюнити: t.me/okx_russian

👨‍💻 Поддержка: [email protected]

АДМИН: @DaniiOKX
Маркетинг: @CoffeeTrends

Last updated 6 Tage, 8 Stunden her

Здесь простым языком про TON, DFC и крипту.

Принимаем автоматически.
Ссылка для друзей: https://t.me/+-EOfWx2pRKhmNGE6
Связь: @deftalk_bot

Last updated 2 Monate her

Реклама: @kingygmads / Платформа: ton.org.in
Чат: t.me/+QzoGJS7ktps1NOzh
Приватный канал: t.me/investkingyru/417
Помощь: @tonorgin_bot
EN: @investkingyru_en

Last updated 4 Monate her