Калькулятор множеств - C#

Узнай цену своей работы

Формулировка задачи:

Помогите создать калькулятор множеств, а если конкретнее, то написать такие операции над 2мя множествами как: пересечение, разность, симметрическая разность и декартово произведение, а также отрицание 1-ого или 2-ого множества. Решение такими методами как Intersect, Except и т.д. не предлагать, ибо они некорректно работают для множеств, в которых содержится по несколько одинаковых элементов, а мне нужно учитывать, что такое может случиться, метод Concat решил использовать, потому что он нормально работает независимо от того, повторяются элементы или нет. Вот код, созданный на данный момент.
namespace Multiplicity
{
    class Program
    {
        static void Main(string[] args)
        {
            
            Console.WriteLine("Laba #1");
            Console.Write("Введите количество членов универсального множества: ");
            int n3 = Int32.Parse(Console.ReadLine());
            string[] mn3 = new string[n3];
            Console.WriteLine("Введите элементы множества через Enter");
            for (int i = 0; i < n3; i++)
            {
                string k = Console.ReadLine();
                mn3[i] = k;
            }
                Console.WriteLine();
 
            Console.Write("Введите количество членов A множества: ");
            int n1 = Int32.Parse(Console.ReadLine());
            string[] mn1 = new string[n1];
            Console.WriteLine("Введите элементы множества через Enter");
            for (int i = 0; i < n1; i++)
            {
                string k = Console.ReadLine();
                mn1[i] = k;
            }
                Console.WriteLine();
 
            Console.Write("Введите количество членов B множества: ");
            int n2 = Int32.Parse(Console.ReadLine());
            string[] mn2 = new string[n2];
            Console.WriteLine("Введите элементы множества через Enter");
            for (int i = 0; i < n2; i++)
            {
                string k = Console.ReadLine();
                mn2[i] = k;
            }
                Console.WriteLine();
 
            Console.WriteLine("Объединение A U B"); 
            var result2 = mn1.Concat(mn2);
            foreach (string s in result2)
            Console.WriteLine(s);
                Console.WriteLine();
 
            Console.ReadKey();
 
        }
    }
}

Решение задачи: «Калькулятор множеств»

textual
Листинг программы
class Program
{
    public static void Main()
    {
        int[] left = { 1, 2, 2, 3, 3, 1, 1 };
        int[] right = { 2, 3, 3, 1, 7 };
 
        Console.WriteLine("Left: " + string.Join(" ", left));
        Console.WriteLine("Right: " + string.Join(" ", right));
 
        Console.WriteLine("Except: " + string.Join(" ", left.MyExcept(right)));
        Console.WriteLine("Intersect: " + string.Join(" ", left.MyIntersect(right)));
        Console.WriteLine("Unite: " + string.Join(" ", left.MyUnite(right)));
        Console.WriteLine("Symmetric Difference: " + string.Join(" ", left.MySymmetricDifference(right)));
    }
}
 
public static class EnumerableExtensions
{
    public static IEnumerable<T> MyExcept<T>(this IEnumerable<T> left, IEnumerable<T> right)
    {
        return left.OperationImpl(right, (a, b) => a - b);
    }
    
    public static IEnumerable<T> MyUnite<T>(this IEnumerable<T> left, IEnumerable<T> right)
    {
        return left.Concat(right);
    }
 
    public static IEnumerable<T> MyIntersect<T>(this IEnumerable<T> left, IEnumerable<T> right)
    {
        return left.OperationImpl(right, (a, b) => Math.Min(a, b));
    }
 
    public static IEnumerable<T> MySymmetricDifference<T>(this IEnumerable<T> left, IEnumerable<T> right)
    {
        return left.MyExcept(right).MyUnite(right.MyExcept(left));
    }
 
    private static IEnumerable<T> OperationImpl<T>(this IEnumerable<T> left, IEnumerable<T> right,
        Func<int, int, int> getCount)
    {
        var leftGroups = left.ToLookup(x => x);
        var rightGroups = right.ToLookup(x => x);
 
        foreach (var element in leftGroups)
        {
            var other = rightGroups[element.Key];
 
            int count = getCount(element.Count(), other.Count());
 
            for (int i = 0; i < count; i++)
                yield return element.Key;
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4 из 5
Похожие ответы