Visual C ++: plotarea graficelor cu interpretarea funcției introduse de utilizator
În principiu, toate informațiile necesare sunt aici. Vom face un proiect complet.
Structura formei principale este prezentată în figură, componentele din panoul1 sunt listate în ordine în forma de la stânga la dreapta, ceea ce asigură ordinea obișnuită de traversare a câmpurilor de-a lungul tastei tab.
formularul de cerere de bază
Câmpurile de text pot fi limitate la dimensiunea maximă a șirului de intrare (proprietatea MaxLength). De asemenea, panoul1 este localizat cu proprietatea Dock = Top. și diagram1 cu proprietatea Dock = Fill. Acest lucru va asigura interacțiunea normală a componentelor atunci când se modifică dimensiunea ferestrei. Forma însăși are dimensiunea și dimensiunea minimă setată la 640; 400 - nu pentru a "dispărea" butoanele atunci când fereastra este redusă.
În câmpurile de text sunt date și valori implicite, în timp ce părțile fracționate ale numerelor reale sunt separate de o perioadă, nu de o virgulă - vom face acest lucru în întregul proiect.
Ca alternativă, puteți genera dinamic valori reale ale câmpurilor în funcție de separatorul curent (de exemplu, la evenimentul Load al Formularului 1):
O proprietate globală de tip NumberFormatInfo
care este inițializată în constructorul său:
Lucrarea principală se efectuează făcând clic pe butonul OK (buton1_Click). Vă rugăm să verificați permisibilitatea datelor introduse de o pereche Analizează metode oficiale (a obține numărul) și verificați (validați funcția de înregistrare prin încercarea de a obține valoarea sa de la primul argument). Apoi, metoda Go face o buclă pe valorile dorite ale argumentului, formând o diagramă. Dacă apare o eroare de parser, este afișat un mesaj, dar programul nu se termină. Doar în date nu vor exista perechi de valori.
Parserul este același cu cel de mai sus. Aici este codul complet al fragmentului:
Singurul lucru nou în legătură cu articolul -
Dacă standardele naționale presupun că partea fracționată a unui număr real este separată de virgulă, mai degrabă decât de un punct, în locul operatorului
Adăugați un al doilea formular în proiect, unde puteți afișa tabelele de date din diagramă. Pentru a face acest lucru, mergeți la meniul Project - Adăugați un element nou - Formați Windows Forms și formați-l Form2. În cea de-a doua formulă adăugăm DataGridView. pune proprietățile Dock = Umpleți-l. ScrollBars = Vertical și pregătește 2 coloane pentru afișarea valorilor X și Y:
Al doilea formular este rezultatul tabelului cu valori de funcții
Acest formular va avea singura metodă publică - de a lua o pereche de valori (x, y) și a le adăuga în tabel:
Un astfel de cod al metodei Do funcționează la setarea unei proprietăți
deoarece la o valoare adevărată în tabel există un șir gol "suplimentar", care participă și la numerotare.
Și apelați această metodă va fi al doilea buton tab din primul formular (funcția button2_Click), în același timp, o nouă instanță a Form2 va fi creată mai întâi. astfel încât să puteți compara mai multe tabele:
Pentru ca aceasta să funcționeze, introduceți anteturile celui de-al doilea formular la începutul codului Form1.h:
Desigur, parserul în sine este, de asemenea, sublimat. Acesta este întregul proiect pe care îl puteți aduna. Iată un exemplu de funcționare a programului:
exemplu al programului
Expresiile din parser sunt scrise "nu chiar în C ++", uitați-vă în fișierul parser.cpp și vedeți-o, chiar mai bine, puteți modifica codul de parser pentru nevoile dvs. Ei bine, există multe care pot fi îmbunătățite și voi pune proiectul în actualul "educativ" stat.
Cele mai evidente îmbunătățiri:- rotunjiți valorile de intrare și calculate la un număr convenabil de cifre din partea fracționată;
- limitați numărul maxim de noduri de rețea, de exemplu, prin unele constante maxCollectionSize. Dacă colecția de dictionare este prea mare, aplicația poate să se închidă și ce dimensiune este "prea mare" numai Studio știe;
- găsiți valorile minime și maxime ale funcției, atribuindu-le etichetelor axei Y, fac același lucru pentru axa X;
- Pentru a urmări, dacă s-a dovedit la calcul "nu-număr" Y cu isnan (y) || isinf (y);
- Pentru a vedea dacă elementele cu aceeași cheie sunt adăugate în mod repetat la colecție, folosind ContainsKey, etc.