Visual C ++: побудова графіків з інтерпретацією введеної користувачем функції
В принципі, вся потрібна інформація є ось тут. зробимо по ній закінчений проект.
Структура основної форми показана на малюнку, компоненти в panel1 перераховані по порядку в формі зліва направо, що забезпечує і нормальний порядок обходу полів по клавіші табуляції.
основна форма додатка
Текстових полів можна обмежити максимальний розмір введеної рядки (властивість 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:
друга форма - висновок таблиці значень функції
У цієї форми буде єдиний публічний метод - взяти пару значень (x, y) і додати їх у таблицю:
Такий код методу Do працює при установці властивості
так як при значенні true в таблиці є "додаткова" порожній рядок, яка теж бере участь в нумерації.
А викликати цей метод буде друга кнопка tab з першої форми (функція button2_Click), при цьому, спочатку створиться новий екземпляр Form2. щоб можна було порівняти кілька таблиць:
Щоб це спрацювало, заінклудьте заголовки другий форми на початку коду Form1.h:
Зрозуміло, сам парсер теж подлючён. Це весь проект, можна збирати. Ось приклад роботи програми:
приклад роботи програми
Вирази в парсером пишуться "не зовсім на C ++", загляньте в файл parser.cpp і побачите це, ще краще, можете модифікувати код парсера під свої потреби. Ну і ще багато що можна поліпшити, а я викладу проект в поточному "освітньому" стані.
Найбільш очевидні поліпшення:- округляти вводяться і обчислювані значення до деякого зручного кількості знаків у дробовій частині;
- обмежити максимальну кількість вузлів сітки, наприклад, якоїсь константою maxCollectionSize. При "занадто великому" розмірі колекції Dictionary додаток може зависнути, а який розмір "занадто великий", знає тільки Studio;
- знайти мінімальне і максимальне значення функції, призначивши їх потім мітках осі Y, виконати ту ж роботу і для осі X;
- стежити, чи не вийшло при розрахунку «не-число" Y за допомогою isnan (y) || isinf (y);
- стежити, чи не додаються чи повторно в колекцію елементи з тим же ключем, за допомогою ContainsKey і т.д.