Презентация по регулярным выражениям https://drive.google.com/file/d/1Bt6SkfDzYEer5BTTBK-8_8evUzBSnwhr/view?usp=sharing
Станислав Станиславович, пожалуйста, опубликуйте презентацию о Файлах.
Вот ссылка на папку, где будут появляться все используемые презентации 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)
Вот реализация метода для решения данной задачи:
Вот небольшой тест:Скриншот приводить - это конечно круто Ну, мне кажется, что вторая ситуация, это когда sr.Read() возвращает -1, а предыдущий - не пробел. Для этого надо преобразовывать sr.Read() в char позже
Сегодня подсказали решение. Считывать строки из файла, записывать в переменную, добавив к переменной пробел в конец. Тогда все работает. То, что вы написали я даже не особо понял, но все равно спасибо. Кстати, а чем вам скриншоты не понравились?
Их нельзя скопировать в код и попробовать
Кстати, насчет задачи с подсчетом слов, Можно циклом считывать строки и в каждой строке проверять следующее, если первый символ не пробел увеличить кол-во слов, Пройтись дальше по данной строке посимвольно, и если будет встречено слово( пробел- элемент перед словом и непробел-след после него), то продолжать подсчет слов
Станислав Станиславович, я придумала алгоритм без использования рекурсии для Ханойских башен( время написания(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;
}