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

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

Алена Ученик (23), на голосовании 2 дня назад
Я сделала визуализацию стека на односвязном списке. то есть есть 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 Просветленный (32852) 1 месяц назад
Проблема в методе удаления элемента из стека. Вы пытаетесь удалить элемент по индексу 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();
}
}
АленаУченик (23) 1 месяц назад
даже после этого исправления работает некорректно. сижу с этой кнопкой 3 дня, но все впустую :(
Chromatic Scale Просветленный (32852) Алена, Пожалуйста, опишите, что именно не работает корректно при удалении элемента из стека? Возможно, есть дополнительные ошибки, которые нужно устранить. Например, если после исправления метода button3_Click вы все еще сталкиваетесь с проблемой удаления всех элементов, это может означать, что при каждом обновлении стека в методе UpdateStack вы создаете новые элементы панели для каждого элемента в списке, что приводит к накоплению всех предыдущих элементов на панели и затем к их удалению при вызове метода Clear для панели. Чтобы избежать этого, вы можете предварительно очистить список контролов панели в методе UpdateStack перед созданием новых элементов:
Jurijus Zaksas Искусственный Интеллект (393945) 1 месяц назад
>Помогите, пожалуйста, исправить.
Используй готовый класс Stack<T> и будет тебе счастье.
Похожие вопросы