Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 23.02.2020
Сообщений: 7
.NET Core

Не понимаю где ошибка в коде

05.05.2021, 12:18. Показов 907. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Написал игру судоку под поведенчиский паттерн Снимок.Но в коде метод Backup работает криво. Я когда меняю чифру в массиве и делаю бэкап, то почему-то меняются все бекапы которые были до этого. Из-за этого я не могу использовать метод Undo.

Пример паттерна

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
 
namespace RefactoringGuru.DesignPatterns.Memento.Conceptual
{
    // Создатель содержит некоторое важное состояние, которое может со временем
    // меняться. Он также объявляет метод сохранения состояния внутри снимка и
    // метод восстановления состояния из него.
    class Originator
    {
        // Для удобства состояние создателя хранится внутри одной переменной.
        private string _state;
 
        public Originator(string state)
        {
            this._state = state;
            Console.WriteLine("Originator: My initial state is: " + state);
        }
 
        // Бизнес-логика Создателя может повлиять на его внутреннее состояние.
        // Поэтому клиент должен выполнить резервное копирование состояния с
        // помощью метода save перед запуском методов бизнес-логики.
        public void DoSomething()
        {
            Console.WriteLine("Originator: I'm doing something important.");
            this._state = this.GenerateRandomString(30);
            Console.WriteLine($"Originator: and my state has changed to: {_state}");
        }
 
        private string GenerateRandomString(int length = 10)
        {
            string allowedSymbols = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
            string result = string.Empty;
 
            while (length > 0)
            {
                result += allowedSymbols[new Random().Next(0, allowedSymbols.Length)];
 
                Thread.Sleep(12);
 
                length--;
            }
 
            return result;
        }
 
        // Сохраняет текущее состояние внутри снимка.
        public IMemento Save()
        {
            return new ConcreteMemento(this._state);
        }
 
        // Восстанавливает состояние Создателя из объекта снимка.
        public void Restore(IMemento memento)
        {
            if (!(memento is ConcreteMemento))
            {
                throw new Exception("Unknown memento class " + memento.ToString());
            }
 
            this._state = memento.GetState();
            Console.Write($"Originator: My state has changed to: {_state}");
        }
    }
 
    // Интерфейс Снимка предоставляет способ извлечения метаданных снимка, таких
    // как дата создания или название. Однако он не раскрывает состояние
    // Создателя.
    public interface IMemento
    {
        string GetName();
 
        string GetState();
 
        DateTime GetDate();
    }
 
    // Конкретный снимок содержит инфраструктуру для хранения состояния
    // Создателя.
    class ConcreteMemento : IMemento
    {
        private string _state;
 
        private DateTime _date;
 
        public ConcreteMemento(string state)
        {
            this._state = state;
            this._date = DateTime.Now;
        }
 
        // Создатель использует этот метод, когда восстанавливает своё
        // состояние.
        public string GetState()
        {
            return this._state;
        }
        
        // Остальные методы используются Опекуном для отображения метаданных.
        public string GetName()
        {
            return $"{this._date} / ({this._state.Substring(0, 9)})...";
        }
 
        public DateTime GetDate()
        {
            return this._date;
        }
    }
 
    // Опекун не зависит от класса Конкретного Снимка. Таким образом, он не
    // имеет доступа к состоянию создателя, хранящемуся внутри снимка. Он
    // работает со всеми снимками через базовый интерфейс Снимка.
    class Caretaker
    {
        private List<IMemento> _mementos = new List<IMemento>();
 
        private Originator _originator = null;
 
        public Caretaker(Originator originator)
        {
            this._originator = originator;
        }
 
        public void Backup()
        {
            Console.WriteLine("\nCaretaker: Saving Originator's state...");
            this._mementos.Add(this._originator.Save());
        }
 
        public void Undo()
        {
            if (this._mementos.Count == 0)
            {
                return;
            }
 
            var memento = this._mementos.Last();
            this._mementos.Remove(memento);
 
            Console.WriteLine("Caretaker: Restoring state to: " + memento.GetName());
 
            try
            {
                this._originator.Restore(memento);
            }
            catch (Exception)
            {
                this.Undo();
            }
        }
 
        public void ShowHistory()
        {
            Console.WriteLine("Caretaker: Here's the list of mementos:");
 
            foreach (var memento in this._mementos)
            {
                Console.WriteLine(memento.GetName());
            }
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            // Клиентский код.
            Originator originator = new Originator("Super-duper-super-puper-super.");
            Caretaker caretaker = new Caretaker(originator);
 
            caretaker.Backup();
            originator.DoSomething();
 
            caretaker.Backup();
            originator.DoSomething();
 
            caretaker.Backup();
            originator.DoSomething();
 
            Console.WriteLine();
            caretaker.ShowHistory();
 
            Console.WriteLine("\nClient: Now, let's rollback!\n");
            caretaker.Undo();
 
            Console.WriteLine("\n\nClient: Once more!\n");
            caretaker.Undo();
 
            Console.WriteLine();
        }
    }
}
Мой код

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
 
namespace OOPLab3
{
    class Program
    {
        static void Main(string[] args)
        {
            int[,] MainGame = { { 0, 0, 0, 0, 5, 0, 0, 8, 0 }, { 4, 0, 5, 0, 8, 6, 0, 0, 2 }, { 0, 0, 8, 0, 9, 0, 0, 0, 5 }, { 0, 0, 2, 5, 7, 0, 0, 0, 3 }, { 0, 8, 0, 0, 0, 0, 0, 7, 0 }, { 6, 0, 0, 0, 3, 4, 1, 0, 0 }, { 7, 0, 0, 0, 1, 0, 4, 0, 0 }, { 5, 0, 0, 2, 6, 0, 9, 0, 7 }, { 0, 3, 0, 0, 4, 0, 0, 0, 0 } };
            Sudoku sudoku = new Sudoku(MainGame);
            Caretaker caretaker = new Caretaker(sudoku);
            
            caretaker.Backup();
            sudoku.AddNum(0,0,4);
 
            caretaker.Backup();
            sudoku.AddNum(0,1,3);
 
            caretaker.ShowHistory();
 
            caretaker.Undo();
            sudoku.Show();
 
 
        }
 
        class Sudoku
        {
            private int[,] _state;
 
            public Sudoku(int[,] state)
            {
                this._state = state;
                Console.WriteLine("Your game is ready");
            }
 
            public void AddNum(int i, int j, int k)
            {
                this._state[i, j] = k;
            }
 
            public void Show()
            {
                for (int i = 0; i < 9; i++)
                {
                    for (int j = 0; j < 9; j++)
                    {
                        Console.Write(this._state[i,j] + " ");
                    }
                    Console.WriteLine();
                }
            }
 
            public IMemento Save()
            {
                return new ConcreteMemento(this._state);
            }
 
            public void Restore(IMemento memento)
            {
                if(!(memento is ConcreteMemento))
                {
                    throw new Exception("Some error");
                }
 
                this._state = memento.GetState();
            }
        }
 
        public interface IMemento
        {
            int[,] GetState();
            void GetName();
            DateTime GetDate();
        }
 
        class ConcreteMemento : IMemento
        {
            private int[,] _state;
 
            private DateTime _date;
 
            public ConcreteMemento(int[,] state)
            {
                this._state = state;
                this._date = DateTime.Now;
            }
 
            public int[,] GetState()
            {
                return this._state;
            }
 
            public void GetName()
            {
                Console.WriteLine(this._date);
                for (int i = 0; i < 9; i++)
                {
                    for (int j = 0; j < 9; j++)
                    {
                        Console.Write(this._state[i, j] + " ");
                    }
                    Console.WriteLine();
                }
                Console.WriteLine("------------------");
            }
 
            public DateTime GetDate()
            {
                return this._date;
            }
        }
 
        class Caretaker
        {
            private List<IMemento> _mementos = new List<IMemento>();
 
            private Sudoku _sudoku = null;
 
            public Caretaker(Sudoku sudoku)
            {
                this._sudoku = sudoku;
            }
 
            public void Backup()
            {
                Console.WriteLine("Saving data");
                this._mementos.Add(this._sudoku.Save());
            }
 
            public void Undo()
            {
                if(this._mementos.Count == 0)
                {
                    return;
                }
 
                var memento = this._mementos.Last();
                this._mementos.Remove(memento);
 
                try
                {
                    this._sudoku.Restore(memento);
                }
                catch(Exception)
                {
                    this.Undo();
                }
            }
 
            public void ShowHistory()
            {
                foreach(var memento in this._mementos)
                {
                    memento.GetName();
                }
            }   
        }
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.05.2021, 12:18
Ответы с готовыми решениями:

Не понимаю, где ошибка в коде скрипта
Задание 1. создать скрипт с выводом таблиц из бд с этим все вроде получилось Задание 2. сделать форму для ввода и потом чтобы в бд...

Вывести на экран количество слов где первая и последняя буквы одинаковы (не понимаю где ошибка)
задан текст нужно вывести на экран количество слов где первая и последняя буквы одинаковы #include &lt;iostream&gt; #include...

Ошибка в коде, которую я не понимаю
Я написал код, который преподаватель оценил как &quot;г..... код&quot;, что с ним не так я не понял var label = $(&quot;label,label&quot;); ...

3
 Аватар для lovember
152 / 100 / 40
Регистрация: 14.10.2016
Сообщений: 379
05.05.2021, 15:50
MaxKravchuk, Вынесите инициализацию полей _mementos и _sudoku класса Caretaker в конструктор.
Мне почему-то кажется, что проблема в этом.

C#
117
118
119
120
121
122
123
124
125
126
127
128
129
class Caretaker
{
    private List<IMemento> _mementos  { get; set; }
 
    private Sudoku _sudoku { get; set; }
 
    public Caretaker(Sudoku sudoku)
    {
        _sudoku = sudoku;
        _mementos = new List<IMemento>();
    }
/*Дальнейший код класса*/
}
1
0 / 0 / 0
Регистрация: 23.02.2020
Сообщений: 7
05.05.2021, 16:38  [ТС]
Оно все равно меняет значения тех сохраненных массивов(
0
 Аватар для lovember
152 / 100 / 40
Регистрация: 14.10.2016
Сообщений: 379
05.05.2021, 18:04
У вас нарушен принцип инкапсуляции полей в классах ConcreteMemento и Sudoku.
Ниже пример задания поля _state для класса ConcreteMemento. Аналогично переделайте и для Sudoku.
Если массивы сделать "зубчатыми", т.е. массив массивов, то вместо вложенных for можно будет использовать CopyTo.
Также у вас везде излишняя this. Если имя поля не совпадает с именем локальной переменной, из которой поле получает значение, то уточнение this не нужно. У вас есть подчёркивание, что делает имена разными. Поэтому this не нужна.

Почитайте про ссылочные типы и инкапсуляцию.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
            class ConcreteMemento : IMemento
            {
                private int[,] _state { get; set; }
 
                private DateTime _date;
 
                public ConcreteMemento(int[,] state)
                {
                    int rows = state.GetUpperBound(0);
                    int columns = state.GetUpperBound(1);
                    _state = new int[rows, columns];
                    for (int i = 0; i < rows; i++)
                    {
                        for (int j = 0; j < columns; j++)
                        {
                            _state[i, j] = state[i, j];
                        }
                    }
                    _date = DateTime.Now;
                }
            }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.05.2021, 18:04
Помогаю со студенческими работами здесь

Не понимаю в чем ошибка в коде программы
Задание: Напишите программу, которая вычисляет выражение, состоящее из трех чисел и двух знаков (допускаются только знаки «+» или «–»)....

не понимаю где ошибка
Помогите найти ошибку почему программа находит координаты 2-х точек пересечения а пишет что их 3? (параметры n=3 m=3 точки...

Не понимаю где ошибка
const n=10; var a:array of integer; b, c, d: integer; begin write('исходный массив'); readln(d); for b:=1 to n do ...

Не понимаю где ошибка
Всем доброго времени суток, есть код на pascal его нужно перевести в python, не могу понять что не так. var x,y: real; begin write...

Не понимаю, где ошибка
Доброго времени суток! Решаю задачу с тимуса, вот условие: http://acm.timus.ru/problem.aspx?space=1&amp;num=1118 Не понимаю, где...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru