Курс "Языки программирования" (лекции) 2 семестр 2018-19 гг.


#1

Мы переходим на C#.

Помимо быстрого введения на лекциях и не практике можно пользоваться неплохими материалами отсюда: https://ulearn.me/Course/BasicProgramming 28

Вот ссылка на папку, где будут появляться все используемые презентации https://drive.google.com/drive/folders/1bcJ4Fdx2JBlq6A1RXPZiKjPQp7kfxZyG?usp=sharing 37

Шпаргалка по C# CSharpCrib.pdf (131,7 КБ)


#2

Делал домашнее задание и возникла проблема. Как сравнить два целочисленных массива на равенство? Array.Equals() пробовал - не работает.


#3

a.SequenceEqual(b)


#4

Здравствуйте, по поводу опционального задания по стеку на c# (калькулятор выражений в ПАЛИЗ) решение можно кинуть в это обсуждение? И если - да, то в каком виде? Заранее спасибо.


#5

Кидайте. В виде кода.


#8
`var st = new Stack<int>();
        bool flag;
        do
        {
            flag = true;
            Console.WriteLine("Введите выражение в ПОЛИЗ");
            var expr = Console.ReadLine();
            var ss = Regex.Matches(expr, @"\d+|[+*]"); 
            if ((ss.Count == 0) || (ss[ss.Count-1].Value!="+")&&(ss[ss.Count - 1].Value != "*")) // Есть хоть одно совпадение и выражение завершается оператором
            {
                flag = false;
            }
            foreach (Match m in ss)
            {
                if (int.TryParse(m.Value, out int a))
                {
                    st.Push(a);
                }
                else if ((m.Value == "+") && (st.Count >= 2))
                {
                    st.Push(st.Pop() + st.Pop());
                }
                else if ((m.Value == "*") && (st.Count >= 2))
                {
                    st.Push(st.Pop() * st.Pop());
                }
                else
                {
                    flag = false;
                }
            }
            if (!flag)
            {
                Console.WriteLine("Please, try again");
            }
        } while (!flag);
        Console.WriteLine($"Ответ:{st.Pop()}");
        Console.ReadLine();`

#9

А где тексты ошибок, выдаваемых при компиляции неправильного выражения?


#10

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


#11
var st = new Stack<int>();
        int flag = 0;
        do
        {
            flag = 0;
            Console.WriteLine("Введите выражение в ПОЛИЗ");
            var expr = Console.ReadLine();
            var ss = Regex.Matches(expr, @"\d+|[+*]");
            if (ss.Count == 0)// Есть хоть одно совпадение
            {
                flag = 2;
                Console.WriteLine("Вы ввели строку, не содержащую допустимых символов");
            }
            else
            {
                foreach (Match m in ss)
                {
                    if (int.TryParse(m.Value, out int a))
                    {
                        st.Push(a);
                    }
                    else if ((m.Value == "+") && (st.Count >= 2))
                    {
                        st.Push(st.Pop() + st.Pop());
                    }
                    else if ((m.Value == "*") && (st.Count >= 2))
                    {
                        st.Push(st.Pop() * st.Pop());
                    }
                    else
                    {
                        flag = 1;
                    }
                }    
            }
            if ((st.Count > 1)||(flag==1))
            {
                flag = 200;
                Console.WriteLine("В выражении неверное кол-во операторов");
                while (st.Count != 0)
                {
                    st.Pop();
                }
            }
            if (flag > 0)
            {
                Console.WriteLine("Пожалуйста, повторите попытку");
            }
        } while (flag > 0);
        Console.WriteLine($"Ответ:{st.Pop()}");
        Console.ReadLine();

#12

Удаление корня из бинарного дерева поиска (без повторений). Работает чаще, чем нет.

        static void DelRoot(ref TreeNode<int> root, int search)
        {
            if (root == null)
                return;
            else if (root.data == search && (root.left == null || root.right == null))
                root = root.left ?? root.right;
            else if (root.data == search)
            {
                var t = RightMost(root.left);
                root.data = t.data;
                t.data = search;
                DelRoot(ref root.left, search);
            }
            else if (root.data > search)
                DelRoot(ref root.left, search);
            else
                DelRoot(ref root.right, search);
        }

        static TreeNode<T> RightMost<T>(TreeNode<T> root)
        {
            if (root == null)
                return null;
            if (root.right != null)
                return (RightMost(root.right));
            return root;
        }

#13

Вы же помните критерий эффективности программы #0. :sunglasses:


#14

У меня соответствует для любого узла дерева.


#15

Я честно говоря не понял фразу “работает чаще чем нет”. Есть ли случай, когда работает неправильно?


#16

Щютка. У меня таких случаев не нашлось, обрабатывает все случаи, включая удаление несуществующего узла.