προγραμματισμός εργαστήριο

94
ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΤΜΗΜΑ ΦΥΣΙΚΗΣ ΤΟΜΕΑΣ ΗΛΕΚΤΡΟΝΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ ΙI Εργαστηριακές Ασκήσεις Δ. Μπακάλης Επίκουρος Καθηγητής ΠΑΤΡΑ, ΙΑΝΟΥΑΡΙΟΣ 2012

description

αφού σου λέω. είναι πολύ χοντρή ρε!

Transcript of προγραμματισμός εργαστήριο

Page 1: προγραμματισμός εργαστήριο

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΤΜΗΜΑ ΦΥΣΙΚΗΣ

ΤΟΜΕΑΣ ΗΛΕΚΤΡΟΝΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ ΙI

Εργαστηριακές Ασκήσεις

Δ. Μπακάλης

Επίκουρος Καθηγητής

ΠΑΤΡΑ, ΙΑΝΟΥΑΡΙΟΣ 2012

Page 2: προγραμματισμός εργαστήριο

2

«Ακούω και ξεχνάω,

βλέπω και θυμάμαι,

κάνω και καταλαβαίνω.»

Page 3: προγραμματισμός εργαστήριο

3

Πρόλογος

Το κείμενο αυτό αποτελεί την έκτη έκδοση μίας σειράς εργαστηριακών

ασκήσεων για το μάθημα «Προγραμματισμός Η/Υ ΙΙ – Εργαστήριο» του 2ου

εξαμήνου σπουδών, σύμφωνα με το νέο πρόγραμμα σπουδών το οποίο εφαρμόζεται

στο τμήμα Φυσικής του Πανεπιστημίου Πατρών από το ακαδημαϊκό έτος 2006-

2007. Αποτελεί εξέλιξη των ασκήσεων οι οποίες χρησιμοποιήθηκαν κατά τα

προηγούμενα ακαδημαϊκά έτη. Προσθήκες και βελτιώσεις έγιναν μετά από

υπόδειξη του καθηγητή κ. Β. Γερογιάννη ο οποίος παρείχε και τη σχετική

βιβλιογραφία.

Οι εργαστηριακές ασκήσεις χωρίζονται σε εννέα ενότητες. Οι έξι πρώτες ενότητες

χρησιμοποιούν ταυτόχρονα τις γλώσσες προγραμματισμού Fortran και C++ και

ασχολούνται με το δομημένο προγραμματισμό και συγκεκριμένα με σταθερές και

μεταβλητές ποσότητες, δομές επιλογής, δομές επανάληψης, πίνακες,

υποπρογράμματα και διαχείριση αρχείων δεδομένων / αποτελεσμάτων. Οι τρεις

τελευταίες ενότητες χρησιμοποιούν μόνο τη γλώσσα προγραμματισμού C++ και

ασχολούνται με τον αντικειμενοστραφή προγραμματισμό και συγκεκριμένα με

τάξεις και αντικείμενα, υπερφόρτωση τελεστών και συναρτήσεων και την

κληρονομικότητα.

Κάθε ενότητα χωρίζεται σε τρία τμήματα. Το πρώτο τμήμα, το οποίο πρέπει να

ολοκληρώνεται πριν από την προσέλευση των συμμετεχόντων στο εργαστήριο,

περιέχει κυρίως ερωτήσεις επανάληψης της αντίστοιχης θεωρίας καθώς επίσης και

έτοιμα προγράμματα τα οποία δίνονται ως παραδείγματα για την κατανόηση των

αντίστοιχων εννοιών προγραμματισμού. Το δεύτερο τμήμα, το οποίο θα

ολοκληρώνεται στο εργαστήριο, περιέχει δύο ασκήσεις οι οποίες επιλύουν βασικά

προβλήματα Φυσικής ή Μαθηματικών. Η πρώτη άσκηση περιέχει ένα ημιτελές

πρόγραμμα. Το ζητούμενο από τους συμμετέχοντες στο εργαστήριο είναι η

διόρθωση των συντακτικών ή λογικών λαθών του καθώς επίσης και η συμπλήρωσή

του. Η δεύτερη άσκηση περιέχει την εκφώνηση ενός προβλήματος. Το ζητούμενο

από τους συμμετέχοντες στο εργαστήριο είναι η δημιουργία ενός προγράμματος

που να επιλύει το συγκεκριμένο πρόβλημα. Το τρίτο τμήμα σε κάθε ενότητα

περιέχει επιπλέον ασκήσεις για όσους θέλουν να ασχοληθούν περισσότερο μετά το

τέλος του αντίστοιχου εργαστηρίου.

Η προσπάθεια για τη βελτίωση τόσο του παρόντος κειμένου όσο και των

εργαστηρίων γενικότερα είναι συνεχής. Οποιεσδήποτε παρατηρήσεις για βελτιώσεις

είναι ευπρόσδεκτες.

Δ. Μπακάλης

Επίκουρος Καθηγητής

Page 4: προγραμματισμός εργαστήριο

4

Κανόνες εργαστηρίου

Οι συμμετέχοντες στο εργαστήριο οφείλουν να συμμορφώνονται με τα

ακόλουθα:

α. Να έχουν μελετήσει το αντίστοιχο τμήμα της θεωρίας από τις σημειώσεις του

μαθήματος πριν την προσέλευσή τους στο εργαστήριο και να έχουν ολοκληρώσει

το πρώτο τμήμα της αντίστοιχης εργαστηριακής ενότητας.

β. Να φέρνουν τις εργαστηριακές ασκήσεις καθώς και τις σημειώσεις του

προγραμματισμού μαζί τους την ώρα του εργαστηρίου.

γ. Σε οποιαδήποτε στιγμή και ανάλογα με την εξέλιξη του εργαστηρίου, να είναι

έτοιμοι να παρουσιάσουν και κυρίως να εξηγήσουν στους επιβλέποντες

οποιοδήποτε από τα προγράμματα.

δ. Να αφιερώνουν χρόνο και πέρα από τις εργαστηριακές ώρες για την

ολοκλήρωση των ασκήσεων των εργαστηριακών ενοτήτων, όταν και εάν αυτό

χρειάζεται.

ε. Να διατηρούν τα προγράμματα που δημιούργησαν αποθηκευμένα με κατάλληλο

όνομα στον προσωπικό τους χώρο στον υπολογιστή.

στ. Να μην απουσιάζουν από το εργαστήριο.

ζ. Να παρευρεθούν στις τμηματικές και τελικές εξετάσεις του εργαστηρίου.

Χρήσιμες συμβουλές

1. Μη χρησιμoπoιείτε Ελληvικoύς χαρακτήρες στα πρoγράμματα.

2. Γράφετε σχόλια και χωρίζετε τα πρoγράμματά σας σε εvότητες με κεvές γραμμές.

3. Υιοθετήστε την ελεύθερη γραφή της Fortran και εφαρμόστε την σε όλα τα

προγράμματα Fortran που ακολουθούν.

4. Οι πηγαίοι κώδικες των προγραμμάτων των εργαστηριακών ασκήσεων είναι

διαθέσιμοι στην ιστοσελίδα του μαθήματος.

Page 5: προγραμματισμός εργαστήριο

5

Περιεχόμενα

Πρόλογος ___________________________________________________________________ 3

Περιεχόμενα ________________________________________________________________ 5

ΕΝΟΤΗΤΑ 1 ________________________________________________________________ 7 Διδακτικοί Στόχοι ___________________________________________________________ 7 Ι. Πριν το εργαστήριο - Προετοιμασία _________________________________________ 7 ΙΙ. Στο εργαστήριο __________________________________________________________ 11 ΙΙΙ. Μετά το εργαστήριο – Ασκήσεις προς επίλυση _____________________________ 13

ΕΝΟΤΗΤΑ 2 ______________________________________________________________ 17 Διδακτικοί Στόχοι __________________________________________________________ 17 Ι. Πριν το εργαστήριο - Προετοιμασία ________________________________________ 17 ΙΙ. Στο εργαστήριο __________________________________________________________ 19 ΙΙΙ. Μετά το εργαστήριο – Ασκήσεις προς επίλυση _____________________________ 21

ΕΝΟΤΗΤΑ 3 ______________________________________________________________ 25 Διδακτικοί Στόχοι __________________________________________________________ 25 Ι. Πριν το εργαστήριο - Προετοιμασία ________________________________________ 25 ΙΙ. Στο εργαστήριο __________________________________________________________ 28 ΙΙΙ. Μετά το εργαστήριο – Ασκήσεις προς επίλυση _____________________________ 30

ΕΝΟΤΗΤΑ 4 ______________________________________________________________ 35 Διδακτικοί Στόχοι __________________________________________________________ 35 Ι. Πριν το εργαστήριο - Προετοιμασία ________________________________________ 35 ΙΙ. Στο εργαστήριο __________________________________________________________ 38 ΙΙΙ. Μετά το εργαστήριο – Ασκήσεις προς επίλυση _____________________________ 40

ΕΝΟΤΗΤΑ 5 ______________________________________________________________ 45 Διδακτικοί Στόχοι __________________________________________________________ 45 Ι. Πριν το εργαστήριο - Προετοιμασία ________________________________________ 45 ΙΙ. Στο εργαστήριο __________________________________________________________ 48 ΙΙΙ. Μετά το εργαστήριο – Ασκήσεις προς επίλυση _____________________________ 50

ΕΝΟΤΗΤΑ 6 ______________________________________________________________ 53 Διδακτικοί Στόχοι __________________________________________________________ 53 Ι. Πριν το εργαστήριο - Προετοιμασία ________________________________________ 53 ΙΙ. Στο εργαστήριο __________________________________________________________ 56 ΙΙΙ. Μετά το εργαστήριο – Ασκήσεις προς επίλυση _____________________________ 59

ΕΝΟΤΗΤΑ 7 ______________________________________________________________ 65 Διδακτικοί Στόχοι __________________________________________________________ 65 Ι. Πριν το εργαστήριο - Προετοιμασία ________________________________________ 65 ΙΙ. Στο εργαστήριο __________________________________________________________ 67 ΙΙΙ. Μετά το εργαστήριο – Ασκήσεις προς επίλυση _____________________________ 69

ΕΝΟΤΗΤΑ 8 ______________________________________________________________ 71 Διδακτικοί Στόχοι __________________________________________________________ 71 Ι. Πριν το εργαστήριο - Προετοιμασία ________________________________________ 71 ΙΙ. Στο εργαστήριο __________________________________________________________ 73 ΙΙΙ. Μετά το εργαστήριο – Ασκήσεις προς επίλυση _____________________________ 74

ΕΝΟΤΗΤΑ 9 ______________________________________________________________ 77 Διδακτικοί Στόχοι __________________________________________________________ 77 Ι. Πριν το εργαστήριο - Προετοιμασία ________________________________________ 77 ΙΙ. Στο εργαστήριο __________________________________________________________ 79 ΙΙΙ. Μετά το εργαστήριο – Ασκήσεις προς επίλυση _____________________________ 82

Page 6: προγραμματισμός εργαστήριο

6

Παράρτημα Ι _______________________________________________________________ 85 Διδακτικοί Στόχοι __________________________________________________________ 85 Ο κειμενογράφος Crimson και ο μεταγλωττιστής G95 ________________________ 85

Παράρτημα ΙΙ ______________________________________________________________ 89 Διδακτικοί Στόχοι __________________________________________________________ 89 Ο κειμενογράφος Crimson και ο μεταγλωττιστής της C++ _____________________ 89

Βιβλιογραφία ______________________________________________________________ 93

Page 7: προγραμματισμός εργαστήριο

7

ΕΝΟΤΗΤΑ 1

Εισαγωγή στις γλώσσες προγραμματισμού Fortran/C++ - Σταθερές και μεταβλητές ποσότητες

Διδακτικοί Στόχοι

Οι διδακτικοί στόχοι της εργαστηριακής ενότητας είναι:

να εξοικειωθείτε με διαφορετικές γλώσσες προγραμματισμού (Fortran και

C++),

να μπορείτε να γράψετε απλά προγράμματα,

να μπορείτε να χρησιμοποιείτε απλές εντολές εισόδου και εξόδου δεδομένων,

να μπορείτε να ορίσετε σταθερές και μεταβλητές ποσότητες,

να εξοικειωθείτε με τους τύπους δεδομένων των δύο γλωσσών

προγραμματισμού,

να εξοικειωθείτε με τους αριθμητικούς τελεστές.

Ι. Πριν το εργαστήριο – Προετοιμασία

Α. Επαναλάβετε τη μελέτη της αντίστοιχης θεωρίας για τη γλώσσα προγραμματισμού

Fortran και απαντήστε στις παρακάτω ερωτήσεις:

1. Τι χαρακτηριστικά πρέπει να έχει ένα όνομα προγράμματος ή μεταβλητής για να

είναι έγκυρο;

2. Σε ένα πρόγραμμα εμφανίζονται τα ονόματα μεταβλητών var12 και VAR12.

Αντιστοιχούν στην ίδια ποσότητα ή όχι;

3. Με ποιό τρόπο μπορώ να εισάγω μια γραμμή σχολίων σε ένα πρόγραμμα;

4. Ένα πρόγραμμα πρέπει πάντα να ξεκινά με την εντολή PROGRAM;

5. Με ποια εντολή σηματοδοτείται το τέλος του κύριου προγράμματος στη γλώσσα

Fortran;

6. Με ποια εντολή μπορώ να εμφανίσω ένα μήνυμα ή την τιμή μιας ποσότητας στην

οθόνη του υπολογιστή; Πως συντάσσεται η εντολή αυτή;

7. Τι απεικονίζουν οι παρακάτω εντολές στην οθόνη του υπολογιστή;

(α) PRINT*, GEIA (β) PRINT*, 'GEIA'

8. Θέλω να εισάγω έναν ακέραιο αριθμό από το πληκτρολόγιο και να τον

αποθηκεύσω στη μεταβλητή με όνομα Ν. Ποιά εντολή θα χρησιμοποιήσω;

9. Ποιό είναι το αποτέλεσμα εκτέλεσης της εντολής Ν=Ν+2;

10. Ποιός είναι ο τελεστής ύψωσης σε δύναμη;

11. Ποιά είναι τα αποτελέσματα εκτέλεσης των παρακάτω εντολών; Γιατί διαφέρουν;

(α) PRINT*, 1/3 (β) PRINT*, 1./3.

Page 8: προγραμματισμός εργαστήριο

8

12. Δώστε δύο εναλλακτικούς τρόπους για να δηλώσετε σε ένα πρόγραμμα μία

σταθερή ποσότητα με όνομα G και τιμή 9.81.

13. Δώστε τρεις εναλλακτικούς τρόπους για να δηλώσετε σε ένα πρόγραμμα μία

μεταβλητή ποσότητα με όνομα INT που να αντιστοιχεί σε ακέραιο αριθμό.

14. Πόσους διαφορετικούς τύπους δεδομένων υποστηρίζει η γλώσσα Fortran; Ποιοί

είναι αυτοί και σε τι ποσότητες αντιστοιχούν;

15. Πως ξεχωρίζω μία πραγματική σταθερά απλής ακρίβειας από μία πραγματική

σταθερά διπλής ακρίβειας;

16. Πως καθορίζουμε είδος και τύπο δεδομένων σε μία μεταβλητή;

17. Ποιά είδη δεδομένων υπάρχουν για τύπο δεδομένων ακέραιο αριθμό;

18. Με ποια σειρά θα γίνουν οι πράξεις σε μία αριθμητική παράσταση με

παρενθέσεις, τελεστές, μεταβλητές και σταθερές;

19. Με ποια σειρά θα γίνουν οι πράξεις στην αριθμητική παράσταση

A**B+(C+D)*E/F;

20. Ποιός είναι ο κανόνας που εφαρμόζεται όταν σε μία αριθμητική παράσταση

έχουμε ποσότητες με διαφορετικά είδη και τύπους δεδομένων;

Β. Διαβάστε τις οδηγίες χρήσης του μεταγλωττιστή της γλώσσας Fortran (Παράρτημα Ι).

Μεταγλωττίστε και εκτελέστε στον υπολογιστή το παρακάτω πρόγραμμα:

! First Program

PROGRAM FIRST

PRINT*,'A first program in Fortran'

END PROGRAM FIRST

Γ. Επαναλάβετε τη μελέτη της αντίστοιχης θεωρίας για τη γλώσσα προγραμματισμού

C++ και απαντήστε στις παρακάτω ερωτήσεις:

1. Τι χαρακτηριστικά πρέπει να έχει ένα όνομα μεταβλητής για να είναι έγκυρο;

2. Σε ένα πρόγραμμα εμφανίζονται τα ονόματα μεταβλητών var12 και VAR12.

Αντιστοιχούν στην ίδια ποσότητα ή όχι;

3. Με ποιό τρόπο μπορώ να εισάγω μία γραμμή σχολίων σε ένα πρόγραμμα;

4. Σε ένα πρόγραμμα C++, πως καθορίζονται οι εντολές που αντιστοιχούν στο κύριο

πρόγραμμα;

5. Πως οριοθετείται το τέλος κάθε εντολής στην C++;

6. Με ποιο τρόπο μπορώ να εμφανίσω ένα μήνυμα ή την τιμή μιας ποσότητας στην

οθόνη του υπολογιστή; Δώστε ένα παράδειγμα. Τι θα πρέπει να εισάγω στην αρχή

του προγράμματος;

7. Τι απεικονίζουν οι παρακάτω εντολές στην οθόνη του υπολογιστή;

(α) cout << "GEIA"; (β) cout << GEIA;

8. Θέλω να εισάγω έναν ακέραιο αριθμό από το πληκτρολόγιο και να τον

αποθηκεύσω στη μεταβλητή με όνομα Ν. Δώστε την κατάλληλη εντολή.

Page 9: προγραμματισμός εργαστήριο

9

9. Ποιό είναι το αποτέλεσμα εκτέλεσης της εντολής Ν=Ν+2;

10. Μπορώ να χρησιμοποιήσω σε ένα πρόγραμμα μια μεταβλητή χωρίς να έχω

δηλώσει τον τύπο δεδομένων στον οποίο αντιστοιχεί;

11. Υπάρχει τελεστής ύψωσης σε δύναμη στη γλώσσα C++; Με ποιο τρόπο μπορώ να

υπολογίσω το xy;

12. Ποιά είναι η χρησιμότητα μίας εντολής #include στην αρχή ενός προγράμματος

C++;

13. Δώστε την εντολή δήλωσης σε ένα πρόγραμμα μιας μεταβλητής ποσότητας με

όνομα varint που να αντιστοιχεί σε ακέραιο αριθμό. Ποιός θα είναι ο τύπος

δεδομένων της μεταβλητής αυτής;

14. Πόσους διαφορετικούς τύπους δεδομένων υποστηρίζει η γλώσσα C++; Ποιοί

είναι αυτοί και σε τι ποσότητες αντιστοιχούν;

15. Πως ξεχωρίζω μια πραγματική ποσότητα (σταθερή ή μεταβλητή) απλής

ακρίβειας από μια πραγματική ποσότητα διπλής ακρίβειας;

16. Που διαφέρει ο τύπος δεδομένων int από τον τύπο δεδομένων unsigned int;

17. Ποιός είναι ο κανόνας που εφαρμόζεται όταν σε μία αριθμητική παράσταση

έχουμε ποσότητες με διαφορετικούς τύπους δεδομένων;

18. Τι αναπαριστά ο τύπος δεδομένων char;

19. Ποιά είναι η λειτουργία των τελεστών += και ++; Δώστε δύο ενδεικτικά

παραδείγματα.

20. Είναι ισοδύναμες οι εκφράσεις var++ και ++var;

Δ. Διαβάστε τις οδηγίες χρήσης του μεταγλωττιστή της γλώσσας C++ (Παράρτημα ΙΙ).

Μεταγλωττίστε και εκτελέστε στον υπολογιστή το παρακάτω πρόγραμμα:

// First program

#include <iostream>

using namespace std;

int main()

{

cout << "A first program in C++" << "\n";

return 0;

}

Page 10: προγραμματισμός εργαστήριο

10

E. [Εκκρεμές]

l

Η περίοδος εκκρεμούς Τ δίνεται από τη σχέση glT 2 , όπου l το μήκος και g η

επιτάχυνση της βαρύτητας.

Δίνονται τα παρακάτω προγράμματα σε γλώσσα Fortran και C++ που υπολογίζουν

την περίοδο του εκκρεμούς με βάση την παραπάνω σχέση για δεδομένη τιμή l που

εισάγεται από το πληκτρολόγιο θεωρώντας ότι η επιτάχυνση της βαρύτητας είναι ίση

με 9.81 m/s2.

PROGRAM ekkremes

REAL g,pi,t,l

PARAMETER (pi=3.14159, g=9.81)

PRINT*,'Dwste timh gia to l'

READ*, l

t = 2*pi*sqrt(l/g) ! Pendulum period evaluation

PRINT*, 'The period of the pendulum is ', t

STOP

END PROGRAM ekkremes

// pendulum

#include <iostream>

#include <cmath>

using namespace std;

int main()

{

const double PI = 3.14159;

const double g = 9.81;

double t, l;

cout << "Dwste timh gia to l ";

cin >> l;

t = 2*PI*sqrt(l/g);

cout << "The period of the pendulum is " << t << endl;

return 0;

}

1. Μεταγλωττίστε τα προγράμματα στον υπολογιστή.

2. Υπολογίστε την περίοδο εκκρεμούς με μήκος l = 20 cm χρησιμοποιώντας: (α) την

παραπάνω σχέση και (β) τα προγράμματα.

Page 11: προγραμματισμός εργαστήριο

11

3. Τροποποιήστε τα προγράμματα ώστε να υπολογίζουν την περίοδο για τιμή της

επιτάχυνσης της βαρύτητας η οποία θα εισάγεται από το πληκτρολόγιο.

Επιβεβαιώστε την ορθότητα των προγραμμάτων.

ΙΙ. Στο εργαστήριο

A. [Υπολογισμός εμβαδού τριγώνου]

B

Γ

Α

α

βγ

Με βάση τον Ήρων τον Αλεξανδρινό, το εμβαδόν τριγώνου Ε με μήκη πλευρών α, β,

γ υπολογίζεται από την εξίσωση ))()(( E , όπου τ η ημιπερίμετρος.

Η απόσταση α μεταξύ δύο σημείων (x1, y1) και (x2, y2) ενός Καρτεσιανού

συστήματος συντεταγμένων υπολογίζεται από τον τύπο 2

21

2

21 )()( yyxxa .

Ένας προγραμματιστής δοκίμασε να γράψει προγράμματα σε Fortran και C++ που

να υπολογίζουν το εμβαδόν τριγώνου με βάση τα παραπάνω. Τα προγράμματα

δέχονται ως δεδομένα εισόδου τις συντεταγμένες των σημείων των κορυφών Α, Β, Γ

του τριγώνου. Κατέληξε στα παρακάτω προγράμματα τα οποία δυστυχώς είναι

ημιτελή ενώ περιέχουν συντακτικά και λογικά λάθη.

! program triangle

!

REAL ax,ay,bx,by,cx,cy,sa,sb,sc,t,area !variable declaration

PRINT, 'Give the coordinates of the triangle vertexes: '

READ*, ax,ay,bx,by,cx,cy

sc = sqrt((ax-bx)**2+(ay-by)**2) !Evaluation of one side

t = (sa+sb+sc)/2

area = sqrt(t*(t-sa)*(t-sb)*(t-sc)) !Area evaluation

PRINT*, 'Area is: ', area

STOP

END

// program triangle

#include <iostream>

#include <cmath>

using namespace std;

int main()

{

float ax, ay, bx, by, cx, cy;

float sa, sb, sc, t, area;

cout << "Give the coordinates of the triangle vertexes";

Page 12: προγραμματισμός εργαστήριο

12

cin >> ax >> ay >> bx >> by >> cx >> cy;

sc = sqrt((ax-bx)*(ax-bx) +(ay-by)**2);

t = (sa+sb+sc)/2

area = sqrt(t*(t-a)*(t-b)*(t-c)); // Area evaluation

cout << "Area is: " << area;

return 0;

}

1. Διορθώστε τα λάθη των δύο προγραμμάτων, προσθέστε τις εντολές που λείπουν

και μεταγλωττίστε τα. Καταγράψτε τα συντακτικά και λογικά λάθη που βρήκατε.

2. Εκτελέστε τα προγράμματα για διάφορα δεδομένα εισόδου και επιβεβαιώστε την

ορθότητα των αποτελεσμάτων που παίρνετε.

3. Γνωρίζετε ότι το εμβαδόν ορθογωνίου τριγώνου δίνεται από τη σχέση 2

1E ,

όπου β και υ η βάση και το ύψος του τριγώνου αντίστοιχα. Υπολογίστε το εμβαδόν

του ορθογωνίου τριγώνου που δημιουργείται από τα σημεία Α, Β, Γ με

συντεταγμένες (1,1), (1,4), (3,1) αντίστοιχα, χρησιμοποιώντας την παραπάνω σχέση

καθώς και τα προγράμματα που ετοιμάσατε. Ταυτίζονται τα αποτελέσματα;

4. Συγκρίνετε μεταξύ τους τα αποτελέσματα που δίνουν τα δύο προγράμματα για

ίδια δεδομένα εισόδου.

Β. [Κεντρική ελαστική κρούση δύο σφαιρών]

m1m2

υ1υ2

Πριν την

κρούση

m1m2

υ΄2

Μετά την

κρούση

υ΄1

Δύο σφαίρες Σ1 και Σ2 με μάζες m1 και m2 κινούνται με ταχύτητες v1 και v2 όπως στο

παραπάνω σχήμα. Οι σφαίρες συγκρούονται κεντρικά και ελαστικά.

Χρησιμοποιώντας την αρχή διατήρησης της ορμής και την αρχή διατήρησης της

κινητικής ενέργειας προκύπτει ότι οι ταχύτητες που έχουν οι δύο σφαίρες μετά την

κρούση δίνονται από τις εξισώσεις 1

21

212

21

21

2v

mm

mmv

mm

mv

και

2

21

121

21

12

2v

mm

mmv

mm

mv

αντίστοιχα.

1. Γράψτε προγράμματα σε γλώσσα Fortran και C++ που να υπολογίζουν τις

ταχύτητες των δύο σφαιρών μετά την ελαστική κρούση δεδομένων των μαζών των δύο

σφαιρών και των ταχυτήτων τους πριν την κρούση.

2. Εκτελέστε τα προγράμματα με κάποια δεδομένα. Τα αποτελέσματα που παίρνετε

συμφωνούν με τα αναμενόμενα;

3. Επιβεβαιώστε, εισάγοντας κατάλληλα δεδομένα στα προγράμματα που φτιάξατε

και παρατηρώντας τα αποτελέσματα αυτών, τα παρακάτω:

(α) Όταν οι μάζες των δύο σφαιρών είναι ίσες, τότε οι σφαίρες ανταλλάσσουν

ταχύτητες.

Page 13: προγραμματισμός εργαστήριο

13

(β) Όταν μία σφαίρα μικρής μάζας προσκρούει ελαστικά και κάθετα στην επιφάνεια

ενός τοίχου ή στο δάπεδο, τότε ανακλάται με ταχύτητα ίδιου μέτρου και αντίθετης

φοράς.

ΙΙΙ. Μετά το εργαστήριο – Ασκήσεις προς επίλυση

A. [Σύνθεση δύο απλών αρμονικών ταλαντώσεων ίδιας συχνότητας]

Σώμα Σ εκτελεί ταυτόχρονα δύο ταλαντώσεις με εξισώσεις tAx 11 και

)(22 tAx . Η σύνθεση των δύο ταλαντώσεων οδηγεί στο συμπέρασμα ότι το

σώμα εκτελεί αρμονική ταλάντωση με εξίσωση: )( tAx , όπου

21

2

2

2

1 2 AAAAA και

21

2

.

Γράψτε προγράμματα σε γλώσσα Fortran και C++ που να υπολογίζουν το πλάτος Α

και την αρχική φάση θ της ταλάντωσης χ με βάση τα στοιχεία των επιμέρους

ταλαντώσεων χ1 και χ2. Ελέγξτε τις ειδικές περιπτώσεις όπου φ=0 ή φ=180. Τα

αποτελέσματα των προγραμμάτων που φτιάξατε συμφωνούν με τα αναμενόμενα;

Β. [Υπολογισμός ταχύτητας εκροής υγρού από ανοικτό δοχείο]

Έστω δοχείο στη βάση του οποίου υπάρχει στόμιο εκροής. Χρησιμοποιώντας το

νόμο του Bernoulli καταλήγουμε στο συμπέρασμα ότι η ταχύτητα εκροής του υγρού

στο σημείο Κ δίνεται από την εξίσωση: ghv 2 . Η εξίσωση αυτή αποτελεί τη

μαθηματική έκφραση του θεωρήματος του Torricelli: «Η ταχύτητα εκροής υγρού από

στόμιο που βρίσκεται σε βάθος h από την ελεύθερη επιφάνεια του είναι ίση με την

ταχύτητα που θα είχε το υγρό αν έπεφτε ελεύθερα από ύψος h».

h

E

x x1 x2

Page 14: προγραμματισμός εργαστήριο

14

Γράψτε προγράμματα σε γλώσσα Fortran και C++ που να υπολογίζουν την ταχύτητα

εκροής υγρού από ανοικτό δοχείο για δεδομένο βάθος h. Επιβεβαιώστε την

ορθότητα των προγραμμάτων σας με διάφορα δεδομένα.

Γ. [Ροόμετρο του Ventouri]

A1

A2

υ1 υ2

ΓΒ

h

1 2

Η παραπάνω διάταξη χρησιμεύει για τη μέτρηση της ταχύτητας ροής σε ένα σωλήνα.

Αν είναι γνωστές οι διατομές Α1 και Α2 του σωλήνα και η υψομετρική διαφορά h στη

στάθμη των δύο κατακόρυφων ανοιχτών σωλήνων Β και Γ, η ταχύτητα ροής v1 στην

περιοχή του σωλήνα με διατομή A1 δίνεται από τη σχέση: 1)(

22

21

1

AA

ghv .

Γράψτε προγράμματα σε γλώσσα Fortran και C++ που να υπολογίζουν την ταχύτητα

ροής στο σωλήνα για δεδομένες διατομές Α1 και Α2 και υψομετρική διαφορά h.

Επιβεβαιώστε την ορθότητα των προγραμμάτων σας με διάφορα δεδομένα.

Δ. [Σχετικιστική Ορμή]

Η θεωρία της σχετικότητας ορίζει ότι η ορμή p σώματος μάζας m που κινείται με

ταχύτητα v δίνεται από τη σχέση: 22 /1 cv

mvp

, όπου c η ταχύτητα του φωτός.

Όταν η ταχύτητα του σώματος v είναι πολύ μικρότερη της ταχύτητας του φωτός, τότε

η παραπάνω σχέση ανάγεται στον κλασσικό ορισμό της ορμής: mvp .

0 c v

p

Κλασσική

Ορμή

Σχετικιστική

Ορμή

Γράψτε προγράμματα σε γλώσσα Fortran και C++ που να υπολογίζουν τη

σχετικιστική ορμή σώματος για δεδομένες τιμές μάζας και ταχύτητας που θα

Page 15: προγραμματισμός εργαστήριο

15

εισάγονται από το πληκτρολόγιο. Επιβεβαιώστε την ορθότητα των προγραμμάτων

σας με διάφορα δεδομένα.

Ε. [Μέτρηση συντελεστή εσωτερικής τριβής (ιξώδους) υγρού]

Ο συντελεστής εσωτερικής τριβής η ενός υγρού μπορεί να υπολογιστεί με βάση το

παρακάτω πείραμα:

Μέσα στο υγρό, πυκνότητας ρυ, αφήνουμε να πέσει σφαίρα πολύ μικρής ακτίνας r

και πυκνότητας ρσ. Στην αρχή η σφαίρα επιταχύνει και στη συνέχεια αποκτά οριακή

σταθερή ταχύτητα ίση με vορ. Ο ζητούμενος συντελεστής εσωτερικής τριβής δίνεται

από τη σχέση

v

rg

2

)(9

2 , όπου g η επιτάχυνση της βαρύτητας.

Γράψτε προγράμματα σε γλώσσα Fortran και C++ που να υπολογίζουν το

συντελεστή εσωτερικής τριβής υγρού. Οι τιμές των δεδομένων ρυ, ρσ, g, r και vορ θα

εισάγονται από το πληκτρολόγιο. Ελέγξτε την ορθότητα των προγραμμάτων που

φτιάξατε με κατάλληλα δεδομένα εισόδου.

ΣΤ. [Ο νόμος της παγκόσμιας έλξης του Νεύτωνα]

Το 1687 ο Άγγλος μαθηματικός Ισαάκ Νεύτων διατύπωσε το πρώτο αξίωμα για τη

βαρύτητα: «Συμπέρανα ότι οι δυνάμεις που συγκρατούν τους πλανήτες στην τροχιά

τους πρέπει να είναι αντιστρόφως ανάλογες ως προς τα τετράγωνα των αποστάσεων

από τα κέντρα γύρω από τα οποία περιφέρονται». Ο νόμος της παγκόσμιας έλξης

ορίζει ότι η ελκτική δύναμη της βαρύτητας F μεταξύ δύο σημειακών μαζών m1 και

m2 που βρίσκονται σε απόσταση d δίνεται από τη σχέση F=Gm1m2/d2, όπου

G=6.6710-11 Nm2kg-2 η σταθερά της παγκόσμιας έλξης.

Γράψτε προγράμματα σε Fortran και C++ που να υπολογίζουν την ελκτική δύναμη

της βαρύτητας για δύο μάζες m1 και m2 που βρίσκονται σε απόσταση d. Οι τιμές

των δεδομένων m1, m2 και d θα δίνονται από το πληκτρολόγιο.

Z. [Υπολογισμός στοιχείων τριγώνου]

B

Γ

Α

α

βγ

Σε κάθε τρίγωνο ΑΒΓ ισχύουν ο νόμος των ημιτόνων (

sinsinsin

) και οι

νόμοι των συνημιτόνων ( cos2222 ), όπου α, β και γ είναι οι πλευρές

απέναντι από τις γωνίες Α, Β και Γ αντίστοιχα.

Γράψτε προγράμματα σε Fortran και C++ που να υπολογίζουν και να εμφανίζουν

στην οθόνη του υπολογιστή το μήκος της πλευράς γ καθώς και τις τιμές των γωνιών

Α και Β ενός τριγώνου ΑΒΓ. Τα μήκη των πλευρών α, β και η τιμή της γωνίας Γ (σε

ακτίνια) θα εισάγονται από το πληκτρολόγιο.

Δοκιμάστε την ορθότητα των προγραμμάτων που φτιάξατε για τις παρακάτω

περιπτώσεις ορθογωνίων τριγώνων: (α) α=3, β=4, Γ= 90ο (π/2), (β) α=2, β=2, Γ= 90ο

(π/2).

Page 16: προγραμματισμός εργαστήριο

16

Page 17: προγραμματισμός εργαστήριο

17

ΕΝΟΤΗΤΑ 2 Δομές Επιλογής

Διδακτικοί Στόχοι

Οι διδακτικοί στόχοι της εργαστηριακής ενότητας είναι:

να μπορείτε να χρησιμοποιείτε δομές επιλογής για τη λήψη αποφάσεων,

να μπορείτε να επιλέγετε την κατάλληλη δομή επιλογής σε κάθε περίπτωση,

να εξοικειωθείτε με τους λογικούς τελεστές,

να εξοικειωθείτε με τους τελεστές συσχέτισης,

να κατανοήσετε τη διαφορά του τελεστή εκχώρησης (=) από τον τελεστή

ισότητας (==).

Ι. Πριν το εργαστήριο – Προετοιμασία

Α. Επαναλάβετε τη μελέτη της αντίστοιχης θεωρίας για τη γλώσσα προγραμματισμού

Fortran και απαντήστε στις παρακάτω ερωτήσεις:

1. Ποιά είναι η γενική σύνταξη της δομής BLOCK IF; Δώστε ένα παράδειγμα.

2. Σε ένα πρόγραμμα θέλουμε να απεικονίσουμε στην οθόνη τη λέξη «θετικός» ή

«αρνητικός» ανάλογα με το αν η τιμή μιας μεταβλητής ακέραιου αριθμού Ι είναι

μεγαλύτερη ή μικρότερη του μηδενός. Δώστε την αντίστοιχη εντολή

χρησιμοποιώντας δομή BLOCK IF.

3. Ποιά η χρησιμότητα μιας εντολής CONTINUE σε μία δομή BLOCK IF;

4. Με ποιο τρόπο καθορίζεται το τέλος μιας εντολής BLOCK IF;

5. Ποιά είναι η γενική σύνταξη της εντολής SELECT; Δώστε ένα παράδειγμα χρήσης

της.

6. Σε ένα πρόγραμμα θέλουμε να απεικονίσουμε στην οθόνη τις λέξεις «ΑΠΟΤΥΧΙΑ»,

«ΚΑΛΑ», «ΠΟΛΥ ΚΑΛΑ», «ΑΡΙΣΤΑ» ανάλογα με το αν η τιμή μιας μεταβλητής

ακέραιου αριθμού Ν έχει τις τιμές (0,1,2,3,4), (5,6), (7,8), (9,10) αντίστοιχα. Δώστε

την αντίστοιχη εντολή χρησιμοποιώντας: (α) την εντολή SELECT και (β) τη δομή

BLOCK IF.

7. Σε ποιες περιπτώσεις θα χρησιμοποιούσατε τη δομή BLOCK IF και σε ποιες την

εντολή SELECT;

8. Ποια η χρησιμότητα της εντολής CASE DEFAULT σε μία δομή SELECT;

9. Από τι αποτελούνται οι λογικές προτάσεις που χρησιμοποιούνται σε μία δομή

BLOCK IF;

10. Σε τι διαφέρει ο τελεστής = από τον τελεστή ==; Πότε χρησιμοποιείται ο κάθε

ένας από αυτούς;

Page 18: προγραμματισμός εργαστήριο

18

Β. Επαναλάβετε τη μελέτη της αντίστοιχης θεωρίας για τη γλώσσα προγραμματισμού

C++ και απαντήστε στις παρακάτω ερωτήσεις:

1. Ποιές είναι οι εντολές επιλογής που υποστηρίζει η γλώσσα C++;

2. Σε ένα πρόγραμμα θέλουμε να απεικονίσουμε στην οθόνη τη λέξη «περιττός» ή

«άρτιος» ανάλογα με το αν η τιμή μιας μεταβλητής ακέραιου αριθμού με όνομα var

είναι περιττός ή άρτιος αριθμός αντίστοιχα. Δώστε την αντίστοιχη εντολή

χρησιμοποιώντας μια εντολή if.

3. Πότε χρησιμοποιούμε άγκιστρα ({ }) σε μία εντολή if;

4. Ποιά είναι η γενική σύνταξη μιας εντολής if-else; Δώστε ένα παράδειγμα χρήσης

της.

5. Ποιά είναι η γενική σύνταξη μιας εντολής switch; Δώστε ένα παράδειγμα χρήσης

της.

6. Σε ένα πρόγραμμα θέλουμε να απεικονίσουμε στην οθόνη τις λέξεις «ΑΠΟΤΥΧΙΑ»,

«ΚΑΛΑ», «ΠΟΛΥ ΚΑΛΑ», «ΑΡΙΣΤΑ» ανάλογα με το αν η τιμή μιας μεταβλητής

ακέραιου αριθμού Ν έχει τις τιμές (0,1,2,3,4), (5,6), (7,8), (9,10) αντίστοιχα. Δώστε

την αντίστοιχη εντολή χρησιμοποιώντας: (α) την εντολή switch και (β) την εντολή if.

7. Ποιά είναι η χρησιμότητα της δήλωσης default σε μία εντολή switch;

8. Ποιά είναι η χρησιμότητα της εντολής break σε μία εντολή switch;

9. Ποιοί είναι οι τελεστές που εκφράζουν το λογικό AND, το λογικό OR και τη λογική

άρνηση;

10. Σε τι διαφέρει ο τελεστής = από τον τελεστή ==; Πότε χρησιμοποιείται ο κάθε

ένας από αυτούς;

Γ. [Επίλυση πρωτοβάθμιας εξίσωσης]

Η γενική μορφή μιας πρωτοβάθμιας εξίσωσης δίνεται από τη σχέση 0 x .

Ανάλογα με τις τιμές των α και β, η εξίσωση:

(α) έχει ρίζα x όταν 0a ,

(β) είναι αδύνατη όταν 0a και 0 , και

(γ) είναι αόριστη όταν 0a και 0 .

Δίνονται τα παρακάτω προγράμματα σε γλώσσα Fortran και C++ που επιλύουν μία

πρωτοβάθμια εξίσωση για δεδομένες τιμές α και β που εισάγονται από το

πληκτρολόγιο.

PROGRAM prwtoba0mia

REAL a,b,x

PRINT*, 'Dwste tis times twn a kai b :'

READ*, a,b

IF (a==0 .AND. b==0) THEN

PRINT*, 'Equation not defined'

ELSEIF (a==0 .AND. b/=0) THEN

PRINT*, 'Equation impossible'

ELSE

x = -b/a

Page 19: προγραμματισμός εργαστήριο

19

PRINT*, 'x=',x

ENDIF

STOP

END PROGRAM prwtoba0mia

#include <iostream>

using namespace std;

int main()

{

double a,b,x;

cout << "Dwste tis times twn a kai b : ";

cin >> a >> b;

if (a==0)

if (b==0)

cout << "H eksiswsh einai aoristh" << endl;

else

cout << "H eksiswsh einai adynath" << endl;

else

{

x=-b/a;

cout << "x=" << x << endl;

}

return 0;

}

1. Μεταγλωττίστε τα προγράμματα στον υπολογιστή.

2. Επιλύστε τις εξισώσεις (α) 023 x (β) 006 x (γ) 050 x (δ) 000 x

χρησιμοποιώντας τα παραπάνω προγράμματα και επιβεβαιώστε την ορθότητα των

αποτελεσμάτων.

3. Είναι σωστό να μεταφέρουμε την εντολή x=-b/a αμέσως μετά τις εντολές READ και

cin; Ποιά θα είναι η τιμή του x όταν 0a ;

ΙΙ. Στο εργαστήριο

Α. [Υπολογισμός τιμών συνάρτησης]

Έστω η συνάρτηση 0,1

1,0

23

54

)2321()(

2

2

x

x

x

x

xxxxf .

Ένας προγραμματιστής δοκίμασε να γράψει προγράμματα σε Fortran και C++ που

να υπολογίζουν την τιμή της συνάρτησης f για δεδομένη τιμή του x . Κατέληξε στα

παρακάτω προγράμματα τα οποία δυστυχώς είναι ημιτελή ενώ περιέχουν

συντακτικά και λογικά λάθη.

! synarthsh_f

PROGRAM synarthsh

REAL x,f

PRINT*, 'Dwse thn timh toy x : '

Page 20: προγραμματισμός εργαστήριο

20

READ*, x

IF (x >= 0) THEN

f = (x**2)*(sqrt(1.+2.*x)+sqrt(3-2.*x))

ELSEIF (x < 0) THEN

y = (4*x+5.)/3.*x**2+2.

ENDIF

PRINT*, ' x=',x,' f(x)=',f

END PROGRAM synarthsh

#include <iostream>

#include <cmath>

using namespace std;

int main()

{

double x,f

cout << "Dwse thn timh toy x : ";

cin >> x;

if (x < 0)

f = x*x*(sqrt(1+2x)+sqrt(3-2*x);

else

f = (4*x+5)/(3*x*x+2);

cout << " x=" << x << " f(x)=" << f << endl;

return 0;

}

1. Διορθώστε τα λάθη των δύο προγραμμάτων, προσθέστε τις εντολές που λείπουν

και μεταγλωττίστε τα. Καταγράψτε τα συντακτικά και λογικά λάθη που βρήκατε.

2. Εκτελέστε τα προγράμματα για 5 διαφορετικές τιμές του χ (-1, -0.5, 0, +0.5, +1)

και επιβεβαιώστε την ορθότητα των αποτελεσμάτων που παίρνετε (f(-1)=2.333,

f(-0.5)=6, f(0)=0, f(+0.5)=0.707, f(+1)=2.732).

3. Συγκρίνετε μεταξύ τους τα αποτελέσματα που δίνουν τα δύο προγράμματα για

ίδια δεδομένα εισόδου.

Β. [Επίλυση γραμμικού συστήματος δύο εξισώσεων με δύο αγνώστους]

Θεωρήστε το παρακάτω γραμμικό σύστημα δύο εξισώσεων με δύο αγνώστους x και

y:

22221

11211

byaxa

byaxa

Έστω 21122211

2221

1211aaaa

aa

aaD η ορίζουσα των συντελεστών των αγνώστων και

122221

222

121abab

ab

abDx , 121211

221

111baba

ba

baDy οι ορίζουσες Cramer των

αγνώστων.

Η μέθοδος των οριζουσών (μέθοδος Cramer) ορίζει ότι, ανάλογα με τις τιμές των

οριζουσών D, Dx και Dy, το σύστημα:

(α) έχει μοναδική λύση DDx x και DDy y , όταν 0D , ή

(β) έχει άπειρες λύσεις, όταν 0 yx DDD , ή

Page 21: προγραμματισμός εργαστήριο

21

(γ) δεν έχει λύση, όταν 0D και ταυτόχρονα 0xD ή/και 0yD .

Γράψτε προγράμματα σε γλώσσα Fortran και C++ που να επιλύουν ένα γραμμικό

σύστημα δύο εξισώσεων για δεδομένες τιμές των ija και ib , 2,1 ji , οι οποίες θα

εισάγονται από το πληκτρολόγιο. Ελέγξτε την ορθότητα των προγραμμάτων που

φτιάξατε με κατάλληλα δεδομένα εισόδου που να καλύπτουν και τις τρεις παραπάνω

περιπτώσεις.

ΙΙΙ. Μετά το εργαστήριο – Ασκήσεις προς επίλυση

Α. [Εύρεση απόλυτης τιμής πραγματικού αριθμού]

Η απόλυτη τιμή ενός πραγματικού αριθμού χ συμβολίζεται με |χ| και δίνεται από

τη σχέση

0

0

x

x

x

xx .

1. Γράψτε προγράμματα σε γλώσσα Fortran και C++ που να υπολογίζουν την

απόλυτη τιμή ενός πραγματικού αριθμού με βάση την παραπάνω σχέση.

2. Εκτελέστε τα προγράμματα με κάποια δεδομένα. Τα αποτελέσματα που παίρνετε

συμφωνούν με τα αναμενόμενα;

3. Με ποιο τρόπο μπορούμε να υπολογίσουμε την απόλυτη τιμή του αριθμού χ

χωρίς να ελέγξουμε εάν ο αριθμός χ είναι μικρότερος ή μεγαλύτερος του 0;

Τροποποιήστε κατάλληλα τα προγράμματα και ελέγξτε την ορθότητά τους.

Β. [Υπολογισμός τιμών συνάρτησης]

Έστω η συνάρτηση xxg )( . Η συνάρτηση )(xg μπορεί να γραφεί εναλλακτικά και

ως εξής:

)0(

)0()(

x

x

x

xxg

Γράψτε προγράμματα σε γλώσσα Fortran και C++ που να υπολογίζουν την τιμή της

συνάρτησης g για δεδομένη τιμή του χ με βάση την εναλλακτική γραφή της. Η τιμή

αυτή θα εισάγεται από το πληκτρολόγιο. Ελέγξτε την ορθότητα των προγραμμάτων

που φτιάξατε με κατάλληλα δεδομένα εισόδου. Τι αλλαγές πρέπει να κάνετε στα

προγράμματα ώστε να υπολογίζουν την τιμή της συνάρτησης g με βάση την αρχική

της γραφή;

Γ. [Υπολογισμός τιμών συνάρτησης]

Έστω η συνάρτηση 1

1

cos

sin)(

x

x

xex

xexxf

x

x

.

Γράψτε προγράμματα σε γλώσσα Fortran και C++ που να υπολογίζουν την τιμή της

συνάρτησης f για δεδομένη τιμή του χ που θα εισάγεται από το πληκτρολόγιο.

Ελέγξτε την ορθότητα των προγραμμάτων που φτιάξατε με κατάλληλα δεδομένα

εισόδου.

Page 22: προγραμματισμός εργαστήριο

22

Δ. [Επίλυση δευτεροβάθμιας εξίσωσης]

Δευτεροβάθμια εξίσωση ονομάζεται κάθε πολυωνυμική εξίσωση δευτέρου βαθμού. Η

γενική μορφή μιας δευτεροβάθμιας εξίσωσης είναι 02 xx με α 0.

Ονομάζουμε διακρίνουσα Δ την παράσταση 42 . Ανάλογα με την τιμή της

διακρίνουσας, η δευτεροβάθμια εξίσωση έχει:

(α) δύο πραγματικές ρίζες

2

x , όταν 0

(β) δύο μιγαδικές ρίζες

2

ix , όταν 0

(γ) μία διπλή πραγματική ρίζα

2x , όταν 0 .

Γράψτε προγράμματα σε γλώσσα Fortran και C++ που να υπολογίζουν τις ρίζες μιας

δευτεροβάθμιας εξίσωσης για δεδομένες τιμές των α, β, γ οι οποίες θα εισάγονται

από το πληκτρολόγιο. Ελέγξτε την ορθότητα των προγραμμάτων που φτιάξατε με

κατάλληλα δεδομένα εισόδου για κάθε μία από τις τρεις παραπάνω περιπτώσεις.

Ε. [Εύρεση ιδιοτήτων ακέραιου αριθμού]

Έστω ακέραιος αριθμός x ο οποίος παίρνει τιμές από -10 έως και +10.

Γράψτε προγράμματα σε γλώσσα Fortran και C++ τα οποία αρχικά να δέχονται την

τιμή του x από το πληκτρολόγιο και να κάνουν έλεγχο εάν ο αριθμός είναι μέσα στο

επιτρεπτό εύρος τιμών. Στη συνέχεια τα προγράμματα πρέπει να εμφανίζουν στην

οθόνη την ένδειξη «ΘΕΤΙΚΟΣ», «ΑΡΝΗΤΙΚΟΣ» ή «ΜΗΔΕΝ» καθώς επίσης και την

ένδειξη «ΠΕΡΙΤΤΟΣ» ή «ΑΡΤΙΟΣ» ανάλογα με την τιμή του αριθμού. Ελέγξτε την

ορθότητα των προγραμμάτων που φτιάξατε με κατάλληλα δεδομένα εισόδου για

κάθε μία από τις διαφορετικές περιπτώσεις.

ΣΤ. [Αισθητή θερμοκρασία]

Η αισθητή θερμοκρασία αναφέρεται στη θερμοκρασία όπως τη νοιώθει το

ανθρώπινο σώμα και υπολογίζεται με βάση τους παρακάτω κανόνες:

Όταν η θερμοκρασία περιβάλλοντος είναι μεγαλύτερη των 27 οC και η σχετική

υγρασία υπερβαίνει το 40%, τότε η αισθητή θερμοκρασία είναι ίση με το δείκτη

θερμότητας (heat index) ο οποίος υπολογίζεται σύμφωνα με τον τύπο:

22624

232223

1099.1105282.8

1022874.110481717.51083783.6

22475541.014333127.1004901523.2379.42

RTRT

RTRT

RTRTT

aa

aa

aahi

όπου Thi είναι ο δείκτης Θερμότητας σε οF, Ta η θερμοκρασία περιβάλλοντος σε οF

και R η σχετική υγρασία σε %.

Όταν η θερμοκρασία περιβάλλοντος είναι μικρότερη ή ίση των 10 οC και η

ταχύτητα του ανέμου υπερβαίνει τα 4.8 Km/h, τότε η αισθητή θερμοκρασία είναι

ίση με τον δείκτη ψυχρότητας (wind chill) ο οποίος υπολογίζεται σύμφωνα με τον

τύπο: 16.016.0 3965.037.116215.012.13 VTVTT aawc

όπου Twc είναι ο δείκτης ψυχρότητας σε οC, Ta η θερμοκρασία περιβάλλοντος σε οC και V η ταχύτητα του ανέμου σε Km/h.

Σε όλες τις υπόλοιπες περιπτώσεις η αισθητή θερμοκρασία είναι ίση με τη

θερμοκρασία περιβάλλοντος.

Page 23: προγραμματισμός εργαστήριο

23

Γράψτε προγράμματα σε Fortran και C++ που να υπολογίζουν την αισθητή

θερμοκρασία για δεδομένες τιμές θερμοκρασίας περιβάλλοντος, σχετικής υγρασίας

και ταχύτητας ανέμου που θα δίνονται από το πληκτρολόγιο.

Υπόδειξη: Η μετατροπή μίας θερμοκρασίας από οC (Celcius) σε οF (Fahrenheit)

και το αντίστροφο γίνεται σύμφωνα με τους τύπους )32()9/5( FC TT και

32)5/9( CF TT .

Ζ. [Αριθμός Angstrom]

Ένας φυσικός αριθμός τριών ψηφίων ονομάζεται αριθμός Angstrom αν το

άθροισμα των κύβων των ψηφίων του είναι ίσο με τον αριθμό. Για παράδειγμα, το

371 είναι αριθμός Angstrom επειδή 371=33+73+13.

Να γράψετε προγράμματα σε Fortran και C++ που να δέχονται έναν φυσικό

αριθμό από το πληκτρολόγιο και να εμφανίζουν στην οθόνη το κατάλληλο μήνυμα

αν ο αριθμός αυτός είναι αριθμός Angstrom ή όχι.

Η. [Αυτόμορφος αριθμός]

Ένας φυσικός αριθμός των n ψηφίων χ ονομάζεται αυτόμορφος αριθμός αν ισχύει

τα n λιγότερο σημαντικά ψηφία του x2 να είναι ίσα με τον αριθμό x. Για

παράδειγμα, ο αριθμός 9376 είναι ένας αυτόμορφος αριθμός των 4 ψηφίων καθώς

x2=87909376.

Να γράψετε προγράμματα σε Fortran και C++ που να δέχονται έναν φυσικό

αριθμό από το πληκτρολόγιο και να εμφανίζουν στην οθόνη το κατάλληλο μήνυμα

αν ο αριθμός αυτός είναι αυτόμορφος αριθμός ή όχι.

Page 24: προγραμματισμός εργαστήριο

24

Page 25: προγραμματισμός εργαστήριο

25

ΕΝΟΤΗΤΑ 3 Δομές Επανάληψης

Διδακτικοί Στόχοι

Οι διδακτικοί στόχοι της εργαστηριακής ενότητας είναι:

να μπορείτε να χρησιμοποιείτε τις δομές επανάληψης ώστε να εκτελείτε

αρκετές φορές ένα τμήμα εντολών του προγράμματος,

να μπορείτε να επιλέγετε την κατάλληλη δομή επανάληψης σε κάθε

περίπτωση,

να μπορείτε να διακρίνετε μία δομή μεταβλητού πλήθους επαναλήψεων από

μία δομή σταθερού πλήθους επαναλήψεων,

να εξοικειωθείτε με τις εντολές εξόδου από μία δομή επανάληψης.

Ι. Πριν το εργαστήριο – Προετοιμασία

Α. Επαναλάβετε τη μελέτη της αντίστοιχης θεωρίας για τη γλώσσα προγραμματισμού

Fortran και απαντήστε στις παρακάτω ερωτήσεις:

1. Ποιές είναι οι τρεις δομές επανάληψης που υποστηρίζει η γλώσσα Fortran;

2. Ποιά από τις τρεις δομές επανάληψης θα χρησιμοποιήσετε στην περίπτωση που

θέλετε να επαναλάβετε ένα σύνολο εντολών για συγκεκριμένο αριθμό φορών;

3. Σε μία δομή DO με δείκτη, τι τιμές μπορεί να πάρει η μεταβλητή δείκτη;

4. Ποιά τιμή θα έχει η μεταβλητή Κ μετά την εκτέλεση του παρακάτω τμήματος

προγράμματος;

DO I=1,6

K=K+I

END DO

Πόσες φορές θα εκτελεστεί η εντολή Κ=Κ+Ι;

5. Πόσες φορές ενδέχεται να εκτελεστούν οι εντολές που περιέχονται σε μία δομή

DO με συνθήκη;

6. Ποιός είναι ο ρόλος της λογικής πρότασης σε μία δομή DO με συνθήκη;

7. Μετατρέψτε το τμήμα προγράμματος της ερώτησης 4 ώστε να χρησιμοποιεί δομή

DO με συνθήκη.

8. Ποιά τιμή θα έχει η μεταβλητή J μετά την εκτέλεση του παρακάτω τμήματος

προγράμματος;

J=-3

DO WHILE (J<=0)

J=J+2

END DO

Πόσες φορές θα εκτελεστεί η εντολή J=J+2;

Page 26: προγραμματισμός εργαστήριο

26

9. Ποιός είναι ο ρόλος των εντολών CYCLE και EXIT σε μία δομή επανάληψης;

Πόσες φορές μπορούν να εμφανίζονται οι εντολές CYCLE και EXIT σε μία δομή

ατέρμονος DO;

10. Τι αναφέρει ο κανόνας της επαλληλίας για την περίπτωση που έχουμε πολλές

δομές DO σε ένα πρόγραμμα; Δώστε ένα παράδειγμα που να περιέχει τρεις δομές

DO και να συμφωνεί με τον κανόνα της επαλληλίας.

Β. Επαναλάβετε τη μελέτη της αντίστοιχης θεωρίας για τη γλώσσα προγραμματισμού

C++ και απαντήστε στις παρακάτω ερωτήσεις:

1. Ποιές είναι οι εντολές επανάληψης που υποστηρίζει η γλώσσα C++;

2. Ποιά από τις εντολές επανάληψης θα χρησιμοποιήσετε στην περίπτωση που

θέλετε να επαναλάβετε ένα σύνολο εντολών για συγκεκριμένο αριθμό φορών;

3. Ποιός είναι ο ρόλος, σε μία εντολή for, των τριών τμημάτων που βρίσκονται σε

παρένθεση;

4. Ποιά τιμή θα έχει η μεταβλητή k μετά την εκτέλεση του παρακάτω τμήματος

προγράμματος;

for (i=1; i<7; i++)

k=k+i;

Πόσες φορές θα εκτελεστεί η εντολή k=k+i;

5. Πότε χρησιμοποιούμε άγκιστρα ({ }) σε μία εντολή for;

6. Ποιά τιμή θα έχει η μεταβλητή k μετά την εκτέλεση του παρακάτω τμήματος

προγράμματος;

for (i=1; i<10; i++);

k=k+i;

7. Ποιά είναι η διαφορά της εντολής while από την εντολή do-while;

8. Ποιά τιμή θα έχει η μεταβλητή j μετά την εκτέλεση του παρακάτω τμήματος

προγράμματος;

j=-3;

while (j<=0)

j++;

Πόσες φορές θα εκτελεστεί η εντολή j++;

9. Ποιός είναι ο ρόλος μιας εντολής break που βρίσκεται μέσα σε μία δομή

επανάληψης (for, while, do-while);

10. Ποιά τιμή θα έχει η μεταβλητή n μετά την εκτέλεση του παρακάτω τμήματος

προγράμματος;

n=0;

do

n++;

while (n<0);

Page 27: προγραμματισμός εργαστήριο

27

Γ. [Άθροισμα Ν πρώτων φυσικών αριθμών]

Δίνονται τα παρακάτω προγράμματα σε γλώσσα Fortran και C++ που υπολογίζουν,

για διάφορες τιμές του Ν, το άθροισμα των Ν πρώτων φυσικών αριθμών ( N ...21 )

προσθέτοντας επαναληπτικά τους αριθμούς από το 1 έως και το Ν. Η τιμή του Ν

εισάγεται κάθε φορά από το πληκτρολόγιο.

PROGRAM SUM_n

INTEGER n

INTEGER(KIND=1) :: sum

DO !atermwn DO

PRINT*,'Dwse timh gia to n (h <=0 gia exodo): '

READ*,n

IF (n<=0) THEN

EXIT

END IF

sum=0

DO k=1,n ! DO me deikth

sum=sum+k

END DO ! DO me deikth

PRINT*,'n=',n,' sum=',sum

END DO ! atermwn DO

END PROGRAM SUM_n

#include <iostream>

using namespace std;

int main()

{

int n=1;

unsigned short sum;

while (n>0)

{

cout << "Dwse timh gia to n (h <=0 gia exodo):";

cin >> n;

if (n>0)

{

sum=0;

for (int i=1; i<=n; i++)

sum+=i;

cout << "n=" << n << " sum=" << sum << endl;

}

}

return 0;

}

1. Μεταγλωττίστε τα προγράμματα στον υπολογιστή.

Page 28: προγραμματισμός εργαστήριο

28

2. Βρείτε την τιμή του αθροίσματος για (α) Ν=3 (β) Ν=15 (γ) Ν=100 χρησιμοποιώντας

τα παραπάνω προγράμματα.

3. Το ζητούμενο άθροισμα αποτελεί αριθμητική πρόοδο με Ν το πλήθος όρους,

πρώτο όρο το 1 και τελευταίο όρο το Ν. Επομένως ισχύει: 2

)1(...21

NNN

.

Ποιά είναι η μέγιστη τιμή του Ν για την οποία τα παραπάνω προγράμματα δίνουν

σωστό αποτέλεσμα; Μπορείτε να μετατρέψετε τα προγράμματα ώστε να δίνουν σωστό

αποτέλεσμα για μεγαλύτερες τιμές του Ν;

ΙΙ. Στο εργαστήριο

A. [Προσέγγιση τιμής ημίτονου]

Η τιμή του ημίτονου κάποιας γωνίας εκφρασμένης σε ακτίνια μπορεί να υπολογιστεί

χρησιμοποιώντας τη σχέση ...!5!3

53

xx

xx .

Ένας προγραμματιστής δοκίμασε να γράψει προγράμματα σε Fortran και C++ που

να προσεγγίζουν την τιμή του ημίτονου χρησιμοποιώντας την παραπάνω σχέση. Τα

προγράμματα προσθέτουν (αφαιρούν) τον επόμενο όρο (term) κάθε φορά στο τρέχον

άθροισμα (imitono) μέχρι αυτό να προσεγγίσει με ακρίβεια τεσσάρων δεκαδικών

ψηφίων την τιμή που επιστρέφει η συνάρτηση sin(). Κατέληξε στα παρακάτω

προγράμματα τα οποία δυστυχώς είναι ημιτελή ενώ περιέχουν συντακτικά και

λογικά λάθη.

! ypologismos hmitonou

REAL x,term,imitono,error,sinus

INTEGER i

error = 1

i = 0

imitono = x

term = x

sinus = sin(x)

DO WHILE (abs(error) > 1.0e-4)

term = term*(-1)*x*x/((i+1)*(i+2))

i = i+2

imitono = imitono+term

error = sinus-imitono

END

PRINT*, sinus,imitono,error

STOP

END

#include <iostream>

#include <cmath>

using namespace std;

int main()

{

float x, term, imitono, error, sinus

int i=0;

cout << "Dwse th gwnia se aktinia : " << endl;

cin >> x;

Page 29: προγραμματισμός εργαστήριο

29

error=1;

imitono=x;

term=imitono;

sinus=sin(x);

while (abs(error) > 1.0e-4)

{

term = term*(-1)*x*x/(i+1)*(i+2);

i += 2;

imitono += term;

error = sinus - imitono;

}

cout << sinus << imitono << error << endl;

return 0;

}

1. Διορθώστε τα λάθη των δύο προγραμμάτων, προσθέστε τις εντολές που λείπουν

και μεταγλωττίστε τα. Καταγράψτε τα συντακτικά και λογικά λάθη που βρήκατε.

2. Εκτελέστε τα προγράμματα για 5 διαφορετικές τιμές του χ (0, π/2, π, 3π/2, 2π)

και επιβεβαιώστε την ορθότητα των αποτελεσμάτων που παίρνετε.

3. Τροποποιήστε τα προγράμματα ώστε να εμφανίζουν στην οθόνη πόσοι όροι

χρειάστηκαν από το παραπάνω ανάπτυγμα για να επιτευχθεί η απαιτούμενη

ακρίβεια.

4. Μπορούμε να αυξήσουμε την ακρίβεια σε οκτώ δεκαδικά ψηφία; Εάν ναι,

τροποποιήστε κατάλληλα τα προγράμματα.

B. [Αριθμητική μέθοδος παραγώγισης]

Η παράγωγος )(xf μίας συνάρτησης )(xf ορίζεται με βάση τη σχέση:

h

xfhxfxf

h

)()(lim)(

0

. Μπορούμε επομένως να προσεγγίσουμε την τιμή της

παραγώγου μίας συνάρτησης για μία ορισμένη τιμή του x εάν υπολογίσουμε το λόγο

h

xfhxf )()( για μία αρκετά μικρή τιμή του h.

1. Γράψτε προγράμματα σε γλώσσα Fortran και C++ που να υπολογίζουν

προσεγγιστικά την τιμή της παραγώγου της συνάρτησης )cos()( xxf για 6/x .

Ξεκινήστε αρχικά με 2.0h και υπολογίστε επαναληπτικά τον παραπάνω λόγο

υποδιπλασιάζοντας κάθε φορά την τιμή του h έως ότου δύο διαδοχικές προσεγγίσεις

της παραγώγου να έχουν ίδια τα πρώτα 4 δεκαδικά ψηφία. Χρησιμοποιήστε δομή DO

με συνθήκη στη Fortran και αντίστοιχα την εντολή do-while στη C++.

2. Ελέγξτε την ορθότητα των προγραμμάτων που φτιάξατε συγκρίνοντας τα

αποτελέσματα που δίνουν.

3. Γνωρίζετε ότι η παράγωγος της συνάρτησης )cos()( xxf είναι ίση με:

)sin()( xxf . Υπολογίστε την τιμή της παραγώγου για 6/x με βάση την

προηγούμενη σχέση και συγκρίνετε το αποτέλεσμα με αυτά που προέκυψαν από τα

προγράμματά σας ( 866.0)6/cos()6/( f , 5.0)6/sin()6/( f ).

4. Χρησιμοποιήστε τα προγράμματά σας για να προσεγγίσετε την τιμή της

παραγώγου για κάποια άλλη συνάρτηση )(xf .

Page 30: προγραμματισμός εργαστήριο

30

ΙΙΙ. Μετά το εργαστήριο – Ασκήσεις προς επίλυση

Α. [Υπολογισμός παραγοντικού]

Η συνάρτηση του παραγοντικού ορίζεται με βάση τη σχέση

n

k

kn1

! 0n ενώ

ισχύει ότι 0!=1. Για παράδειγμα 5! = 12345 = 120. Είναι προφανές επίσης ότι

)!1(! nnn .

Γράψτε προγράμματα σε γλώσσα Fortran και C++ που να υπολογίζουν την τιμή της

συνάρτησης !n για δεδομένη τιμή του n που θα εισάγεται από το πληκτρολόγιο.

Ελέγξτε την ορθότητα των προγραμμάτων που φτιάξατε με κατάλληλα δεδομένα

εισόδου. Ποιά είναι η μέγιστη τιμή του n για την οποία τα προγράμματα σας

υπολογίζουν σωστά τη συνάρτηση !n στις περιπτώσεις που το αποτέλεσμα

αποθηκεύεται σε μεταβλητές τύπου δεδομένων INTEGER και είδους 1,2,4 στη fortran

ή τύπου char, unsigned char, short, int, unsigned int στη C++;

Β. [Ροπή αδράνειας χαρακτηριστικών σωμάτων]

L

ab

R

2

12

1MLI

)(

12

1 22 baMI 2

2

1MRI

(α) Λεπτή ράβδος (β) Ορθογώνια πλάκα (γ) Συμπαγής κύλινδρος

R

R

R

2

2

1MRI

2

3

2MRI

2

5

2MRI

(δ) Δίσκος (ε) Σφαιρικός φλοιός (στ) Συμπαγής σφαίρα

Οι ροπές αδράνειας ορισμένων χαρακτηριστικών σωμάτων μάζας Μ ως προς άξονα

που διέρχεται από το κέντρο μάζας τους δίνονται στο παραπάνω σχήμα.

Γράψτε προγράμματα σε γλώσσα Fortran και C++ που να υπολογίζουν

επαναληπτικά την τιμή της ροπής αδράνειας διαφόρων σωμάτων. Το είδος του

σώματος, η μάζα και οι διαστάσεις του θα εισάγονται κάθε φορά από το

πληκτρολόγιο. Τα προγράμματα θα τερματίζουν τη λειτουργία τους όταν εισαχθεί

από το πληκτρολόγιο η κατάλληλη τιμή. Ελέγξτε την ορθότητα των προγραμμάτων

που φτιάξατε με κατάλληλα δεδομένα εισόδου.

Page 31: προγραμματισμός εργαστήριο

31

Γ. [Κύκλωμα RC] C

RV

Έστω το κύκλωμα RC του παραπάνω σχήματος. Ο πυκνωτής αρχικά είναι

αφόρτιστος. Τη χρονική στιγμή t = 0 κλείνουμε το διακόπτη και ο πυκνωτής αρχίζει

να φορτίζεται. Το δυναμικό στα άκρα του πυκνωτή δίνεται από τη σχέση

)1( t

C eVV

ενώ η ένταση του ρεύματος που διαρρέει την αντίσταση δίνεται από τη

σχέση t

R eR

VI

, όπου RC η σταθερά χρόνου του κυκλώματος.

Γράψτε προγράμματα σε γλώσσα Fortran και C++ που να υπολογίζουν το δυναμικό

στα άκρα του πυκνωτή και την ένταση του ρεύματος στην αντίσταση για τις χρονικές

στιγμές t = 0, τ, 2τ, 3τ, 4τ, 5τ. Οι τιμές της αντίστασης, του πυκνωτή και της πηγής

θα εισάγονται κάθε φορά από το πληκτρολόγιο. Ελέγξτε την ορθότητα των

προγραμμάτων που φτιάξατε με κατάλληλα δεδομένα εισόδου.

Δ. [Υπολογισμός αθροισμάτων]

Δίνονται τα αθροίσματα

30

1

4

1 12k

kA και

23

1

6

2 )5.0(logk

e kA .

1. Γράψτε προγράμματα σε γλώσσα Fortran και C++ που να υπολογίζουν την τιμή

των αθροισμάτων 1A και 2A θεωρώντας τα ως πραγματικούς αριθμούς απλής

ακρίβειας. Χρησιμοποιήστε δομή DO με δείκτη στη Fortran και αντίστοιχα την

εντολή for στη C++.

2. Ελέγξτε την ορθότητα των προγραμμάτων που φτιάξατε συγκρίνοντας τα

αποτελέσματα που δίνουν.

3. Τροποποιήστε τα προγράμματα ώστε τα αθροίσματα 1A και 2A να αντιστοιχούν σε

πραγματικούς αριθμούς διπλής ακρίβειας. Διαφέρουν τα αποτελέσματα σε σχέση με

αυτά που είχατε προηγούμενα; Αν ναι, που οφείλεται η διαφορά;

4. Τροποποιήστε τα προγράμματα ώστε να χρησιμοποιούν δομή DO με συνθήκη αντί

για δομή DO με δείκτη στη Fortran και την εντολή while αντί για την εντολή for στη

C++.

E. [Προσέγγιση τετραγωνικής ρίζας]

Μία μέθοδος για την προσέγγιση της τετραγωνικής ρίζας ενός αριθμού x (x>0)

βασίζεται σε διαδοχικές αφαιρέσεις περιττών ακεραίων αριθμών. Η μέθοδος έχει ως

εξής: αρχικά αφαιρείται η τιμή 1 από την τιμή του x. Στη συνέχεια αφαιρείται ο

επόμενος περιττός αριθμός (π.χ. 3) από το προηγούμενο αποτέλεσμα (π.χ. χ-1) και η

διαδικασία αυτή επαναλαμβάνεται μέχρι το αποτέλεσμα μίας αφαίρεσης να είναι

μικρότερο του μηδενός. Το πλήθος των πράξεων που απαιτούνται μέχρι να

προκύψει ως αποτέλεσμα αρνητικός αριθμός (μη συμπεριλαμβανομένης της

Page 32: προγραμματισμός εργαστήριο

32

τελευταίας πράξης) καθορίζει το ακέραιο μέρος της τετραγωνικής ρίζας του αριθμού

x.

Παράδειγμα: Προσέγγιση της τετραγωνικής ρίζας του 17. Έχουμε:

17-1 = 16 [1]

16-3 = 13 [2]

13-5 = 8 [3]

8 -7 = 1 [4]

1 -9 = -8.

Επομένως το ακέραιο μέρος της τετραγωνικής ρίζας του 17 είναι ίσο με 4.

Γράψτε προγράμματα σε γλώσσα Fortran και C++ που να υπολογίζουν το ακέραιο

μέρος της τετραγωνικής ρίζας ενός θετικού αριθμού, η τιμή του οποίου θα εισάγεται

από το πληκτρολόγιο. Ελέγξτε την ορθότητα των προγραμμάτων που φτιάξατε

χρησιμοποιώντας διάφορους αριθμούς.

ΣΤ. [Τέλειοι αριθμοί]

Ένας ακέραιος αριθμός ονομάζεται τέλειος αριθμός αν το άθροισμα των

παραγόντων του, συμπεριλαμβανομένου του 1 αλλά όχι του ίδιου του αριθμού,

είναι ίσο με τον αριθμό. Για παράδειγμα το 6 είναι τέλειος αριθμός επειδή

6=1+2+3.

Γράψτε προγράμματα σε Fortran και C++ που να υπολογίζουν ποιοί από τους

αριθμούς στο διάστημα [1, 10000] είναι τέλειοι αριθμοί. Είναι επιθυμητό τα

προγράμματά σας να εμφανίζουν τους παράγοντες των τέλειων αριθμών.

Ζ. [Μέγιστος κοινός διαιρέτης]

Ο μέγιστος κοινός διαιρέτης (ΜΚΔ) δύο φυσικών αριθμών a και b με a>b μπορεί να

υπολογιστεί με τον αλγόριθμο του Ευκλείδη ο οποίος ορίζει ότι:

0)mod,(

0),(

bbab

baba ,

όπου α mod b είναι το υπόλοιπο της διαίρεσης α/b.

Παράδειγμα: Εύρεση του ΜΚΔ(22,12). Έχουμε:

b =12 ≠ 0, 22 mod 12 = 10 => ΜΚΔ(22,12) = ΜΚΔ(12,10)

b =10 ≠ 0, 12 mod 10 = 2 => ΜΚΔ(22,12) = ΜΚΔ(10, 2)

b = 2 ≠ 0, 10 mod 2 = 0 => ΜΚΔ(22,12) = ΜΚΔ( 2, 0)

b = 0 = 0, => ΜΚΔ(22,12) = 2

Δημιουργήστε προγράμματα σε Fortran και C++ που να υπολογίζουν το μέγιστο

κοινό διαιρέτη δύο φυσικών αριθμών, η τιμή των οποίων θα εισάγεται από το

πληκτρολόγιο.

Η. [Αριθμός ISBN-10]

Σε κάθε βιβλίο που κυκλοφορεί ανατίθεται ένας μοναδικός αριθμός που λέγεται

ISBN (International Standard Book Number). Αυτός στην αρχική του μορφή

(ISBN-10) αποτελείται από 9 ψηφία Α1...Α9, όπου το καθένα παίρνει τιμές από το 0

έως και το 9 και από ένα ψηφίο ελέγχου Α10, που παίρνει τιμές από το 0 έως και το

Page 33: προγραμματισμός εργαστήριο

33

10. Οι τιμές των ψηφίων A1…A10 για κάθε βιβλίο επιλέγονται κατάλληλα από τον

εκδότη ώστε να ισχύει ότι το

10

1)11(

i iAi είναι πολλαπλάσιο του 11.

1. Να γράψετε πρoγράμματα σε Fortran και C++ που να δέχονται από το

πληκτρολόγιο τα 10 ψηφία ενός ISBN αριθμού και να εμφανίζουν στην οθόνη εάν ο

ISBN αριθμός είναι έγκυρος ή όχι (εάν δηλαδή υπακούει στον παραπάνω κανόνα).

Ελέξγτε την ορθότητα των προγραμμάτων που ετοιμάσατε για τις παρακάτω δύο

περιπτώσεις: (α) 960425059-0, (β) 111111111-2.

2. Ο αριθμός ISBN-10 έχει αντικατασταθεί πλέον από τον αριθμό ISBN-13 ο οποίος

περιέχει 13 ψηφία αντί για 10. Αφού βρείτε τις σχετικές πληροφορίες για τον αριθμό

αυτό, δημιουργήστε νέα προγράμματα που να ελέγχουν την εγκυρότητα ή μή ενός

ISBN-13 αριθμού.

Θ. [Πυθαγόρειες τριάδες]

Τρεις ακέραιοι αριθμοί αποτελούν μία Πυθαγόρεια τριάδα αν μπορούν να

αναπαριστούν τα μήκη των τριών πλευρών ενός ορθογωνίου τριγώνου. Για

παράδειγμα οι αριθμοί 3, 4 και 5 αποτελούν μία Πυθαγόρεια τριάδα.

Γράψτε πρόγραμμα σε γλώσσα Fortran και σε γλώσσα C++ που να υπολογίζει όλες

τις διαφορετικές Πυθαγόρειες τριάδες στις οποίες και οι τρεις αριθμοί είναι από το 1

έως και το 20 και να εμφανίζει τα αποτελέσματα στην οθόνη του υπολογιστή.

Ι. [Ακολουθία Fibonacci]

Η ακολουθία Fibonacci (0, 1, 1, 2, 3, 5, 8, 13, 21, ...) σχηματίζεται ξεκινώντας με

τους αριθμούς 0 και 1 ενώ στη συνέχεια κάθε επόμενος όρος είναι το άθροισμα

των δύο προηγούμενων όρων. Για παράδειγμα ο 5ος κατά σειρά όρος της

ακολουθίας Fibonacci είναι ο αριθμός 3.

Γράψτε πρόγραμμα σε γλώσσα Fortran και σε γλώσσα C++ που να υπολογίζει που

να υπολογίζει τον n-οστό κατά σειρά όρο της ακολουθίας Fibonacci και να εμφανίζει

το αποτέλεσμα στην οθόνη. Η τιμή του αριθμού n θα εισάγεται από το

πληκτρολόγιο.

IA. [Αριθμός CAS]

Σε κάθε χημική ένωση που αναφέρεται στη βιβλιογραφία ανατίθεται και ένας

μοναδικός αριθμός που αναφέρεται ως αριθμός CAS. Ο αριθμός αυτός αποτελείται

από τρία μέρη. Το πρώτο μέρος αποτελείται από το πολύ έως 7 αριθμητικά ψηφία,

το δεύτερο μέρος από 2 ψηφία και το τρίτο μέρος από 1 ψηφίο (ψηφίο ελέγχου). Για

παράδειγμα α αριθμός CAS του νερού είναι ο 7732-18-5. Το ψηφίο ελέγχου

υπολογίζεται (α) πολλαπλασιάζοντας το τελευταίο ψηφίο (πριν το ψηφίο ελέγχου) επί

1, το προτελευταίο επι 2, κ.λπ., (β) αθροίζοντας τα επιμέρους γινόμενα και (γ)

βρίσκοντας το υπόλοιπο της διαίρεσης του αθροίσματος με το 10. Για παράδειγμα

81+12+23+34+75+76=105 και το υπόλοιπο της διαίρεσής του με το 10 δίνει

το ψηφίο ελέγχου 5.

Να γράψετε πρoγράμματα σε Fortran και C++ που να δέχονται από το

πληκτρολόγιο τα ψηφία ενός CAS αριθμού και να εμφανίζουν στην οθόνη εάν ο CAS

αριθμός είναι έγκυρος ή όχι (εάν δηλαδή υπακούει στον παραπάνω κανόνα).

Page 34: προγραμματισμός εργαστήριο

34

Page 35: προγραμματισμός εργαστήριο

35

ΕΝΟΤΗΤΑ 4 Πίνακες

Διδακτικοί Στόχοι

Οι διδακτικοί στόχοι της εργαστηριακής ενότητας είναι:

να κατανοήσετε τη χρήση των μεταβλητών πινάκων για αποθήκευση,

ταξινόμηση και αναζήτηση τιμών σε λίστες και πίνακες,

να μπορείτε να δηλώνετε και να αρχικοποιείτε τα στοιχεία ενός πίνακα,

να μπορείτε να αναφέρετε τα στοιχεία ενός πίνακα,

να μπορείτε να χειρίζεστε μονοδιάστατους πίνακες αλλά και πίνακες με

περισσότερες από μία διαστάσεις.

Ι. Πριν το εργαστήριο – Προετοιμασία

Α. Επαναλάβετε τη μελέτη της αντίστοιχης θεωρίας για τη γλώσσα προγραμματισμού

Fortran και απαντήστε στις παρακάτω ερωτήσεις:

1. Με πόσους τρόπους μπορούμε να ορίσουμε μια μεταβλητή πίνακα; Δώστε ένα

παράδειγμα για κάθε έναν από αυτούς.

2. Ορίστε έναν πίνακα 2χ3 ακεραίων αριθμών με όνομα TABLE. Πως μπορώ να

προσπελάσω το πρώτο στοιχείο της δεύτερης γραμμής του πίνακα;

3. Συγκρίνετε τις τρεις παρακάτω εντολές δήλωσης μεταβλητών πινάκων. Είναι

ταυτόσημες;

(α) REAL, DIMENSION(3) :: A, B, C

(β) REAL A(3), B, C

(γ) REAL, DIMENSION(0:3) :: A, B, C

4. Πως θα δηλώσω μία μεταβλητή πίνακα όταν δεν γνωρίζω το πλήθος των στοιχείων

που θα περιέχει αυτός τελικά αλλά μόνο τις διαστάσεις του; Δώστε ένα παράδειγμα.

5. Ένα πρόγραμμα Fortran διαθέτει μία μεταβλητή μονοδιάστατου πίνακα. Δώστε

δύο εναλλακτικούς τρόπους ώστε να εισαχθούν τιμές σε όλον τον πίνακα από το

πληκτρολόγιο του υπολογιστή.

6. Μπορώ να εμφανίσω στην οθόνη του υπολογιστή όλες τις τιμές ενός

μονοδιάστατου πίνακα χρησιμοποιώντας μόνο μία εντολή PRINT; Αν ναι, με ποιόν

τρόπο;

7. Μπορεί μία μεταβλητή πίνακα να περιέχει στοιχεία διαφορετικών τύπων

δεδομένων, π.χ. ακέραιους και πραγματικούς αριθμούς;

8. Πόσα στοιχεία περιέχει ο πίνακας που δηλώνεται με την εντολή: COMPLEX,

DIMENSION(0:7,1:8) :: MAT;

9. Πόσες διαστάσεις έχει ο πίνακας που δηλώνεται με την εντολή INTEGER K(5,5);

Page 36: προγραμματισμός εργαστήριο

36

10. Έχω δύο μεταβλητές πίνακα ακεραίων αριθμών με ίδιες διαστάσεις και πλήθος

στοιχείων και ονόματα Α και Β. Δώστε δύο εναλλακτικούς τρόπους για την

αντιγραφή των τιμών των στοιχείων του πίνακα Α και την αποθήκευσή τους στον

πίνακα Β.

Β. Επαναλάβετε τη μελέτη της αντίστοιχης θεωρίας για τη γλώσσα προγραμματισμού

C++ και απαντήστε στις παρακάτω ερωτήσεις:

1. Ορίστε έναν πίνακα 2χ3 ακεραίων αριθμών με όνομα matrix. Πως μπορώ να

προσπελάσω το πρώτο στοιχείο της δεύτερης γραμμής του πίνακα;

2. Με πόσους τρόπους μπορώ να αρχικοποιήσω τις τιμές των στοιχείων ενός πίνακα;

3. Ένα πρόγραμμα διαθέτει μία μεταβλητή μονοδιάστατου πίνακα. Δώστε τις

κατάλληλες εντολές για την εισαγωγή τιμών στα στοιχεία του πίνακα από το

πληκτρολόγιο.

4. Μπορεί μία μεταβλητή πίνακα να περιέχει στοιχεία διαφορετικού τύπου

δεδομένων, π.χ. ακέραιους και πραγματικούς αριθμούς; Ποιά είναι η δομή που

υποστηρίζει η C++ για το σκοπό αυτό;

5. Πόσα στοιχεία περιέχει ο πίνακας που δηλώνεται με την εντολή int matrix[15];

Πως θα προσπελάσω το τρίτο στοιχείο του πίνακα;

6. Πόσες διαστάσεις και πόσα στοιχεία έχει ο πίνακας που δηλώνεται με την εντολή

float pin[10][10];

7. Έστω δύο μεταβλητές πίνακα ακεραίων με ίδιες διαστάσεις και πλήθος στοιχείων

και ονόματα Α και Β. Μπορώ να δώσω την εντολή Α=Β για να αντιγραφούν τα

στοιχεία του ενός πίνακα στον άλλο;

8. Έστω μεταβλητή μονοδιάστατου πίνακα 10 ακεραίων αριθμών με όνομα Α. Η

ανάθεση Α[10]=5 είναι σωστή;

9. Ποιό είναι το αποτέλεσμα εκτέλεσης του παρακάτω τμήματος προγράμματος, εάν

η μεταβλητή x έχει δηλωθεί με την εντολή int x[5];

for (int i=0; i<5; i++)

x[i]--;

10. Το παρακάτω τμήμα προγράμματος μηδενίζει τα στοιχεία ενός πίνακα. Είναι

σωστό; Εάν όχι, βρείτε και διορθώστε τα λάθη του.

float a[10][10];

for (int i=1; i<=10; i++)

for (int j=1; j<=10; j++)

a[i,j]=0.0;

Γ. [Εύρεση ελάχιστου/μέγιστου στοιχείου σε λίστα αριθμών]

Δίνονται τα παρακάτω προγράμματα σε γλώσσα Fortran και C++ που υπολογίζουν

το μέγιστο και το ελάχιστο μεταξύ των στοιχείων ενός μονοδιάστατου πίνακα.

! eyresh megistou / elaxistou

PROGRAM min_max

INTEGER,PARAMETER :: N=10

Page 37: προγραμματισμός εργαστήριο

37

INTEGER,DIMENSION(N) :: A

INTEGER min, max

DO i=1,N

PRINT*,'Dwse stoixeio A(',I,'):'

READ*, A(I)

END DO

max=A(1)

DO i=2,N

IF (A(i)>max) THEN

max=A(i)

END IF

END DO

min=A(1)

DO i=2,N

IF (A(i)<min) THEN

min=A(i)

END IF

END DO

PRINT*,'MIN=',min,' MAX=',max

END PROGRAM min_max

#include <iostream>

using namespace std;

int main()

{

const int N=10;

int A[N], i;

int min,max;

for (i=0; i<N; i++)

{

cout << "Dwse stoixeio A(" << i << "):";

cin >> A[i];

}

max = A[0];

for (i=1; i<N; i++)

if (A[i]>max)

max=A[i];

min = A[0];

for (i=1; i<N; i++)

if (A[i]<min)

min=A[i];

cout << "MIN=" << min << " MAX=" << max << endl;

return 0;

}

1. Μεταγλωττίστε τα προγράμματα στον υπολογιστή.

2. Βρείτε το μέγιστο και το ελάχιστο στοιχείο των πινάκων (α) [1 2 3 4 5 6 7 8 9 10]

(β) [2 5 3 8 12 25 32 48 9 2] (γ) [-3 4 0 8 23 18 -8 9 -5 10] χρησιμοποιώντας τα

παραπάνω προγράμματα.

Page 38: προγραμματισμός εργαστήριο

38

3. Τροποποιήστε τα παραπάνω προγράμματα ώστε να εμφανίζουν και τη θέση του

πίνακα στην οποία βρέθηκε το μέγιστο ή το ελάχιστο στοιχείο. Συγκρίνετε τα

αποτελέσματα των δύο προγραμμάτων για τον ίδιο πίνακα. Διαφέρουν ή όχι και

γιατί;

ΙΙ. Στο εργαστήριο

Α. [Ταξινόμηση στοιχείων μονοδιάστατου πίνακα]

Η ταξινόμηση των στοιχείων ενός μονοδιάστατου πίνακα είναι μία διαδικασία που

απαιτείται αρκετά συχνά σε εφαρμογές. Μια μέθοδος για την ταξινόμηση των

στοιχείων ενός μονοδιάστατου πίνακα είναι η μέθοδος ταξινόμησης φυσαλίδας

(bubble sort). Με βάση τη μέθοδο αυτή κάνουμε Ν-1 το πλήθος περάσματα στα

στοιχεία του πίνακα, όπου Ν το πλήθος των στοιχείων του πίνακα. Σε κάθε πέρασμα

ξεκινάμε από το πρώτο στοιχείο του πίνακα και προχωράμε μέχρι το προτελευταίο

στοιχείο του. Συγκρίνουμε κάθε φορά το τρέχον στοιχείο με το επόμενό του. Στην

περίπτωση που τα δύο αυτά στοιχεία είναι σε αύξουσα σειρά τα αφήνουμε ως έχουν.

Στην περίπτωση που τα δύο στοιχεία δεν είναι σε αύξουσα σειρά, τότε εναλλάσσουμε

τις τιμές τους. Στο τέλος αυτής της διαδικασίας τα στοιχεία του πίνακα είναι

ταξινομημένα σε αύξουσα σειρά.

Ένας προγραμματιστής δοκίμασε να γράψει προγράμματα σε Fortran και C++ που

να ταξινομούν τα στοιχεία ενός μονοδιάστατου πίνακα χρησιμοποιώντας τη μέθοδο

της φυσαλίδας. Κατέληξε στα παρακάτω προγράμματα τα οποία δυστυχώς περιέχουν

συντακτικά και λογικά λάθη.

! bubble sort

PROGRAM Sorting

REAL, DIMENSION(10) :: arr

DO i=1,10

print*,'Dwse stoixeio arr(',i,'): '

read*, arr(i)

ENDDO

DO i=1,9

DO j=1,9

IF (arr(j)>arr(j+1)) THEN

hold=arr(i)

arr(j)=arr(j+1)

arr(j+1)=hold

ENDIF

ENDDO

ENDDO

PRINT*,'Sorted array'

DO i=1,9

PRINT*,'arr(',i,')=',arr(i)

ENDDO

END PROGRAM Sorting

#include <iostream>

using namespace std;

Page 39: προγραμματισμός εργαστήριο

39

int main()

{

const int N = 10; // size of array a

double arr[N];

double hold; // temporary location used to swap array elements

int i,j,k;

for (i=0; i<=N; i++)

{

cout << "Dwse stoixeio arr(" << i << "): ";

cin >> arr[i];

}

for (i=0; i<N-1; i++)

for (j=0; j<N-1; j++)

if (arr[j]>arr[j+1])

{

hold = arr[i];

arr[j] = arr[j+1];

arr[j+1] = hold;

} // end if

cout << "Sorted array" << endl;

for (k=0; k<N; k++)

cout << arr[k];

cout << endl;

return 0;

} // end main

1. Διορθώστε τα λάθη των δύο προγραμμάτων και μεταγλωττίστε τα. Καταγράψτε τα

συντακτικά και λογικά λάθη που βρήκατε.

2. Εκτελέστε τα προγράμματα για 3 διαφορετικούς πίνακες και επιβεβαιώστε την

ορθότητα των αποτελεσμάτων που παίρνετε.

3. Μπορούμε να ταξινομήσουμε τα στοιχεία του πίνακα σε φθίνουσα σειρά; Εάν ναι,

τροποποιήστε κατάλληλα τα προγράμματα.

Β. [Προσέγγιση γραμμικής σχέσης με τη μέθοδο ελαχίστων τετραγώνων]

Στα πλαίσια ενός πειράματος, καταγράφουμε τις τιμές ενός φυσικού μεγέθους y για

διάφορες τιμές ενός φυσικού μεγέθους χ. Έστω n το πλήθος των ζευγών ( ix , iy ) που

προέκυψαν από το πείραμα. Γνωρίζουμε ότι τα μεγέθη x και y συνδέονται μεταξύ

τους με μία γραμμική σχέση baxxfy )( . Δυστυχώς η διαδικασία καταγραφής

φυσικών μεγεθών είναι επιρρεπής σε σφάλματα. Ζητείται η εύρεση της γραμμικής

σχέσης μεταξύ των x και y (δηλαδή οι τιμές των α και b) η οποία να προσεγγίζει με

τον καλύτερο δυνατό τρόπο τα ζεύγη ( ix , iy ) τα οποία προέκυψαν από το πείραμα.

Θα πρέπει να βρούμε τη συνάρτηση baxxf )( η οποία ελαχιστοποιεί το μέσο

τετραγωνικό σφάλμα

n

i

ii yxfn

E1

2)(

1. Αυτό είναι ισοδύναμο με την

ελαχιστοποίηση της συνάρτησης

n

i

ii ybaxbaG1

2),( ή αντίστοιχα με την επίλυση

του παρακάτω γραμμικού συστήματος δύο εξισώσεων με δύο αγνώστους:

Page 40: προγραμματισμός εργαστήριο

40

n

i

ii

n

i

i

n

i

i

n

i

i

n

i

i

yxaxbx

yaxnb

11

2

1

11

Γράψτε προγράμματα σε γλώσσα Fortran και C++ που να προσεγγίζουν τη

γραμμική σχέση μεταξύ των μεγεθών x και y χρησιμοποιώντας τα ζεύγη τιμών

( ix , iy ) που προέκυψαν από ένα πείραμα. Το πλήθος των ζευγών, n, καθώς και οι

τιμές των δεδομένων ix και iy , ni 1 , θα εισάγονται από το πληκτρολόγιο.

Χρησιμοποιήστε το πρόγραμμα που δημιουργήσατε στην Ενότητα 2 για την επίλυση

του γραμμικού συστήματος των εξισώσεων. Ελέγξτε την ορθότητα των προγραμμάτων

που φτιάξατε χρησιμοποιώντας τα παρακάτω δεδομένα γνωρίζοντας εκ των προτέρων

ότι 74605.206338.1)( xxfy και ότι το γραμμικό σύστημα που προκύπτει είναι το

παρακάτω:

7302.608.21963

326.96321

ab

ab

ix iy ix iy

1.0 -1.945 3.2 +0.764

1.2 -1.253 3.4 +0.532

1.4 -1.140 3.6 +1.073

1.6 -1.087 3.8 +1.286

1.8 -0.760 4.0 +1.502

2.0 -0.682 4.2 +1.582

2.2 -0.424 4.4 +1.993

2.4 -0.012 4.6 +2.473

2.6 -0.190 4.8 +2.503

2.8 +0.452 5.0 +2.322

3.0 +0.337

ΙΙΙ. Μετά το εργαστήριο – Ασκήσεις προς επίλυση

Α. [Κέντρο μάζας συστήματος σωμάτων]

Έστω σύστημα το οποίο αποτελείται από έναν αριθμό σωμάτων με μάζες m1, m2, ….

Αν xi, yi, zi είναι οι συντεταγμένες του σώματος mi στο χώρο, τότε το κέντρο μάζας του

συστήματος βρίσκεται στο σημείο με συντεταγμένες

i

ii

m

xmx ,

i

ii

m

ymy ,

i

ii

m

zmz .

1. Γράψτε προγράμματα σε γλώσσα Fortran και C++ που να υπολογίζουν το κέντρο

μάζας συστήματος το οποίο αποτελείται από 5 σώματα. Χρησιμοποιήστε μεταβλητές

πίνακα για να αποθηκεύσετε τις μάζες και τις συντεταγμένες του κάθε σώματος οι

οποίες θα εισάγονται από το πληκτρολόγιο.

2. Εκτελέστε τα προγράμματα για 3 διαφορετικές περιπτώσεις και επιβεβαιώστε την

ορθότητα των αποτελεσμάτων που παίρνετε.

3. Τροποποιήστε τα προγράμματα ώστε να υπολογίζουν το κέντρο μάζας συστήματος

10 σωμάτων που βρίσκονται στο επίπεδο (z=0).

Page 41: προγραμματισμός εργαστήριο

41

Β. [Γραμμική / Δυαδική αναζήτηση]

Δίνεται ένας μονοδιάστατος πίνακας ακεραίων αριθμών Α. Ζητείται να βρεθεί εάν

υπάρχει ο αριθμός χ μέσα στα στοιχεία του πίνακα.

Η πιο απλή και άμεση λύση στο πρόβλημα δίνεται με τη γραμμική αναζήτηση. Με

βάση αυτή, τα στοιχεία του πίνακα Α συγκρίνονται ένα προς ένα με τον ζητούμενο

αριθμό χ ξεκινώντας από το πρώτο στοιχείο του πίνακα και προχωρώντας είτε μέχρι

να βρεθεί ο αριθμός χ είτε μέχρι να ελεγχθούν όλα τα στοιχεία του πίνακα. Είναι

προφανές ότι στη χειρότερη περίπτωση (που ο πίνακας δεν περιέχει τον αριθμό χ) η

γραμμική αναζήτηση απαιτεί n το πλήθος συγκρίσεις, όπου n το πλήθος των

στοιχείων του πίνακα Α. Στην περίπτωση που τα στοιχεία του πίνακα Α είναι

ταξινομημένα, π.χ. σε αύξουσα σειρά, τότε η αναζήτηση σταματά στο πρώτο στοιχείο

του πίνακα το οποίο είναι μεγαλύτερο από τον αριθμό χ.

Στην περίπτωση που τα στοιχεία του πίνακα είναι ταξινομημένα, μία πιο αποδοτική

λύση στο πρόβλημα της αναζήτησης δίνεται με τη δυαδική αναζήτηση. Η αναζήτηση

ξεκινά συγκρίνοντας το μεσαίο στοιχείο του πίνακα με τον αριθμό χ. Αν το χ είναι

ίσο με το μεσαίο στοιχείο του πίνακα η αναζήτηση τερματίζεται καθώς ο αριθμός

έχει βρεθεί. Αν το χ είναι μικρότερο τότε επαναλαμβάνουμε την αναζήτηση στο

πρώτο μισό του πίνακα. Αν το χ είναι μεγαλύτερο τότε επαναλαμβάνουμε την

αναζήτηση στο δεύτερο μισό του πίνακα. Συνεχίζουμε την παραπάνω διαδικασία είτε

μέχρι να βρεθεί ο αριθμός χ είτε μέχρι να καταλήξουμε σε έναν πίνακα με μόνο ένα

στοιχείο. Στη χειρότερη περίπτωση η δυαδική αναζήτηση απαιτεί log2n+1 συγκρίσεις

και επομένως είναι πολύ πιο γρήγορη από τη γραμμική αναζήτηση σε πίνακες με

πολλά στοιχεία.

Γράψτε προγράμματα σε γλώσσα Fortran και C++ που να υλοποιούν τόσο τη

γραμμική όσο και τη δυαδική αναζήτηση. Θεωρείστε ότι ο πίνακας Α αποτελείται

από 1000 αριθμούς και ότι iiA ][ . Ο αριθμός χ θα εισάγεται από το πληκτρολόγιο.

Ελέγξτε την ορθότητα των προγραμμάτων που φτιάξατε. Συγκρίνετε το πλήθος των

συγκρίσεων που απαιτεί στη χειρότερη περίπτωση η γραμμική και η δυαδική

αναζήτηση.

Γ. [Ροπή αδράνειας στερεού]

Z

r1 υ1

r2 υ2

m1

m2

Ονομάζουμε ροπή αδράνειας ενός στερεού ως προς κάποιο άξονα το άθροισμα των

γινομένων των στοιχειωδών μαζών από τις οποίες αποτελείται το σώμα επί τα

τετράγωνα των αποστάσεών τους από τον άξονα περιστροφής.

...2

22

2

11 rmrmI

Η ροπή αδράνειας είναι μονόμετρο μέγεθος και έχει μονάδα το 1 Kg m2.

Page 42: προγραμματισμός εργαστήριο

42

Γράψτε προγράμματα σε γλώσσα Fortran και C++ που να υπολογίζουν την τιμή της

ροπής αδράνειας στερεού. Θεωρείστε ότι το στερεό αποτελείται από το πολύ έως 100

στοιχειώδεις μάζες. Το πλήθος των στοιχειωδών μαζών καθώς και οι μάζες και οι

αποστάσεις από τον άξονα περιστροφής κάθε μίας από αυτές θα εισάγονται από το

πληκτρολόγιο. Ελέγξτε την ορθότητα των προγραμμάτων που φτιάξατε με κατάλληλα

δεδομένα εισόδου.

Δ. [Υπολογισμός αντίστροφου πίνακα]

Ο πίνακας

A είναι αντιστρέψιμος αν και μόνο αν 0

. Ο αντίστροφος

ενός πίνακα

A , αν υπάρχει, δίνεται από τον τύπο

aDA

11 , όπου

D .

Γράψτε προγράμματα σε γλώσσα Fortran και C++ που να υπολογίζουν τον

αντίστροφο ενός πίνακα 22. Σε περίπτωση που δεν υπάρχει αντίστροφος, τα

προγράμματα πρέπει να εμφανίζουν το αντίστοιχο μήνυμα. Τα στοιχεία του πίνακα

θα εισάγονται κάθε φορά από το πληκτρολόγιο. Ελέγξτε την ορθότητα των

προγραμμάτων που φτιάξατε χρησιμοποιώντας ως δεδομένα εισόδου τους παρακάτω

πίνακες: (α)

21

43A (β)

12

24B (γ)

43

12.

Ε. [Κινητική ενέργεια στερεού σώματος λόγω περιστροφής]

Z

r1 υ1

r2 υ2

m1

m2

Έστω στερεό σώμα αποτελούμενο από στοιχειώδεις μάζες 1m , 2m , … το οποίο

στρέφεται με γωνιακή ταχύτητα ω. Η κινητική ενέργεια του σώματος είναι ίση με το

άθροισμα των κινητικών ενεργειών των μαζών από τις οποίες αποτελείται:

...2

1

2

1 2

22

2

11 vmvmK ενώ οι ταχύτητες δίνονται αντίστοιχα από τις σχέσεις: 11 rv ,

22 rv , κ.λπ.

Γράψτε προγράμματα σε γλώσσα Fortran και C++ που να υπολογίζουν την τιμή της

κινητικής ενέργειας στερεού σώματος. Θεωρείστε ότι το στερεό αποτελείται από το

πολύ έως 100 στοιχειώδεις μάζες. Το πλήθος των στοιχειωδών μαζών καθώς και οι

μάζες και οι αποστάσεις από τον άξονα περιστροφής κάθε μίας από αυτές καθώς και

η γωνιακή ταχύτητα θα εισάγονται από το πληκτρολόγιο. Ελέγξτε την ορθότητα των

προγραμμάτων που φτιάξατε με κατάλληλα δεδομένα εισόδου.

Page 43: προγραμματισμός εργαστήριο

43

ΣΤ. [Παλίνδρομο κείμενο]

Παλίνδρομο ονομάζεται ένα κείμενο όταν διαβάζεται το ίδιο είτε ξεκινήσουμε από

την αρχή προς το τέλος είτε ξεκινήσουμε από το τέλος προς την αρχή. Για

παράδειγμα, το κείμενο «ΑΝΝΑ» είναι παλίνδρομο.

Γράψτε προγράμματα σε Fortran και C++ που να δέχονται ένα κείμενο από το

πληκτρολόγιο, να ελέγχουν κατά πόσο είναι παλίνδρομο ή όχι, και να εμφανίζουν

το αποτέλεσμα στην οθόνη.

Page 44: προγραμματισμός εργαστήριο

44

Page 45: προγραμματισμός εργαστήριο

45

ΕΝΟΤΗΤΑ 5 Υποπρογράμματα

Διδακτικοί Στόχοι

Οι διδακτικοί στόχοι της εργαστηριακής ενότητας είναι:

να κατανοήσετε ότι μπορείτε να κατασκευάζετε προγράμματα από κομμάτια

που ονομάζονται υποπρογράμματα,

να μπορείτε να δημιουργείτε νέα υποπρογράμματα (υπορουτίνες ή/και

συναρτήσεις),

να μπορείτε να δημιουργείτε υποπρογράμματα που να δέχονται ως ορίσματα

πίνακες δεδομένων,

να κατανοήσετε τους μηχανισμούς περάσματος πληροφοριών μεταξύ

υποπρογραμμάτων και κύριου προγράμματος.

Ι. Πριν το εργαστήριο – Προετοιμασία

Α. Επαναλάβετε τη μελέτη της αντίστοιχης θεωρίας για τη γλώσσα προγραμματισμού

Fortran και απαντήστε στις παρακάτω ερωτήσεις:

1. Ποιά είναι τα δύο είδη υποπρογραμμάτων που υποστηρίζει η γλώσσα Fortran;

Που διαφέρουν;

2. Δώστε τη γενική σύνταξη μιας υπορουτίνας.

3. Με ποιά εντολή καλούμε μία υπορουτίνα στο κύριο πρόγραμμα;

4. Ποιά είναι η λειτουργία της παρακάτω υπορουτίνας;

SUBROUTINE SWAP(A,B)

REAL A, B, TEMP

TEMP = A

A = B

B = TEMP

END SUBROUTINE SWAP

5. Είναι απαραίτητη η χρήση της εντολής RETURN σε μία υπορουτίνα ή σε μία

συνάρτηση;

6. Ποιό είναι το αποτέλεσμα κλήσης της υπορουτίνας SWAP της ερώτησης 4 στο

παρακάτω κύριο πρόγραμμα;

X=2.15

Y=3.5

PRINT*, 'X=', X, 'Y=', Y

CALL SWAP(X,Y)

PRINT*, 'X=', X, 'Y=', Y

END PROGRAM

7. Ποιά είναι η λειτουργία της παρακάτω συνάρτησης;

REAL FUNCTION MINVALUE(A,B)

REAL A,B

IF (A<B) THEN

MINVALUE=B

Page 46: προγραμματισμός εργαστήριο

46

ELSE

MINVALUE=A

END IF

END FUNCTION MINVALUE

8. Ποιό είναι το αποτέλεσμα κλήσης της συνάρτησης MINVALUE της ερώτησης 7 με

ορίσματα τις τιμές 3.1 και 5.5;

9. Μετατρέψτε τη συνάρτηση MINVALUE της ερώτησης 7 σε υπορουτίνα με το ίδιο

όνομα. Τι αλλαγές πρέπει να γίνουν στη συνάρτηση;

10. Με ποιο τρόπο καλούμε μία συνάρτηση μέσα στο κύριο πρόγραμμα;

Β. Επαναλάβετε τη μελέτη της αντίστοιχης θεωρίας για τη γλώσσα προγραμματισμού

C++ και απαντήστε στις παρακάτω ερωτήσεις:

1. Δώστε τη γενική σύνταξη μίας συνάρτησης;

2. Η γλώσσα C++ δεν υποστηρίζει υπορουτίνες. Με ποιο τρόπο μπορούμε να

μετατρέψουμε μία συνάρτηση ώστε να συμπεριφέρεται ως υπορουτίνα;

3. Πως οριοθετείται η αρχή και το τέλος των εντολών μίας συνάρτησης;

4. Ποιά είναι η λειτουργία της παρακάτω συνάρτησης;

void swap(int a, int b)

{

int temp;

temp=a;

a=b;

b=temp;

}

5. Πως θα καλέσω στο κύριο πρόγραμμα τη συνάρτηση swap του ερωτήματος 4 με

ορίσματα δύο μεταβλητές x και y;

6. Ποιά είναι η διαφορά μεταβίβασης μεταβλητών σε μία συνάρτηση με τιμή και με

αναφορά; Δώστε ενδεικτικό παράδειγμα.

7. Μπορούμε να δημιουργήσουμε δύο συναρτήσεις με το ίδιο όνομα στο ίδιο

πρόγραμμα;

8. Τι θα συμβεί εάν καλέσω μία συνάρτηση με μικρότερο πλήθος ορισμάτων από

αυτά που έχει στη δήλωσή της;

9. Ποιό είναι το αποτέλεσμα εκτέλεσης του παρακάτω προγράμματος;

int main()

{

float x1, y1, x2, y2;

x1=5.2;

y1=2.3;

x2=fun(x1);

y2=fun(y1);

cout << x2 << y2;

return 0;

}

float fun(float a)

{

return a+=1.5;

}

Page 47: προγραμματισμός εργαστήριο

47

10. Μπορεί το όρισμα μιας συνάρτησης να είναι πίνακας; Δώστε ένα παράδειγμα.

Γ. [Συζυγείς μιγαδικοί]

Έστω δύο μιγαδικοί αριθμοί ic 1 και ic 2 . Οι αριθμοί 1c και 2c λέγονται

συζυγείς μιγαδικοί όταν και .

Δίνονται οι παρακάτω συναρτήσεις σε γλώσσα Fortran και C++ που ελέγχουν εάν

δύο μιγαδικοί αριθμοί είναι συζυγείς ή όχι και εμφανίζουν στην οθόνη το αντίστοιχο

αποτέλεσμα.

! H yporoytina dexetai sthn eisodo tous migadikous

! arithmous c1=p1+if1 kai c2=p2+if2 kai elegxei an

! einai syzygeis h oxi

SUBROUTINE syzygeis(p1, f1, p2, f2)

IF (p1==p2 .AND. f1==-f2) THEN

PRINT*,'Oi arithmoi einai syzygeis migadikoi.'

ELSE

PRINT*,'Oi arithmoi den einai syzygeis migadikoi.'

END IF

RETURN

END SUBROUTINE syzygeis

// H synarthsh dexetai sthn eisodo tous migadikous

// arithmous c1=p1+if1 kai c2=p2+if2 kai elegxei an

// einai syzygeis h oxi

void syzygeis(float p1, float f1, float p2, float f2)

{

if (p1==p2 && f1==-f2)

cout << "Oi arithmoi einai syzygeis migadikoi." << endl;

else

cout << "Oi arithmoi den einai syzygeis migadikoi." << endl;

}

1. Δημιουργήστε κύρια προγράμματα στη Fortran και στη C++ που να καλούν

αντίστοιχα τις δύο υπορουτίνες. Μεταγλωττίστε τα προγράμματα στον υπολογιστή.

2. Ελέγξτε με τη βοήθεια των προγραμμάτων αν είναι συζυγείς ή όχι οι παρακάτω

μιγαδικοί (α) i23 και i23 (β) i125 και i124 (γ) i35 και i45 .

3. Η γλώσσα Fortran υποστηρίζει μεταβλητές τύπου μιγαδικών αριθμών.

Μετατρέψτε την υπορουτίνα της Fortran ώστε να δέχεται ως παραμέτρους δύο

μεταβλητές μιγαδικών αριθμών αντί για τέσσερις μεταβλητές πραγματικών αριθμών.

Page 48: προγραμματισμός εργαστήριο

48

ΙΙ. Στο εργαστήριο

Α. [Εύρεση ρίζας εξίσωσης με τη μέθοδο της διχοτόμησης]

f(x)

x

a

b

a+b

2

(a+b)/2+b

2

f(a)

f(b)

f((a+b)/2)

f(((a+b)/2+b)/2)

Έστω συνάρτηση )(xf η οποία είναι συνεχής στο διάστημα ba, . Έστω επίσης ότι

0)()( bfaf . Αυτό σημαίνει ότι η συνάρτηση )(xf αλλάζει πρόσημο στο διάστημα

ba, και επομένως η εξίσωση 0)( xf έχει τουλάχιστον μία ρίζα στο διάστημα αυτό.

Η απλούστερη αριθμητική μέθοδος για την εύρεση μίας ρίζας ονομάζεται μέθοδος

της διχοτόμησης (ή του Bolzano). Η μέθοδος αυτή χωρίζει επαναληπτικά το

διάστημα ba, στη μέση και κρατά κάθε φορά το διάστημα εκείνο στο οποίο η

συνάρτηση αλλάζει πρόσημο.

Έστω συνεχής συνάρτηση )(xf και διάστημα ba, για το οποίο ισχύει 0)()( bfaf

και έστω e η επιθυμητή ακρίβεια του αποτελέσματος. Η μέθοδος της διχοτόμησης

για την εύρεση μίας ρίζας της εξίσωσης 0)( xf ακολουθεί τα παρακάτω βήματα:

Βήμα 1. Θέσε 2/)( bac .

Bήμα 2. Εάν ecb , τότε η ρίζα της εξίσωσης είναι ίση με c. Σταμάτα.

Bήμα 3. Εάν 0)()( bfcf , τότε θέσε ca , διαφορετικά θέσε cb . Επέστρεψε στο

Βήμα 1.

Ένας προγραμματιστής δοκίμασε να γράψει προγράμματα σε Fortran και C++ που

να χρησιμοποιούν τη μέθοδο της διχοτόμησης για να βρουν τη ρίζα της εξίσωσης

01)( 6 xxxf με ακρίβεια τεσσάρων δεκαδικών ψηφίων γνωρίζοντας ότι

0)2()1( ff . Κατέληξε στα παρακάτω προγράμματα τα οποία δυστυχώς περιέχουν

συντακτικά και λογικά λάθη.

PROGRAM root

REAL A, B, RES

A=1.0

B=1.0

IF ( F(A)*F(B) > 0. ) THEN

PRINT*, 'CANNOT FIND ROOT.'

ELSE

RES = BISECT(A, B, 0.0001)

PRINT*, 'Root= ', RES, ', f(root)= ', F(RES)

Page 49: προγραμματισμός εργαστήριο

49

END IF

END PROGRAM root

REAL FUNCTION F(X)

REAL X

F = X**6 - X - 1

RETURN

END FUNCTION F

REAL FUNCTION BISECT(A, B, E)

REAL A, B, E

REAL C

C = (A+B)/2

PRINT*, 'c=', C, ', f(c)=', F(C)

DO WHILE ( (B-C)>E )

IF ( F(C)*F(B) <= 0. ) THEN

A = C

ELSE

B = C

END IF

C = (A+B)/2.

PRINT*, 'c=', C, ', f(c)=', F(C)

END DO

BISECT = C

RETURN

END BISECT

#include <iostream>

#include <cmath>

using namespace std;

double f(double x)

double bisect(double a, double b, double e);

int main()

{

double a, b, res;

a = 1.0;

b = 2.0;

if ( f(a)*f(b) > 0.0 )

cout << "Cannot find root. \n";

else

{

res = bisect(a, b, 0.0001);

cout << "Root = " << res << ", f(root) = " << f(res) << endl;

}

return 0;

}

double f(double x)

{

return pow(x,5) - x - 1;

}

double bisect(double a, double b, double e)

{

double c = (a+b)/2;

Page 50: προγραμματισμός εργαστήριο

50

cout << "c=" << c << ", f(c)=" << f(c) << endl;

while ( (b-c)>e )

{

if ( f(c)*f(b) <= 0.0 )

a = c;

else

b = c;

c = (a+b)/2;

cout << "c=" << c << ", f(c)=" << f(c) << endl;

}

}

1. Διορθώστε τα λάθη των δύο προγραμμάτων και μεταγλωττίστε τα. Καταγράψτε τα

συντακτικά και λογικά λάθη που βρήκατε.

2. Εκτελέστε τα προγράμματα και επιβεβαιώστε την ορθότητα των αποτελεσμάτων

που παίρνετε.

3. Αλλάξτε τη συνάρτηση f() στα δύο προγράμματα ώστε να υπολογίζει τη ρίζα της

εξίσωσης 0)1(133)( 323 xxxxxf . Μεταγλωττίστε και εκτελέστε εκ νέου τα

προγράμματα θέτοντας a=0.5 και b=2.0. Συγκρίνετε τα αποτελέσματα που παίρνετε

με τα αναμενόμενα.

4. Επαναλάβατε για τη συνάρτηση 01)( 3 xxxf θέτοντας a=-1 και b=+1.

Β. [Μέση τιμή / Τυπική απόκλιση]

Επαναλαμβάνουμε ένα πείραμα Ν το πλήθος φορές και μετράμε κάθε φορά το

μέγεθος χ. Λαμβάνουμε έτσι Ν το πλήθος τιμές του χ: χ1, χ2, ..., χΝ. Η μέση τιμή του

μεγέθους χ δίνεται από τη σχέση

N

k

kxN

x1

1ενώ η τυπική απόκλιση δίνεται από τη

σχέση: 1

)( 2

1

N

xxN

k

k

x .

1. Γράψτε προγράμματα σε γλώσσα Fortran και C++ που να υπολογίζουν τη μέση

τιμή και την τυπική απόκλιση μεγέθους χ για πείραμα το οποίο επαναλαμβάνεται

10 φορές. Χρησιμοποιήστε μεταβλητές πίνακα για να αποθηκεύσετε τις τιμές του

μεγέθους χ οι οποίες θα εισάγονται από το πληκτρολόγιο.

2. Εκτελέστε τα προγράμματα και επιβεβαιώστε την ορθότητα των αποτελεσμάτων

που παίρνετε.

3. Δημιουργήστε δύο συναρτήσεις που να δέχονται ως ορίσματα τον πίνακα με τις

τιμές του χ καθώς και το πλήθος των τιμών αυτών. Η πρώτη συνάρτηση θα

υπολογίζει τη μέση τιμή και η δεύτερη την τυπική απόκλιση. Τροποποιήστε τα

προγράμματά σας ώστε να χρησιμοποιούν τις συναρτήσεις που δημιουργήσατε.

ΙΙΙ. Μετά το εργαστήριο – Ασκήσεις προς επίλυση

Α. [Συναρτήσεις τετραγωνικών πινάκων]

Αν ένας πίνακας έχει τον ίδιο αριθμό γραμμών και στηλών, τότε ο πίνακας αυτός

λέγεται τετραγωνικός πίνακας. Ένας τετραγωνικός πίνακας λέγεται διαγώνιος

πίνακας όταν τα στοιχεία που δεν βρίσκονται στην κύρια διαγώνιο του είναι όλα 0.

Page 51: προγραμματισμός εργαστήριο

51

Ένας τετραγωνικός πίνακας λέγεται τριγωνικός άνω όταν όλα τα στοιχεία του που

βρίσκονται κάτω από την κύρια διαγώνιο είναι μηδενικά και τριγωνικός κάτω όταν

όλα τα στοιχεία του που βρίσκονται πάνω από την κύρια διαγώνιο είναι μηδενικά.

Γράψτε υποπρογράμματα σε γλώσσα Fortran και C++ που να ελέγχουν εάν ένας

τετραγωνικός πίνακας 33 είναι διαγώνιος πίνακας, τριγωνικός άνω ή τριγωνικός

κάτω. Μπορείτε να δημιουργήσετε είτε τρία διαφορετικά υποπρογράμματα είτε ένα

υποπρόγραμμα που να καλύπτει και τις τρεις περιπτώσεις. Δημιουργήστε επίσης ένα

κύριο πρόγραμμα στο οποίο θα εισάγονται τα στοιχεία του πίνακα από το

πληκτρολόγιο και θα καλείται το υποπρόγραμμα. Ελέγξτε την ορθότητα των

προγραμμάτων που φτιάξατε χρησιμοποιώντας ως δεδομένα εισόδου τους παρακάτω

πίνακες: (α)

300

010

001

A (β)

200

510

063

B (γ)

275

013

006

(δ)

140

011

025

.

Β. [Υποπρογράμματα γραμμικής / δυαδικής αναζήτησης]

Σε προηγούμενη ενότητα δημιουργήσατε προγράμματα για τη γραμμική / δυαδική

αναζήτηση αριθμού μέσα στα στοιχεία ενός μονοδιάστατου πίνακα. Δημιουργήστε

δύο υποπρογράμματα σε Fortran και σε C++ που να υλοποιούν τις δύο μεθόδους

αναζήτησης. Τα υποπρογράμματα πρέπει να δέχονται ως ορίσματα τον πίνακα, το

πλήθος των στοιχείων που αυτός περιέχει καθώς και τον προς αναζήτηση αριθμό και

θα επιστρέφουν τη θέση του πίνακα στην οποία υπάρχει ο αριθμός ή την τιμή -1

στην περίπτωση που ο αριθμός δεν υπάρχει στον πίνακα. Δημιουργήστε επίσης ένα

κύριο πρόγραμμα στο οποίο θα εισάγονται τα στοιχεία του πίνακα και ο ζητούμενος

αριθμός από το πληκτρολόγιο και θα καλούνται τα αντίστοιχα υποπρογράμματα.

Ελέγξτε την ορθότητα των προγραμμάτων με κατάλληλα δεδομένα εισόδου.

Γ. [Εύρεση πρώτων αριθμών]

Πρώτος αριθμός λέγεται ένας φυσικός αριθμός μεγαλύτερος της μονάδας με την

ιδιότητα οι μόνοι φυσικοί διαιρέτες του να είναι η μονάδα και ο εαυτός του.

Δημιουργήστε σε γλώσσα Fortran και C++ συναρτήσεις που να ελέγχουν εάν ένας

αριθμός είναι πρώτος. Οι συναρτήσεις θα παίρνουν ως όρισμα έναν ακέραιο αριθμό

και θα επιστρέφουν την τιμή 1 ή 0 ανάλογα με το αν ο αριθμός είναι πρώτος ή όχι

αντίστοιχα. Γράψτε ένα κύριο πρόγραμμα που να υπολογίζει το πλήθος των πρώτων

αριθμών στο διάστημα [2...1000] χρησιμοποιώντας τις παραπάνω συναρτήσεις.

Δ. [Σχηματισμός τριγώνου]

Σκαληνό Ισοσκελές Ισόπλευρο

γ

α β

Έστω τρία ευθύγραμμα τμήματα με μήκη πλευρών α, β, γ αντίστοιχα. Για να

μπορούν να σχηματίσουν τα τρία ευθύγραμμα τμήματα τρίγωνο, πρέπει το άθροισμα

των μηκών των δύο ευθυγράμμων τμημάτων με τα μικρότερα μήκη να είναι

μεγαλύτερο από το μήκος του τρίτου ευθύγραμμου τμήματος.

Page 52: προγραμματισμός εργαστήριο

52

Γράψτε συναρτήσεις σε γλώσσα Fortran και C++ που να εξετάζουν κατά πόσο τρία

ευθύγραμμα τμήματα με δεδομένα μήκη μπορούν να σχηματίζουν τρίγωνο. Οι

συναρτήσεις πρέπει να επιστρέφουν την τιμή 1 εάν τα ευθύγραμμα τμήματα

μπορούν να σχηματίζουν τρίγωνο ή διαφορετικά την τιμή 0. Προσθέστε κύρια

προγράμματα που να καλούν τις συναρτήσεις, μεταγλωττίστε τα και εκτελέστε τα για

να επιβεβαιώσετε την ορθότητα των αποτελεσμάτων που παίρνετε. Τροποποιήστε τις

παραπάνω συναρτήσεις ώστε να επιστρέφουν τις παρακάτω τιμές ανάλογα με τις

τιμές των ορισμάτων: 0 αν δεν σχηματίζεται τρίγωνο, 1 εάν σχηματίζεται σκαληνό

τρίγωνο, 2 αν σχηματίζεται ισοσκελές τρίγωνο και 3 αν σχηματίζεται ισόπλευρο

τρίγωνο.

Ε. [Εύρεση ρίζας εξίσωσης με τη μέθοδο Newton-Raphson και τη μέθοδο Regula-Falsi]

Γνωρίσατε προηγούμενα μία μέθοδο για την εύρεση της ρίζας μίας εξίσωσης f(x)=0

που ονομάζεται μέθοδος της διχοτόμησης. Το ίδιο πρόβλημα μπορεί να λυθεί και με

τη βοήθεια δύο άλλων επαναληπτικών μεθόδων.

Η μέθοδος Newton-Raphson είναι μία επαναληπτική μέθοδος η οποία δημιουργεί

ακολουθίες που συγκλίνουν προς τη ρίζα της f(x), η οποία πρέπει να είναι συνεχής

και παραγωγίσιμη. Με βάση τη μέθοδο αυτή, η ακολουθία )(

)(1

n

nnn

xf

xfxx

,

,...2,1,0n , όπου f(x) είναι η παράγωγος της f(x), συγκλίνει προς τη ρίζα της f(x) που

είναι μοναδική στο διάστημα [α,b] για x0 στο διάστημα [α,b].

Η μέθοδος Regula-Falsi (ή αλλιώς μέθοδος της εσφαλμένης θέσης) είναι μία άλλη

επαναληπτική μέθοδος η οποία λειτουργεί όπως και η μέθοδος της διχοτόμησης

περιορίζοντας το διάστημα [α,b] κάθε φορά επιλέγοντας όμως το νέο άκρο του

διαστήματος c με διαφορετικό τρόπο. Με βάση τη μέθοδο αυτή, το c υπολογίζεται

από τη σχέση )()(

)()(

afbf

abfbafc

αντί για τη σχέση

2

bac

που χρησιμοποιεί η

μέθοδος της διχοτόμησης.

Γράψτε προγράμματα σε γλώσσα Fortran και C++ που να επιλύουν το πρόβλημα

της εύρεσης ρίζας χρησιμοποιώντας τις μεθόδους Netwon-Raphson και Regula-

Falsi. Δημιουργήστε τα κατάλληλα υποπρογράμματα-συναρτήσεις όπου χρειάζεται.

Ελέγξτε την ορθότητα των προγραμμάτων που φτιάξατε χρησιμοποιώντας τα

παραδείγματα συναρτήσεων f(x) που χρησιμοποιήσατε και στη μέθοδο της

διχοτόμησης.

ΣΤ. [Κρυπτογράφηση δεδομένων]

Μία εταιρία θέλει να κρυπτογραφεί τα δεδομένα που στέλνει από το ένα

υποκατάστημά της στο άλλο. Κάθε δεδομένο είναι ένας αριθμός των τεσσάρων

ψηφίων χωρίς πρόσημο.

Γράψτε πρoγράμματα σε Fortran και C++ που να δέχονται ένα δεδομένο προς

αποστολή ή λήψη από το πληκτρολόγιο και να το κρυπτογραφούν ή να το

αποκρυπτογραφούν ανάλογα με την επιθυμία του χρήστη.

Υπόδειξη: Χρησιμοποιήστε την ακόλουθη κρυπτογράφηση. Αντικαταστήστε κάθε

ψηφίο του αριθμού με το υπόλοιπο της διαίρεσης με το 10 του αθροίσματος του

ψηφίου με τον αριθμό 7. Αντιμεταθέστε το πρώτο με το τελευταίο ψηφίο και το

δεύτερο με το τρίτο. Δημιουργήστε μία συνάρτηση με όνομα Encrypt() για την

κρυπτογράφηση και μία συνάρτηση με όνομα Decrypt() για την αποκρυπτογράφηση.

Page 53: προγραμματισμός εργαστήριο

53

ΕΝΟΤΗΤΑ 6 Αρχεία Δεδομένων/Αποτελεσμάτων.

Διδακτικοί Στόχοι

Οι διδακτικοί στόχοι της συγκεκριμένης εργαστηριακής ενότητας είναι:

να μπορείτε να δημιουργείτε, να διαβάζετε και να γράφετε αρχεία,

να εξοικειωθείτε με την επεξεργασία αρχείων,

να κατανοήσετε την ομοιότητα μεταξύ του τρόπου εισόδου / εξόδου

δεδομένων από αρχεία και του τρόπου εισόδου / εξόδου δεδομένων από το

πληκτρολόγιο / στην οθόνη του υπολογιστή,

να μπορείτε να δημιουργείτε ψευδοτυχαίους αριθμούς.

Ι. Πριν το εργαστήριο – Προετοιμασία

Α. Επαναλάβετε τη μελέτη της αντίστοιχης θεωρίας για τη γλώσσα προγραμματισμού

Fortran και απαντήστε στις παρακάτω ερωτήσεις:

1. Ποιά είναι η χρησιμότητα της εντολής OPEN; Πως συντάσσεται;

2. Με ποιά εντολή μπορώ να διαβάσω δεδομένα που βρίσκονται αποθηκευμένα σε

ένα αρχείο δεδομένων;

3. Με ποιά εντολή μπορώ να αποθηκεύσω δεδομένα σε ένα αρχείο αποτελεσμάτων;

4. Σε ποιό σημείο του προγράμματος τοποθετούμε συνήθως μία εντολή CLOSE;

Ποιός είναι ο ρόλος της;

5. Ποιό είναι το αποτέλεσμα εκτέλεσης του παρακάτω προγράμματος;

PROGRAM FILE

OPEN(UNIT=16, FILE='RESULTS.TXT', STATUS='UNKNOWN')

WRITE(16,*) 'FILE'

CLOSE(UNIT=16, STATUS='KEEP')

END PROGRAM FILE

6. Στο σκληρό δίσκο του υπολογιστή υπάρχει ένα αρχείο δεδομένων με όνομα

DATA.TXT που περιέχει 10 ακεραίους αριθμούς. Γράψτε ένα πρόγραμμα που να

διαβάζει τους αριθμούς από το αρχείο δεδομένων και τους απεικονίζει στην οθόνη

του υπολογιστή.

7. Ποιά είναι η λειτουργία της εντολής READ(15,*) N σε ένα πρόγραμμα;

8. Η εντολή WRITE(16,*) 'APOTELESMATA' αποθηκεύει πληροφορία σε ένα αρχείο

αποτελεσμάτων με συνθηματικό όνομα 16. Με ποιά εντολή αντιστοιχίζεται το

συνθηματικό αυτό όνομα με το όνομα ενός αρχείου του Λ/Σ του υπολογιστή;

9. Δώστε δύο εναλλακτικούς τρόπους για να αποθηκεύσετε τα δεδομένα ενός

μονοδιάστατου πίνακα 5 ακεραίων αριθμών σε ένα αρχείο αποτελεσμάτων.

10. Πόσα αρχεία δεδομένων ή/και αρχεία αποτελεσμάτων μπορούμε να

χρησιμοποιήσουμε σε ένα πρόγραμμα Fortran;

Page 54: προγραμματισμός εργαστήριο

54

Β. Επαναλάβετε τη μελέτη της αντίστοιχης θεωρίας για τη γλώσσα προγραμματισμού

C++ και απαντήστε στις παρακάτω ερωτήσεις:

1. Με ποιο τρόπο δηλώνουμε μία μεταβλητή (αντικείμενο) που αντιστοιχεί σε ένα

αρχείο αποτελεσμάτων;

2. Με ποιά εντολή μπορώ να αποθηκεύσω δεδομένα σε ένα αρχείο αποτελεσμάτων;

3. Με ποιο τρόπο δηλώνουμε μία μεταβλητή (αντικείμενο) που αντιστοιχεί σε ένα

αρχείο δεδομένων;

4. Με ποιά εντολή μπορώ να αποθηκεύσω δεδομένα σε ένα αρχείο δεδομένων;

5. Ποιό είναι το αποτέλεσμα εκτέλεσης του παρακάτω προγράμματος;

int main()

{

int x, y;

ifstream infile("data.txt");

infile >> x >> y;

cout << x << y;

return 0;

}

6. Ποιός είναι ο ρόλος του τελεστή >> όταν εφαρμόζεται σε μία μεταβλητή

(αντικείμενο) αρχείου αποτελεσμάτων;

7. Ποιός είναι ο ρόλος του τελεστή << όταν εφαρμόζεται σε μία μεταβλητή

(αντικείμενο) αρχείου δεδομένων;

8. Πόσα αρχεία δεδομένων ή/και αρχεία αποτελεσμάτων μπορούμε να

χρησιμοποιήσουμε σε ένα πρόγραμμα C++;

9. Δώστε έναν τρόπο για να αποθηκεύσετε τα δεδομένα ενός μονοδιάστατου πίνακα 5

ακεραίων αριθμών σε ένα αρχείο αποτελεσμάτων.

10. Ποιός είναι ο ρόλος των χειριστών showpoint, scientific, hex;

Γ. [Ανάγνωση / εγγραφή δεδομένων σε αρχεία]

Δίνονται στη συνέχεια δύο προγράμματα σε γλώσσα Fortran και δύο προγράμματα

σε γλώσσα C++. Το πρώτο από τα προγράμματα δημιουργεί ένα αρχείο

αποτελεσμάτων και αποθηκεύει σε αυτό τους ακέραιους αριθμούς από το 0 έως το

100 μαζί με τις τετραγωνικές τους ρίζες. Το δεύτερο από τα προγράμματα διαβάζει

τους ακέραιους αριθμούς και τις τετραγωνικές ρίζες από το αρχείο αποτελεσμάτων

και τα απεικονίζει στην οθόνη του υπολογιστή.

! Writing in a sequential data file

REAL(KIND=4) :: y

INTEGER(KIND=2) :: x

OPEN(UNIT=13,FILE='sqrt.txt')

DO x = 0,99

y = sqrt(1.*x)

WRITE(13,*) x, y

ENDDO

CLOSE(UNIT=13)

Page 55: προγραμματισμός εργαστήριο

55

END

! Reading from a sequential data file

REAL z

INTEGER(KIND=2) w

OPEN(UNIT=16,FILE='sqrt.txt')

DO i = 0,99

READ(16,*) w, z

PRINT*, w, z

ENDDO

CLOSE(UNIT=16)

END

// Writing in a sequential data file

#include <iostream>

#include <cmath>

#include <fstream>

using namespace std;

int main()

{

ofstream outfile("sqrt.txt");

for (short x=0; x<100; x++)

outfile << x << " " << sqrt( (float) x) << endl;

outfile.close();

return 0;

}

// Reading from a sequential data file

#include <iostream>

#include <fstream>

using namespace std;

int main()

{

float z;

short w;

ifstream infile("sqrt.txt");

for (int i=0; i<100; i++)

{

infile >> w >> z;

cout << w << " " << z << endl;

}

infile.close();

return 0;

}

1. Μεταγλωττίστε τα προγράμματα στον υπολογιστή.

2. Εκτελέστε τα προγράμματα δημιουργίας του αρχείου αποτελεσμάτων.

Επιβεβαιώστε την εμφάνιση του αρχείου sqrt.txt στο σκληρό δίσκο του υπολογιστή.

Ελέγξτε τα περιεχόμενα του αρχείου αυτού με τη βοήθεια του κειμενογράφου.

3. Εκτελέστε τα προγράμματα ανάγνωσης των δεδομένων από το αρχείο

αποτελεσμάτων και συγκρίνετε αυτό που εμφανίζεται στην οθόνη με τα περιεχόμενα

του αρχείου sqrt.txt.

Page 56: προγραμματισμός εργαστήριο

56

ΙΙ. Στο εργαστήριο

Α. [Αριθμητική μέθοδος ολοκλήρωσης με γραμμική παρεμβολή]

x

f(x)

a=x0 b=x4x1 x2 x3

f(x0)

f(x1)

f(x2)

Οι αριθμητικές μέθοδοι υπολογισμού της τιμής ενός ολοκληρώματος μίας

συνάρτησης dxxffIb

a )()( για δεδομένες τιμές των a και b προσπαθούν να

προσεγγίσουν την τιμή του ολοκληρώματος χρησιμοποιώντας μία προσεγγιστική

συνάρτηση. Η μέθοδος της γραμμικής παρεμβολής ορίζει n+1 ισαπέχοντα σημεία xi

στο διάστημα ],[ ba με απόσταση nabh /)( το ένα από το άλλο

( niihaxi ,...,1,0, ) και προσεγγίζει την τιμή του ολοκληρώματος I(f) υπολογίζοντας

τη συνάρτηση

2

)()(...)(

2

)()()( 11

0 nnn

xfxfxf

xfhfTfI .

Ένας προγραμματιστής δοκίμασε να γράψει προγράμματα σε Fortran και C++ που

να προσεγγίζουν, με τη μέθοδο της γραμμικής παρεμβολής, την τιμή του

ολοκληρώματος

b

a x

dx21

, για διάφορες τιμές των a, b και n, και να τις αποθηκεύουν

σε ένα αρχείο αποτελεσμάτων. Κατέληξε στα παρακάτω προγράμματα τα οποία

δυστυχώς περιέχουν συντακτικά και λογικά λάθη.

PROGRAM integration

REAL A, B, INTEGRAL

INTEGER N

OPEN (UNIT=13,FILE='integral.txt')

PRINT*, 'Finding integral of f(x)=1/(1+x^2).'

PRINT*

PRINT*, 'Give a, b, n (=0 to exit) : '

READ*, A, B, N

DO WHILE (N /= 0)

Page 57: προγραμματισμός εργαστήριο

57

INTEGRAL = F_INTEGATE(A, B, N)

PRINT*, 'The integral of f(x)=1/(1+x^2) at [', A

PRINT*, ',', B, '] with ', N, ' subintervals is :', INTEGRAL

WRITE(13,*) 'The integral of f(x)=1/(1+x^2) at [', A

WRITE(13,*) ',',B, '] with ', N, ' subintervals is :', INTEGRAL

PRINT*

PRINT*, 'Give a, b, n (=0 to exit) : '

READ*, A, B, N

END DO

CLOSE(UNIT=13)

END PROGRAM integration

REAL FUNCTION F(X)

REAL X

F = 1 / (1 + X*X)

RETURN

END FUNCTION F

REAL FUNCTION F_INTEGRATE(A, B, N)

REAL A, B

INTEGER N

REAL RESULT

REAL X_I, H

RESULT = 0

H = (B-A)/N

DO I = 0, N

X_I = A + I*H

IF (I==0 .OR. I==N)

RESULT = RESULT + F(X_I)/2

ELSE

RESULT = RESULT + F(X_I)

END IF

END DO

F_INTEGRATE = RESULT*H

RETURN

END FUNCTION F_INTEGRATE

#include <iostream>

#include <fstream>

using namespace std;

double f(double x);

double integrate(double a, double b, int n);

int main()

{

double a, b;

int n;

double integral;

ofstream result_file("integral.txt");

cout << "Finding integral of f(x)=1/(1+x^2).\n";

cout << "\n Give a, b, n (=0 to exit) : ";

cin >> a >> b >> n;

while (n!=0)

{

integral = integrate(a, b, n);

cout << " The integral of f(x)=1/(1+x^2) at ["

Page 58: προγραμματισμός εργαστήριο

58

<< a << "," << b << "] with " << n << " subintervals is :"

<< integral << "\n";

result_file << " The integral of f(x)=1/(1+x^2) at ["

<< a << "," << b << "] with " << n << " subintervals is :"

<< integral << "\n";

cout << "\n Give a, b, n (=0 to exit) : ";

cin >> a >> b >> n;

}

result_file.close();

return 0;

}

double f(double x)

{

return 1 / (1 + x*x)

}

double integrate(double a, double b, int n)

{

double h = (b-a)/n;

double result = 0;

double x_i;

for (int i=0; i<=n; i++)

{

x_i = a + i*h;

if (i==0 || i == n)

result += f(x_i)/2;

else

result += f(x_i);

}

result *= h;

return result;

}

1. Διορθώστε τα λάθη των δύο προγραμμάτων και μεταγλωττίστε τα. Καταγράψτε τα

συντακτικά και λογικά λάθη που βρήκατε.

2. Εκτελέστε τα προγράμματα στον υπολογιστή. Επιβεβαιώστε την εμφάνιση του

αρχείου integral.txt στο σκληρό δίσκο του υπολογιστή. Ελέγξτε τα περιεχόμενα του

αρχείου αυτού με τη βοήθεια του κειμενογράφου.

3. Επιβεβαιώστε την ορθότητα των αποτελεσμάτων που βλέπετε εάν γνωρίζετε ότι

6803258176636.1)4(tan1

14

0 2

x

dx.

4. Τροποποιήστε τα προγράμματα ώστε να υπολογίζουν προσεγγιστικά την τιμή

κάποιου άλλου ολοκληρώματος (π.χ. 12347468241328.01

0

2

dxe x , 1)23(

1

0

2 dxx ,

6)sin3(0

dxx ).

Β. [Άθροισμα / διαφορά πινάκων]

Άθροισμα δύο πινάκων μν στοιχείων Α=[αij] και B=[βij] λέγεται ο πίνακας μν

στοιχείων του οποίου κάθε στοιχείο είναι το άθροισμα των αντίστοιχων στοιχείων των

Α και Β. Ο πίνακας αυτός συμβολίζεται με Α+Β, δηλαδή Α+Β=[αij+βij]. Διαφορά δύο

πινάκων μν στοιχείων Α=[αij] και B=[βij] λέγεται ο πίνακας μν στοιχείων του οποίου

Page 59: προγραμματισμός εργαστήριο

59

κάθε στοιχείο προκύπτει από τη διαφορά των αντίστοιχων στοιχείων των Α και Β. Η

διαφορά συμβολίζεται με Α-Β, δηλαδή Α-Β=[αij-βij].

1. Γράψτε προγράμματα σε γλώσσα Fortran και C++ που να υπολογίζουν το

άθροισμα δύο πινάκων 55 πραγματικών αριθμών. Οι τιμές των στοιχείων των δύο

πινάκων βρίσκονται αποθηκευμένες σε δύο αρχεία (matrix_a.txt και

matrix_b.txt) στο σκληρό δίσκο του υπολογιστή ενώ το αποτέλεσμα πρέπει να

αποθηκεύεται σε ένα τρίτο αρχείο (sum.txt).

2. Εκτελέστε τα προγράμματα για διαφορετικές περιπτώσεις πινάκων και

επιβεβαιώστε την ορθότητα των αποτελεσμάτων που παίρνετε ελέγχοντας με τον

κειμενογράφο τα περιεχόμενα του αρχείου του αθροίσματος.

3. Τροποποιήστε τα προγράμματα ώστε να υπολογίζουν ταυτόχρονα και τη διαφορά

των δύο πινάκων και να αποθηκεύουν το αποτέλεσμα σε ένα τέταρτο αρχείο

(dif.txt).

ΙΙΙ. Μετά το εργαστήριο – Ασκήσεις προς επίλυση

Α. [Υπολογισμός εκθετικού]

Η τιμή του xe μπορεί να υπολογιστεί με βάση το άθροισμα k!

x = e

k

0=k

x

. Γράψτε

προγράμματα σε γλώσσα Fortran και C++ που να υπολογίζουν το παραπάνω

άθροισμα για τιμές του k στα διαστήματα [0...10], [0...20], ..., [0...100]. Η τιμή του x

θα εισάγεται από το πληκτρολόγιο ενώ οι προσεγγίσεις του xe καθώς και το σφάλμα

κάθε φορά σε σχέση με την τιμή που επιστρέφει η συνάρτηση exp(x) θα

αποθηκεύονται σε ένα αρχείο αποτελεσμάτων.

Β. [Εύρεση πρώτων αριθμών και αποθήκευση σε αρχείο]

Σε προηγούμενη ενότητα δημιουργήσατε μία συνάρτηση που ελέγχει εάν ένας

αριθμός είναι πρώτος. Δημιουργήστε ένα κύριο πρόγραμμα σε γλώσσα Fortran και

C++ που να αποθηκεύει τους πρώτους αριθμούς στο διάστημα [2...2000] σε ένα

αρχείο αποτελεσμάτων με όνομα prime.txt.

Γ. [Μέση τιμή / Τυπική απόκλιση]

Σε προηγούμενη ενότητα δημιουργήσατε προγράμματα και συναρτήσεις για τον

υπολογισμό της μέσης τιμής και της τυπικής απόκλισης μεγέθους χ σε πείραμα το

οποίο επαναλαμβάνεται Ν φορές. Υποθέστε ότι το πλήθος των επαναλήψεων του

πειράματος Ν καθώς και η τιμή του μεγέθους χ σε κάθε πείραμα έχουν αποθηκευτεί

σε ένα αρχείο δεδομένων. Ο πρώτος αριθμός του αρχείου αυτού αντιστοιχεί στο

πλήθος των επαναλήψεων ενώ οι υπόλοιποι αριθμοί αντιστοιχούν σε τιμές του χ.

Τροποποιήστε τα προγράμματα που είχατε δημιουργήσει ώστε να διαβάζουν τα

δεδομένα εισόδου από το αρχείο αυτό.

Δ. [Ανάγνωση / εγγραφή τυχαίων αριθμών σε αρχεία]

Οι γλώσσες προγραμματισμού παρέχουν κάποια έτοιμα υποπρογράμματα για τη

δημιουργία ψευδοτυχαίων αριθμών. Στη γλώσσα Fortran η κλήση της συνάρτησης

με όνομα RAND() χωρίς όρισμα επιστρέφει ως αποτέλεσμα ένα ψευδοτυχαίο

Page 60: προγραμματισμός εργαστήριο

60

πραγματικό αριθμό στο διάστημα [0,1). Απαραίτητη προϋπόθεση για τη δημιουργία

ψευδοτυχαίων αριθμών είναι η κλήση στην αρχή του προγράμματος της

υπορουτίνας SRAND() με όρισμα έναν ακέραιο αριθμό. Στη γλώσσα C++ η κλήση της

συνάρτησης rand(), που είναι μέλος της βιβλιοθήκης cstdlib, χωρίς όρισμα

επιστρέφει ως αποτέλεσμα ένα ψευδοτυχαίο ακέραιο θετικό αριθμό μεταξύ του 0 και

μίας σταθεράς με όνομα RAND_MAX (με τιμή τουλάχιστον 32767). Απαραίτητη

προϋπόθεση για τη δημιουργία ψευδοτυχαίων αριθμών είναι η κλήση στην αρχή του

προγράμματος της συνάρτησης srand() με όρισμα έναν ακέραιο αριθμό χωρίς

πρόσημο.

Γράψτε προγράμματα σε Fortran και C++ που να παράγουν 5000 τυχαίους

ακέραιους αριθμούς στο διάστημα [-5,+5) και να τους αποθηκεύουν σε ένα αρχείο

αποτελεσμάτων με όνομα random.txt. Εκτελέστε τα προγράμματα και επιβεβαιώστε

την εμφάνιση του αρχείου random.txt στο σκληρό δίσκο του υπολογιστή. Ελέγξτε τα

περιεχόμενα του αρχείου αυτού με τη βοήθεια του κειμενογράφου. Γράψτε

προγράμματα σε γλώσσα Fortran και C++ που να διαβάζουν τους τυχαίους

αριθμούς από το αρχείο random.txt και να υπολογίζουν τη συχνότητα εμφάνισης

κάθε ενός από τους αριθμούς από το -5 έως και το +4.

Ε. [Επίλυση γραμμικού συστήματος n εξισώσεων με n αγνώστους με τη μέθοδο

απαλοιφής Gauss με μερική οδήγηση]

Έστω το παρακάτω γραμμικό σύστημα n εξισώσεων με n αγνώστους:

nnnnnn

nn

nn

bxaxaxa

bxaxaxa

bxaxaxa

2211

22222121

11212111

Μία μέθοδος επίλυσης του γραμμικού συστήματος είναι με τη βοήθεια της

μεθόδου απαλοιφής Gauss. Η μέθοδος αυτή αποτελείται από δύο κύρια μέρη: την

απαλοιφή των αγνώστων και την αντικατάσταση προς τα πίσω:

Απαλοιφή: Για r = 1,...,(n-1) απαλείφεται ο xr από τις εξισώσεις Ei, i =

(r+1),...,n. Αυτό σημαίνει ότι το σύστημα μετασχηματίζεται έτσι ώστε οι νέες τιμές

των air, i = (r+1),...,n, να είναι μηδέν. Στο τέλος της διαδικασίας της απαλοιφής, ο

πίνακας των συντελεστών του συστήματος είναι άνω τριγωνικός.

Αντικατάσταση προς τα πίσω: Για j = n,n-1,...,1, λύνεται η εξίσωση Ej ως προς

xj.

Παράδειγμα: Έστω το παρακάτω σύστημα τριών εξισώσεων με τρεις αγνώστους:

5110

6111

3112

321

321

321

xxx

xxx

xxx

Η απαλοιφή του άγνωστου x1 από τη δεύτερη και την τρίτη εξίσωση δημιουργεί το

ακόλουθο ισοδύναμο σύστημα:

51102

9

2

1

2

30

3112

321

321

321

xxx

xxx

xxx

Στη συνέχεια, η απαλοιφή του αγνώστου χ2 από την τρίτη εξίσωση δημιουργεί το

σύστημα:

Page 61: προγραμματισμός εργαστήριο

61

23

200

2

9

2

1

2

30

3112

321

321

321

xxx

xxx

xxx

Ο πίνακας των συντελεστών έχει γίνει πλέον άνω τριγωνικός και επομένως

μπορούμε να συνεχίσουμε με το δεύτερο μέρος της μεθόδου. Η τρίτη εξίσωση μας

δίνει: x3 = 3. Αντικαθιστώντας στη δεύτερη εξίσωση έχουμε x2 = 2. Τέλος, από την

πρώτη εξίσωση βρίσκουμε ότι x1 = 1.

Ένας προγραμματιστής δημιούργησε σε γλώσσα Fortran το παρακάτω πρόγραμμα

που επιλύει ένα γραμμικό σύστημα n εξισώσεων. Η τιμή του n εισάγεται από το

πληκτρολόγιο ενώ οι τιμές των δεδομένων των εξισώσεων διαβάζονται από το αρχείο

δεδομένων MATRIX.TXT. Επιβεβαιώστε την ορθότητα του προγράμματος

χρησιμοποιώντας διάφορα συστήματα εξισώσεων. Κατανοήστε τη λειτουργία του

και δημιουργήστε το αντίστοιχο πρόγραμμα σε γλώσσα C++.

___________________________________________________________ PROGRAM GAUSS_MAIN

REAL,DIMENSION(:,:),ALLOCATABLE :: A

REAL,DIMENSION(:),ALLOCATABLE :: B, X

PRINT*,'DWSTE PLH0OS AGNWSTWN: '

READ*,N

! DHMIOURGIA TWN PINAKWN

ALLOCATE(A(N,N))

ALLOCATE(B(N))

ALLOCATE(X(N))

! ANAGNWSH TWN STOIXEIWN TOY SYSTHMATOS APO TO ARXEIO

OPEN (UNIT=15,FILE='MATRIX.TXT')

DO I=1,N

READ(15,*) (A(I,J),J=1,N),B(I)

END DO

CLOSE (UNIT=15)

! KLHSH THS YPOROUTINAS EPILYSHS

CALL GAUSS(A,B,X,N)

! EKTYPWSH TWN LYSEWN TOY SYSTHMATOS

PRINT*, 'OI LYSEIS EINAI: '

DO I=1,N

PRINT*, 'X(',I,')=',X(I)

END DO

DEALLOCATE(A)

DEALLOCATE(B)

DEALLOCATE(X)

STOP

END PROGRAM GAUSS_MAIN

SUBROUTINE GAUSS(A,B,X,N)

INTEGER N

REAL A(N,N),B(N),X(N)

INTEGER R,T

! MEROS PRWTO: APALOIFES AGNWSTWN KAI TRIGWNOPOIHSH TOY PINAKA

DO R=1,N-1

PRINT*, 'APALOIFH: BHMA ',R

MAX_R=R

DO I=R+1,N

IF (ABS(A(I,R)) > ABS(A(R,R))) THEN

MAX_R=I

END IF

Page 62: προγραμματισμός εργαστήριο

62

END DO

IF (MAX_R>R) THEN

DO L=R,N

TEMP=A(R,L)

A(R,L)=A(MAX_R,L)

A(MAX_R,L)=TEMP

END DO

TEMP=B(R)

B(R)=B(MAX_R)

B(MAX_R)=TEMP

END IF

CALL PRINT_TABLE(A,B,N)

DO I=R+1,N

DO J=R+1,N

A(I,J) = A(I,J)-A(I,R)*A(R,J)/A(R,R)

END DO

B(I) = B(I)-A(I,R)*B(R)/A(R,R)

A(I,R)=0.

END DO

CALL PRINT_TABLE(A,B,N)

END DO

! MEROS DEYTERO: ANTIKATASTASH PROS TA PISW

PRINT*, 'ANTIKATASTASH: BHMA 1'

X(N) = B(N)/A(N,N)

A(N,N)=1.

B(N)=X(N)

CALL PRINT_TABLE(A,B,N)

DO J=N-1,1,-1

PRINT*, 'ANTIKATASTASH: BHMA ',(N+1-J)

S=0.

DO K=J+1,N

S=S+A(J,K)*X(K)

END DO

X(J) = (B(J)-S)/A(J,J)

A(J,J)=1.

B(J)=X(J)

DO K=J+1,N

A(J,K)=0.

END DO

CALL PRINT_TABLE(A,B,N)

END DO

RETURN

END SUBROUTINE GAUSS

! YPOROUTINA EMFANISHS TWN STOIXEIWN TOY SYSTHMATOS

SUBROUTINE PRINT_TABLE(A,B,N)

INTEGER N

REAL A(N,N),B(N)

DO I=1,N

PRINT*, (A(I,J),J=1,N), B(I)

END DO

PRINT*

RETURN

END SUBROUTINE PRINT_TABLE

___________________________________________________________

ΣΤ. [Πίνακες δεικτών θερμότητας και ψυχρότητας]

Σε προηγούμενη ενότητα γνωρίσατε τους δείκτες θερμότητας και ψυχρότητας που

χρησιμοποιούνται για τον υπολογισμό της αισθητής θερμοκρασίας.

Γράψτε πρoγράμματα σε Fortran και C++ που να δημιουργούν έναν πίνακα

δεικτών θερμότητας και να τον αποθηκεύουν σε ένα αρχείο αποτελεσμάτων με

όνομα HeatIndex.txt. Θεωρήστε θερμοκρασίες περιβάλλοντος από +30 oC έως

+45 oC με βήμα 3 και σχετική υγρασία από 50% έως και 90% με βήμα 10.

Ομοίως, γράψτε πρoγράμματα σε Fortran και C++ που να δημιουργούν έναν

Page 63: προγραμματισμός εργαστήριο

63

πίνακα δεικτών ψυχρότητας και να τον αποθηκεύουν σε ένα αρχείο

αποτελεσμάτων με όνομα WindChill.txt. Θεωρήστε θερμοκρασίες περιβάλλοντος

από -30 oC έως +10 oC με βήμα 5 και ταχύτητα ανέμου από 10 km/h έως

60 km/h με βήμα 10.

Page 64: προγραμματισμός εργαστήριο

64

Page 65: προγραμματισμός εργαστήριο

65

ΕΝΟΤΗΤΑ 7 Αντικειμενοστραφής Προγραμματισμός

Δομές Δεδομένων – Αντικείμενα και Τάξεις

Διδακτικοί Στόχοι

Οι διδακτικοί στόχοι της εργαστηριακής ενότητας είναι:

να μπορείτε να ορίσετε και να χειριστείτε νέες δομές δεδομένων,

να μπορείτε να ορίσετε νέες τάξεις αντικειμένων,

να μπορείτε να διακρίνετε τα δεδομένα μέλη από τις συναρτήσεις μέλη μίας

τάξης αντικειμένων,

να κατανοήσετε τη χρησιμότητα των συναρτήσεων δημιουργίας /

αποδιάρθρωσης μίας τάξης αντικειμένων,

να κατανοήσετε τη χρησιμότητα των δηλώσεων public και private στον

ορισμό μίας τάξης αντικειμένων.

Ι. Πριν το εργαστήριο – Προετοιμασία

Α. Επαναλάβετε τη μελέτη της αντίστοιχης θεωρίας για τη γλώσσα προγραμματισμού

C++ και απαντήστε στις παρακάτω ερωτήσεις:

1. Δώστε τη γενική σύνταξη μίας δομής (struct). Δώστε ένα παράδειγμα.

2. Με ποιο τρόπο μπορείτε να ορίσετε μεταβλητές που να αντιστοιχούν σε μία δομή

που έχετε δημιουργήσει;

3. Με ποιο τρόπο μπορείτε να προσπελάσετε ένα μέλος μίας δομής σε μία

μεταβλητή;

4. Τι τύπου δεδομένων μπορούν να είναι τα μέλη μίας δομής;

5. Δώστε τη γενική σύνταξη μίας τάξης αντικειμένων. Δώστε ένα παράδειγμα. Που

διαφέρουν οι τάξεις αντικειμένων από τις δομές;

6. Πως ορίζονται σε ένα πρόγραμμα αντικείμενα που αντιστοιχούν σε μία τάξη;

7. Ποιός είναι ο ρόλος των συναρτήσεων κατασκευαστών (constructor) και

καταστροφέων (destructor) σε μία τάξη αντικειμένων;

8. Μπορεί ένα αντικείμενο να αποτελεί όρισμα σε μία συνάρτηση;

9. Έστω Α και Β δύο αντικείμενα μίας τάξης. Πώς μπορούμε να αντιγράψουμε τα

δεδομένα του αντικειμένου Β στο αντικείμενο Α;

10. Πόσες συναρτήσεις κατασκευαστών μπορούν να οριστούν σε μία τάξη

αντικειμένων;

Page 66: προγραμματισμός εργαστήριο

66

Β. [Δομή δεδομένων μιγαδικών αριθμών]

Η γλώσσα C++ δεν έχει ενσωματωμένο τύπο δεδομένων για μιγαδικούς αριθμούς

όπως έχει για παράδειγμα η γλώσσα Fortran. Παρέχει όμως τη δυνατότητα στον

προγραμματιστή να δημιουργήσει δικούς του τύπους δεδομένων χρησιμοποιώντας

δομές (structs) ή τάξεις αντικειμένων (classes).

Δίνεται στη συνέχεια πρόγραμμα σε γλώσσα C++ το οποίο προσθέτει δύο μιγαδικούς

αριθμούς. Το πρόγραμμα αρχικά δημιουργεί μία δομή δεδομένων (struct) με

όνομα complex που αναπαριστά τους μιγαδικούς αριθμούς. Η δομή περιέχει δύο

μέλη (πραγματικούς αριθμούς) που αντιστοιχούν στο πραγματικό και στο

φανταστικό μέρος ενός μιγαδικού αριθμού. Στη συνέχεια δημιουργείται μία

συνάρτηση η οποία δέχεται ως ορίσματα δύο μεταβλητές τύπου complex και

επιστρέφει το άθροισμά τους. Τέλος ακολουθεί η συνάρτηση main() η οποία

προσθέτει έναν μιγαδικό αριθμό που εισάγεται από το πληκτρολόγιο με έναν

δεύτερο μιγαδικό αριθμό και εμφανίζει το αποτέλεσμα στην οθόνη.

// migadikoi arithmoi

#include <iostream>

using namespace std;

struct complex

{

float real;

float imag;

};

complex add_complex(complex, complex);

int main()

{

complex c1, c2, c3;

c1.real = 1.0;

c1.imag = 2.5; // c1 = 1.0+2.5i

cout << "Dwste to pragmatiko meros toy arithmou c2:";

cin >> c2.real;

cout << "Dwste to fantastiko meros toy arithmou c2:";

cin >> c2.imag;

c3 = add_complex(c1,c2);

cout << " c1+c2 = " << c3.real << "+i" << c3.imag << endl;

return 0;

}

complex add_complex(complex a1, complex a2)

{

complex a3;

a3.real = a1.real + a2.real;

a3.imag = a1.imag + a2.imag;

return a3;

}

1. Μεταγλωττίστε το πρόγραμμα στον υπολογιστή.

Page 67: προγραμματισμός εργαστήριο

67

2. Εκτελέστε το πρόγραμμα και επιβεβαιώστε τα αποτελέσματα για 3 διαφορετικές

περιπτώσεις.

3. Προσθέστε στο πρόγραμμα μία συνάρτηση που να δέχεται ως ορίσματα δύο

μιγαδικούς αριθμούς και να ελέγχει εάν είναι συζυγείς. Τροποποιήστε τη συνάρτηση

main() ώστε να καλεί τη συνάρτηση που δημιουργήσατε και ελέγξτε την ορθότητά

της.

ΙΙ. Στο εργαστήριο

Α. [Τάξη αντικειμένων μιγαδικών αριθμών]

Ένας προγραμματιστής προσπάθησε να δημιουργήσει μία τάξη αντικειμένων για

μιγαδικούς αριθμούς, αντίστοιχη της δομής δεδομένων complex της προηγούμενης

άσκησης, με το ίδιο όνομα. Η τάξη αντικειμένων περιέχει ως private μέλη δύο

πραγματικούς αριθμούς που αντιστοιχούν στο πραγματικό και φανταστικό μέρος

του μιγαδικού αριθμού και ως public μέλη:

(α) τις συναρτήσεις set_real() και set_imag() με τις οποίες θέτουμε τιμή στο

πραγματικό ή στο φανταστικό μέρος του αριθμού αντίστοιχα,

(β) τις συναρτήσεις get_real() και get_imag() με τις οποίες διαβάζουμε την τιμή

του πραγματικού ή του φανταστικού μέρους του αριθμού και

(γ) τη συνάρτηση add_complex() η οποία αναθέτει σε ένα μιγαδικό αριθμό το

αποτέλεσμα της πρόσθεσης δύο μιγαδικών (ορίσματα της συνάρτησης).

Κατέληξε στο παρακάτω πρόγραμμα το οποίο περιέχει συντακτικά και λογικά λάθη.

// migadikoi arithmoi

#include <iostream>

using namespace std;

class complex

{

private:

float real;

float imag;

public:

void set_real(float a)

{

real = a;

}

void set_imag(float a)

{

imag = a;

}

float get_real(void)

{

return real;

}

float get_imag(void)

{

return real;

}

void add_complex(complex a1, complex a2)

{

real = a1.real + a2.real;

imag = a1.imag + a1.imag;

Page 68: προγραμματισμός εργαστήριο

68

}

};

int main()

{

const float in=0.0;

complex c1, c2, c3;

c1.set_real(1.0);

c1.set_imag(2.5); // c1 = 1.0+2.5i

cout << "Dwste to pragmatiko meros toy arithmou c2:";

cin >> in;

c2.set_real(in);

cout << "Dwste to fantastiko meros toy arithmou c2:";

cin >> in;

c2.set_imag(in);

c3.addcomplex(c1,c2);

cout << "c1+c2=" << c3.real << "+i" << c3.imag <<endl;

return 0;

}

1. Διορθώστε τα λάθη του προγράμματος και μεταγλωττίστε το. Καταγράψτε τα

συντακτικά και λογικά λάθη που βρήκατε.

2. Εκτελέστε το πρόγραμμα και επιβεβαιώστε την ορθότητα των αποτελεσμάτων του.

3. Προσθέστε στην τάξη complex μία συνάρτηση μέλος με όνομα syzygeis(). Η

συνάρτηση θα δέχεται ως όρισμα έναν μιγαδικό αριθμό και θα τον συγκρίνει με το

τρέχον αντικείμενο. Εάν οι δύο μιγαδικοί αριθμοί είναι συζυγείς, τότε η συνάρτηση

θα επιστρέφει την τιμή 1, διαφορετικά θα επιστρέφει την τιμή 0. Τροποποιήστε τη

συνάρτηση main() ώστε να καλεί τη συνάρτηση που δημιουργήσατε και ελέγξτε την

ορθότητά της.

Β. [Διανύσματα στο χώρο]

Σε ένα πρόβλημα Φυσικής, μελετάμε διανύσματα στο χώρο των τριών διαστάσεων.

1. Δημιουργήστε μία τάξη αντικειμένων που να αναπαριστά ένα διάνυσμα στο χώρο.

Η τάξη αντικειμένων πρέπει να έχει:

(α) τρία δεδομένα μέλη που θα αντιστοιχούν στο μέτρο του διανύσματος σε κάθε μία

από τις τρεις διαστάσεις,

(β) συναρτήσεις μέλη για την αλλαγή της τιμής του μέτρου του διανύσματος σε κάθε

διάσταση,

(γ) συναρτήσεις μέλη για την ανάγνωση της τιμής του μέτρου του διανύσματος σε

κάθε διάσταση.

2. Δημιουργήστε ένα κύριο πρόγραμμα που να χρησιμοποιεί την τάξη αντικειμένων

για να εισάγει από το πληκτρολόγιο το μέτρο ενός διανύσματος σε κάθε διάσταση

και να το εμφανίζει στην οθόνη του υπολογιστή. Εκτελέστε το πρόγραμμα και

επιβεβαιώστε την ορθότητα των αποτελεσμάτων που παίρνετε.

3. Δημιουργήστε μία συνάρτηση μέλος της τάξης αντικειμένων που να υπολογίζει το

μέτρο του διανύσματος. Τροποποιήστε το κύριο πρόγραμμα ώστε να εμφανίζει και το

μέτρο του διανύσματος στην οθόνη του υπολογιστή.

Page 69: προγραμματισμός εργαστήριο

69

ΙΙΙ. Μετά το εργαστήριο – Ασκήσεις προς επίλυση

Α. [Τάξη αντικειμένων ημερομηνίας]

Δημιουργήστε μία τάξη αντικειμένων σε γλώσσα C++ που να αναπαριστά την

ημερομηνία. Χρησιμοποιήστε τρία δεδομένα μέλη για να αποθηκεύσετε την ημέρα,

το μήνα και το έτος. Δημιουργήστε επίσης:

(α) κατάλληλες συναρτήσεις δημιουργίας που να κάνουν έλεγχο έγκυρης

ημερομηνίας (για παράδειγμα ημερομηνία 33/15/2007 δεν είναι επιτρεπτή),

(β) συναρτήσεις μέλη οι οποίες να θέτουν τιμή στην ημέρα ή στο μήνα ή στο έτος,

(γ) συναρτήσεις μέλη οι οποίες να διαβάζουν την τιμή της ημέρας ή του μήνα ή του

έτους,

(δ) μία συνάρτηση μέλος η οποία να εμφανίζει στην οθόνη του υπολογιστή την

ημερομηνία σε μορφή ΗΗ/ΜΜ/ΕΕΕΕ.

Β. [Τάξη αντικειμένων μεγάλων ακεραίων αριθμών]

Ο τύπος δεδομένων int της γλώσσας C++ αναπαριστά όλους τους ακέραιους

αριθμούς που μπορούν να αποθηκευτούν σε 4 bytes στον υπολογιστή, δηλαδή

ακέραιους αριθμούς στο διάστημα [-2147483648, +2147483647]. Μερικές

εφαρμογές χρειάζονται ακέραιους αριθμούς με μεγαλύτερο εύρος τιμών.

Δημιουργήστε μία τάξη αντικειμένων σε γλώσσα C++ που να αναπαριστά μεγάλους

ακέραιους αριθμούς. Χρησιμοποιήστε πίνακα ακεραίων αριθμών ως δεδομένα μέλη

για να αποθηκεύσετε τον ακέραιο αριθμό. Δημιουργήστε επίσης:

(α) κατάλληλες συναρτήσεις δημιουργίας,

(β) μία συνάρτηση μέλος η οποία να θέτει τιμή στον ακέραιο αριθμό (η τιμή θα

εισάγεται από το πληκτρολόγιο) και

(γ) μία συνάρτηση μέλος η οποία να εμφανίζει στην οθόνη του υπολογιστή την τιμή

του ακέραιου αριθμού.

Γ. [Τάξη αντικειμένων κλασματικών αριθμών]

Μερικές εφαρμογές απαιτούν την εκτέλεση πράξεων με κλάσματα, δηλαδή αριθμούς

της μορφής α/β.

Δημιουργήστε μία τάξη αντικειμένων σε γλώσσα C++ που να αναπαριστά

κλασματικούς αριθμούς. Χρησιμοποιήστε ως δεδομένα μέλη δύο ακέραιους

αριθμούς για να αποθηκεύσετε τον αριθμητή και τον παρονομαστή του κλασματικού

αριθμού. Δημιουργήστε επίσης:

(α) κατάλληλες συναρτήσεις δημιουργίας,

(β) συναρτήσεις μέλη οι οποίες να θέτουν τιμή στον αριθμητή ή στον παρονομαστή,

(γ) συναρτήσεις μέλη οι οποίες να διαβάζουν την τιμή του αριθμητή ή του

παρονομαστή,

(δ) μία συνάρτηση μέλος η οποία να εμφανίζει στην οθόνη του υπολογιστή τον

κλασματικό αριθμό σε μορφή α/β.

Δ. [Τάξη αντικειμένων πολυωνύμων]

Page 70: προγραμματισμός εργαστήριο

70

Ένα πολυώνυμο P(x) = anxn + … + a1x1 + a0x0 προσδιορίζεται πλήρως από το

βαθμό, n, και τους συντελεστές, ai, n≤i≤0. Δημιουργήστε μία τάξη αντικειμένων σε

γλώσσα C++ που να αναπαριστά πολυώνυμα.

Μπορείτε να χρησιμοποιήσετε μία μεταβλητή πίνακα ως δεδομένο μέλος της τάξης

αντικειμένων για να αποθηκεύετε τους συντελεστές ενός πολυωνύμου. Μπορείτε να

χρησιμοποιήσετε επιπλέον μία ακέραια μεταβλητή για να αποθηκεύετε το βαθμό

του πολυωνύμου. Η τάξη αντικειμένων πρέπει να διαθέτει:

(α) κατάλληλες συναρτήσεις μέλη δημιουργίας,

(β) κατάλληλες συναρτήσεις μέλη για το χειρισμό των συντελεστών και του βαθμού

ενός πολυωνύμου,

(γ) κατάλληλες συναρτήσεις μέλη για την εισαγωγή των στοιχείων ενός πολυωνύμου

από το πληκτρολόγιο και την εμφάνισή του στην οθόνη.

Γράψτε ένα κύριο πρόγραμμα που να αξιοποιεί τον νέο τύπο δεδομένων που

δημιουργήσατε.

Επαυξήστε τη λειτουργικότητα της τάξης αντικειμένων με επιπλέον συναρτήσεις

μέλη ώστε να:

(α) γίνεται έλεγχος κατα πόσο ένα πολυώνυμο είναι μηδενικό ή όχι,

(β) μπορεί να πολλαπλασιαστεί ένα πολυώνυμο με το xk, όπου το k είναι ακέραιος

αριθμός,

(γ) υπολογίζεται η τιμή του πολυωνύμου P(x), για δεδομένη τιμή του x,

(δ) υπολογίζεται η παράγωγος P’(x) ενός πολυωνύμου P(x), για δεδομένη τιμή του x.

Ελέγξτε τη σωστή λειτουργία των παραπάνω με το κατάλληλο κύριο πρόγραμμα.

Ε. [Τάξη αντικειμένων κλειστών διαστημάτων]

Δημιουργήστε μία τάξη αντικειμένων με όνομα Interval που να αναπαριστά κλειστά

διαστήματα στην ευθεία των πραγματικών αριθμών: }:{, bxaxba . Η τάξη

αντικειμένων πρέπει τουλάχιστον να περιέχει: (α) τα κατάλληλα δεδομένα μέλη, (β)

μία συνάρτηση δημιουργίας, (γ) συναρτήσεις μέλη για τον χειρισμό των δεδομένων,

και (δ) μία συνάρτηση μέλος με όνομα print() για την εμφάνιση των άκρων του

κλειστού διαστήματος στην οθόνη.

Page 71: προγραμματισμός εργαστήριο

71

ΕΝΟΤΗΤΑ 8 Αντικειμενοστραφής Προγραμματισμός Υπερφόρτωση Τελεστών/Συναρτήσεων

Διδακτικοί Στόχοι

Οι διδακτικοί στόχοι της εργαστηριακής ενότητας είναι:

να μπορείτε να δημιουργήσετε πολλές συναρτήσεις με το ίδιο όνομα σε ένα

πρόγραμμα,

να μπορείτε να ορίσετε τον τρόπο λειτουργίας ενός τελεστή όταν εφαρμόζεται

σε ένα αντικείμενο μίας νέας τάξης αντικειμένων,

να μπορείτε να υπερφορτώνετε τους τελεστές εισόδου / εξόδου δεδομένων (<<

και >>).

Ι. Πριν το εργαστήριο – Προετοιμασία

Α. Επαναλάβετε τη μελέτη της αντίστοιχης θεωρίας για τη γλώσσα προγραμματισμού

C++ και απαντήστε στις παρακάτω ερωτήσεις:

1. Πως αποφασίζει ο μεταγλωττιστής ποια συνάρτηση θα καλέσει όταν υπάρχουν

περισσότερες από μία συναρτήσεις με το ίδιο όνομα;

2. Μία συνάρτηση δέχεται τρία ορίσματα: έναν ακέραιο, έναν πραγματικό αριθμό

και ένα χαρακτήρα. Μπορούμε να καλέσουμε τη συνάρτηση με λιγότερα από τρία

ορίσματα; Αν ναι, με ποιόν τρόπο;

3. Ποιά είναι η χρησιμότητα της υπερφόρτωσης μίας συνάρτησης;

4. Μπορεί να υπερφορτωθεί η συνάρτηση κατασκευαστή μίας τάξης αντικει-μένων;

5. Ποιά είναι η χρησιμότητα της υπερφόρτωσης ενός τελεστή;

6. Ποιούς τελεστές μπορούμε να υπερφορτώσουμε;

7. Μπορεί να αλλάξει η προτεραιότητα ενός τελεστή χρησιμοποιώντας υπερ-

φόρτωση;

8. Μπορούμε να δημιουργήσουμε νέους τελεστές;

9. Δώστε τη γενική σύνταξη μίας συνάρτησης υπερφόρτωσης του τελεστή +;

10. Μπορεί να υπερφορτωθεί ο τελεστής ++;

Β. [Τάξη αντικειμένων μιγαδικών αριθμών]

Δίνεται στη συνέχεια πρόγραμμα σε γλώσσα C++ το οποίο επαυξάνει τις δυνατότητες

της τάξης αντικειμένων μιγαδικών αριθμών της προηγούμενης ενότητας

υπερφορτώνοντας τους παρακάτω τελεστές: (α) >> για την απεικόνιση ενός μιγαδικού

αριθμού στην οθόνη, (β) << για την εισαγωγή ενός μιγαδικού αριθμού από το

Page 72: προγραμματισμός εργαστήριο

72

πληκτρολόγιο, (γ) + για την πρόσθεση δύο μιγαδικών αριθμών. Το πρόγραμμα

χρησιμοποιεί μία συνάρτηση δημιουργίας με δύο ορίσματα.

// migadikoi arithmoi – yperfortwsh telestwn

#include <iostream>

using namespace std;

class complex

{

friend ostream &operator<<(ostream&, complex &);

friend istream &operator>>(istream&, complex &);

private:

float real;

float imag;

public:

complex()

{

}

complex(float r, float i)

{

real=r;

imag=i;

}

void set_real(float a)

{

real = a;

}

void set_imag(float a)

{

imag = a;

}

float get_real(void)

{

return real;

}

float get_imag(void)

{

return imag;

}

complex operator+ (complex a)

{

float r=get_real()+a.get_real();

float i=get_imag()+a.get_imag();

return complex(r,i);

}

};

ostream &operator<<(ostream &output, complex &a)

{

output << a.real << "+i" << a.imag;

return output;

}

istream &operator>>(istream &input, complex &a)

{

input >> a.real;

input >> a.imag;

return input;

}

Page 73: προγραμματισμός εργαστήριο

73

int main()

{

complex c1(1.0,2.5);

complex c2, c3;

float in=0.0;

cout << "Dwste ton arithmo c2:";

cin >> c2;

c3 = c1 + c2;

cout << "c1+c2=" << c3 << endl;

return 0;

}

1. Μεταγλωττίστε το πρόγραμμα στον υπολογιστή.

2. Εκτελέστε το πρόγραμμα και επιβεβαιώστε τα αποτελέσματα για 3 διαφορετικές

περιπτώσεις.

3. Υπερφορτώστε τον τελεστή - ώστε να υποστηρίζει την αφαίρεση μεταξύ δύο

μιγαδικών αριθμών. Τροποποιήστε το πρόγραμμα κατάλληλα και ελέγξτε την

ορθότητά του.

ΙΙ. Στο εργαστήριο

Α. [Συνάρτηση κύβου]

Ένας προγραμματιστής χρειάζεται, σε ένα πρόγραμμά του σε γλώσσα C++, μία

συνάρτηση για να υπολογίζει το χ3 για: (α) ακέραιους αριθμούς, (β) πραγματικούς

αριθμούς απλής ακρίβειας και (γ) πραγματικούς αριθμούς διπλής ακρίβειας.

Αποφάσισε να χρησιμοποιήσει την υπερφόρτωση συναρτήσεων και να δημιουργήσει

τρεις συναρτήσεις με το ίδιο όνομα (cube), μία για κάθε περίπτωση αριθμών.

Κατέληξε στο παρακάτω πρόγραμμα το οποίο περιέχει συντακτικά και λογικά λάθη.

#include <iostream>

using namespace std;

int cube(int)

float cube (float);

double cube(double);

int main()

{

char a='a';

int b=5;

float c=7.2;

double d=3.4;

cout << "a^3 = " << cube(a) << endl;

cout << "5^3 = " << cube(b) << endl;

cout << "7.2^3 = " << cube(c) << endl;

cout << "3.4^3 = " << cube(d) << endl;

return 0;

}

Page 74: προγραμματισμός εργαστήριο

74

int cube(int x)

{

cout << "(Function with int arguments called) ";

return x*x*x;

}

float cube (float x)

{

cout << "(Function with float arguments called) ";

return x*x*x;

}

double cube(double x)

{

cout << "(Function with double arguments called) ";

return x*x*x;

}

1. Διορθώστε τα λάθη του προγράμματος και μεταγλωττίστε το. Καταγράψτε τα

συντακτικά και λογικά λάθη που βρήκατε.

2. Εκτελέστε το πρόγραμμα και επιβεβαιώστε την ορθότητα των αποτελεσμάτων του.

3. Πώς καταλαβαίνει ο μεταγλωττιστής ποιά συνάρτηση θα καλέσει κάθε φορά;

4. Πώς ερμηνεύεται το αποτέλεσμα ύψωσης του χαρακτήρα 'a' στον κύβο;

Β. [Διανύσματα στο χώρο]

Σε προηγούμενη ενότητα δημιουργήσατε μία τάξη αντικειμένων που αναπαριστά

διανύσματα στο χώρο.

1. Επαυξήστε την τάξη αντικειμένων προσθέτοντας κατάλληλες συναρτήσεις για την

υπερφόρτωση των τελεστών << και >> για την εισαγωγή των στοιχείων ενός

διανύσματος από το πληκτρολόγιο και την απεικόνιση των στοιχείων του

διανύσματος στην οθόνη του υπολογιστή αντίστοιχα.

2. Δημιουργήστε μία συνάρτηση δημιουργίας της τάξης αντικειμένων η οποία να

δέχεται ως ορίσματα το μέτρο του διανύσματος σε κάθε διάσταση. Επίσης,

υπερφορτώστε τον τελεστή + ώστε να υποστηρίζει την πρόσθεση μεταξύ δύο

διανυσμάτων.

3. Τροποποιήστε το κύριο πρόγραμμα κατάλληλα για να ελέγξετε την ορθότητα των

συναρτήσεων που δημιουργήσατε.

ΙΙΙ. Μετά το εργαστήριο – Ασκήσεις προς επίλυση

Α. [Τάξη αντικειμένων ημερομηνίας]

Σε προηγούμενη ενότητα δημιουργήσατε μία τάξη αντικειμένων ημερομηνίας.

Επαυξήστε τις δυνατότητες της τάξης αυτής προσθέτοντας συναρτήσεις που να

υπερφορτώνουν:

(α) τον τελεστή << ώστε να εισάγεται η ημερομηνία από το πληκτρολόγιο στη μορφή

ΗΗ/ΜΜ/ΕΕΕΕ,

(β) τον τελεστή >> ώστε να απεικονίζεται η ημερομηνία στην οθόνη του υπολογιστή

με τη μορφή ΗΗ/ΜΜ/ΕΕΕΕ, και

(γ) τον τελεστή ++ ώστε να αυξάνεται η τρέχουσα ημερομηνία κατά μία ημέρα.

Επιβεβαιώστε με κατάλληλο κύριο πρόγραμμα την ορθότητα των συναρτήσεων που

δημιουργήσατε.

Page 75: προγραμματισμός εργαστήριο

75

Β. [Τάξη αντικειμένων μεγάλων ακέραιων αριθμών]

Σε προηγούμενη ενότητα δημιουργήσατε μία τάξη αντικειμένων μεγάλων ακεραίων

αριθμών. Επαυξήστε τις δυνατότητες της τάξης αυτής προσθέτοντας συναρτήσεις που

να υπερφορτώνουν:

(α) τον τελεστή << ώστε να εισάγεται ο αριθμός από το πληκτρολόγιο,

(β) τον τελεστή >> ώστε να απεικονίζεται ο αριθμός στην οθόνη του υπολογιστή, και

(γ) τον τελεστή + ώστε να προστίθενται δύο μεγάλοι ακέραιοι αριθμοί.

Επιβεβαιώστε με κατάλληλο κύριο πρόγραμμα την ορθότητα των συναρτήσεων που

δημιουργήσατε.

Γ. [Τάξη αντικειμένων κλασματικών αριθμών]

Σε προηγούμενη ενότητα δημιουργήσατε μία τάξη αντικειμένων κλασματικών

αριθμών. Επαυξήστε τις δυνατότητες της τάξης αυτής προσθέτοντας συναρτήσεις που

να υπερφορτώνουν:

(α) τον τελεστή << ώστε να εισάγεται ο αριθμός από το πληκτρολόγιο σε μορφή α/β,

(β) τον τελεστή >> ώστε να απεικονίζεται ο αριθμός στην οθόνη του υπολογιστή σε

μορφή α/β,

(γ) τον τελεστή + για την πρόσθεση δύο κλασματικών αριθμών,

(δ) τον τελεστή – για την αφαίρεση δύο κλασματικών αριθμών,

(ε) τον τελεστή * για τον πολλαπλασιασμό δύο κλασματικών αριθμών και

(στ) τον τελεστή / για τη διαίρεση δύο κλασματικών αριθμών. Επιβεβαιώστε με

κατάλληλο κύριο πρόγραμμα την ορθότητα των συναρτήσεων που δημιουργήσατε.

Δ. [Τάξη αντικειμένων πολυωνύμων]

Σε προηγούμενη ενότητα δημιουργήσατε μία τάξη αντικειμένων για την

αναπαράσταση πολυωνύμων. Επεκτείνετε την τάξη αντικειμένων υπερφορτώνοντας

τους τελεστές:

(α) == για τον έλεγχο ισότητας μεταξύ δύο πολυωνύμων,

(β) + για την πρόσθεση δύο πολυωνύμων,

(γ) – για την αφαίρεση δύο πολυωνύμων,

(δ) << για την εμφάνιση ενός πολυωνύμου στην οθόνη.

Ελέγξτε τη σωστή λειτουργία των παραπάνω με το κατάλληλο κύριο πρόγραμμα.

Ε. [Τάξη αντικειμένων κλειστών διαστημάτων]

Σε προηγούμενη ενότητα δημιουργήσατε μία τάξη αντικειμένων για την

αναπαράσταση κλειστών διαστημάτων στην ευθεία των πραγματικών αριθμών.

Επεκτείνετε την τάξη αντικειμένων υπερφορτώνοντας τον τελεστή == για τον έλεγχο

της ισότητας δύο κλειστών διαστημάτων.

Page 76: προγραμματισμός εργαστήριο

76

Page 77: προγραμματισμός εργαστήριο

77

ΕΝΟΤΗΤΑ 9 Αντικειμενοστραφής Προγραμματισμός

Κληρονομικότητα

Διδακτικοί Στόχοι

Οι διδακτικοί στόχοι της συγκεκριμένης εργαστηριακής ενότητας είναι:

να μπορείτε να δημιουργείτε τάξεις που κληρονομούν χαρακτηριστικά από

υπάρχουσες τάξεις,

να κατανοήσετε τη χρησιμότητα της εκμετάλλευσης τάξεων που ήδη

υπάρχουν για τη δημιουργία νέων τάξεων αντικειμένων,

να κατανοήσετε τη χρησιμότητα των δηλώσεων protected στον ορισμό μίας

τάξης αντικειμένων,

να μπορείτε να διακρίνετε μητρικές και θυγατρικές τάξεις αντικειμένων.

Ι. Πριν το εργαστήριο – Προετοιμασία

Α. Επαναλάβετε τη μελέτη της αντίστοιχης θεωρίας για τη γλώσσα προγραμματισμού

C++ και απαντήστε στις παρακάτω ερωτήσεις:

1. Ποιά είναι τα πλεονεκτήματα από τη χρήση της κληρονομικότητας;

2. Ποιά χαρακτηριστικά κληρονομεί μία θυγατρική από μία μητρική τάξη

αντικειμένων;

3. Μία μητρική τάξη αντικειμένων έχει κάποια δεδομένα δηλωμένα ως private.

Μπορεί μία θυγατρική τάξη να έχει πρόσβαση στα δεδομένα αυτά;

4. Ποιά είναι η διαφορά της δήλωσης protected από τη δήλωση private;

5. Μία μητρική και μία θυγατρική τάξη αντικειμένων έχουν μία συνάρτηση με το

ίδιο όνομα. Ποιά συνάρτηση χρησιμοποιούν εξ΄ ορισμού τα αντικείμενα της

θυγατρικής τάξης; Μπορούν να καλέσουν τη συνάρτηση της μητρικής τάξης;

Β. [Γεωμετρικά σχήματα: Σημείο / Κύκλος]

(x,y) (x,y)

r

Ένα σημείο περιγράφεται πλήρως από τις συντεταγμένες του (x,y). Ένας κύκλος

περιγράφεται πλήρως από τις συντεταγμένες του κέντρου του και από την ακτίνα

του.

Δίνεται στη συνέχεια πρόγραμμα σε γλώσσα C++ το οποίο αρχικά δημιουργεί μία

τάξη αντικειμένων με όνομα point που αναπαριστά τα σημεία. Στη συνέχεια

Page 78: προγραμματισμός εργαστήριο

78

δημιουργεί μία τάξη αντικειμένων με όνομα circle που αναπαριστά τους κύκλους

και η οποία κληρονομεί τα χαρακτηριστικά του κέντρου του κύκλου από την τάξη

point.

#include <iostream>

using namespace std;

const double PI = 3.14159;

class point

{

protected:

int x;

int y;

public:

point()

{

}

point(int xvalue, int yvalue)

{

x=xvalue;

y=yvalue;

}

void setX(int value)

{

x=value;

}

void setY(int value)

{

y=value;

}

int getX(void)

{

return x;

}

int getY(void)

{

return y;

}

void print(void)

{

cout << "(" << x << "," << y << ")" << endl;

}

};

class circle : public point

{

private:

double radius;

public:

circle()

{

}

circle(int xvalue, int yvalue, double radiusvalue)

{

x=xvalue;

y=yvalue;

radius=radiusvalue;

}

Page 79: προγραμματισμός εργαστήριο

79

void setRadius(double value)

{

radius=value;

}

double getRadius(void)

{

return radius;

}

double getArea(void)

{

return PI*radius*radius;

}

void print(void)

{

cout << "Center: (" << x << "," << y << ") ";

cout << "Radius: " << radius << endl;

}

};

int main()

{

circle x(37, 43, 2.5);

x.print();

cout << "Circle area: " << x.getArea() << endl;

x.setX(23);

x.setY(32);

x.setRadius(1.2);

x.print();

return 0;

}

1. Μεταγλωττίστε το πρόγραμμα στον υπολογιστή.

2. Εκτελέστε το πρόγραμμα και επιβεβαιώστε τα αποτελέσματα.

3. Επαυξήστε την τάξη circle με συναρτήσεις που να υπολογίζουν τη διάμετρο και

την περιφέρεια ενός κύκλου.

ΙΙ. Στο εργαστήριο

Α. [Γεωμετρικά σχήματα: Σημείο / Κύκλος / Κύλινδρος]

(x,y) (x,y)

r

(x,y)

r

h

Ένας κύλινδρος περιγράφεται πλήρως από τις συντεταγμένες του άξονά του στο

επίπεδο, την ακτίνα και το ύψος του.

Ένας προγραμματιστής χρειάζεται, σε ένα πρόγραμμά του σε γλώσσα C++, μία τάξη

αντικειμένων κυλίνδρων. Αποφάσισε να δημιουργήσει μία τάξη με όνομα cylinder η

οποία να κληρονομεί χαρακτηριστικά από την τάξη circle του προηγούμενου

προγράμματος. Κατέληξε στον παρακάτω ορισμό της τάξης ο οποίος περιέχει

συντακτικά και λογικά λάθη.

Page 80: προγραμματισμός εργαστήριο

80

#include <iostream>

using namespace std;

class point

{

protected:

int x;

int y;

public:

point()

{

}

point(int xvalue, int yvalue)

{

x=xvalue;

y=yvalue;

}

void setX(int value)

{

x=value;

}

void setY(int value)

{

y=value;

}

int getX(void)

{

return x;

}

int getY(void)

{

return y;

}

void print(void)

{

cout << "(" << x << "," << y << ")" << endl;

}

};

class circle : public point

{

private:

double radius;

public:

circle()

{

}

circle(int xvalue, int yvalue, double radiusvalue)

{

x=xvalue;

y=yvalue;

radius=radiusvalue;

}

void setRadius(double value)

{

radius=value;

}

double getRadius(void)

Page 81: προγραμματισμός εργαστήριο

81

{

return radius;

}

double getArea(void)

{

return PI*radius*radius;

}

void print(void)

{

cout << "Center: (" << x << "," << y << ") ";

cout << "Radius: " << radius << endl;

}

};

class cylinder : circle

{

private:

double height;

public:

cylinder(int xvalue, int yvalue, int rvalue, double hvalue)

{

x=xvalue;

y=yvalue;

radius=rvalue

height=hvalue;

}

void setHeight(double value)

{

heigh=value;

}

double getHeight(void)

{

return height;

}

double getArea(void)

{

return 2*circle::getArea() + 2*PI*radius*height;

}

void print(void)

{

cout << "Center: (" << x << "," << y << ") ";

cout << "Radius: " << radius << " Height: " << height << endl;

}

};

1. Διορθώστε τα λάθη της τάξης cylinder, δημιουργήστε μία συνάρτηση main() που

να υπολογίζει την επιφάνεια κυλίνδρου χρησιμοποιώντας αντικείμενα της τάξης

αυτής και μεταγλωττίστε το πρόγραμμα. Καταγράψτε τα συντακτικά και λογικά λάθη

που βρήκατε.

2. Εκτελέστε το πρόγραμμα και επιβεβαιώστε την ορθότητα των αποτελεσμάτων του.

3. Επαυξήστε την τάξη cylinder με συνάρτηση που να υπολογίζει τον όγκο του

κυλίνδρου (= hr 2 ).

Page 82: προγραμματισμός εργαστήριο

82

Β. [Σωματίδιο]

Σε προηγούμενη ενότητα δημιουργήσατε μία τάξη αντικειμένων που αναπαριστά

διανύσματα στο χώρο. Σε ένα πρόβλημα Φυσικής, μελετάμε την ταχύτητα ενός

σωματιδίου δοσμένης μάζας που κινείται στο χώρο.

1. Δημιουργήστε μία τάξη αντικειμένων για τα σωματίδια η οποία να κληρονομεί τα

χαρακτηριστικά της τάξης αντικειμένων του διανύσματος για να αναπαριστά την

ταχύτητα του σωματιδίου και να αποθηκεύει επιπλέον τη μάζα του σωματιδίου.

2. Δημιουργήστε συναρτήσεις μέλη που να υπολογίζουν:

(α) το μέτρο της ορμής του σωματιδίου και

(β) την κινητική του ενέργεια.

3. Τροποποιήστε το κύριο πρόγραμμα κατάλληλα για να ελέγξετε την ορθότητα των

συναρτήσεων που δημιουργήσατε.

ΙΙΙ. Μετά το εργαστήριο – Ασκήσεις προς επίλυση

Α. [Τάξη αντικειμένων χρόνου]

Σε προηγούμενη ενότητα δημιουργήσατε μία τάξη αντικειμένων ημερομηνίας. Σε

ένα πρόβλημα χρειαζόμαστε την καταγραφή του χρόνου με ακρίβεια δευτερολέπτου.

Δημιουργήστε μία τάξη αντικειμένων για το χρόνο η οποία να κληρονομεί τα

χαρακτηριστικά της τάξης αντικειμένων ημερομηνίας και να χρησιμοποιεί επίσης

τρία δεδομένα μέλη για την ώρα, τα λεπτά και τα δευτερόλεπτα. Δημιουργήστε

κατάλληλες συναρτήσεις δημιουργίας και συναρτήσεις μέλη ανάλογες με αυτές που

είχατε δημιουργήσει για την τάξη αντικειμένων ημερομηνίας. Επιβεβαιώστε με

κατάλληλο κύριο πρόγραμμα την ορθότητα της τάξης αντικειμένων που

δημιουργήσατε.

Β. [Γεωμετρικά σχήματα: ευθύγραμμο τμήμα, παραλληλόγραμμο, παραλληλεπίπεδο]

α α

β

α

β

γ

Ένα ευθύγραμμο τμήμα περιγράφεται από το μήκος του. Ένα ορθογώνιο

παραλληλόγραμμο περιγράφεται από το μήκος και το πλάτος του. Ένα ορθογώνιο

παραλληλεπίπεδο περιγράφεται από το μήκος, το πλάτος και το ύψος του.

Δημιουργήστε αρχικά μία τάξη αντικειμένων σε γλώσσα C++ για το ευθύγραμμο

τμήμα. Στη συνέχεια δημιουργήστε μία τάξη αντικειμένων για το ορθογώνιο

παραλληλόγραμμο η οποία να κληρονομεί τα χαρακτηριστικά του ευθύγραμμου

τμήματος από την προηγούμενη τάξη. Τέλος δημιουργήστε μία τάξη αντικειμένων

για το ορθογώνιο παραλληλεπίπεδο η οποία να κληρονομεί τα χαρακτηριστικά του

ορθογώνιου παραλληλόγραμμου από την προηγούμενη τάξη. Σε κάθε τάξη

αντικειμένων ορίστε τις κατάλληλες συναρτήσεις μέλη.

Page 83: προγραμματισμός εργαστήριο

83

Γ. [Γεωμετρικά σχήματα: τρίγωνο, ορθογώνιο, τετράγωνο]

α

β

α

α

α

β γ

Ένα τρίγωνο, ένα ορθογώνιο και ένα τετράγωνο περιγράφονται από τα μήκη των

πλευρών τους.

Δημιουργήστε αρχικά μία τάξη αντικειμένων σε γλώσσα C++ που να αναπαριστά ένα

σχήμα. Η τάξη αντικειμένων θα περιέχει ένα μοναδικό δεδομένο μέλος, το όνομα

του σχήματος. Στη συνέχεια δημιουργήστε τρεις τάξεις αντικειμένων, μία για

τρίγωνο, μία για ορθογώνιο και μία για τετράγωνο. Και οι τρεις τάξεις αντικειμένων

πρέπει να κληρονομούν τα χαρακτηριστικά της τάξης αντικειμένων σχήματος. Σε

κάθε τάξη αντικειμένων ορίστε κατάλληλες συναρτήσεις μέλη και συναρτήσεις

δημιουργίας.

Page 84: προγραμματισμός εργαστήριο

84

Page 85: προγραμματισμός εργαστήριο

85

Παράρτημα Ι

Δημιουργία προγραμμάτων σε γλώσσα Fortran με τoν κειμενογράφο Crimson και τον μεταγλωττιστή G95.

Διδακτικοί Στόχοι

Οι διδακτικοί στόχοι του παραρτήματος είναι:

να έχετε μία πρώτη επαφή με τo περιβάλλον του κειμενογράφου Crimson και

τον μεταγλωττιστή G95,

να γνωρίσετε τη διαδικασία σύνταξης, μεταγλώττισης και εκτέλεσης απλών

προγραμμάτων σε γλώσσα Fortran χρησιμοποιώντας τις παραπάνω

εφαρμογές.

Ο κειμενογράφος Crimson και ο μεταγλωττιστής G95

Η εφαρμογή Crimson αποτελεί έναν κειμενογράφο για τη συγγραφή προγραμμάτων

σε διάφορες γλώσσες προγραμματισμού μεταξύ των οποίων και η γλώσσα Fortran

και διατίθεται δωρεάν από τον ιστότοπο (http://www.crimsoneditor.com).

Η εφαρμογή g95 αποτελεί έναν μεταγλωττιστή για τη γλώσσα προγραμματισμού

Fortran και διατίθεται δωρεάν από τον ιστότοπο (htpp://www.g95.org).

Οι οδηγίες που ακολουθούν περιγράφουν τα βήματα που πρέπει να ακολουθήσουμε

προκειμένου να γράψουμε, να μεταγλωττίσουμε και να εκτελέσουμε ένα πρόγραμμα σε

γλώσσα Fortran χρησιμοποιώντας τις εφαρμογές αυτές. Θα χρησιμοποιήσουμε για

παράδειγμα το παρακάτω πρόγραμμα:

! First Program

PROGRAM FIRST

PRINT*,'A first program in Fortran'

END PROGRAM FIRST

Βήμα 1ο: Εκκίνηση της εφαρμογής του κειμενογράφου

Προκειμένου να εκκινήσουμε τον κειμενογράφο Crimson επιλέγουμε Start -> All

Programs -> Crimson Editor -> Crimson Editor. Στη συνέχεια επιλέγουμε View

-> Line Numbers προκειμένου να αριθμούνται οι γραμμές του πηγαίου κώδικα του

προγράμματος που θέλουμε να δημιουργήσουμε. Βήμα 2ο: Δημιουργία ενός αρχείου πηγαίου κώδικα

Δημιουργούμε ένα αρχείο με κατάληξη .for το οποίο θα περιέχει τον πηγαίο

κώδικα του προγράμματος. Επιλέγουμε File -> New. Στο παράθυρο της οθόνης

εμφανίζεται ο χώρος συγγραφής του πηγαίου κώδικα ξεκινώντας από τη γραμμή 1.

Επιλέγουμε File -> Save As. Στη θέση File Name δηλώνουμε το όνομα του

αρχείου πηγαίου κώδικα το οποίο θέλουμε να δημιουργήσουμε μαζί με την

κατάληξη (π.χ. FirstProgram.for), στη θέση Save As τον κατάλογο στον οποίο

θέλουμε να αποθηκευτεί (π.χ. C:\prog1) και επιλέγουμε το Save.

Page 86: προγραμματισμός εργαστήριο

86

Βήμα 3ο: Συγγραφή του πηγαίου κώδικα

Είμαστε έτοιμοι να εισάγουμε το πρόγραμμα στον υπολογιστή. Όταν τελειώσουμε με

την εισαγωγή του κειμένου του πηγαίου κώδικα επιλέγουμε File -> Save

προκειμένου αυτό να αποθηκευτεί στον υπολογιστή.

Page 87: προγραμματισμός εργαστήριο

87

Βήμα 4ο: Μεταγλώττιση του προγράμματος

Στο χώρο του εργαστηρίου η μεταγλώττιση μπορεί εύκολα να γίνει μέσα από τον

κειμενογράφο Crimson επιλέγοντας Tools -> Fortran: Compile. Απαραίτητη

προϋπόθεση είναι να έχουμε χρησιμοποιήσει στο πρόγραμμά μας την ελεύθερη

γραφή της Fortran. Το αποτέλεσμα της μεταγλώττισης εμφανίζεται στο κάτω μισό

κομμάτι της οθόνης.

Εάν δεν προέκυψαν λάθη κατά τη μεταγλώττιση (εμφανίστηκε το μήνυμα

«Terminated with exit code 0») συνεχίζουμε με το επόμενο βήμα. Διαφορετικά

διαβάζουμε ένα προς ένα τα μηνύματα λάθους που δημιούργησε ο μεταγλωττιστής

ξεκινώντας από το πρώτο και επιστρέφουμε στον κειμενογράφο για να κάνουμε τις

απαραίτητες διορθώσεις στον πηγαίο κώδικα.

Βήμα 5ο: Εκτέλεση του προγράμματος

Στο χώρο του εργαστηρίου η εκτέλεση του προγράμματος μπορεί εύκολα να γίνει

μέσα από τον κειμενογράφο Crimson επιλέγοντας Tools -> Fortran: Execute. Το

αποτέλεσμα της εκτέλεσης εμφανίζεται στην οθόνη.

Εάν το πρόγραμμα έχει την επιθυμητή συμπεριφορά τότε προχωράμε στο επόμενο

βήμα. Διαφορετικά επιστρέφουμε στον κειμενογράφο και κάνουμε τις απαραίτητες

διορθώσεις στον πηγαίο κώδικα του προγράμματος.

Page 88: προγραμματισμός εργαστήριο

88

Βήμα 6ο: Τερματισμός της εφαρμογής

Όταν τελειώσουμε με ένα πρόγραμμα επιλέγουμε στον κειμενογράφο File -> Close

προκειμένου να κλείσει το τρέχον αρχείο πηγαίου κώδικα.

Εάν επιθυμούμε να δημιουργήσουμε ένα νέο πρόγραμμα ξεκινάμε πάλι από το

βήμα 2.

Εάν επιθυμούμε να εργαστούμε με ένα πρόγραμμα το οποίο είχαμε δημιουργήσει

κάποια στιγμή στο παρελθόν επιλέγουμε File -> Open και στο παράθυρο που

εμφανίζεται στην οθόνη του υπολογιστή μετακινούμαστε στον κατάλογο στον οποίο

έχουμε αποθηκεύσει το αρχείο πηγαίου κώδικα του προγράμματος αυτού (π.χ.

C:\prog1), επιλέγουμε το επιθυμητό αρχείο (με κατάληξη .for) και επιλέγουμε

Open.

Για να τερματίσουμε την εφαρμογή του κειμενογράφου επιλέγουμε File -> Exit.

Page 89: προγραμματισμός εργαστήριο

89

Παράρτημα ΙΙ

Δημιουργία προγραμμάτων σε γλώσσα C++ με τον κειμενογράφο Crimson και τον μεταγλωττιστή Microsoft

Visual C++.

Διδακτικοί Στόχοι

Οι διδακτικοί στόχοι του παραρτήματος είναι να γνωρίσετε τη διαδικασία σύνταξης,

μεταγλώττισης και εκτέλεσης απλών προγραμμάτων σε γλώσσα C++

χρησιμοποιώντας τον κειμενογράφο Crimson και τον μεταγλωττιστή Microsoft

Visual C++.

Ο κειμενογράφος Crimson και ο μεταγλωττιστής της C++

Η εφαρμογή Crimson αποτελεί έναν κειμενογράφο για τη συγγραφή προγραμμάτων

σε διάφορες γλώσσες προγραμματισμού μεταξύ των οποίων και η γλώσσα C++ και

διατίθεται δωρεάν από τον ιστότοπο (http://www.crimsoneditor.com).

Η εφαρμογή Visual C++ Express Edition αποτελεί έναν μεταγλωττιστή για τη

γλώσσα προγραμματισμού C++ και διατίθεται δωρεάν από την εταιρία Microsoft

μέσα από τον ιστότοπο

(http://www.microsoft.com/express/download/default.aspx).

Οι οδηγίες που ακολουθούν περιγράφουν τα βήματα που πρέπει να ακολουθήσουμε

προκειμένου να γράψουμε, να μεταγλωττίσουμε και να εκτελέσουμε ένα πρόγραμμα σε

γλώσσα C++ χρησιμοποιώντας την εφαρμογή αυτή. Θα χρησιμοποιήσουμε για

παράδειγμα το παρακάτω πρόγραμμα:

// First program

#include <iostream>

using namespace std;

int main()

{

cout << "A first program in C++" << "\n";

return 0;

}

Βήμα 1ο: Εκκίνηση της εφαρμογής του κειμενογράφου

Για να εκκινήσουμε τον κειμενογράφο Crimson επιλέγουμε Start -> All Programs

-> Crimson Editor -> Crimson Editor. Στη συνέχεια επιλέγουμε View -> Line

Numbers προκειμένου να αριθμούνται οι γραμμές του πηγαίου κώδικα του

προγράμματος που θέλουμε να δημιουργήσουμε.

Βήμα 2ο: Δημιουργία ενός αρχείου πηγαίου κώδικα

Δημιουργούμε ένα αρχείο με κατάληξη .cpp το οποίο θα περιέχει τον πηγαίο

κώδικα του προγράμματος. Επιλέγουμε File -> New. Στο παράθυρο της οθόνης

εμφανίζεται ο χώρος συγγραφής του πηγαίου κώδικα ξεκινώντας από τη γραμμή 1.

Επιλέγουμε File -> Save As. Στη θέση File Name δηλώνουμε το όνομα του

αρχείου πηγαίου κώδικα το οποίο θέλουμε να δημιουργήσουμε μαζί με την

κατάληξη .cpp (π.χ. FirstProgram.cpp), στη θέση Save As τον κατάλογο στον οποίο

θέλουμε να αποθηκευτεί (π.χ. C:\prog1) και επιλέγουμε το Save.

Page 90: προγραμματισμός εργαστήριο

90

Βήμα 3ο: Συγγραφή του πηγαίου κώδικα

Είμαστε έτοιμοι να εισάγουμε το πρόγραμμα στον υπολογιστή. Όταν τελειώσουμε με

την εισαγωγή του κειμένου του πηγαίου κώδικα επιλέγουμε File -> Save

προκειμένου αυτό να αποθηκευτεί στον υπολογιστή.

Page 91: προγραμματισμός εργαστήριο

91

Βήμα 4ο: Μεταγλώττιση του προγράμματος

Στο χώρο του εργαστηρίου η μεταγλώττιση μπορεί εύκολα να γίνει μέσα από τον

κειμενογράφο Crimson επιλέγοντας Tools -> C++: Compile. Το αποτέλεσμα της

μεταγλώττισης εμφανίζεται στο κάτω μισό κομμάτι της οθόνης.

Εάν δεν προέκυψαν λάθη κατά τη μεταγλώττιση (εμφανίστηκε το μήνυμα

«Terminated with exit code 0») συνεχίζουμε με το επόμενο βήμα. Διαφορετικά

διαβάζουμε ένα προς ένα τα μηνύματα λάθους που δημιούργησε ο μεταγλωττιστής

ξεκινώντας από το πρώτο και επιστρέφουμε στον κειμενογράφο για να κάνουμε τις

απαραίτητες διορθώσεις στον πηγαίο κώδικα.

Βήμα 5ο: Εκτέλεση του προγράμματος

Στο χώρο του εργαστηρίου η εκτέλεση του προγράμματος μπορεί εύκολα να γίνει

μέσα από τον κειμενογράφο Crimson επιλέγοντας Tools -> C++: Execute. Το

αποτέλεσμα της εκτέλεσης εμφανίζεται στην οθόνη.

Εάν το πρόγραμμα έχει την επιθυμητή συμπεριφορά τότε προχωράμε στο επόμενο

βήμα. Διαφορετικά επιστρέφουμε στον κειμενογράφο και κάνουμε τις απαραίτητες

διορθώσεις στον πηγαίο κώδικα του προγράμματος.

Page 92: προγραμματισμός εργαστήριο

92

Βήμα 6ο: Τερματισμός της εφαρμογής

Όταν τελειώσουμε με ένα πρόγραμμα επιλέγουμε στον κειμενογράφο File -> Close

προκειμένου να κλείσει το τρέχον αρχείο πηγαίου κώδικα.

Εάν επιθυμούμε να δημιουργήσουμε ένα νέο πρόγραμμα ξεκινάμε πάλι από το

βήμα 2.

Εάν επιθυμούμε να εργαστούμε με ένα πρόγραμμα το οποίο είχαμε δημιουργήσει

κάποια στιγμή στο παρελθόν επιλέγουμε File -> Open και στο παράθυρο που

εμφανίζεται στην οθόνη του υπολογιστή μετακινούμαστε στον κατάλογο στον οποίο

έχουμε αποθηκεύσει το αρχείο πηγαίου κώδικα του προγράμματος αυτού (π.χ.

C:\prog1), επιλέγουμε το επιθυμητό αρχείο (με κατάληξη .cpp) και επιλέγουμε

Open.

Για να τερματίσουμε την εφαρμογή του κειμενογράφου επιλέγουμε File -> Exit.

Page 93: προγραμματισμός εργαστήριο

93

Βιβλιογραφία

1. Η γλώσσα προγραμματισμού Fortran, καθηγητής Β. Γερογιάννης,

Πανεπιστήμιο Πατρών, 2007.

2. Fortran 77/90/95 & Fortran 2003 (2η έκδοση), Αλ. Καράκος, Εκδόσεις

Κλειδάριθμος, 2007.

3. Εισαγωγή στην Fortran 90/95, Ν. Καραμπετάκης, Εκδόσεις Ζήτη, 2002.

4. C++ Βήμα προς Βήμα, H. Schildt, Εκδόσεις Μ. Γκιούρδας, 2005.

5. Μάθετε την C++ από το μηδέν, H. Schildt, Εκδόσεις Κλειδάριθμος, 2004.

6. C++ Προγραμματισμός, 4η έκδοση, H. M. Deitel, P. J. Deitel, Εκδόσεις

Γκιούρδας, 2003.

7. Φυσική Γ’ Λυκείου (Θετικής και Τεχνολογικής κατεύθυνσης), Παιδαγωγικό

Ινστιτούτο (http://www.pi-schools.gr)

8. Μαθηματικά Γ’ Λυκείου (θετικής και τεχνολογικής κατεύθυνσης), Παιδαγωγικό

Ινστιτούτο (http://www.pi-schools.gr)

9. Elementary Numerical Analysis, K. Atkinson.

10. Fortran 77 για μικροϋπολογιστές, Δ’ έκδοση, Στ. Κλημόπουλος, Αθ.

Τσουροπλής, Αθήνα, 1990.

11. Αριθμητικές μέθοδοι και περιβάλλοντα υλοποίησης, Θ. Παπαθεοδώρου,

Πανεπιστήμιο Πατρών, 2004.

12. C++ για Μαθηματικούς, E. Scheinerman, Εκδόσεις Κλειδάριθμος, 2010.

Page 94: προγραμματισμός εργαστήριο

94