Visual c побудова графіків з інтерпретацією введеної користувачем функції

Visual C ++: побудова графіків з інтерпретацією введеної користувачем функції

В принципі, вся потрібна інформація є ось тут. зробимо по ній закінчений проект.

Структура основної форми показана на малюнку, компоненти в panel1 перераховані по порядку в формі зліва направо, що забезпечує і нормальний порядок обходу полів по клавіші табуляції.

Visual c побудова графіків з інтерпретацією введеної користувачем функції

основна форма додатка

Текстових полів можна обмежити максимальний розмір введеної рядки (властивість MaxLength). Також panel1 розташована з властивістю Dock = Top. а chart1 з властивістю Dock = Fill. Це забезпечить нормальну взаємодію компонент при зміні розмірів вікна. У самій форми виставлені Size і MinimumSize в значення 640; 400 - щоб не "зникали" кнопки при зменшенні вікна.

Текстових полів також дані значення за замовчуванням, дробові частини дійсних чисел при цьому відокремлені крапкою, а не комою - будемо так робити в усьому проекті.

Як альтернатива, можна формувати речові значення полів динамічно в залежності від поточного роздільник (наприклад, за подією Load форми 1):

У форму також додано глобальне властивість типу NumberFormatInfo

яке проініціалізувати в її конструкторі:

Основна робота виконується після натискання на кнопку OK (button1_Click). Спочатку перевіряємо допустимість введених даних за допомогою пари службових методів Parse (отримати число) і Check (перевірити правильність запису функції, спробувавши отримати її значення від 1-го аргументу). Потім метод Go робить цикл по потрібним значенням аргументу, формуючи діаграму. Якщо виникає помилка парсеру, про неї виводиться повідомлення, але програма не закінчується. Просто в даних не буде якоїсь пари значень.

Парсер той же, що за посиланням вище. Ось повний код фрагмента:

Єдина нова по відношенню до статті дрібниця -

Якщо національні стандарти припускають, що дрібна частина дійсного числа відокремлюється від цілої комою, а не крапкою, замість оператора

Додамо в проект другу форму, куди можна буде виводити таблиці даних з діаграми. Для цього звернемося до меню Проект - Додати новий елемент - Форма Windows Forms і назвемо її Form2. На другу форму додамо DataGridView. поставимо йому властивості Dock = Fill. ScrollBars = Vertical і підготуємо 2 стовпці для виведення значень X і Y:

Visual c побудова графіків з інтерпретацією введеної користувачем функції

друга форма - висновок таблиці значень функції

У цієї форми буде єдиний публічний метод - взяти пару значень (x, y) і додати їх у таблицю:

Такий код методу Do працює при установці властивості

так як при значенні true в таблиці є "додаткова" порожній рядок, яка теж бере участь в нумерації.

А викликати цей метод буде друга кнопка tab з першої форми (функція button2_Click), при цьому, спочатку створиться новий екземпляр Form2. щоб можна було порівняти кілька таблиць:

Щоб це спрацювало, заінклудьте заголовки другий форми на початку коду Form1.h:

Зрозуміло, сам парсер теж подлючён. Це весь проект, можна збирати. Ось приклад роботи програми:

Visual c побудова графіків з інтерпретацією введеної користувачем функції

приклад роботи програми

Вирази в парсером пишуться "не зовсім на C ++", загляньте в файл parser.cpp і побачите це, ще краще, можете модифікувати код парсера під свої потреби. Ну і ще багато що можна поліпшити, а я викладу проект в поточному "освітньому" стані.

Найбільш очевидні поліпшення:
  • округляти вводяться і обчислювані значення до деякого зручного кількості знаків у дробовій частині;
  • обмежити максимальну кількість вузлів сітки, наприклад, якоїсь константою maxCollectionSize. При "занадто великому" розмірі колекції Dictionary додаток може зависнути, а який розмір "занадто великий", знає тільки Studio;
  • знайти мінімальне і максимальне значення функції, призначивши їх потім мітках осі Y, виконати ту ж роботу і для осі X;
  • стежити, чи не вийшло при розрахунку «не-число" Y за допомогою isnan (y) || isinf (y);
  • стежити, чи не додаються чи повторно в колекцію елементи з тим же ключем, за допомогою ContainsKey і т.д.

Схожі статті