با توجه به سوالات شما، کد های مورد نیاز برای حل هر مسئله به شرح زیر است.
1. شرکت با مدیر، برنامه نویس، و کارمند اداری
public class Person
{
public string Name {get; private set;}
public string Position {get; protected set;}
public Person(string name)
{
Name = name;
}
public virtual void WritePosition()
{
Console.WriteLine(Position);
}
~Person()
{
Console.WriteLine($"Destroying: {Name}, {Position}");
}
}
public class Manager : Person
{
public int EmployeeCount {get; set;}
public Manager(string name) : base(name)
{
Position = "Manager";
}
}
public class Programmer : Person
{
public string ManagerName {get; set;}
public Programmer(string name, string managerName) : base(name)
{
Position = "Programmer";
ManagerName = managerName;
}
}
public class AdministrativeStaff : Person
{
public string ManagerName {get; set;}
public AdministrativeStaff(string name, string managerName) : base(name)
{
Position = "Administrative Staff";
ManagerName = managerName;
}
}
public abstract class Informer
{
public abstract void Inform();
}
public class EmailInformer : Informer
{
public override void Inform()
{
Console.WriteLine("Informing via Email");
}
}
public class SMSInformer : Informer
{
public override void Inform()
{
Console.WriteLine("Informing via SMS");
}
}
```
2. کلاس HugeInteger
public class HugeInteger
{
private int[] digits = new int[40];
private bool isNegative;
public HugeInteger()
{
}
public HugeInteger(string value)
{
if (value.Length > 40 || !Regex.IsMatch(value, @"^[-+]?[0-9]*$"))
{
Console.WriteLine("Invalid input. Setting value to 0");
return;
}
isNegative = value.StartsWith('-');
var digitChars = value.TrimStart('-', '+').ToCharArray();
Array.Reverse(digitChars);
for (int i = 0; i < digitChars.Length; i++)
{
digits[i] = int.Parse(digitChars[i].ToString());
}
}
public override string ToString()
{
var stringBuilder = new StringBuilder(isNegative ? "-" : "");
var started = false;
for (int i = digits.Length - 1; i >= 0; i--)
{
if (started || digits[i] != 0)
{
started = true;
stringBuilder.Append(digits[i]);
}
}
if (!started) // the number is 0
stringBuilder.Append('0');
return stringBuilder.ToString();
}
// Comparison methods go here
}
3. ضرب ماتریسها
public class MatrixMultiplier
{
public static int[,] Multiply(int[,] a, int[,] b)
{
int[,] result = new int[a.GetLength(0), b.GetLength(1)];
List<Task> tasks = new List<Task>();
for (int i = 0; i < result.GetLength(0); i++)
{
for (int j = 0; j < result.GetLength(1); j++)
{
int row = i;
int col = j;
tasks.Add(Task.Run(() =>
{
for (int k = 0; k < a.GetLength(1); k++)
{
result[row, col] += a[row, k] * b[k, col];
}
}));
}
}
Task.WaitAll(tasks.ToArray());
return result;
}
}
4. ConcurrentIntegerList
public class ConcurrentIntegerList
{
private List<int> list = new List<int>();
private object lockObject = new object();
public void Add(int item)
{
lock (lockObject)
{
list.Add(item);
}
}
public int Get(int index)
{
lock (lockObject)
{
return list[index];
}
}
// other methods go here
}
در مورد مفاهیم Exclusion Mutual و Section Critical،**Exclusion Mutual (Mutex)**:
Exclusion Mutual یا Mutex مفهومی در همزمانی و چند نخی است که نشان میدهد فقط یک نخ به طور همزمان میتواند منابع مشترک را استفاده کند. نحوه کار کردن Mutex این است که هرگاه نخی منبعی را درخواست میکند، این نخ باید ابتدا Mutex را درخواست کند. اگر Mutex در دسترس باشد، به نخ درخواست کننده اختصاص داده میشود (یا "قفل" میشود) و نخ میتواند منبع را استفاده کند. هنگامی که نخ کار خود را با منبع تمام میکند، Mutex "باز" (یا "رها") میشود و سپس برای درخواستهای دیگر نخها در دسترس است.
Critical Section یا بخش حساس، قسمتی از کد است که به دسترسی به منابع مشترک نیاز دارد و بنابراین باید در زمان اجرا از دسترسی همزمان چندین نخ جلوگیری شود. این امر معمولاً با استفاده از مکانیزمهایی مانند Mutex ها یا سمافورها انجام میشود. در برنامهنویسی چند نخی، این بسیار مهم است که نخها در حین اجرای بخشهای حساس به صورت همزمان به منابع مشترک دسترسی نداشته باشند، زیرا این میتواند منجر به وضعیتهای ناپایدار یا غیر قابل پیشبینی شود.