Είναι ένα mini tutorial ως προς τον υπολογισμό τών ριζών μίας δευτεροβάθμιας εξίσωσης το οποίο το υπέβαλα για διδασκαλία σε κάποιο Λύκειο.
Οσοι ασχολούνται με προγραμματσμό γνωρίζουν ότι η C++ και η επερχόμενη C++0x είναι αντικειμενοστραφείς γλώσσες το οποίο σημαίνει ότι μπορούμε να υλοποιήσουμε εφαρμογές χρησσιμοποιώντας μεθόδους και αλγορίθμους που έχουν αναπτυχθεί απο άλλους προγραμματιστές και να τα ενσωματώσουμε σε κάποιο δικό μας έργο (project).
Είναι κάτι το οποίο απλόχερα το προσφέρει το ελεύθερο λογισμικό.
Παραθέτω ένα απλό πρόγραμμα που υλοποίησα για τους μαθητές της Β τάξης λυκείου χωρίς χρήση αρχείων .h (headers ή classes).
Code:
/* quadratic.cpp
** To πρόγραμμα επιλύει εξισώσεις Β βαθμού (quadratic equation) αx^2 + βx + γ = 0 .
** Σκοπός του κώδικα είνα να παροτρύνει τους μαθητές να ασχοληθούν με το ελεύθερο λογισμικό και την λογική του .
** Θα ακολουθήσει το ίδιο πρόγραμμα με αρχεία headers ( classes ) και κατασκευή αντικειμένων (objects) .
** επίσης το ίδιο θα γραφεί σε java με το IDE netbeans ( www.netbeans.org ) .
**
** Author: john
** Date : 06/12/2011
** Language : GNU C++
** IDE : Eclipse Galileo ( www.eclipse.org )
** Πλατφόρμα : Linux
** Διανομή : Ubuntu 11.04
** To compile : g++ -o quadratic quadratic.cpp
** Εκτέλεση απο τον ίδιο φάκελο που έγινε compilation : ./quadratic αλλοιώς: /path/to/file/quadratic */
//εντολές προεπεξεργασίας (εδώ είνα τα default headers της GNU C++)
#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;
/* Μέθοδος υπολογισμού της Διακρίνουσας ( determinant() )
Σημ.: ολες οι μεταβλητές είναι τύπου double δηλαδή αριθμοί κινητής υποδιαστολής διπλής ακρίβειας */
double determinant(double arg_a, double arg_b, double arg_c) {
return (arg_b * arg_b) - (4 * arg_a * arg_c);
} // Τέλος μεθόδου determinant()
// Μέθοδος υπολογισμού και εμφάνισης πραγματικών αποτελεσμάτων - real roots ( realRoots() )
void realRoots(double arg_a, double arg_b, double arg_sqrt) {
double firstRoot = (-arg_b/(2 * arg_a)) +
(arg_sqrt/(2 * arg_a));
double secondRoot = (-arg_b/(2 * arg_a)) -
(arg_sqrt/(2 * arg_a));
cout << "\nΧ1: \t" << firstRoot << " (Πραγματικός αριθμός) " << "\n";
cout << "Χ2: \t" << secondRoot << " (Πραγματικός αριθμός) " << "\n";
} // Tέλος μεθόδου realRoots()
// Μέθοδοι εμφάνισης φανταστικών αποτελεσμάτων - imaginary roots ( outpout1() και outpout2() )
void output1(double first, double second) {
cout << "\nΧ1: \t" << first << " + " << second << "i" << " (Μιγαδικός αριθμός) " << "\n";
cout << "\nΧ2: \t" << first << " - " << second << "i" << " (Μιγαδικός αριθμός) " << "\n";
}
void output2(double first, double second) {
second = -(second);
cout << "\nΧ1: \t" << first << " - " << second << "i" << " (Μιγαδικός αριθμός ) " << "\n";
cout << "\nΧ2: \t" << first << " + " << second << "i" << " (Μιγαδικός αριθμός) " << "\n";
}
// Tέλος μεθόδων εμφάνισης φανταστικών αποτελεσμάτων - imaginary roots
// Μέθοδος υπολογισμού φανταστικών αποτελεσμάτων ( imaginaryRoots() )
void imaginaryRoots(double arg_a, double arg_b, double arg_imag_sqrt) {
double two_a = 2 * arg_a;
double first_term = (-arg_b)/two_a;
double second_term = (arg_imag_sqrt)/two_a;
if(second_term >= 0) {
output1(first_term, second_term);
}
else {
output2(first_term, second_term);
}
} // Τέλος μεθόδου imaginaryRoots()
// Κύρια μέθοδος main() η οποία θα χρησιμοποιήσει τις μεθόδους παραπάνω ώστε να μας εξάγει τα αποτελέσματα
int main()
{
cout << "\n********************************************************************************************************************\n";
cout << "* Επίλυση εξισώσεων 2ου βαθμού (αx^2 + βx + γ = 0) *";
cout << "\n********************************************************************************************************************";
cout << "\n* Προτείνεται να γίνεται επαλήθευση του αποτελέσματος με τον κλασσικό τρόπο (επίλυση στο τετράδιο ασκήσεων) *";
cout << "\n********************************************************************************************************************\n";
// Δήλωση μεταβλητών της main()
double a, b, c; // Τα ορίσματα (arguments) που θα εισαγάγει ο χρήστης απο το πληκτρολόγιο
char n; /* Μεταβλητή τύπου char (χαρακτήρα) η οποία ζητήται στο τέλος για συνέχιση ή όχι του προγράμματος
Σημ.: θα μπορούσε να είναι boolean (λογική τιμή -αληθές ή ψευδές-) αλλά θα άλλαζε την ροή του κώδικα
στις τελευταίες γραμμές απαιτόντας έναν επιπλέον βρόγχο if-else (TO DO)*/
// Τέλος δηλώσεων των μεταβλητών της main()
// Παρότρυνση και εισαγωγή των ορισμάτων της εξίσωσης (arguments) απο το πληκτρολόγιο
do {
cout << "\nΠληκτρολογήστε την τιμή του 'α': "; // Παρότρυνση για εισαγωγή του αριθμού α
cin >> a; // Εισαγωγή του αριθμού και καταχώρηση στην μεταβλητή a
cout << "Πληκτρολογήστε την τιμή του 'β': "; // Παρότρυνση για εισαγωγή του αριθμού β
cin >> b; // Εισαγωγή του αριθμού β και καταχώρηση στην μεταβλητή b
cout << "Πληκτρολογήστε την τιμή του 'γ': "; // Παρότρυνση για εισαγωγή του αριθμού γ
cin >> c; // Εισαγωγή του αριθμού γ και καταχώρηση στην μεταβλητή c
/*Υπολογισμός Διακρίνουσας με χρήση της μεθόδου determinant() και ορίσματα τα a,b,c
τα οποία έχει εισαγάγει ο χρήστης απο το πληκτρολόγιο. */
double det = determinant(a, b, c); /* Η μεταβλητή det υπολογίζει την Διακρίνουσα με βάση τα ορίσματα
Σημ.: εδώ γίνεται η χρήση της μεθόδου determinant() */
// Υπολογισμός και εμφάνιση αποτελεσμάτων
/**/
// Αν Διακρίνουσα >= 0
if (det >= 0) {
realRoots(a, b, sqrt(det)); // οι ρίζες είναι πραγματικές - real ( χρήση μεθόδου realRoots() )
}
// Αλλοιώς αν διακρίνουσα > 0
else {
imaginaryRoots(a, b, sqrt(-det)); // οι ρίζες είναι φανταστικές - imaginary ( χρήση μεθόδου imaginaryRoots() )
}
// Παρότρυνση για συνέχεια ή διακοπή του προγράμματος ( Τερματίζεται ή και με ^C σε οποιοδήποτε σημείο )
cout << "\nΘέλετε να επιλύσετε άλλη άσκηση ?";
cout << "\nΔώστε 'y' ή 'Y' για 'Ναί' ή 'Οτιδήποτε άλλο για Τερματισμό': ";
cin >> n;
cout << "\n";
}
while (n == 'y' || n == 'Y'); // Με y ή Y ξαναεκτελείται το πρόγμαμμα με οτιδήποτε άλλο τερματίζεται
return 0;
} // Τέλος της κύριας μεθόδου main()
Η άσκηση ήταν να το υλοποιήσουν με αρχεία .h (headers) και δημιουργία αντικειμένων (objects) μέσα στο αρχείο που περιέχει την main().
Τα παιδιά ενθουσιάστηκαν πάρα πολύ και μέσα σε μία εβδομάδα το είχαν φτιάξει οι πιό πολλοί.
Θα παραθέσω τις απαντήσεις τους κάποια στιγμή μαζί με τον κώδικα που υπέβαλλαν μετά τις (λίγες) διορθώσεις.