Προγραµµατισµός Ι (ΗΥ120)

Σχετικά έγγραφα
Προγραμματισμός Ι (ΗΥ120)

Προγραμματισμός Ι (ΗΥ120)

Προγραμματισμός Ι (HY120)

Προγραμματισμός Ι (HY120)

Βασικές Έννοιες. Προγραµµατισµός Ι 1

Προγραμματισμός Ι (ΗΥ120)

Προγραμματισμός Ι (ΗΥ120)

Προγραμματισμός Ι (ΗΥ120)

Προγραµµατισµός Ι (ΗΥ120)

Προγραμματισμός Ι (ΗΥ120)

Διάλεξη 2η: Αλγόριθμοι και Προγράμματα

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

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

Προγραμματισμός Ι (ΗΥ120)

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Η γλώσσα προγραμματισμού C

int a[5]; a[0] a[1] a[2] a[3] a[4] 15/10/2009

ΥΠΟΛΟΓΙΣΤΕΣ Ι. Τα επιμέρους τμήματα Η ΟΜΗ TOY ΥΠΟΛΟΓΙΣΤΗ. Αναπαράσταση μεγεθών. Αναλογική αναπαράσταση ΚΕΝΤΡΙΚΗ ΜΝΗΜΗ ΜΟΝΑ Α ΕΛΕΓΧΟΥ

ΕΡΓΑΣΤΗΡΙΟ 1 ΕΙΣΑΓΩΓΗ ΣΤΗ C. Τµήµα Πληροφορικής και Τηλεπικοινωνιών

Προγραμματισμός Ι. Είσοδος/Έξοδος. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Δομημένος Προγραμματισμός (ΤΛ1006)

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Υπολογιστές Ι. Άδειες Χρήσης. Εισαγωγή. Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

Περιεχόμενα. Πρόλογος... 21

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

Βιβλιοθήκες Αφηρημένοι τύποι δεδομένων. Προγραμματισμός II 1

Επεξεργασία Αρχείων Κειµένου

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Δομημένος Προγραμματισμός

H ΓΛΩΣΣΑ C. Μάθηµα 1: Το Πρώτο µας Πρόγραµµα σε C. ηµήτρης Ψούνης

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

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

Δομημένος Προγραμματισμός

Εισαγωγή στον Προγραμματισμό

lab13grades 449 PASS 451 PASS PASS FAIL 1900 FAIL Page 1

Διαδικασιακός Προγραμματισμός

ΤΕΙ ΙΟΝΙΩΝ ΝΗΣΩΝ ΣΧΟΛΗ ΔΙΟΙΚΗΣΗΣ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ ΤΜΗΜΑ ΔΙΟΙΚΗΣΗΣ ΕΠΙΧΕΙΡΗΣΕΩΝ - ΕΙΣ

Δομημένος Προγραμματισμός (ΤΛ1006)

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ

Προγραμματισμός Ι (HY120)

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

Ενδεικτική περιγραφή μαθήματος

Προγραμματισμός Ι (ΗΥ120)

Προγραµµατισµός Ι Εργαστήριο 13ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 13 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Προγραμματισμός Η/Υ (ΤΛ2007 )

Βαθμός Σχόλια. lab5 PASS PASS PASS PASS PASS. Οριακά PASS - Καλή δουλειά

ΕΡΓΑΣΤΗΡΙΟ 4: Μεταβλητές, Δομές Ελέγχου και Επανάληψης

Πίνακες: μια σύντομη εισαγωγή. Πίνακες χαρακτήρων: τα "Αλφαριθμητικά"

Εισαγωγή. Διαλέξεις στο μάθημα: Μεταφραστές Γιώργος Μανής

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

Προγραμματισμός Ι (ΗΥ120)

Προγραµµατισµός Ι Εισαγωγή Πανεπιστήµιο Πελοποννήσου Τµήµα Πληροφορικής & Τηλεπικοινωνιών Προγραµµατισµός Ι Νικόλαος Δ. Τσελίκας

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο

Μεταγλώττιση και σύνδεση πολλαπλών αρχείων κώδικα. Προγραμματισμός II 1

Διάλεξη 20: Χαμηλού Επιπέδου Προγραμματισμός II

Προγραμματισμός Η/Υ (ΤΛ2007 )

Αλγόριθμος. Αλγόριθμο ονομάζουμε τη σαφή και ακριβή περιγραφή μιας σειράς ξεχωριστών οδηγιών βημάτων με σκοπό την επίλυση ενός προβλήματος.

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

Κεφάλαιο VΙ: Προσπέλαση Αρχείων. 5.1 Αρχεία δεδομένων.

είκτες και Πίνακες (2)

Προγραμματισμός Ι (ΗΥ120)

Χωρική Βάση δεδοµένων Autocad

ΗΜΥ 100 Εισαγωγή στην Τεχνολογία ιάλεξη 12

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

Προγραμματισμός Ι (ΗΥ120)

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal 1 ο Μέρος σηµειώσεων (Ενότητες 8.1 & 8.2 σχολικού βιβλίου)

Τμήμα Μηχανολόγων Μηχανικών Πανεπιστήμιο Θεσσαλίας ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ. Βασικές Έννοιες Προγραμματισμού. Ιωάννης Λυχναρόπουλος Μαθηματικός, MSc, PhD

Διαδικασιακός Προγραμματισμός

Προγραμματισμός Ι (ΗΥ120)

Βιβλιοθήκη stdio. Προγραμματισμός II 1

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Προγραµµατισµός Ι Εργαστήριο 13ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 13 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

scanf() scanf() stdin scanf() printf() int float double %lf float

Εισαγωγή στην Πληροφορική. Α σ κ ή σ ε ι ς σ τ η ν ι α χ ε ί ρ ι σ η Μ ν ή µ η ς. Αντώνης Σταµατάκης

Α. Ερωτήσεις Ανάπτυξης

Διάλεξη 18η: Διαχείρηση Αρχείων

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Μεταγλωττιστής. Μεταφραστές. Γλώσσες. Είδη Μεταγλωττιστών. Μεταγλωττιστής Τελικό πρόγραµµα (object program) Εισαγωγή Αρχικό πρόγραµµα (source program)

Περιεχόμενο: Δομή υπολογιστή Συστήματα αρίθμησης

Προγραμματισμός H/Y Ενότητα 1: Εισαγωγή. Επικ. Καθηγητής Συνδουκάς Δημήτριος Τμήμα Διοίκησης Επιχειρήσεων (Γρεβενά)

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. (Διάλεξη 15)

Δομημένος Προγραμματισμός (ΤΛ1006)

Εισαγωγή στην γλώσσα προγραμματισμού C

Κεφάλαιο 1 Εισαγωγή στη C

(programming interfaceή/και application programming interface API).

Master Mind εφαρμογή στη γλώσσα προγραμματισμού C

Προγραμματισμός Ι (ΗΥ120)

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Δομημένος Προγραμματισμός (ΤΛ1006)

ΕΠΕΞΕΡΓΑΣΙΑ ΑΡΧΕΙΩΝ Λέµε αρχείο

Προγραμματισμός Η/Υ (ΤΛ2007 )

Διαδικασιακός Προγραμματισμός

Ανάπτυξη και Σχεδίαση Λογισμικού

Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος

Προεπεξεργαστής C. Προγραμματισμός Ι 1

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Transcript:

Προγραµµατισµός Ι (ΗΥ120) Διάλεξη 2: Μνήµη Εισαγωγή στη C

Μνήµη 2 Μια διάταξη από «δωµάτια» κάθε ένα από τα οποία µπορεί να χρησιµοποιηθεί για την αποθήκευση 1 bit (0 / 1). 8 τέτοια δωµάτια οργανώνονται σε µια µονάδα (Byte) Ένα «σπίτι» µε διεύθυνση κλπ! Τη µνήµη ο προγραµµατιστής τη «βλέπει» σα µια ακολουθία από bytes. Η διεύθυνση κάθε byte είναι η σειρά του στην ακολουθία

Πόσο Μεγάλη Μνήµη; 3 Τυπικός Η/Υ: Κύρια µνήµη (RAM) εκατοντάδων Megabyte έως και λίγων Gigabyte Σκληρός δίσκο εκατοντάδων Gigabyte. 1 byte (B) = 8 bits 1 KB = 1024 B = 2 10 B 1 MB = 1024 KB = 2 20 B 1 GB = 1024 MB = 2 30 B 1 TΒ = 1024 GΒ = 2 40 B

Πρόσβαση στη Μνήµη Τι πρέπει να καθορίσω; Τη διεύθυνση Τι θέλω να κάνω (ανάγνωση / εγγραφή) Σε πόσα bytes Πόσο µεγάλη γειτονιά 4 «Ανάγνωση»: επιστρέφει τις τιµές των bytes που έχουν αποθηκευτεί στις αντίστοιχες θέσεις. «Εγγραφή»: προσδιορίζει τις τιµές των bytes που θα αποθηκευτούν στις αντίστοιχες θέσεις.

Ανάγνωση από τη Μνήµη διεύθυνση περιεχόµενα 5 adr=3 op=read 0 1 2 0 0 1 1 0 1 0 1 1 1 1 0 1 0 1 0 1 1 0 1 0 1 1 1 len=1 10101011 µηχανισµός πρόσβασης µνήµης 3 4 5 1 0 1 0 1 0 1 1 0 0 1 1 0 1 0 1 1 1 1 1 1 0 1 0... Ν-1 0 0 0 0 0 1 0 1 Ν 1 1 0 1 1 0 0 1

Εγγραφή στη Μνήµη διεύθυνση περιεχόµενα 6 adr=1 len=2 00010101 11101010 op=write µηχανισµός πρόσβασης µνήµης Η/Υ 0 1 2 3 4 5 Ν-1 Ν 0 0 1 1 0 1 0 1 0 0 0 1 0 1 0 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 0 1 1 0 1 0 1 1 1 1 1 1 0 1 0... 0 0 0 0 0 1 0 1 1 1 0 1 1 0 0 1

Κωδικοποίηση Δεδοµένων Τα πάντα είναι 0 και 1! Κωδικοποίηση: η µετατροπή δεδοµένων από ένα σύστηµα σε ένα άλλο (π.χ. δεκαδικό δυαδικό, χαρακτήρες δυαδικό). Πόσα bits για κάθε είδος δεδοµένων; Περισσότερα bits/bytes: Όσο µεγαλύτερο το πεδίο τιµών Τόσο µεγαλύτερη η ακρίβεια Με Ν bits κωδικοποιούµε 2 Ν διαφορετικές τιµές: Π.χ. καλύπτουµε το πεδίο φυσικών [0...2 Ν -1] Ή το πεδίο ακεραίων [-2 Ν-1...2 Ν-1-1]. 7

Δεδοµένα Προγράµµατος και Μνήµη 8 Για κάθε δεδοµένο πρέπει να καθοριστεί (από τον προγραµµατιστή): Η θέση µνήµης για την αποθήκευση του Ο αριθµός των bytes που χρειάζονται για την αποθήκευση των τιµών που µπορεί να λάβει Η κωδικοποίηση που χρησιµοποιείται για κάθε τιµή στο δυαδικό σύστηµα Απάνθρωπο; Χρειάζεται κατάλληλη υποστήριξη από τις γλώσσες προγραµµατισµού...

Τύποι Δεδοµένων 9 Κάθε γλώσσα ορίζει ένα σύνολο από βασικούς τύπους δεδοµένων. Κάθε βασικός τύπος έχει: Προκαθορισµένο µέγεθος (σε bytes) Συγκεκριµένη δυαδική κωδικοποίηση και αντίστοιχο πεδίο τιµών. Ο προγραµµατιστής ορίζει κάθε δεδοµένο του προγράµµατος ως αντικείµενο ενός τύπου Καθορίζει έµµεσα το µέγεθος και την κωδικοποίηση του (την σηµασία των bits). Η µνήµη αποθηκεύει τις τιµές των bits/bytes χωρίς να γνωρίζει το πως αυτές ερµηνεύονται από το πρόγραµµα.

Ονοµασία Θέσεων Δεδοµένων 10 Σε κάθε αντικείµενο δεδοµένων δίνεται και ένα µνηµονικό όνοµα. Το όνοµα µπορεί να χρησιµοποιείται, αντί της διεύθυνσης, στις πράξεις ανάγνωσης και αλλαγής των τιµών του. Η πρόσβαση στην µνήµη εξακολουθεί να γίνεται µε βάση την θέση µνήµης και τον αριθµό bytes προς ανάγνωση/αποθήκευση Η αντιστοίχιση γίνεται (αυτόµατα) από την εκάστοτε γλώσσα προγραµµατισµού.

Μεταβλητές Προγράµµατος Μεταβλητή: αντικείµενο δεδοµένων του προγράµµατος µε Όνοµα και Τύπο «Διαβάζουµε» µεταβλητή: Διαβάζουµε την τιµή που έχει αποθηκευτεί στην αντίστοιχη θέση της µνήµης. «Αναθέτουµε» τιµή σε µεταβλητή: Γράφουµε αυτή την τιµή στην αντίστοιχη θέση της µνήµης. «Δέσµευση» µεταβλητής: Δέσµευση αντίστοιχου χώρου στην µνήµη «Ζωή» µεταβλητής: Διάστηµα κατά το οποίο αυτός ο χώρος παραµένει δεσµευµένος. 11

Παράδειγµα int var; θεση/διεύθυνση: 3 τύπος: int διεύθυνση περιεχόµενα 12 τύπος int 0 4 5 Ν-1 Ν 0 0 1 1 0 1 0 1 1 0 0 0 1 0 1 0 1 µέγεθος: 2 bytes 2 1 1 1 0 1 0 1 0 ερµηνεία: ακέραιος κωδικοποίηση: 2 s complement 3 0 0 0 0 0 0 0 1 τι τιµή έχει η µεταβλητή var; διάβασε από τη διεύθυνση της var όσα bytes ορίζει ο τύπος της T (π.χ. int), και ερµήνευσέ τα σύµφωνα µε τη σύµβαση κωδικοποίησης του T 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 0... 0 0 0 0 0 1 0 1 1 1 0 1 1 0 0 1 αποτέλεσµα

Μετάφραση / µεταγλώτιση (compilation) Πώς «καταλαβαίνει» ο υπολογιστής τη γλώσσα 13 υψηλού επιπέδου; Πρέπει οι εντολές να µετατραπούν σε εντολές γλώσσας µηχανής. Αυτό ονοµάζεται µεταγλώττιση Γίνεται από ειδικά προγράµµατα, τους µεταγλωττιστές (compilers). Συνήθως µια εντολή γλώσσας υψηλού επιπέδου αντιστοιχεί σε µια σειρά εντολών γλώσσας µηχανής Η µεταγλώττιση γίνεται (συνήθως) ως ξεχωριστή διαδικασία, πολύ πριν αρχίσει η εκτέλεση του κώδικα. Υπάρχουν περιπτώσεις όπου η µετάφραση γίνεται ακριβώς πριν την εκτέλεση (just in time compilation).

14 C compiler C -> 01001010 Γλώσσα Μηχανής για CPU y CPU y

Ερµηνεία (interpretation) Ο κώδικας δεν µεταφράζεται σε γλώσσα µηχανής αλλά εκτελείται, εντολή προς εντολή, µέσα από ένα άλλο πρόγραµµα Ονοµάζεται ερµηνεία και το πρόγραµµα που την πραγµατοποιεί διερµηνέας (interpreter). Συνήθως πιο αργή εκτέλεση από την µετάφραση Δεν γίνεται αποδοτική απεικόνιση των πράξεων σε εντολές επεξεργαστή Δεν µπορεί να γίνουν εξυπνάδες (βελτιστοποιήσεις). Όµως µε την ερµηνεία ο κώδικας είναι Συνήθως πιο µικρός σε µέγεθος και Μεταφέρσιµος: Μπορεί να εκτελεσθεί σε διαφορετικές πλατφόρµες χωρίς ανάγκη µετάφρασης για κάθε µια από αυτές. 15

16 Px compiler X -> Z P z Z interpreter CPU y

Γιατί δε Γράφουµε σε Γλώσσα Μηχανής; Ανεξαρτησία: Ο κώδικας υψηλού επιπέδου παραµένει αµετάβλητος, ανεξάρτητα από τους διάφορους επεξεργαστές Η/Υ που υπάρχουν και θα υπάρξουν στο µέλλον. Αφαίρεση: Ο κώδικας υψηλού επιπέδου βασίζεται σε πολύπλοκες εκφράσεις (που µπορεί να µην υφίστανται στην γλώσσα ενός επεξεργαστή) που διευκολύνουν σηµαντικά τον προγραµµατισµό. Αναγνωσιµότητα: Ο κώδικας υψηλού επιπέδου είναι (συνήθως) πολύ πιο κατανοητός σε έναν άνθρωπο από τον κώδικα µηχανής Άρα είναι πιο εύκολο να επιδιορθωθεί / αλλαχθεί. 17

Ορθότητα προγραµµάτων Αν στη µετάφραση εντοπιστεί συντακτικό λάθος, αυτή τερµατίζεται (εκτυπώνεται µήνυµα λάθους), διαφορετικά παράγεται κώδικας µηχανής. Το πρόγραµµα µεταφράστηκε επιτυχώς: Είναι σίγουρα σωστό; Κανείς δεν εγγυάται ότι η εκτέλεση του θα έχει και το επιθυµητό / αναµενόµενο αποτέλεσµα. Η εκτέλεση ενός (µεταγλωττισµένου) προγράµµατος γίνεται πάντα σωστά, δηλαδή όπως ορίζεται από την σηµασιολογία της γλώσσας προγραµµατισµού. Δε φταίει το «καταραµένο το µηχάνηµα» Μπορεί να υπάρχουν σηµασιολογικά ή/και λογικά λάθη. Το πρόγραµµα δεν κάνει αυτό που θέλουµε 18

Υπολογισµός x=1+2+...+n 19 Στην καθοµιλουµένη γλώσσα: Θέσε το x ίσο µε 0. Πρόσθεσε στο x την τιµή 1. Πρόσθεσε στο x την τιµή 2. Πρόσθεσε στο x την τιµή 3.... Πρόσθεσε στο x την τιµή n-1. Πρόσθεσε στο x την τιµή n. Στη γλώσσα προγραµµατισµού C: x = 0; x = x+1; x = x+2 x = x+3;... x = x+n-1; x = x+n; εντοπίζεται από τον µεταφραστή συντακτικό λάθος δεν έχουµε βάλει ; εκεί που θα έπρεπε

Υπολογισµός x=1+2+...+n 20 Στην καθοµιλουµένη γλώσσα: Θέσε το x ίσο µε 0. Πρόσθεσε στο x την τιµή 1. Πρόσθεσε στο x την τιµή 2. Πρόσθεσε στο x την τιµή 3.... Πρόσθεσε στο x την τιµή n-1. Πρόσθεσε στο x την τιµή n. Στη γλώσσα προγραµµατισµού C: x = 0; x = x+1; x == x+2; x = x+3;... x = x+n-1; x = x+n; δεν εντοπίζεται από τον µεταφραστή σηµασιολογικό λάθος δεν έχουµε καταλάβει τι κάνει ο τελεστής ==

Υπολογισµός x=1+2+...+n 21 Στην καθοµιλουµένη γλώσσα: Θέσε το x ίσο µε 0. Πρόσθεσε στο x την τιµή 1. Πρόσθεσε στο x την τιµή 3. Πρόσθεσε στο x την τιµή 3.... Πρόσθεσε στο x την τιµή n-1. Πρόσθεσε στο x την τιµή n. Στη γλώσσα προγραµµατισµού C: x = 0; x = x+1; x = x+3; x = x+3;... x = x+n-1; x = x+n; δεν εντοπίζεται από τον µεταφραστή λογικό λάθος έχουµε υλοποιήσει λάθος αλγόριθµο

Αποσφαλµάτωση Συντακτικό επίπεδο (εύκολο) Ο κώδικας δεν αντιστοιχεί σε επιτρεπτή πρόταση σύµφωνα µε τους κανόνες σύνταξης της γλώσσας Σηµασιολογικό επίπεδο (δύσκολο) Ο κώδικας είναι συντακτικά σωστός αλλά εµείς δεν χρησιµοποιούµε σωστά κάποια εντολή Άλλο θέλουµε να κάνουµε και άλλο ζητάµε από τον υπολογιστή να κάνει Παράγεται λάθος αποτέλεσµα Λογικό επίπεδο (πιο δύσκολο) Ο κώδικας είναι συντακτικά σωστός και όλες οι εντολές χρησιµοποιούνται σωστά Υπάρχει λάθος σε επίπεδο αλγορίθµου (σκέψης) 22

Είσοδος / Έξοδος (Input / Output) έξοδος πρόγραµµα είσοδος 23 To πρόγραµµα πρέπει να µπορεί να εισάγει/εξάγει δεδοµένα από/προς το «περιβάλλον» του Συνήθως από το πληκτρολόγιο και προς την οθόνη του Η/Υ. Η από και προς το δίκτυο, το δίσκο κλπ. Πώς; Ειδικές εντολές εισόδου/εξόδου (input/output commands).

Τι είναι η C; 24 Είναι µια γλώσσα «προστακτικού» (imperative) προγραµµατισµού µε σχετικά λίγες εντολές. Είναι ιδιαίτερα διαδεδοµένη, σε επίπεδο υλοποίησης λειτουργικών συστηµάτων αλλά και εφαρµογών. Η ελάχιστη µονάδα υποπρογράµµατος (δόµησης κώδικα) είναι η συνάρτηση (function). Ένα πρόγραµµα C µεταφράζεται και µετά εκτελείται. Υποστηρίζεται ξεχωριστή µετάφραση διαφορετικών υποπρογραµµάτων µε στατική ή δυναµική σύνδεση. Οι γλώσσες C++ και Java είναι «απόγονοι» της C.

Μορφοποίηση Κώδικα στη C Σχεδόν κάθε εντολή τερµατίζεται µε ';'. Μπορούµε να γράφουµε πολλές διαδοχικές εντολές στην ίδια γραµµή του κειµένου. Χρησιµοποιούµε τον όρο «σώµα» ή «µπλοκ» για να αναφερθούµε σε µια ή περισσότερες εντολές που δίνονται ανάµεσα σε '{' και '} και συµπεριφέρονται σαν «οµάδα». Σχόλια (κείµενο που δεν λαµβάνει υπ όψη του ο µεταφραστής) δίνονται ανάµεσα σε ' /*' και ' */'. Κενοί χαρακτήρες και γραµµές που βρίσκονται ανάµεσα σε εντολές δεν λαµβάνονται υπ όψη από τον µεταφραστή Χρησιµεύουν, όπως και τα σχόλια, για την αναγνωσιµότητα του κώδικα. 25

Παίζοντας µε τη Μορφοποίηση ;-) /*,*/ #include #include/* <time.h> _,o*/ <stdlib.h> #define c(c)/* -. */return ( C); /* 2004*/ #include <stdio.h>/*. Moekan "' `\b-' */ typedef/* */char p;p* u,w [9 ][128],*v;typedef int _;_ R,i,N,I,A,m,o,e [9], a[256],k [9], n[ 256];FILE*f ;_ x (_ K,_ r,_ q){; for(; r< q ; K =(( 0xffffff) &(K>>8))^ n[255 & ( K ^u[0 + r ++ ] )]);c (K )} _ E (p*r, p*q ){ c( f = fopen (r,q))}_ B(_ q){c( fseek (f, 0,q))}_ D(){c( fclose(f ))}_ C( p *q){c( 0- puts(q ) )}_/* / */main(_ t,p**z){if(t<4)c( C("<in" "file>" "\40<l" "a" "yout> " /*b9213272*/"<outfile>" ) )u=0;i=i=(e(z[1],"rb"))?b(2)?0 : (((o =ftell (f))>=8)?(u =(p*)malloc(o))?b(0)?0:!fread(u,o,1,f):0:0)?0: D():0 ;if(!u)c(c(" bad\40input "));if(e(z[2],"rb" )){for(n=-1;256> i;n[i++] =-1 )a[ i]=0; for(i=i=0; i<o&&(r =fgetc( f))>-1;i++)++a[r]?(r==n)?( ++I>7)?(n[ N]+1 )?0:(n [N ]=i-7):0: (N=R) (I=1):0;A =-1;N=o+1;for(i=33;i<127;i++ )( n[i ]+ 1&&N>a[i])? N= a [A=i] :0;B(i=I=0);if(A+1)for(N=n[A]; I< 8&& (R =fgetc(f ))> -1&& i <o ;i++)(i<n i>n+7)?(r==a)?((*w[i ] =u [i])?1:(*w[i]= 46))?(a [I++]=i):0:0:0;D();}if(I<1)c(C( " bad\40la" "yout "))for(i =0;256>(R= i);n[i++]=r)for(a=8; A >0;A --) R = ( (R&1)==0)?(unsigned int)r>>(01):((unsigned /*kero Q',KSS */)R>> 1)^ 0xedb88320;m=a[I-1];a[I ]=(m <N)?(m= N+8): ++ m;for(i=00;i<i;e[i++]=0){ v=w [i]+1;for(r =33;127 >R;R++)if(R-47&&R-92 && R-(_)* w[i])*( v++)= (p)r;*v=0;}for(sprintf /*'_ G*/ (*w+1, "%0" "8x",x(R=time(i=0),m,o)^~ 0) ;i< 8;++ i)u [N+ i]=*(*w+i+1);for(*k=x(~ 0,i=0,*a);i>- 1; ){for (A=i;A<I;A++){u[+a [ A] ]=w[a ][e[a]] ; k [A+1]=x (k[a],a[a],a[a+1] );}if (R==k[I]) c( (E(z[3 ],"wb+"))?fwrite( /* */ u,o,1,f)?d () C(" \n OK."):0 :C( " \n WriteError" )) for (i =+I- 1 ;i >-1?!w[i][++ e[+ i]]:0; ) for( A=+i--; A<I;e[A++] =0); (i <I-4 )?putchar ((_ ) 46) fflush /*',*/ ( stdout ): 0& 0;}c(C (" \n fail") ) /* dp' / dp pd ' ' zc */ } Από το Obfuscated C Contest http://www.ioccc.org/ 26

Η συνάρτηση στη C 27 Συνάρτηση: Η κύρια µονάδα υποπρογράµµατος Μπορεί να βασίζεται σε άλλες συναρτήσεις, που µε τη σειρά τους µπορεί να βασίζονται σε άλλες συναρτήσεις κλπ. Η συνάρτηση main (κυρίως συνάρτηση) καλείται από το περιβάλλον εκτέλεσης (λειτουργικό) για να αρχίσει η εκτέλεση του προγράµµατος Ανεξάρτητα από το αν το πρόγραµµα έχει και άλλες συναρτήσεις. Αρχικά θα εστιάσουµε σε προγράµµατα που αποτελούνται µόνο από την main.

Η συνάρτηση main() 28 Σχόλια /* Αρχείο hello.c. Εµφανίζει στην οθόνη το µήνυµα hello world */ #include <stdio.h> int main(int argc, char* argv[]) { Συµπερίληψη δηλώσεων εξωτερικών συναρτήσεων Ορίσµατα συνάρτησης Επικεφαλίδα συνάρτησης } printf("hello world\n"); return(0); Σώµα (εντολές)

Μεταγλώττιση / Εκτέλεση στο Linux το όνοµα του προγράµµατος µεταγλώτισης (compiler) Δείξε και τις προειδοποιήσεις (όχι µόνο τα σφάλµατα) Πρόσθεσε πληροφορίες για τον αποσφαλµατωτή το όνοµα του αρχείου µε τον κώδικα C το όνοµα του αρχείου όπου θα αποθηκευτεί ο κώδικας µηχανής 29 >gcc Wall g myprog.c o myprog<enter> > ακολουθεί το όνοµα του αρχείου >./myprog<enter> όπου πρέπει να αποθηκευτεί το hello world αποτέλεσµα (κώδικας µηχανής), µόνο > αν η µετάφραση είναι επιτυχής

Ένα Ακόµα Παράδειγµα #include <stdio.h> int main(int argc, char* argv[]) { } putchar('h'); putchar('e'); putchar('l'); putchar('l'); putchar('o'); putchar(' '); putchar('w'); putchar('o'); putchar('r'); putchar('l'); putchar('d'); putchar('\n'); >./myprog<enter> hello world > 30

Κι Άλλο Παράδειγµα #include <stdio.h> int main(int argc, char* argv[]) { } putchar('5'); putchar(' '); putchar('+'); putchar(' '); putchar('2'); putchar(' '); putchar('='); putchar('='); putchar(' '); putchar('9'); putchar('\n'); >./myprog<enter> 5 + 2 == 9 > 31