ΑΝΑΚΟΙΝΩΣΕΙΣ ΜΑΘΗΜΑΤΩΝ

Τρίτη 12 Ιανουαρίου 2016

Η ΓΛΩΣΣΑ C

Η C είναι μια γλώσσα προγραμματισμού υψηλού επιπέδου η οποία αναπτύχθηκε στις αρχές της δεκαετίας του ’70 από τον Dennis Ritchie στα Bell Labs.
Η σημερινή μορφή της γλώσσας ακολουθεί το πρότυπο ANSI (American National standards Institute) γι αυτό και ονομάζεται “ANSI C”
Ως γλώσσα υψηλού επιπέδου παρουσιάζει τα εξής πλεονεκτήματα:

Αναγνωσιμότητα
Τα προγράμματα διαβάζονται εύκολα.

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

Μεταφερσιμότητα
Τα προγράμματα μεταφέρονται εύκολα σε διαφορετικά λειτουργικά συστήματα
Κάθε γλώσσα υψηλού επιπέδου χρειάζεται έναν μεταγλωττιστή (compiler) ο οποίος
μεταφράζει τις γραμμές ενός προγράμματος σε γλώσσα μηχανής ώστε να γίνεται κατανοητό από τον υπολογιστή και να εκτελείται
Ένα απλό πρόγραμμα σε C.
/* This is my first C program */
#include <stdio.h>
int main()
{
printf("This is a C program\n");
return(0);
}
Επεξήγηση του προγράμματος
1 Πως γράφω σχόλια.
Η πρώτη γραμμή περιέχει ένα σχόλιο:
/* This is my first C program */
2 Η εντολή #include και τα αρχεία επικεφαλίδων.
Η δεύτερη γραμμή του προγράμματος είναι η ακόλουθη: #include<stdio.h>
Η γραμμή αυτή ξεκινά με ένα #, το οποίο ακολουθείται από την εντολή include. Το
include είναι μια εντολή του προεπεξεργαστή η οποία ψάχνει να βρει το αρχείο stdio.h. Επί πλέον η εντολή include ζητά από τον προεπεξεργαστή να τοποθετήσει το αρχείο stdio.h στη θέση της εντολής μέσα στο πρόγραμμα.
Τα αρχεία τα οποία περιλαμβάνονται με την εντολή #include, όπως το stdio.h, ονομάζονται
αρχεία επικεφαλίδων και περιέχουν συναρτήσεις έτοιμων προς χρήση για τον προγραμματιστή.. Εκτός από το stdio.h υπάρχουν και άλλα αρχεία επικεφαλίδων, όπως τα
math.h, stdlib.h, string.h κτλ. Κάθε φορά ο προγραμματιστής πρέπει να περιλαμβάνει τα απαραίτητα αρχεία επικεφαλίδων στην αρχή του κώδικά του.
3 Η συνάρτηση main() αποτελεί μια ειδική συνάρτηση της C.
Κάθε πρόγραμμα πρέπει να περιέχει μία και μόνο μία συνάρτηση main() η οποία εκτελείται πάντα πρώτη ακόμη και εάν είναι στο κάτω μέρος του προγράμματος. Στο συγκεκριμένο παράδειγμα η συνάρτηση main έχει δηλωθεί ως ακέραιου τύπου (int) ενώ δεν περιέχει κάποιο όρισμα
4 Η συνάρτηση printf() εμφανίζει και τυπώνει μηνύματα στην οθόνη μας. Ο χαρακτήρας
\n ο οποίος εμφανίζεται στο τέλος του μηνύματος λέει στον υπολογιστή να μετακινήσει τον
δρομέα στην αρχή της επόμενης γραμμής.
Η συνάρτηση printf() ορίζεται στο αρχείο επικεφαλίδας stdio.h.
5 Η εντολή return.
Όλες οι συναρτήσεις της C μπορούν να επιστρέφουν τιμές. Στο συγκεκριμένο παράδειγμα η συνάρτηση main η οποία έχει δηλωθεί ως ακέραια συνάρτηση επιστέφει την τιμή μηδέν και με αυτόν τον τρόπο το πρόγραμμα τερματίζεται κανονικά.
ΑΝΑΛΥΤΙΚΑ ΓΙΑ ΤΗΝ ΣΥΝΑΡΤΗΣΗ printf()
printf():
Η συνάρτηση printf() εμφανίζει στην οθόνη μορφοποιημένα δεδομένα ή/και συνοδευτικό κείμενο.
Η γενική μορφή της συνάρτησης είναι:
printf (ΣΕΙΡΑ_ΕΛΕΓΧΟΥ, v1, v2,... , vn)
Τα " v1, v2,... , vn ", είναι ονόματα μεταβλητών, σταθερές ή εκφράσεις.
Η ΣΕΙΡΑ_ΕΛΕΓΧΟΥ περικλείεται μέσα σε διπλά εισαγωγικά (") και καθορίζει τον τρόπο εμφάνισης των δεδομένων.
Η ΣΕΙΡΑ_ΕΛΕΓΧΟΥ μπορεί να περιλαμβάνει:
• επεξηγηματικό κείμενο, οτιδήποτε κείμενο θέλουμε
• προσδιοριστές, που μπαίνουν απαραίτητα μέσα στην ΣΕΙΡΑ_ΕΛΕΓΧΟΥ, μόνο όταν θέλουμε να εμφανίσουμε καποιο στοιχείο (μεταβλητές, σταθερές ή εκφράσεις)
• χαρακτήρες ελέγχου, που τους χρησιμοποιούμε για την διαμόρφωση της εμφάνισης
H ΣΕΙΡΑ_ΕΛΕΓΧΟΥ δεν είναι απαραίτητο να περιλαμβάνει όλα τα παραπάνω. Εξαρτάται από το τι θέλουμε να κάνουμε με την printf().
Οι προσδιοριστές των στοιχείων τοποθετούνται μέσα στην ΣΕΙΡΑ_ΕΛΕΓΧΟΥ όπου θέλουμε να εμφανιστούν τα δεδομένα, έχουν σχέση με τον τύπο των δεδομένων που εμφανίζονται στην printf() και αρχίζουν με τον χαρακτήρα %. Ο αριθμός των προσδιοριστών είναι ίσος με τον αριθμό των στοιχείων.
Για κάθε τύπο δεδομένων έχουμε τους εξής προσδιοριστές:
%d
Ακέραιος
%c
Χαρακτήρας/char (1 μονο)
%s
Σειρά χαρακτήρων (συμβολοσειρά)
%f
Κινητής υποδιαστολής, δηλαδή float ή double
%e
Κινητής υποδιαστολής, δηλαδή float ή double σε εκθετική μορφή
%g
Κινητής υποδιαστολής σαν %e ή %f (όποιο είναι μικρότερο)
%u
Ακέραιος χωρίς πρόσημο (unsigned int)
%o
Ακεραιος σε οκταδικό σύστημα (χωρίς πρόσημο)
%x
Ακέραιος σε δεκαεξαδικό σύστημα
Συχνά οι προσδιοριστές συνοδεύονται με αριθμούς που ορίζουν το εύρος της εμφάνισης του δεδομένου. Για παράδειγμα το %6d, σημαίνει ότι το δεδομένο είναι ακέραιος και ότι το εύρος του είναι 6 ψηφία (χαρακτήρες), ενώ το %7.2f, σημαίνει ότι το δεδομένο είναι κινητής υποδιαστολής και έχει εύρος 7 ψηφία με 2 ψηφία μετά την υποδιαστολή.
Οι χαρακτήρες ελέγχου χρησιμοποιούνται για τον διαμόρφωση της εμφάνισης και για την εκτύπωση των δεσμευμένων από την ΣΕΙΡΑ_ΕΛΕΓΧΟΥ χαρακτήρων (όπως τα εισαγωγικά).
Ξεκινούν με την ανάποδη πλάγια κάθετο \ (backslash) και είναι:
\a
Hχητικό σήμα (<BELL>)
\b
Ο χαρακτήρας <BACKSPACE> (διάστημα πίσω)
\f
Ο χαρακτήρας νέας σελίδας (<FORM FEED>)
\n
Νέας γραμμής (<LINE FEED>)
\r
Επιστροφής (<CR>)
\t
Oριζοντίου προκαθορισμένου διαστήματος (<ΤΑΒ>)
\v
Κατακορύφου διαστήματος( <VTAB>)
\'
Εμφάνιση του απλού εισαγωγικού
\"
Εμφάνιση του διπλόυ εισαγωγικού
\\
Εμφάνιση της ανάποδης πλαγίας καθέτου
\?
Εμφάνιση του λατινικού ερωτηματικού
\xhhh
Εμφάνιση του χαρακτήρα hhh σε δεκαεξαδικό αριθμό
\ooo
Εμφάνιση του χαρακτήρα οοο σε δεκαεξαδικό αριθμό
Η printf() σαν συνάρτηση που είναι, επιστρέφει το αριθμό των χαρακτήρων που τυπώνονται.
Παραδείγματα:
1)Δίνονται οι κάτωθι εντολές .Τι τυπώνει το συγκεκριμένο κομμάτι του προγράμματος ?
metavliti=5;
printf(" %d", metavliti);
Τυπώνει:
5
2)Δίνονται οι κάτωθι εντολές .Τι τυπώνει το συγκεκριμένο κομμάτι του προγράμματος ?
metavliti=5;
printf("The value of variable metavliti is: %d", metavliti);
Τυπώνει:
The value of variable metavliti is:5
3)Δίνονται οι κάτωθι εντολές .Τι τυπώνει το συγκεκριμένο κομμάτι του προγράμματος ?
metavliti=5;
printf("The value of variable metavliti is:\n %d", metavliti);
Τυπώνει:
The value of variable metavliti is: 5
4)Δίνονται οι κάτωθι εντολές .Τι τυπώνει το συγκεκριμένο κομμάτι του προγράμματος ?
x=5;
y=3;
printf("%d + %d = %d", x, y, (x+y));
Τυπώνει:
5+3 = 8
5)Δίνονται οι κάτωθι εντολές .Τι τυπώνει το συγκεκριμένο κομμάτι του προγράμματος ?
x=5;
y=3;
printf("x=%d /n y=%d /n x+y= %d", x, y, (x+y));
Τυπώνει:
x=5 y=3 x+y=8
6)Δημιουργήστε ένα πρόγραμμα που θα εμφανίζει στην οθόνη του υπολογιστή τα παρακάτω κατά σειρά:
• Τον ακέραιο αριθμό 5
• Τον πραγματικό αριθμό 5
• Τον πραγματικό αριθμό 5.01234567890123456789 σε απλή γραφή
• Τον πραγματικό αριθμό 5.01234567890123456789 σε απλή γραφή με δύο δεκαδικά ψηφία
• Τον χαρακτήρα Ν
Και η εξοδος να είναι η εξής:
O akeraios arithmos x exei timh: 5
O pragmatikos arithmos y exei timh: 5.000000
O pragmatikos arithmos z exei timh: 5.012346
O pragmatikos arithmos z exei timh: 5.01
O xaraktiras einai o N
ΠΡΟΓΡΑΜΜΑ
#include <stdio.h>
void main()
{
int x=5;
float y=5;
float z=5.01234567890123456789;
char w='N';
printf("O akeraios arithmos x exei timh: %d\n",x);
printf("O pragmatikos arithmos y exei timh: %f\n",y);
printf("O pragmatikos arithmos z exei timh: %f\n",z);
printf("O pragmatikos arithmos z exei timh: %.2f\n",z);
printf("O xaraktiras einai o %c\n", w);
}
7)Δημιουργήστε ένα πρόγραμμα που θα ζητά από τον χρήστη δύο ακέραιους αριθμούς και θα εκτυπώνει στην οθόνη:
• Το άθροισμά τους
• Την διαφορά τους
• Το γινόμενό τους.
ΠΡΟΓΡΑΜΜΑ
#include <stdio.h>
void main()
{
int x;
int y;
printf("Dwse enan akeraio arithmo x:\n");
scanf("%d", &x);
printf("Dwse enan akomi akeraio arithmo y:\n");
scanf("%d", &y);
printf("x+y= %d\n",x+y);
printf("x-y= %d\n",x-y);
printf("x*y= %d\n",x*y);
ΑΝΑΛΥΤΙΚΑ ΓΙΑ ΤΗΝ ΣΥΝΑΡΤΗΣΗ scanf ()
scanf():
Διαβάζει από το πληκτρολόγιο μορφοποιημένες τιμές μεταβλητών.
scanf (ΣΕΙΡΑ_ΕΛΕΓΧΟΥ, &v1, &v2,... , &vn)
Η συνάρτηση scanf() μοιάζει πολύ με την printf() με μιά μεγάλη διαφορά. Όπως βλέπετε στην περιγραφή της δεν αναφέρεται σε πραγματικές μεταβλητές, αλλά σε. διευθύνσεις μεταβλητών (Όταν δηλώνεται μία μεταβλητή σ' ένα πρόγραμμα, ουσιαστικά δεσμεύεται στην μνήμη του υπολογιστή μία περιοχή, η οποία θα φιλοξενήσει κατά την διάρκεια της εκτέλεσης του προγράμματος τις τιμές που θα δώσουμε για αυτή την μεταβλητή. Αυτή η περιοχή μνήμης έχει μία συγκεκριμένη διεύθυνση -πρόκειται για κάποιον συνήθως δεκαεξαδικό αριθμό- που είναι η διεύθυνση της μεταβλητής.)
Στην γλώσσα προγραμματισμού C, γιά ν' αναφερθούμε στην διεύθυνση μιάς μεταβλητής χρησιμοποιούμε το όνομα της μεταβλητής προσθέτοντας μπροστά το σύμβολο "&".
Δηλαδή η έκφραση &v1 εννοεί την διεύθυνση της μεταβλητής v1
Προσέξτε όμως για το διάβασμα μιάς συμβολοσειράς, δεν χρησιμοποιούμε &, διότι το όνομα της μεταβλητής_συμβολοσειράς είναι ουσιαστικά η διεύθυνση του πρώτου χαρακτήρα
Παραδείγματα
1) Διαβάζει από το πληκτρολόγιο την ακέραια μεταβλητή x
printf("Enter first number: "); scanf("%d", &x);
καλό είναι κάθε κλήση της scanf() να συνοδεύεται από μία κληση της printf(), όπως στο προηγούμενο παράδειγμα (η printf να μπαίνει πρίν την scanf), ώστε ο χρήστης γνωρίζει τι δεδομένο να εισάγει με το πληκτρολόγιο.
2)Διαβάζει από το πληκτρολόγιο μία μεταβλητή κινητής υποδιαστολής (k) και μία ακέραια μεταβλητή (l)
printf ("Give me 1 arithmo kinitis ipodiastolis kai 1 arithmo akereo:"); scanf("%f %d", &k, &l);
3) Τι τιμες παίρνουν τα i,,x όταν γράφω
int i;
float x;
scanf("%d%f", &i, &x);
και δίνω ως γραμμή εισαγωγής : 25 54.324
Aπάντηση
η μεταβλητή i να πάρει την τιμή 25 και η μεταβλητή x να πάρει την τιμή 54.324
ΑΝΑΛΥΤΙΚΑ ΓΙΑ ΤΗΝ ΣΥΝΑΡΤΗΣΗ puts ()
puts():
Εμφανίζει στην οθόνη μία σειρά χαρακτήρων (συμβολοσειρά). puts(<συμβολοσειρά>|<μεταβλητή_συμβολοσειράς>);
Είναι πιό απλή και πιό γρήγορη από την printf() αλλά χρησιμοποιείται μόνο για συμβολοσειρές (όχι για τις μεταβλητές ή τις σταθερές). Η puts() μετά την εμφάνιση της συμβολοσειράς, τυπώνει τον χαρακτήρα \n, δηλαδή επιστρέφει στην επόμενη σειρά. Ο χαρακτήρας \0 που υποδεικνύει το τέλος της συμβολοσειράς χρησιμοποιείται από την puts() και καλό θα έιναι να προσέχετε, ώστε η συμβολοσειρά που έχετε δώσει για εκτύπωση να περιέχει στο τέλος τον χαρακτήρα \0.
ΑΝΑΛΥΤΙΚΑ ΓΙΑ ΤΗΝ ΣΥΝΑΡΤΗΣΗ gets ()
gets():
Διαβάζει από το πληκτρολόγιο (είσοδος -stdin) μία σειρά χαρακτήρων (συμβολοσειρά). gets(<μεταβλητή_συμβολοσειράς>);
Ιδιαίτερα χρήσιμη για διαλογική συζήτηση με τον υπολογιστή.
ΠΑΡΑΔΕΙΓΜΑ
char name[20];
printf("What's your name:"); gets(name); printf("Hello "); puts(name);
H gets() διαβάζει από το πληκτρολόγιο μέχρι να συναντήσει τον χαρακτήρα \n (πράγμα που συμβαίνει όταν πατήσουμε το <ENTER>). O χαρακτήρας \0 μπαίνει αυτόματα στο τέλος της συμβολοσειράς που πληκτρολογείτε.
Παραδείγμα με τις gets() και puts():
#include <stdio.h> main() { char aaa[20]; char bbb[10] = "Ritsa"; printf("Hello my name is "); puts(bbb); printf("What's your name:"); gets(aaa); printf("\n"); printf("%s you 're welcome to our class...",aaa); }
putchar():
Εμφανίζει στην οθόνη ένα μόνο χαρακτήρα.
getchar():
Διαβάζει από το πληκτρολόγιο ένα χαρακτήρα. H συνάρτηση δεν δέχεται παράμετρους, απλά παίρνει έναν χαρακτήρα από το πληκτρολόγιο και δεν χρειάζεται να δώσουμε <ENTER>.
Και άλλο παράδειγμα με χρήση putchar() και getchar()
Στο πρόγραμμα που ακολουθεί εισάγουμε μια πρόταση η οποία τερματίζεται με enter
και στη συνέχεια εμφανίζεται η πρόταση αυτή και μετράμε τους χαρακτήρες της
#include <stdio.h>
void main()
{
int c,count=0;
printf("Dose protasi\n");
while ((c=getchar())!='\n')//διαβάζουμε τους χαρακτήρες της πρότασης ένα προς
//ένα μέχρι να δώσουμε το enter
{
putchar(c);//τυπώνεται ο χαρακτήρας αυτός
count++;//αυξάνεται ο μετρητής των χαρακτήρων της πρότασης αυτής
}
printf("\nPlithos xaraktiron protashs = %d\n",count);
}
ΤΕΛΕΣΤΕΣ
Η C όπως και κάθε γλώσσα προγραμματισμού χρησιμοποιεί διάφορους τελεστές για να εκτελέσει πράξεις, να αναπαραστήσει αριθμητικές και λογικές εκφράσεις και να δημιουργήσεις δομές ελέγχου. Ετσι λοιπόν στην C ανα κατηγορία έχουμε τους τελεστές που ακολουθούν.
Ο τελεστής καταχώρησης:
Για το τελεστή καταχώρησης (ή καλύτερα ανάθεσης σε μεταβλητή -assigment) χρησιμοποιείται το σύμβολο του ίσον (=) που έχει βέβαια διαφορετική έννοια απο ότι στα μαθηματικά. H εντολή: var2 = 52; σημαίνει ότι δίνω την τιμή 52 στην μεταβλητή var2. Αν δώσω παρακάτω την εντολή: var2 = var2 +1; που ενώ μαθηματικώς δεν "στέκει", "αυξάνω" κατα μία μονάδα την τιμή που ήδη υπάρχει καταχωρημένη στην μεταβλητή var2, δηλαδή η νέα τιμή της var2 μετά την εκτέλεση της συγκεκριμένης εντολής θα είναι 53!
Φυσικά δεν μπορείτε να καταχωρήσετε τιμή σε μία σταθερά, ενώ στην C μπορώ να κάνω πολλαπλή καταχώρηση. Δηλαδή ισχύει το: x=y=z=54; Εδώ οι καταχωρήσεις γίνονται από δεξιά προς τα αριστερά, δηλαδή πρώτα πάιρνει την τιμή 54 η μεταβλητή z, μετά η μεταβλητή y και τέλος η x.
Οι αριθμητικοί τελεστές:
Προκειται για τους:
+
Πρόσθεση
-
Αφαίρεση
*
Πολαπλασιασμός
/
Διαίρεση
%
Υπόλοιπο (πχ., 25 % 4 μας δίνει 1), καλείται "mod" και εφαρμόζεται μόνο σε ακεραίους.
Για κάθε τελεστή απαιτούνται 2 όροι (εκτός από τον τελεστή "-", που είναι δυνατόν να χρησιμοποιηθεί και σαν πρόσημο), οι οποίοι μπορεί να είναι σταθερές ή μεταβλητές. ilikia=etos1 - etos2; printf("%d", 95-55); celsious=(-25); Tα κενά διαστήματα δεν παίζουν ρόλο και μπορείτε να χρησιμοποιήστε παρενθέσεις για μαθηματικές παραστάσεις: result = -(b+2)*a + (c +3*(a-b); Η C ακολουθεί την αλγεβρική προτεραιότητα στους αριθμητικούς τελεστές. Δηλαδή μεγαλύτερη προτεραιότητα έχουν οι παρενθέσεις, μετά το προσημο (δηλαδή το μείον), ακολουθούν ο πολλαπλασιασμός, η διαίρεση και το mod και τέλος οι τελεστές πρόσθεσης και αφαίρεσης. Η εντολή καταχώρησης έχει μικρότερη προτεραιότητα από όλες τις πράξεις. Η φορά των πράξεων είναι από αριστερά προς δεξιά για όλους τους αριθμητικούς τελεστές, εκτός αν χρησιμοποιήστε το μείον σαν πρόσημο, οπότε η φορά είναι από δεξιά προς αριστερά!
Οι τελεστές συσχετισμού:
Τελεστές που τους χρησιμοποιούμε για την δημιουργία απλών λογικών εκφράσεων συσχετισμού (σύγκρισης). Αυτοί είναι:
<
Μικρότερο από (πχ. αν i<j επιστρέφει 1 αν το i είναι μικρότερο από το j)
>
Μεγαλύτερο από
<=
Μικρότερο από ή ίσο
>=
Μεγαλύτερο από ή ίσο
= =
Λογικό ισον
!=
Διάφορο (όχι ίσο)
Το αποτέλεσμα μιάς λογικής έκφρασης είναι είτε 1 (αληθές) είτε 0 (ψευδές). Για παράδειγμα αν έχω x=2; και y=3; τότε η έκφραση (x > y) επιστρέφει 0. Οι λογικές εκφράσεις χρησιμοποιούνται σαν συνθήκες στις εντολές ελέγχου (και όχι μόνο). Προσέξτε το σύμβολο της ισότητας που είναι ένα διπλό ισον (= =)! Επίσης θα πρέπει να γνωρίζετε ότι στην C η
προτεραιότητα των τελεστών συσχέτισμού είναι μικρότερη από αυτή των αριθμητικών τελεστών, ενώ είναι μεγαλύτερη από αυτή του τελεστή καταχώρησης. Τι τιμή θα πάρει η μεταβλητή i στο κώδικα που ακολουθεί; j = k =13; i = j = = k; Θα πάρει την τιμή 1, διότι ο τελεστής της ισότητας (λογικό ίσον = =) έχει μεγαλύτερη προτεραιότητα από τον τελεστή καταχώρησης (ένα απλό ίσον =). Αρα λοιπόν, καθώς οι μεταβλητές j και k είναι ίσες το αποτέλεσμα της σύγκρισης αυτών (j = = k) θα είναι αληθές, δηλαδή 1, τιμή που θα πάρει η μεταβλητή i

Εισαγωγή στην OpenGL

Ε.1 Τι είναι η OpenGL;
Ένας νέος χρήστης θα υποθέσει ότι η OpenGL είναι μια βιβλιοθήκη σχεδίασης γραφικών. Ωστόσο, με τον όρο OpenGL δεν αναφερόμαστε σε μια συγκεκριμένη βιβλιοθήκη αλλά σε ένα πρότυπο υλοποίησης βιβλιοθηκών σχεδίασης γραφικών. Εμπεριέχει δηλαδή το σύνολο των συναρτήσεων που πρέπει να υλοποιεί μία βιβλιοθήκη γραφικών προκειμένου να είναι συμβατή με αυτό. Το πρότυπο αυτό λοιπόν καθορίζει μια προγραμματιστική διεπιφάνεια (application programming interface ή API).

Είναι προφανές ότι δεν υπάρχει περιορισμός ως προς τη γλώσσα προγραμματισμού στην οποία θα υλοποιηθεί το πρότυπο της OpenGL. Ενδεικτικά αναφέρουμε την ύπαρξη βιβλιοθηκών σε γλώσσες προγραμματισμού Fortran και C. Τα παραδείγματα των Εργαστηριακών Μαθήματων θα υλοποιηθούν σε γλώσσα προγραματισμού C.
Εφόσον με το όρο OpenGL δεν αναφερόμαστε σε μια συγκεκριμένη βιβλιοθήκη αλλά σε ένα πρότυπο που ορίζει τη λειτουργικότητα μιας βιβλιοθήκης σχεδίασης, μπορούμε να ακολουθήσουμε τις ίδιες συμβάσεις σε όλες τις υλοποιήσεις του προτύπου (τις ίδιες εντολές). Αυτό σημαίνει ότι, εάν βασιστούμε στο πρότυπο της OpenGL, ο κώδικας που συντάσσουμε είναι ανεξάρτητος πλατφόρμας (platform independent) και μπορει να εκτελεστεί σε ευρεία γκάμα περιβαλλόντων προγραμματισμού χωρίς ριζική τροποποίηση της δομής του.
Οι βιβλιοθήκες των περισσότερων νέων μεταγλωττιστών εμπεριέχουν (ή υπάρχει η δυνατότητα να ενσωματωθεί σε αυτούς) μια υλοποίηση της OpenGL.

Ε.2 Βιβλιοθήκες

Στην ενότητα αυτή περιγράφουμε τις κατηγορίες βιβλιοθηκών που συναντά κανείς σε υλοποιήσεις της OpenGL, καθώς και συμβάσεις σε ό,τι αφορά το συμβολισμό εντολών και σταθερών.
α) Βασική βιβλιοθήκη (OpenGL core library):
H βασική βιβλιοθήκη της OpenGL περιέχει τις κύριες εντολές σχεδίασης. Ολες οι εντολές της βιβλιοθήκης αυτής διακρίνονται από το πρόθεμα gl . Πολλές από τις συναρτήσεις της δέχονται προκαθορισμένα ορίσματα (συμβολικές σταθερές) τα οποία έχουν οριστεί στη βιβλιοθήκη και αντιστοιχούν σε διάφορες παραμέτρους ή καταστάσεις λειτουργίας. Κατά σύμβαση, οι σταθερές αυτές ξεκινούν με το πρόθεμα GL_ .

β) OpenGL Utility Library (GLU):

Περιλαμβάνει συναρτήσεις που εκτελούν σύνθετους αλγορίθμους όπως π.χ. τον καθορισμό μητρώων προβολής και το σχηματισμό σύνθετων καμπυλών και επιφανειών. Κάθε υλοποίηση της OpenGL εμπεριέχει τη βιβλιοθήκη GLU. Όλες οι εντολές της βιβλιοθήκης GLU ξεκινούν με το πρόθεμα glu.
γ) OpenGL Utility Toolkit (GLUT):

Όπως αναφέραμε το πρότυπο της OpenGL είναι ανεξάρτητο πλατφόρμας. Ωστόσο μια αυτονόητη απαίτηση ενός προγραμματιστή είναι να έχει τη δυνατότητα να δει το αποτέλεσμα των προγραμμάτων του αλλά και να έχει δηλαδή τη δυνατότητα αλληλεπίδρασης με αυτό. Χρειάζεται δηλαδή εντολές εισόδου-εξόδου. Ωστόσο οι εντολές αλληλεπίδρασης δεν είναι ανεξάρτητες πλατφόρμας και για το λόγο αυτό οι προγραμματιστές σε OpenGL χρησιμοποιούν μία ακόμη βιβλιοθήκη που τους προσφέρει εντολές εισόδου-εξόδου. Μία από τις βιβλιοθήκες που προσφέρει τη λειτουργικότητα αυτή είναι το OpenGL Utility Toolkit (GLUT). Η βιβλιοθήκη αυτή περιλαμβάνει εντολές απεικόνισης παραθύρων στην οθόνη, δημιουργίας menus, διαχείρισης γεγονότων κλπ. Όλες οι εντολές της ξεκινούν με το πρόθεμα glut.
Ε.3 Ένα τυπικό πρόγραμμα
Στην παράγραφο αυτή παρουσιάζουμε και περιγράφουμε συνοπτικά τη δομή ενός τυπικού προγράμματος που βασίζεται στο πρότυπο της OpenGL.
#include <glut.h>
void display()
{
glClearColor(1,1,1,1);
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_LINES);
glColor3f(1,0,0);
glVertex2i(20,20);
glVertex2i(40,40);
glEnd();
glFlush();
}
int main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitWindowPosition(50,50);
glutInitWindowSize(640,480);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutCreateWindow("A sample OpenGL application");
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0,50,0,50);
8
glutDisplayFunc(display);
glutMainLoop();
return 0;
}

Ας ξεκινήσουμε με την περιγραφή του κώδικα που περιέχεται στη συνάρτηση main.
• Αρχικά προσθέτουμε την κεφαλίδα του GLUT glut.h. Γενικά, για την ανάπτυξη ενός προγράμματος που χρησιμοποιεί ρουτίνες της OpenGL, απαιτείται η προσθήκη των κεφαλίδων gl.h και glu.h, ενώ για χρήση του GLUT, απαιτείται η προσθήκη της glut.h. Ωστόσο, με τη δήλωση της κεφαλίδας glut.h δηλώνονται αυτομάτως και οι δύο προηγούμενες.
• Η συνάρτηση glutInit ενεργοποιεί τη βιβλιοθήκη GLUT και μέσω αυτής μπορούμε να περάσουμε παραμέτρους στην εφαρμογή μας από τη γραμμή εντολών του DOS.
• Η ρουτίνα glutInitWindowPosition καθορίζει τη θέση στην οθόνη, στην οποία θα εμφανιστεί το παράθυρο της εφαρμογής (συντεταγμένη της άνω αριστερής κορυφής).
• Η εντολή glutInitWindowSize καθορίζει το πλάτος και ύψος του παραθύρου της εφαρμογής σε pixels.

• Η εντολή glutInitDisplayMode καθορίζει παραμέτρους σχετικές με τους ενταμιευτές και το χρωματικό μοντέλο που χρησιμοποιούνται κατά τη σχεδίαση. (Η τεχνική της διπλής ενταμίευσης χρησιμοποιείται κατά κόρον σε εφαρμογές κινουμένων γραφικών). Στο παράδειγμά μας χρησιμοποιούμε το χρωματικό μοντέλο RGB (GLUT_RGB) και την εφαρμογή απλής ενταμίευσης (GLUT_SINGLE).
• Η εντολή glutCreateWindow εμφανίζει το παράθυρο της εφαρμογής στην οθόνη και του αποδίδει έναν τίτλο.

• Με την εντολή glMatrixMode(GLUint mode) επιλέγουμε το μητρώο το οποίο επιθυμούμε να τροποποιήσουμε. (περισσότερα για τα μητρώα στις ενότητες «Μετασχηματισμοί συντεταγμένων» και «Προβολές») Στο παράδειγμα, δίνοντας ως όρισμα τη σταθερά GL_PROJECTION επιλέγουμε το μητρώο προβολής, το οποίο καθορίζει τον τρόπο με τον οποίο προβάλλεται η σκηνή στο επίπεδο του θεατή. Σε συνδυασμό με την εντολή gluOrtho2D( xMin,xMax,yMin,yMax) διευκρινίζουμε ότι θα απεικονιστεί η παράλληλη προβολή της σκηνής στο επίπεδο ΧΥ (το οποίο, στο συγκεκριμένο παράδειγμα, ταυτίζεται με το παράθυρο της εφαρμογής). Το περιεχόμενο του παραθύρου περιλαμβάνει όλα τα στοιχεία του σκηνικού που εκτείνονται μεταξύ των συντεταγμένων Χ=[-50,50] και Υ=[-50,50]. Ο θετικός άξονας X έχει φορά προς τα δεξιά και το θετικό τμήμα του άξονα Y έχει 9
φορά προς τα πάνω.

• Η εντολή glutDisplayFunc(void func()) εντάσσεται σε μια ειδική κατηγορία συναρτήσεων του GLUT, οι οποίες αποκαλούνται συναρτήσεις κλήσης (callback functions). Η συγκεκριμένη συνάρτηση δέχεται ως όρισμα μια συνάρτηση στην οποία εμπεριέχεται ο κώδικας σχεδίασης γραφικών. Η συνάρτηση αυτή εκτελείται κάθε φορά που η εφαρμογή διαπιστώσει ότι απαιτείται επανασχεδιασμός της σκηνής. Η συνάρτηση δεν επιστρέφει τιμή και δεν έχει ορίσματα. Στο συγκεκριμένο παράδειγμα δίνουμε ως όρισμα τη συνάρτηση display().

• Η εντολή glutMainLoop() ενεργοποιεί τον κύκλο διαχείρισης γεγονότων (event processing loop). Στον κύκλο αυτό, η εφαρμογή αναμένει επ' άπειρον και ανταποκρίνεται σε γεγονότα, όπως λ.χ. στο πάτημα ενός κουμπιού, στην αλλαγή του σκηνικού ή στην κίνηση του ποντικιού. Από το πρόθεμά της, παρατηρούμε ότι η συγκεκριμένη εντολή εμπεριέχεται στη βιβλιοθήκη GLUT, εφόσον το πρότυπο της OpenGL, ως πρότυπο ανεξάρτητο πλατφόρμας, δεν ορίζει διαδικασίες εισόδου-εξόδου.
Ας αναλύσουμε τώρα το περιεχόμενο της συνάρτησης display.

• Η εντολή glClearColor() καθορίζει το χρώμα που χρησιμοποιείται κάθε φορά που εκτελείται εντολή καθαρισμού της οθόνης. Στην OpenGL το χρώμα του φόντου είναι μία μεταβλητή κατάστασης, η οποία διατηρεί την τιμή που της ανατέθηκε την τελευταία φορά. Το χρώμα καθορίζεται από τα βάρη του στο χρωματικό μοντέλο RGB. Στο συγκεκριμένο παράδειγμα, χρησιμοποιείται το λευκό χρώμα.
• Η εντολή glClear() καθαρίζει ενταμιευτές (buffers), συγκεκριμένες περιοχές μνήμης του συστήματος γραφικών (frame buffer). Η μηχανή γραφικών της OpenGL ορίζει ορισμένες κατηγορίες ενταμιευτών. Με την σταθερά GL_COLOR_BUFFER_BIT δίνουμε εντολή καθαρισμού του ενταμιευτή χρωματικών τιμών (colour buffer). Αυτή περιέχει τις χρωματικές τιμές των pixels που απεικονίζονται (ή πρόκειται να απεικονιστούν) στην οθόνη.

• Με την εντολή glColor3f(float r, float g, float b) ορίζουμε το τρέχον χρώμα σχεδιάσης. Πρόκειται για μία ακόμη μεταβλητή κατάστασης που καθορίζει το χρώμα που χρησιμοποιείται για τη σχεδίαση γραφικών. Στην εντολή περνάμε ως ορίσματα τις κανονικοποιημένες ως προς τη μονάδα τιμές των συνιστωσών του κόκκινου, πράσινου και μπλέ χρώματος. Στο παράδειγμα επιλέγουμε ως χρώμα σχεδιάσης το κόκκινο.

• Η εντολή glBegin(GLEnum MODE) δηλώνει την έναρξη ορισμού ενός ή περισσοτέρων 10
γεωμετρικών σχημάτων. Αναλόγως του ορίσματος, μπορεί να προσδιοριστεί μια ποικιλία σχημάτων. Στο παράδειγμά μας, ορίζουμε ευθύγράμμα τμήματα. Η εντολή glBegin εκτελείται πάντα σε συνδυασμό με την εντολή glEnd() και η δεύτερη ορίζει τη λήξη της επιλεγόμενης ρύθμισης σχεδίασης.

• Η εντολή glVertex2i ορίζει σημεία στο διδιάστατο χώρο. Εφόσον έχει προεπιλεγεί η κατάσταση σχεδίασης ευθυγράμμων τμημάτων, τα σημεία ορίζουν ανά ζεύγη τα ευθύγραμμα τμήματα Το παραπάνω παράδειγμα σχεδιάζει ένα ευθύγραμμο τμήμα κόκκινου χρώματος με συνταταγμένες αρχής και τέλους (20,20) (40,40).
• Η εντολή glFlush() εξαναγκάζει την εκτέλεση των εντολών που εκκρεμούν.
Η εκτέλεση του κώδικα εμφανίζει το παράθυρο του παρακάτω σχήματος.
Σχ. 1 Παράθυρο του Παραδείγματος
11

Πέμπτη 17 Δεκεμβρίου 2015

Project για το μάθημα πρακτική εφαρμογή στην ειδικότητας


Δημιουργία ενός ιστότοπου (site)

Ζητούμενα

1. Καθορισμός έργου
• Τι B2C
• Σε ποιον
• Χρόνος B2B
• Budget

1. Ανάλυση απαιτήσεων
2. Επιλογή εργαλείων cms
Joomla
Wordpress
3. Σχεδιασμός
Presto
magento
Cs cast
4. Υλοποίηση
5. Αξιολόγηση
6. Παράδοση
7. Εκπαίδευση

Παραδοτέα
1. Τεύχος ανάλυσης απαιτήσεων
2. Εγχειρίδιο εγκατάστασης
3. Σχεδία site
4. Site
5. Εγχειρίδιο χρήσης του site

Τετάρτη 2 Δεκεμβρίου 2015