0% found this document useful (0 votes)
27 views41 pages

Διαταξη Κωδικα Και Στυλ (Layout & Style)

The document discusses code layout and style. It presents examples of Pascal code for an insertion sort algorithm with poor, improved, and proper formatting. It emphasizes that code layout should enhance readability and understandability of the code logic and structure for humans, rather than just beautifying the code. Key principles discussed are that readability is more important than aesthetics, and that code formatting provides cues about a program's structure that help human comprehension beyond what a computer understands from the code itself.

Uploaded by

Kostas Notis
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
27 views41 pages

Διαταξη Κωδικα Και Στυλ (Layout & Style)

The document discusses code layout and style. It presents examples of Pascal code for an insertion sort algorithm with poor, improved, and proper formatting. It emphasizes that code layout should enhance readability and understandability of the code logic and structure for humans, rather than just beautifying the code. Key principles discussed are that readability is more important than aesthetics, and that code formatting provides cues about a program's structure that help human comprehension beyond what a computer understands from the code itself.

Uploaded by

Kostas Notis
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 41

ΔΙΑΤΑΞΗ ΚΩΔΙΚΑ ΚΑΙ ΣΤΥΛ

(LAYOUT & STYLE)


 Διάταξη Κώδικα: ακραίο παράδειγμα προς αποφυγή (σε Pascal)
procedure InsertionSort( Var Data: SortArray_t; FirstElmt: Integer; LastElmt:
Integer ); { Use the insertion sort technique to sort the "Data" array in
ascending order. This routine assumes that Data [ FirstElmt ] is not the
FirstElmt element in Data and that Data [ FirstElmt−1 ] can be accessed. }
Const SortMin = ''; Var SortBoundary: Integer; { upper end of sorted range }
InsertPos: Integer; { position to insert element } InsertVal: SortElmt_t;
{ value to insert } LowerBoundary: SortElmt_t; { first value below range to
sort } begin { Replace element at lower boundary with an element guaranteed to
be first in a sorted list } LowerBoundary := Data[ FirstElmt−1 ]; Data
[ FirstElmt−1 ] := SortMin; { The elements in positions FirstElmt through
SortBoundary−1 are always sorted. In each pass through the loop, SortBoundary
is increased, and the element at the position of the new SortBoundary probably
isn't in its sorted place in the array, so it's inserted into the proper place
somewhere between FirstElmt and SortBoundary. } for SortBoundary :=
FirstElmt+1 to LastElmt do begin InsertVal := Data [ SortBoundary ]; InsertPos
:= SortBoundary; while InsertVal < Data [ InsertPos−1 ] do begin
Data[ InsertPos ] := Data[ InsertPos−1 ]; InsertPos := InsertPos−1; end; Data
[ InsertPos ] := InsertVal; end; { Replace original lower-boundary element }
Data[ FirstElmt−1 ] := LowerBoundary; end; { InsertionSort }

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021


ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 1
ΔΙΑΤΑΞΗ ΚΩΔΙΚΑ ΚΑΙ ΣΤΥΛ
(LAYOUT & STYLE)
 Διάταξη Κώδικα: ο ίδιος κώδικας λίγο καλύτερα
procedure InsertionSort( Var Data: SortArray_t; FirstElmt: Integer;
LastElmt: Integer );
{ Use the insertion sort technique to sort the "Data" array in ascending
order. This routine assumes that Data[ FirstElmt ] is not the
first element in Data and that Data[ FirstElmt−1 ] can be accessed. }
Const
SortMin = '';
Var
SortBoundary: Integer; { upper end of sorted range }
InsertPos: Integer; { position to insert element }
InsertVal: SortElmt_t; { value to insert }
LowerBoundary: SortElmt_t; { first value below range to sort }
begin
{ Replace element at lower boundary with an element
guaranteed to be first in a sorted list }
LowerBoundary := Data[ FirstElmt−1 ];
Data[ FirstElmt−1 ] := SortMin;
{ The elements in positions FirstElmt through SortBoundary−1 are always sorted. In each pass through the
loop, SortBoundary is increased, and the element at the position of the new SortBoundary probably isn't in
its sorted place in the array, so it's inserted into the proper place somewhere between FirstElmt and
SortBoundary. }
for SortBoundary := FirstElmt+1 to LastElmt do
begin
InsertVal := Data[ SortBoundary ];
InsertPos := SortBoundary;
while InsertVal < Data[ InsertPos−1 ] do
begin
Data[ InsertPos ] := Data[ InsertPos−1 ];
InsertPos := InsertPos−1;
end;
Data[ InsertPos ] := InsertVal;
end;
{ Replace original lower-boundary element }
Data[ FirstElmt−1 ] := LowerBoundary;
end; { InsertionSort }
ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021
ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 2
ΔΙΑΤΑΞΗ ΚΩΔΙΚΑ ΚΑΙ ΣΤΥΛ
(LAYOUT & STYLE)
 Διάταξη Κώδικα: σωστά γραμμένος κώδικας
procedure InsertionSort
(
Var Data: SortArray_t;
FirstElmt: Integer;
LastElmt: Integer
);

{ Use the insertion sort technique to sort the "Data" array in ascending order. This routine
assumes that Data[ FirstElmt ] is not the first element in Data and that Data[ FirstElmt−1 ]

can be accessed. }
Const
SortMin = '';

Var
SortBoundary: Integer; { upper end of sorted range }
InsertPos: Integer; { position to insert element }
InsertVal: SortElmt_t;{ value to insert }
LowerBoundary: SortElmt_t;{ first value below range to sort }

begin
{ Replace element at lower boundary with an element guaranteed to be first in a sorted list
}
LowerBoundary := Data[ FirstElmt−1 ];
Data[ FirstElmt−1 ] := SortMin;

{ The elements in positions FirstElmt through SortBoundary−1 are always sorted. In


each pass through the loop, SortBoundary is increased, and the element at the position of
the new SortBoundary probably isn't in its sorted place in the array, so it's inserted into
the proper place somewhere between FirstElmt and SortBoundary.}

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021


ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 3
ΔΙΑΤΑΞΗ ΚΩΔΙΚΑ ΚΑΙ ΣΤΥΛ
(LAYOUT & STYLE)
 Διάταξη Κώδικα: σωστά γραμμένος κώδικας (συνέχεια)
for SortBoundary := FirstElmt+1 to LastElmt do
begin
InsertVal := Data[ SortBoundary ];
InsertPos := SortBoundary;
while InsertVal < Data[ InsertPos−1 ] do
begin
Data[ InsertPos ] := Data[ InsertPos−1 ];
InsertPos := InsertPos−1;
end;
Data[ InsertPos ] := InsertVal;
end;

{ Replace original lower-boundary element }


Data[ FirstElmt−1 ] := LowerBoundary;
end; { InsertionSort }

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021


ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 4
ΔΙΑΤΑΞΗ ΚΩΔΙΚΑ ΚΑΙ ΣΤΥΛ
(LAYOUT & STYLE)
 Διάταξη Κώδικα: μορφοποίηση κώδικα που αξιοποιεί
τυπογραφικά χαρακτηριστικά (με κατάλληλο εργαλείο)

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021


ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 5
ΘΕΜΕΛΙΩΔΕΙΣ ΑΡΧΕΣ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ
ΚΑΙ ΣΤΥΛ

 Η ΒΑΣΙΚΗ ΑΡΧΗ ΤΗΣ ΣΩΣΤΗΣ ΜΟΡΦΟΠΟΙΗΣΗΣ


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

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


ΠΡΟΓΡΑΜΜΑΤΟΣ
Η διάταξη του κώδικα είναι μία χρήσιμη ένδειξη της δομής ενός
προγράμματος. Ενώ ο υπολογιστής στηρίζεται αποκλειστικά σε
εντολές όπως begin και end ή { και }, ο άνθρωπος δημιουργεί
παραστάσεις αντίληψης από την οπτική παρουσίαση του κώδικα.
ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021
ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 6
ΘΕΜΕΛΙΩΔΕΙΣ ΑΡΧΕΣ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ
ΚΑΙ ΣΤΥΛ

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


υπολογιστή και διαφορετική σημασία έχει για τον άνθρωπο
/* swap left and right elements for whole array */
for ( i = 0; i < MAX_ELMTS; i++ )
LeftElmt = Left[ i ];
Left[ i ] = Right[ i ];
Right[ i ] = LeftElmt;

 Δεύτερο παράδειγμα κώδικα που διαφορετική σημασία έχει


για τον υπολογιστή και διαφορετική σημασία έχει για τον
άνθρωπο
x = 3+4 * 2+7;

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021


ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 7
ΘΕΜΕΛΙΩΔΕΙΣ ΑΡΧΕΣ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ
ΚΑΙ ΣΤΥΛ

 Είναι πιο απλή η συγγραφή κώδικα που να είναι


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

 Το πείραμα με τη σκακιέρα, τους experts και τους


αρχάριους: όταν τα πιόνια είναι τοποθετημένα σε θέσεις
που θα μπορούσαν να εμφανιστούν στη διάρκεια ενός
παιχνιδιού η μνήμη ενός expert λειτουργεί πιο
αποτελεσματικά από τη μνήμη ενός αρχάριου. Όταν τα
πιόνια τοποθετούνται τυχαία δεν υπάρχει διαφορά μεταξύ
expert και αρχάριου.
ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021
ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 8
ΘΕΜΕΛΙΩΔΕΙΣ ΑΡΧΕΣ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ
ΚΑΙ ΣΤΥΛ

 ΣΥΜΠΕΡΑΣΜΑ: Όταν η πληροφορία αντιστοιχεί σε δομημένη


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

 ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ: Όταν οι εντολές του προγράμματος


είναι διευθετημένες σε λογική σειρά (που είναι εύκολα αντιληπτή)
οι ειδικοί εμφανίζουν βελτιωμένες δυνατότητες απομνημόνευσης
σε σχέση με τους αρχάριους. Όταν οι εντολές είναι ανακατεμένες
(ή έτσι φαίνεται) δεν υπάρχει διαφορά στη δυνατότητα
απομνημόνευσης της λογικής του κώδικα.
ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021
ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 9
ΘΕΜΕΛΙΩΔΕΙΣ ΑΡΧΕΣ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ
ΚΑΙ ΣΤΥΛ

 Δεδομένης της πληθώρας των στυλ διάταξης κώδικα και


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

 Οι καλοί προγραμματιστές θα πρέπει να είναι ανοιχτοί


σε νέες πρακτικές διάταξης κώδικα και να υιοθετούν
πρακτικές που αποδεδειγμένα είναι καλύτερες απ΄ αυτές
που χρησιμοποιούν, παρόλο που η αλλαγή αυτή μπορεί
αρχικά να δημιουργεί μία δυσκολία.
ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021
ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 10
ΘΕΜΕΛΙΩΔΕΙΣ ΑΡΧΕΣ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ
ΚΑΙ ΣΤΥΛ

 Στόχοι μιας σωστής διάταξης κώδικα:


– Ακριβής αναπαράσταση της λογικής δομής του κώδικα
– Συνεπής αναπαράσταση της λογικής δομής του κώδικα:
κάποια στυλ έχουν τόσες πολλές εξαιρέσεις που είναι
τελικά δύσκολο να διακρίνουμε συνεπείς κανόνες
δόμησης κώδικα
– Βελτίωση αναγνωσιμότητας
– Ανθεκτικότητα σε τροποποιήσεις: στα καλά σχήματα
διάταξης η τροποποίηση μιας γραμμής κώδικα δεν
επιφέρει τροποποιήσεις στις υπόλοιπες γραμμές
ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021
ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 11
ΤΕΧΝΙΚΕΣ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ

 Κενά:
– Χρησιμοποιείτε χαρακτήρες κενού, tabs, χαρακτήρες
αλλαγής γραμμής και κενές γραμμές για να βελτιώσετε
την αναγνωσιμότητα του προγράμματος
– Φανταστείτε το ρόλο των κεφαλαίων, των παραγράφων
και των προτάσεων σε ένα βιβλίο: καταδεικνύουν στον
αναγνώστη πως να οργανώσει νοητικά ένα θέμα. Η
πληροφορία που περιέχεται σε ένα πρόγραμμα είναι
πολύ πιο πυκνή από την πληροφορία που περιέχεται
στα περισσότερα βιβλία.
ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021
ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 12
ΤΕΧΝΙΚΕΣ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ

 Κενά:
– Συνήθως σε ένα ή δύο λεπτά μπορούμε να διαβάσουμε
και να καταλάβουμε μια σελίδα βιβλίου, αλλά οι
περισσότεροι προγραμματιστές δεν μπορούν να
κατανοήσουν ένα πρόγραμμα με αυτόν τον ρυθμό.
ΣΥΜΠΕΡΑΣΜΑ: ένα πρόγραμμα πρέπει να παρέχει
πολύ περισσότερες ενδείξεις οργάνωσης και δομής από
ότι ένα βιβλίο.
– Ομαδοποίηση: Τα κενά χρησιμοποιούνται για την
ομαδοποίηση εντολών που σχετίζονται μεταξύ τους.
ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021
ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 13
ΤΕΧΝΙΚΕΣ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ

 Κενά:
– Κενές γραμμές: Όσο σημαντική είναι η ομαδοποίηση
γραμμών που σχετίζονται μεταξύ τους, άλλο τόσο
σημαντικός είναι ο διαχωρισμός εντολών που δε
σχετίζονται μεταξύ τους. Αυτό γίνεται με τις κενές
γραμμές που ουσιαστικά χρησιμοποιούνται για το
άνοιγμα νέων παραγράφων κώδικα.
Έχει βρεθεί ότι η βέλτιστη αναλογία κενών γραμμών
σε ένα πρόγραμμα είναι 8 % με 16 %. Περισσότερες
κενές γραμμές αυξάνουν δραματικά τον απαιτούμενο
χρόνο αποσφαλμάτωσης.
ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021
ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 14
ΤΕΧΝΙΚΕΣ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ

 Κενά:
– Στοίχιση: Στοιχίζουμε τα όμοια στοιχεία (π.χ. τελεστές
ανάθεσης) στις ομάδες εντολών που σχετίζονται μεταξύ
τους. Αυτή η τακτική επιτείνει την ιδέα ότι οι συγκεκριμένες
εντολές ανήκουν όλες στην ίδια ομάδα.
– Εσοχές: Χρησιμοποιούμε εσοχές για να καταδείξουμε τη
λογική δομή του προγράμματος. Σα βασικό κανόνα
υιοθετούμε την εσοχή εντολών κάτω από την εντολή στην
οποία λογικά αυτές υπάγονται.
Μελέτες έχουν δείξει ότι όταν χρησιμοποιούνται εσοχές από
δύο μέχρι τέσσερις θέσεις η κατανοησιμότητα των
προγραμμάτων βελτιώνεται από 20% μέχρι 30%.

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021


ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 15
ΤΕΧΝΙΚΕΣ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ

 Παρενθέσεις:
– Χρησιμοποιείτε παρενθέσεις πολύ πιο συχνά από
όσο νομίζετε ότι σας χρειάζονται για να
διευκρινίζετε τις εκφράσεις που συνδυάζουν
περισσότερους από δύο όρους.
Παράδειγμα C: πως αποτιμάται η έκφραση
12+4 % 3 * 7 / 8

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021


ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 16
ΣΤΥΛ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ
 Ένα block κώδικα περικλείεται σε λέξεις κλειδιά:
στην Pascal μεταξύ begin και end και στη C
μεταξύ { και }. Πολλά από τα θέματα που
σχετίζονται με τη διάταξη του κώδικα έχουν να
κάνουν με τη διάταξη blocks κώδικα. Τα τέσσερα
πιο συχνά χρησιμοποιούμενα στυλ διάταξης είναι:
– τα άψογα διευθετημένα blocks (pure blocks)
– η διάταξη τέλους γραμμής
– η προσομοίωση άψογα διευθετημένων blocks
– χρήση ορίων block begin και end
 Το στυλ διάταξης που επιλέγεται εξαρτάται και
από τη γλώσσα προγραμματισμού.
ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021
ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 17
ΣΤΥΛ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ

 άψογα διευθετημένα blocks (pure blocks)

παραδείγματα κώδικα Ada: case PixelColor of


when RedColor =>
if PixelColor = RedColor then statement1;
statement1; statement2;
statement2; ...
... when GreenColor =>
end if; statement1;
statement2;
while PixelColor = RedColor loop ...
statement1; when others =>
statement2; statement1;
... statement2;
end loop; ...
end case;
ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021
ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 18
ΣΤΥΛ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ

 διάταξη τέλους γραμμής

μερικές φορές while PixelColor = RedColor do begin


statement1;
βολεύει: statement2;
...
end;
if ( SoldCount > 10 and PrevMonthSales > 10 ) then
if ( SoldCount > 100 and PrevMonthSales > 10 ) then
if ( SoldCount > 1000 ) then begin
Markdown := 0.10;
αλλά Profit := 0.05
end
else Markdown := 0.05
else Markdown :=
0.025
ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ else Markdown := 2021
9 Δεκεμβρίου 0.0;
ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 19
ΣΤΥΛ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ

 Αποφεύγετε τη διάταξη τέλους γραμμής γιατί δεν είναι


ακριβής, είναι δύσκολο να εφαρμοστεί με συνέπεια και
δύσκολο να συντηρηθεί.
 προσομοίωση άψογα διευθετημένων blocks

if PixelColor = RedColor then begin


statement1;
statement2;
...
end;

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021


ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 20
ΣΤΥΛ ΔΙΑΤΑΞΗΣ ΚΩΔΙΚΑ

 χρήση ορίων block begin και end

if PixelColor = RedColor then


begin
statement1;
statement2;
...
end;

Αυτό το στυλ είναι καλό, συμμορφώνεται στη βασική αρχή της


σωστής μορφοποίησης, μπορεί εύκολα να εφαρμοσθεί με συνέπεια και
δε δημιουργεί προβλήματα συντήρησης.
ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021
ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 21
ΔΙΑΤΑΞΗ ΔΟΜΩΝ ΕΛΕΓΧΟΥ

 Αποφεύγετε τα ζεύγη begin – end χωρίς


εσοχή

 Αποφεύγετε τη διπλή εσοχή με begin και


end

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021


ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 22
ΔΙΑΤΑΞΗ ΔΟΜΩΝ ΕΛΕΓΧΟΥ

 Χρησιμοποιείτε κενές γραμμές μεταξύ


παραγράφων: μερικά blocks δε
διαχωρίζονται με ζεύγη begin και end. Ένα
λογικό block πρέπει να αντιμετωπίζεται
όπως οι παράγραφοι σε ένα συμβατικό
κείμενο.
 Μορφοποιείτε με συνέπεια τα block που
αποτελούνται από μία μόνο εντολή.
ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021
ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 23
ΔΙΑΤΑΞΗ ΔΟΜΩΝ ΕΛΕΓΧΟΥ

 Στυλ για block μιας εντολής

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021


ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 24
ΔΙΑΤΑΞΗ ΔΟΜΩΝ ΕΛΕΓΧΟΥ

 Στις περίπλοκες εκφράσεις διαχωρείστε τις


συνθήκες σε ξεχωριστές γραμμές
if ( ( '0' <= InChar and InChar <= '9' ) or
( 'a' <= InChar and InChar <= 'z' ) or
( 'A' <= InChar and InChar <= 'Z' ) ) then
...

 Αποφεύγετε εντολές τύπου goto

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021


ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 25
ΔΙΑΤΑΞΗ ΕΝΤΟΛΩΝ

 Περιορίστε το μήκος των εντολών το πόλύ στους 80


χαρακτήρες
– γραμμές μεγαλύτερες από 80 χαρακτήρες είναι δύσκολα
αναγνώσιμες
– το όριο των 80 χαρακτήρων αποτρέπει τα πολλά επίπεδα
εμφώλευσης
– γραμμές μεγαλύτερες από 80 χαρακτήρες δε χωράνε σε χαρτί Α4
 Χρησιμοποιείτε κενά για να βελτιώνετε την
αναγνωσιμότητα των λογικών εκφράσεων
Παράδειγμα μη αναγνώσιμου κώδικα:
while(PathName[StartPath+Pos]<>';') and
((StartPath+Pos)<=length(PathName)) do
ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021
ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 26
ΔΙΑΤΑΞΗ ΕΝΤΟΛΩΝ

 Χρησιμοποιείτε κενά για να βελτιώνετε την


αναγνωσιμότητα των λογικών εκφράσεων
– χρησιμοποιείτε κενά για να διαχωρίζετε τα ονόματα μεταξύ
τους
Παράδειγμα αναγνώσιμου κώδικα:
while ( PathName[ StartPath + Pos ] <> ';' ) and
(( StartPath + Pos ) <= length( PathName )) do
 Χρησιμοποιείτε κενά για να βελτιώνετε την
αναγνωσιμότητα αναφορών σε στοιχεία πίνακα
ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021
ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 27
ΔΙΑΤΑΞΗ ΕΝΤΟΛΩΝ

 Χρησιμοποιείτε κενά για να βελτιώνετε την


αναγνωσιμότητα αναφορών σε στοιχεία
πίνακα
Παράδειγμα μη αναγνώσιμου κώδικα:
GrossRate[Census[GroupID].Sex,Census[GroupID].AgeGroup]

Παράδειγμα αναγνώσιμου κώδικα:


GrossRate[ Census[ GroupID ].Sex, Census[ GroupID ].AgeGroup ]

 Χρησιμοποιείτε κενά για να βελτιώνετε την


αναγνωσιμότητα ορισμάτων συναρτήσεων
ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021
ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 28
ΔΙΑΤΑΞΗ ΕΝΤΟΛΩΝ

 Χρησιμοποιείτε κενά για να βελτιώνετε την


αναγνωσιμότητα ορισμάτων συναρτήσεων
Παράδειγμα μη αναγνώσιμου κώδικα:
ReadEmployeeData(MaxEmps,EmpData,InputFile,EmpCount,InputError);

Παράδειγμα μη αναγνώσιμου κώδικα:


GetCensus( InputFile, EmpCount, EmpData, MaxEmps, InputError );

 Στοίχιση εντολών που σχετίζονται μεταξύ τους


Παράδειγμα λάθος στοίχισης:
EmployeeName = InputName
EmployeeSalary = InputSalary
EmployeeBirthdate = InputBirthdate
ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021
ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 29
ΔΙΑΤΑΞΗ ΕΝΤΟΛΩΝ

 Στοίχιση εντολών που σχετίζονται μεταξύ τους


Παράδειγμα σωστής στοίχισης:
EmployeeName = InputName
EmployeeSalary = InputSalary
EmployeeBirthdate = InputBirthdate

Παράδειγμα λάθος στοίχισης:


EmployeeName = InputName
EmployeeAddress = InputAddress
EmployeePhone = InputPhone
BossTitle = Title
BossDept = Department

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021


ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 30
ΔΙΑΤΑΞΗ ΕΝΤΟΛΩΝ

 Στοίχιση εντολών που σχετίζονται μεταξύ τους


Παράδειγμα σωστής στοίχισης:
EmployeeName = InputName
EmployeeAddress = InputAddress
EmployeePhone = InputPhone

BossTitle = Title
BossDept = Department

 Μορφοποίηση μη ολοκληρωμένων γραμμών:


Να κάνετε εμφανές το ότι η εντολή δεν είναι
ολοκληρωμένη
ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021
ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 31
ΔΙΑΤΑΞΗ ΕΝΤΟΛΩΝ

Παραδείγματα εμφανώς μη ολοκληρωμένων γραμμών:

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021


ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 32
ΔΙΑΤΑΞΗ ΕΝΤΟΛΩΝ

 Μορφοποίηση μη ολοκληρωμένων γραμμών: Να


διατηρείτε μαζί στοιχεία του κώδικα που σχετίζονται
μεταξύ τους όπως π.χ. αναφορές σε στοιχεία πίνακα,
ορίσματα συναρτήσεων κ.α.
Παράδειγμα όχι καλού διαχωρισμού γραμμής:
CustomerBill := PrevBalance( PaymentHistory[ CustomerID ] ) + LateCharge(
PaymentHistory[ CustomerID ] );

Παράδειγμα σωστού διαχωρισμού γραμμής:


CustomerBill := PrevBalance( PaymentHistory[ CustomerID ] ) +
LateCharge( PaymentHistory[ CustomerID ] );

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021


ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 33
ΔΙΑΤΑΞΗ ΕΝΤΟΛΩΝ

 Μορφοποίηση μη ολοκληρωμένων γραμμών: Χρησιμοποιείτε


εσοχή για τη συνέχεια γραμμών κλήσης συναρτήσεων
Παράδειγμα σωστού διαχωρισμού γραμμής:
DrawLine( Window.North, Window.South, Window.East, Window.West,
CurrentWidth, CurrentAttribute );
SetFontAttributes( Font.FaceName, Font.Size, Font.Bold, Font.Italic,
Font.SyntheticAttribute[ FontID ].Underline,
Font.SyntheticAttribute[ FontID ].Strikeout );

Ή για να τονίσουμε το όνομα της συνάρτησης:


DrawLine( Window.North, Window.South, Window.East, Window.West,
CurrentWidth, CurrentAttribute );
SetFontAttributes( Font.FaceName, Font.Size, Font.Bold, Font.Italic,
Font.SyntheticAttribute[ FontID ].Underline,
Font.SyntheticAttribute[ FontID ].Strikeout );

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021


ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 34
ΔΙΑΤΑΞΗ ΕΝΤΟΛΩΝ

 Μορφοποίηση μη ολοκληρωμένων γραμμών:


Βάλτε εσοχή σε συνέχεια εντολής ελέγχου
Παράδειγμα:
while ( PathName[ StartPath + Pos ] != ';' ) &&
( ( StartPath + Pos ) <= length( PathName ) )
{
...
}

for ( RecNum = Employee.Rec.Start + Employee.Rec.Offset;


RecNum <= Employee.Rec.Start + Employee.Rec.Offset + Employee.NumRecs;
RecNum++ )
{
...
}

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021


ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 35
ΔΙΑΤΑΞΗ ΕΝΤΟΛΩΝ

 Μορφοποίηση μη ολοκληρωμένων γραμμών: Βάλτε εσοχή σε


συνέχεια εντολών ανάθεσης πέρα από τον τελεστή ανάθεσης

Παράδειγμα μη σωστού διαχωρισμού γραμμής:


CustomerPurchases := CustomerPurchases + CustomerSales( CustomerID );
CustomerBill := CustomerBill + CustomerPurchases;
TotalCustomerBill := CustomerBill + PreviousBalance( CustomerID ) +
LateCharge( CustomerID );
CustomerRating := Rating( CustomerID, TotalCustomerBill );

Παράδειγμα μη σωστού διαχωρισμού γραμμής:


CustomerPurchases := CustomerPurchases + CustomerSales( CustomerID );
CustomerBill := CustomerBill + CustomerPurchases;
TotalCustomerBill := CustomerBill + PreviousBalance( CustomerID ) +
LateCharge( CustomerID );
CustomerRating := Rating( CustomerID, TotalCustomerBill );

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021


ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 36
ΔΙΑΤΑΞΗ ΕΝΤΟΛΩΝ

 Βάζετε μόνο μία εντολή ανά γραμμή


 Να αποφεύγετε τα side effects (παράπλευρες επιπτώσεις
της εκτέλεσης μιας εντολής)
Παράδειγμα μη αποφυγής των side effects:
printf( "%d %d \n", ++n, n + 2 );
Παράδειγμα σύνταξης αποφυγής των side effects:
++n;
printf( "%d %d \n", n, n + 2 );

Ακραίο παράδειγμα μη αποφυγής των side effects:


strcpy( char * t, char * s )
{
while ( *++t = *++s )
;
}

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021


ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 37
ΔΙΑΤΑΞΗ ΕΝΤΟΛΩΝ

Ακραίο παράδειγμα μη αποφυγής των side effects:


strcpy( char * t, char * s )
{
do
{
++t;
++s;
*t = *s;
}
while ( *t != ‘\0’ );
}

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021


ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 38
ΔΙΑΤΑΞΗ ΕΝΤΟΛΩΝ

 Διάταξη δηλώσεων: να χρησιμοποιείτε στοίχιση


int SortBoundary;
int InsertPos;
SORT_STRING InsertVal;
SORT_STRING LowerBoundary;

 Διάταξη δηλώσεων: μόνο μία δήλωση ανά γραμμή


int RowIdx, ColIdx; COLOR PreviousScreen, CurrentScreen,
NextScreen; POINT PreviousTop, PreviousBottom,
CurrentTop, CurrentBottom, NextTop, NextBottom; FONT
PreviousFace, CurrentFace, NextFace; COLOR Choices[
NUM_COLORS ];

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021


ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 39
ΔΙΑΤΑΞΗ ΕΝΤΟΛΩΝ

 Διάταξη δηλώσεων: βάζετε τις δηλώσεις σε μία


λογική σειρά π.χ. ανά τύπο ή αλφαβητικά (έχει
πολλή δουλειά)

 Διάταξη δηλώσεων: στις δηλώσεις μεταβλητών


δείκτη βάζετε το αστεράκι δεξιά του τύπου εκτός
και αν έχουμε περισσότερα του ενός αστεράκια
EMP_LIST * Employees;
FILE * InputFile;

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021


ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 40
ΠΡΟΤΕΙΝΟΜΕΝΟ ΒΙΒΛΙΟ
Code Complete: A Practical Handbook of
Software Construction
Steve McConnell, Microsoft Press, 1993

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓ/ΜΟΣ ΜΕ C++ 9 Δεκεμβρίου 2021


ΤΜ. ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. – ΔΙΔΑΣΚΩΝ: Π. ΚΑΤΣΑΡΟΣ ΔΙΑΦΑΝΕΙΑ 41

You might also like