ФИИТ 1 курс. Языки программирования. C#

Презентация по регулярным выражениям https://drive.google.com/file/d/1Bt6SkfDzYEer5BTTBK-8_8evUzBSnwhr/view?usp=sharing

1 лайк

Станислав Станиславович, пожалуйста, опубликуйте презентацию о Файлах.

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

В последней презентации по файлам в коде

for (int i=0; i<len; i++)
    {
        var x = br.ReadDouble();
        bw.Seek(-sizeof(double), SeekOrigin.Current);
        bw.Write(x * x);
    }

нет ошибки. Binary Readers не имеют своей Position, а пользуются Position базового потока FileStream. Поэтому когда BinaryReader меняет позицию файлового указателя, для BinaryWriter она тоже меняется. И надо вернуться на один шаг назад. Это как раз и делает

bw.Seek(-sizeof(double), SeekOrigin.Current);

Станислав Станиславович, помните у меня был вопрос по работе модификатора This и его отличиях от ref? Я наконец-то собрался выложить код - https://pastebin.com/CUaSfjAi

Вопрос: Как, не ломая код вида arr.ChangeMem();, получить в последней строчке то же, что и во второй?

Ага. Это называется "метод расширения" Я на лекциях буду рассказывать об этом позже. Возможно, уже скоро.

Видимо, ответ “никак”. Принципиально я говорил, что массивы не используются в задачах, где надо перевыделять память - в них используются List

Конкретно: у Вас глубинная ошибка в коде

        public static void ChangeMem(this int[] a)
        {
            Array.Resize(ref a, a.Length + 1);

Вы вызываете a.ChangeMem() и в этом коде меняете a! Это не сработает - поменяется копия a и Вы её потеряете.

Как раз List является обёрткой над массивами и там это делается внутри. Если хотите сделать что-то подобное, потребуется массив инкапсулировать в класс типа List и в нём вызывать метод ChangeMem, которыый будет полностью менять внутренний массив

Спасибо за развёрнутый ответ. Я понимаю, что это методы расширения и ошибка сознательная для демонстрации того, что я хочу. Думаю, раз адекватных решений нет, то лучше просто не делать подобные вещи методами расширения.

Столкнулся с проблемой при решении домашнего задания по регулярным выражениям.Надо из строки найти все IPv4-адреса и записать в новую строку.Я не так создал регулярное выражение или что- то другое? Сам код вот:

0-255 - это неверно

Спасибо за подсказку. Вот это у меня получилось в конце. Работает

      @"((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)"

Добавил презентацию по классам и АТД. Добавил исходники презентаций

Снова возникла проблема при решении домашнего задания. Вот текст задания:

Дан текстовый файл, содержащий слова, разделённые пробелами или символами конца строки. Посчитать количество слов в этом файле. Указание. Реализовать следующий способ решения задачи: организовать посимвольное чтение файла и считать пробельные символы, следующие за непробельными (фактически, это подсчёт концов слов).

Я написал метод, для решения задачи,но количество слов не совпадает с реальным. Проблема в том, что этот метод не считает слово,стоящее на конце строки. Подскажите, как исправить.(deadline сегодня в 23:00)

Вот реализация метода для решения данной задачи:

Вот небольшой тест:

Видимо Биллу из Майкрософта не понравился Predicate и он решил использовать Func<string, bool>

1 лайк

Скриншот приводить - это конечно круто :frowning: Ну, мне кажется, что вторая ситуация, это когда sr.Read() возвращает -1, а предыдущий - не пробел. Для этого надо преобразовывать sr.Read() в char позже

Сегодня подсказали решение. Считывать строки из файла, записывать в переменную, добавив к переменной пробел в конец. Тогда все работает. То, что вы написали я даже не особо понял, но все равно спасибо. Кстати, а чем вам скриншоты не понравились?:face_with_raised_eyebrow:

Их нельзя скопировать в код и попробовать

Кстати, насчет задачи с подсчетом слов, Можно циклом считывать строки и в каждой строке проверять следующее, если первый символ не пробел увеличить кол-во слов, Пройтись дальше по данной строке посимвольно, и если будет встречено слово( пробел- элемент перед словом и непробел-след после него), то продолжать подсчет слов

Станислав Станиславович, я придумала алгоритм без использования рекурсии для Ханойских башен( время написания(30-60 минут)) Собственно вот

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;

namespace ConsoleApp1
{
    class Program
    {
        static Stack<int> Hanoi(int n)
        {
            Stack<int> st1 = new Stack<int>();
            Stack<int> st2 = new Stack<int>();
            Stack<int> st3 = new Stack<int>();
            for (var i = n; i > 0; i--)
                st1.Push(i);
            while (st3.Count!=n)
            {
                if ((st1.Count() != 0) && (st3.Count == 0 || (st3.Count != 0 && st3.Peek() >= st1.Peek())))
                    st3.Push(st1.Pop());
                else if ((st3.Count() != 0) && (st1.Count == 0 || (st1.Count != 0 && st1.Peek() >= st3.Peek())))
                    st1.Push(st3.Pop());
                if ((st1.Count() != 0) && (st2.Count == 0||(st2.Count != 0 && st2.Peek() >= st1.Peek())))
                    st2.Push(st1.Pop());
                else if ((st2.Count() != 0) && (st1.Count == 0 || (st1.Count != 0 && st1.Peek() >= st2.Peek())))
                        st1.Push(st2.Pop());
            }
            return st3;
        }

        static void Main(string[] args)
        {
            var l = Hanoi(15);
            while (l.Count!=0)
            {
                WriteLine(l.Pop());
            }
        }
    }
}

сам алгоритм

static Stack<int> Hanoi(int n)
{
            Stack<int> st1 = new Stack<int>();
            Stack<int> st2 = new Stack<int>();
            Stack<int> st3 = new Stack<int>();
            for (var i = n; i > 0; i--)
                st1.Push(i);
            while (st3.Count!=n)
            {
                if ((st1.Count() != 0) && (st3.Count == 0 || (st3.Count != 0 && st3.Peek() >= st1.Peek())))
                    st3.Push(st1.Pop());
                else if ((st3.Count() != 0) && (st1.Count == 0 || (st1.Count != 0 && st1.Peek() >= st3.Peek())))
                    st1.Push(st3.Pop());
                if ((st1.Count() != 0) && (st2.Count == 0||(st2.Count != 0 && st2.Peek() >= st1.Peek())))
                    st2.Push(st1.Pop());
                else if ((st2.Count() != 0) && (st1.Count == 0 || (st1.Count != 0 && st1.Peek() >= st2.Peek())))
                        st1.Push(st2.Pop());
            }
            return st3;
        }
2 лайка