Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Работа для программиста > Фриланс
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2017, 16:18   #1
TheStevesCompany
 
Регистрация: 30.10.2016
Сообщений: 4
По умолчанию Стеки и скобочные выражения.

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

Так вот, не могу понять, с чем я накосячил в объектной привязке или у меня пространства неправильно прописаны? Помогите отдебажить код с проверкой в визуалке 17-го.

Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        Color Cherniy = Color.Black;
        Color Zeleniy = Color.Green;
        int k;
        int num = -1;
        Stack<char> C;
        string s;
        Graphics g1, g2;
 
        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            k = 0;
            C = new Stack<char>();
            s = toolStripTextBox1.Text;
            if (Proverka() != true)
            {
                return;
            }
            label1.Text = "Стек";
            panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
            timer1.Enabled = true;
        }
        private bool Proverka()
        {
            if (s == "")
            {
                MessageBox.Show("Строка не введена");
                return false;
            }
            for (int i = 0; i < s.Length; i++)
            {
                if (s[0] == ')' || s[0] == '}' || s[0] == ']')
                {
                    MessageBox.Show("В начале должна стоять скобка");
                    return false;
                }
                if (s[i] != '(' && s[i] != ')' && s[i] != '[' && s[i] != ']' && s[i] != '{' && s[i] != '}')
                {
                    MessageBox.Show("Были введены не только скобки");
                    return false;
                }
            }
            return true;
        }
        private void Draw_stak()
        {
            g1 = panel1.CreateGraphics();
            g1.Clear(Color.White);
            Stack<char> S = new Stack<char>();
            while (C.Count != 0)
            {
                S.Push(C.Pop());
            }
            int i = 0;
            while (S.Count != 0)
            {
                C.Push(S.Peek());
                g1.DrawString(S.Pop().ToString(), new Font("Arial", 11), new SolidBrush(Cherniy), new Point(panel1.Width / 2 - 8, panel1.Height - i * 17 - 25));
                i++;
            }
        }
        private void Draw()
        {
            if (s != null)
            {
                g2 = panel2.CreateGraphics();
                g2.Clear(Color.White);
                for (int i = 0; i < s.Length; i++)
                {
                    if (num == i)
                    {
                        g2.DrawString(s[i].ToString(), new Font("Arial", 11), new SolidBrush(Cherniy), new Point(i * 8, 0));
                    }
                    else
                    {
                        g2.DrawString(s[i].ToString(), new Font("Arial", 11), new SolidBrush(Zeleniy), new Point(i * 8, 0));
                    }
                }
            }
        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            if (s == null)
            {
                timer1.Enabled = false;
                return;
            }
            g1 = panel1.CreateGraphics();
            g2 = panel2.CreateGraphics();
            if (C != null & k != s.Length)
            {
                if (s[k] == '(' || s[k] == '[' || s[k] == '{')
                {
                    num = k;
                    C.Push(s[k]);
                    Draw();
                    Draw_stak();
                    k++;
                    timer1.Enabled = true;
                }
                else
                {
                    if ((s[k] == ')' && C.Peek() == '(') || (s[k] == ']' && C.Peek() == '[') || (s[k] == '}' && C.Peek() == '{'))
                    {
                        num = k;
                        C.Pop();
                        Draw();
                        Draw_stak();
                        k++;
                        timer1.Enabled = true;
                    }
                    else
                    {
                        num = k;
                        Draw();
                        timer1.Enabled = false;
                        MessageBox.Show("Не верный тип закрывающих скобок");
                        return;
                    }
                }
                if (C.Count != 0 && k == s.Length)
                {
                    timer1.Enabled = false;
                    MessageBox.Show("Не хватает закрывающих скобок");
                    return;
                }
                if (C.Count == 0 && k != s.Length && s[k] != '(' && s[k] != '{' && s[k] != '[')
                {
                    timer1.Enabled = false;
                    MessageBox.Show("Не хватает открывающих скобок");
                    return;
                }
                if (C.Count == 0 && k == s.Length)
                {
                    MessageBox.Show("Записано верно");
                    timer1.Enabled= false;
                    return;
                }
            }
        }
        private void panel2_Paint(object sender, PaintEventArgs e)
        {
            if (s != null)
            {
                Draw();
            }
        }
        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            if (C != null && C.Count != 0)
            {
                Draw_stak();
            }
        }
    }
}
TheStevesCompany вне форума Ответить с цитированием
Старый 16.05.2017, 16:24   #2
MansMI
Пользователь
 
Регистрация: 04.07.2012
Сообщений: 32
По умолчанию

mansmi@rambler.ru пишите
MansMI вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывести все правильные скобочные выражения размера 2N. woodey Помощь студентам 8 09.06.2021 22:55
Используя любой из видов циклов, вычислить значения выражения. выражения: Y=ln(x-1)+b Roshen Паскаль, Turbo Pascal, PascalABC.NET 2 18.12.2016 12:18
Построить все правильные скобочные выражения 2N Dr1khem Помощь студентам 6 20.03.2012 16:20
скобочные выражения Visual C++ rest Помощь студентам 4 15.09.2009 01:47
Скобочные выражения(язык C) HellForce Помощь студентам 6 08.05.2009 23:42