Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Некорректно работает код на c#

Алена Ученик (81), на голосовании 10 месяцев назад
Я сделала визуализацию стека на односвязном списке. то есть есть 3 кнопки clear, push и pop. Все работает нормально, но при нажатии на кнопку pop удаляются либо все элементы, либо пишет что стек пуст. Стек заполнен, элементы передаются в консолы нормально, стек обновляется. Помогите, пожалуйста, исправить. Скидываю часть кода
 public partial class Form1 : Form 
{
private List stack = new List(); // Односвязный список для хранения стека
private const int itemSize = 25; // Размер элемента стека
private const int spacing = 10; // Расстояние между элементами
private Point stackLocation = new Point(30, 30); // Координаты верхнего элемента стека
private const int maxItems = 10; // Максимальное количество элементов в стеке

private void UpdateStack()
{
panel1.Controls.Clear();
for (int i = 0; i < stack.Count; i++)
{
Panel cell = new Panel();
cell.Size = new Size(itemSize, itemSize);
cell.Location = new Point(stackLocation.X, stackLocation.Y + i * (itemSize + spacing));
cell.BorderStyle = BorderStyle.FixedSingle;

Label label = new Label();
label.Text = stack[i].ToString();
label.Size = new Size(itemSize, itemSize);
label.BorderStyle = BorderStyle.FixedSingle;
label.TextAlign = ContentAlignment.MiddleCenter;
label.Location = new Point(0, 0);
cell.Controls.Add(label);

panel1.Controls.Add(cell);
}
}



private void textBox1_TextChanged(object sender, EventArgs e)
{

}



private void panel1_Paint(object sender, PaintEventArgs e)

{

// Очищаем панель отображения стека

// Отображаем каждый элемент стека на панели
int index = 0;
int maxItemsToDisplay = 10; // Задаем максимальное количество ячеек для отображения
if (stack.Count > maxItemsToDisplay)
{
index = stack.Count - maxItemsToDisplay; // Вычисляем индекс первой ячейки для отображения
}
for (int i = index; i < stack.Count; i++)
{
Label label = new Label();
label.Text = stack[i].ToString();
label.Size = new Size(itemSize, itemSize);
label.BorderStyle = BorderStyle.FixedSingle;
label.TextAlign = ContentAlignment.MiddleCenter;
label.Location = new Point(stackLocation.X, stackLocation.Y + (i - index) * (itemSize + spacing));
panel1.Controls.Add(label);
UpdateStack();
}
}
//кнопка удаления
private void button3_Click(object sender, EventArgs e)
{
int lastItem = stack.LastOrDefault();

if (stack.Count == 0)
{
MessageBox.Show("Stack is empty.");
}
else
{
stack.RemoveAt(lastItem - 1);
UpdateStack();
}
Голосование за лучший ответ
Chromatic Scale Искусственный Интеллект (120806) 11 месяцев назад
Проблема в методе удаления элемента из стека. Вы пытаетесь удалить элемент по индексу lastItem - 1, но lastItem содержит значение последнего элемента стека, а не его индекса. Это может привести к непредсказуемому поведению, когда вы пытаетесь удалить элемент, не находящийся в списке.

Для удаления последнего элемента из списка используйте метод RemoveAt с параметром, равным stack.Count - 1, который удалит элемент с индексом, равным количеству элементов в списке минус один:
 stack.RemoveAt(stack.Count - 1);  

Исправьте метод button3_Click соответственно и попробуйте еще раз:
 private void button3_Click(object sender, EventArgs e) 
{
if (stack.Count == 0)
{
MessageBox.Show("Stack is empty.");
}
else
{
stack.RemoveAt(stack.Count - 1);
UpdateStack();
}
}
АленаУченик (81) 11 месяцев назад
даже после этого исправления работает некорректно. сижу с этой кнопкой 3 дня, но все впустую :(
Chromatic Scale Искусственный Интеллект (120806) Алена, Пожалуйста, опишите, что именно не работает корректно при удалении элемента из стека? Возможно, есть дополнительные ошибки, которые нужно устранить. Например, если после исправления метода button3_Click вы все еще сталкиваетесь с проблемой удаления всех элементов, это может означать, что при каждом обновлении стека в методе UpdateStack вы создаете новые элементы панели для каждого элемента в списке, что приводит к накоплению всех предыдущих элементов на панели и затем к их удалению при вызове метода Clear для панели. Чтобы избежать этого, вы можете предварительно очистить список контролов панели в методе UpdateStack перед созданием новых элементов:
Jurijus Zaksas Искусственный Интеллект (423845) 11 месяцев назад
>Помогите, пожалуйста, исправить.
Используй готовый класс Stack<T> и будет тебе счастье.
Похожие вопросы