ΗΜΜΥ 101 - courses.softlab.ntua.gr

Download Report

Transcript ΗΜΜΥ 101 - courses.softlab.ntua.gr

ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΕΣ
ΤΕΧΝΙΚΕΣ
ΚΩΣΤΑΣ ΚΟΝΤΟΓΙΑΝΝΗΣ
ΓΙΑΝΝΗΣ ΜΑΪΣΤΡΟΣ
ΑΝΔΡΕΑΣ ΣΤΑΦΥΛΟΠΑΤΗΣ
ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ
ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ
Ε.Μ.Π.
1
ΚΑΛΩΣ ΗΡΘΑΤΕ !
• Καλώς ήρθατε στο Μάθημα «Προγραμματιστικές
Τεχνικές».
• Αυτό το Μάθημα ουσιαστικά εισάγει έννοιες σχετικές με
την σχεδίαση και την υλοποίηση λογισμικού με τη χρήση
της γλώσσας προγραμματισμού C και βασικών δομών
δεδομένων.
• Σας ευχόμαστε ολόψυχα καλό και ακαδημαϊκά αποδοτικό
εξάμηνο.
2
ΑΝΤΙΚΕΙΜΕΝΟ ΤΟΥ ΜΑΘΗΜΑΤΟΣ (1)
• Καλύτερη γνώση και χρήση της γλώσσας C
• Εισαγωγή στο Δομημένο Προγραμματισμό
– Έννοιες που χρησιμοποιούνται για τη σχεδίαση
αλγόριθμων και προγραμμάτων
– Βασικές δομές (κατασκευές) για την υλοποίηση
προγραμμάτων
– Απόκτηση εμπειρίας στο προγραμματισμό απλών
εφαρμογών
3
ΑΝΤΙΚΕΙΜΕΝΟ ΤΟΥ ΜΑΘΗΜΑΤΟΣ (2)
Εβδομάδα 1
Χαρακτηριστικά της C, Τελεστές, Έλεγχος Ροής
Εβδομάδα 2
Δομή Προγράμματος, ΑΤΔ, Μονοδιάστατοι Πίνακες Παραδείγματα
Εβδομάδα 3
Εισαγωγή στη Πολυπλοκότητα Προγραμμάτων
Εβδομάδα 4
Πολυδιάστατοι Πίνακες, Δομές, Ενώσεις
Εβδομάδα 5
Δείκτες, Πίνακες και Δείκτες, Δείκτες σε Συναρτήσεις
Εβδομάδα 6
Στοίβες, Συνδεδεμένες Λίστες, Ουρές
Εβδομάδα 7
Διπλά Συνδεδεμένες Λίστες, Κυκλικές Λίστες, Ταξινομημένες Λίστες
Εβδομάδα 8
Δένδρα, Δυαδικά Δένδρα, Διάσχιση Δυαδικών Δένδρων
Εβδομάδα 9
Δυαδικά Δένδρα Αναζήτησης, Δένδρα AVL
Εβδομάδα 10
Πίνακες κατακερματισμού
Εβδομάδα 11
Αλγόριθμοι Ταξινόμησης
Εβδομάδα 12
Γράφοι
Εβδομάδα 13
Επανάληψη
4
ΣΤΟΙΧΕΙΑ ΓΙΑ ΤΟ ΜΑΘΗΜΑ (1)
• Το πρόγραμμα:
– Διαλέξεις (Στo Α4 – Γενικές Έδρες)
• Τρίτη
15:00 – 18:00 (CVETKOVIC, I. - ΜΑΣΟΥΡΗΣ, Η)
• Παρασκευή 12:45 – 16:00 (ΜΑΣΟΥΡΟΣ, Δ.. - ΨΥΛΛΑ, Ι. )
– Εργαστήρια (Στο PC Lab – Αίθουσες 1, 2, και 3)
• Τρίτη
12:45 – 14:30 (CVETKOVIC, I. - ΚΕΝΤΡΩΤΗΣ, Κ.)
• Πέμπτη
10:45 – 12:30 (ΚΙΝΑΛΗΣ, Σ - ΠΑΠΑΠΟΣΤΟΛΟΥ, Α.)
• Παρασκευή 08:45 – 10:30 (ΠΑΠΑΣΤΑΘΗΣ, Ι.Α. - ΨΥΛΛΑ, Ι.
5
ΣΤΟΙΧΕΙΑ ΓΙΑ ΤΟ ΜΑΘΗΜΑ (2)
• Βοηθοί
– Θα ανακοινωθούν
6
ΣΤΟΙΧΕΙΑ ΓΙΑ ΤΟ ΜΑΘΗΜΑ (3)
•
Βιβλία
–
[1] B. Kernighan and D. Ritchie, "Η Γλώσσα Προγραμματισμού C", σε
Ελληνική Μετάφραση, Εκδόσεις Κλειδάριθμος, 1990
–
[2] Ν. Μισυρλής, "Δομές Δεδομένων", Ιδιωτική Έκδοση
–
Σχετικά με τη διανομή των συγγραμμάτων θα ακολουθήσει ανακοίνωση από
τη διοίκηση της Σχολής και τους διδάσκοντες.
•
Σημειώσεις και άλλο υλικό γιά το μάθημα
–
–
•
Σημειώσεις θα παρουσιάζονται σταδιακά στην Ιστοσελίδα του
μαθήματος http://courses.softlab.ntua.gr/progtech
Ασκήσεις, Φροντιστηριακό υλικό, και Ανακοινώσεις θα
παρουσιάζονται επίσης στην παραπάνω ιστοσελίδα
Λογαριασμοί για το υπολογιστικό σύστημα (για όσους δεν
έχουν)
–
Από το Υπολογιστικό Κέντρο με την ταυτότητά σας και τον αριθμό
Μητρώου του ΗΜΜΥ. Λεπτομέρειες θα ανακοινωθούν και στην
ιστοσελίδα του μαθήματος
7
ΣΤΟΙΧΕΙΑ ΓΙΑ ΤΟ ΜΑΘΗΜΑ (4)
• Η βαθμολογία θα υπολογίζεται ως εξής:
– Τελικό διαγώνισμα (80%)
– Εξέταση στις εργαστηριακές ασκήσεις (30%)
• Σειρά Ασκήσεων Α & Β: Προπαρασκευαστικές χωρίς εξέταση
• Σειρά Ασκήσεων Γ (15%)
• Σειρά Ασκήσεων Δ (15%)
– Όσοι δεν εξετασθούν σε ασκήσεις θα έχουν τελικό διαγώνισμα 80%.
– Όσοι φοιτητές επιλέξουν να εξεταστούν στις ασκήσεις έχουν συντελεστή
ασκήσεων 30% και συντελεστή για τελικό διαγώνισμα 80%.
8
ΕΠΙΚΟΙΝΩΝΙΑ
Κώστας Κοντογιάννης
[email protected]
Γιάννης Μαΐστρος
[email protected]
Ανδρέας-Γεώργιος Σταφυλοπάτης
[email protected]
Ας Αρχίσουμε λοιπόν......
9
Μάθημα 10
Χαρακτηριστικά της C, Τελεστές,
Έλεγχος Ροής
10
Η ιστορία της C
1969-1973 AT&T Bell Labs, Dennis Ritchie
1978
“The C Programming Language”
K&R: Kernighan & Ritchie
1983
Σύσταση ANSI Standardization
Committee X3J11
1989-1990 Αποδοχή ANSI/ISO Standard
 ANSI C
1990-1999 Αναθεώρηση του standard υπό
εξέλιξη — C9X
 C99
11
Χαρακτηριστικά της C (i)
• Γλώσσα προστακτικού προγραμματισμού
• Γλώσσα μετρίου επιπέδου
• Οικονομία στην έκφραση
(λιτή και περιεκτική)
• Σχετικά χαλαρό σύστημα τύπων
• Φιλοσοφία: ο προγραμματιστής έχει πλήρη
έλεγχο και ευθύνεται για τα σφάλματά του
12
Χαρακτηριστικά της C (ii)
• Ιδιαίτερα δημοφιλής στην πράξη
• Έχει χρησιμοποιηθεί για τον
προγραμματισμό ευρέως φάσματος
συστημάτων και εφαρμογών
• Έχει χρησιμοποιηθεί ως βάση για
πληθώρα άλλων γλωσσών: C++, Java
13
Σχηματική Παρουσίαση της
Διαδικασίας Προγραμματισμού
Χρήση τεχνικών επίλυσης
προβλημάτων π.χ. Top-down,
Bottom-up
Γνώση της περιοχής
Του Προβλήματος/
Domain Knowledge
Προγραμματιστής/
Αναλυτής
Ορισμός του
Προβλήματος/
Problem Definition
Ανάλυση
Αλγόριθμος
Επίλυσης
Προβλήματος
Αλγόριθμος/
Algorithm
Προγραμματισμός
Πηγαίο πρόγραμμα (Source
Code) σε κάποια Γλώσσα
Προγραμματισμού π.χ. C
Πηγαίο
Πρόγραμμα
14
ΚΥΚΛΟΣ ΜΕΤΑΦΡΑΣΕΩΝ
Μετάφραση/
Compilation
Πηγαίο Πρόγραμμα
Ενοποιημένη
Συμβολική Γλώσσα
Ενοποίηση/
Linking
Πρόγραμμα σε
Συμβολική Γλώσσα
Βελτιστοποίηση/
Optimization
Βελτιστοποιημένη
Συμβολική Γλώσσα
Συμβολομετάφραση/
Assembler
Γλώσσα Μηχανής
Φόρτωση/
Loading
Η/Υ
15
ΤΙ ΕΙΝΑΙ ΟΜΩΣ ΕΝΑΣ ΑΛΓΟΡΙΘΜΟΣ;
• Αλγόριθμος (Algorithm) είναι μία ακολουθία οδηγιών (εντολών) οι
οποίες επιλύουν ένα συγκεκριμένο πρόβλημα
• Μπορούμε να έχουμε πολλούς διαφορετικούς αλγόριθμους για την
επίλυση ενός προβλήματος
• Η επιλογή του πιο κατάλληλου αλγόριθμου μπορεί να γίνει με βάση
την πολυπλοκότητα του (time complexity), την χρήση της μνήμης
που απαιτεί (space complexity), τήν δυνατότητα παραμετροποίησής
του (parameterization), την αξιοπιστία του (reliability), την
δυνατότητα συνέχισης της λειτουργίας του σε ακραίες συνθήκες
(robustness) κλπ.
• Ένας αλγόριθμος έχει ένα ή περισσότερα σημεία εισόδου (πρώτη
εντολή να εκτελεσθεί στην ακολουθία – συνήθως όμως έχει ένα
σημείο εισόδου), και εμπεριέχει κάποιες συνθήκες που εγγυούνται
την λήξη της λειτουργίας του (τελευταία εντολή)
16
ΑΛΓΟΡΙΘΜΟΙ ΚΑΙ ΥΛΟΠΟΙΗΣΗ
ΠΡΟΓΡΑΜΜΑΤΟΣ
• Έχουμε μιλήσει για τις δύο βασικές μεθόδους ανάλυσης
ενός προβλήματος (top-down και bottom-up). Όμως πώς
αυτές συσχετίζονται με την σχεδίαση προγραμμάτων;
• Η αναλυτική μέθοδος (top down) σχετίζεται με την μέθοδο
σχεδίασης «διαίρει και βασίλευε» (divide and conquer),
όπου για να σχεδιάσουμε ένα πρόγραμμα το διαιρούμε σε
απλούστερα προγράμματα
• Η συνθετική μέθοδος (bottom up) σχετίζεται με την μέθοδο
σχεδίασης «σταδιακή εξέλιξη» (successive refinement),
όπου αρχίζουμε με ένα απλό πρόγραμμα και σταδιακά του
προσθέτουμε περισσότερες λεπτομέρειες μέχρι που όλες
οι περιπτώσεις που πρέπει να λυθούν έχουν λυθεί
17
ΨΕΥΔΟ-ΚΩΔΙΚΑΣ
(pseudocode)
• Όταν είμαστε έτοιμοι να παρουσιάσουμε ένα αλγόριθμο
(πρόγραμμα) μπορούμε να χρησιμοποιήσουμε ψευδοκώδικα αντί
μια γλώσσα προγραμματισμού
• Αυτό μας δίνει το πλεονέκτημα ότι η σχεδίαση του αλγόριθμου δεν
επηρεάζεται από την γλώσσα που θα χρησιμοποιηθεί οπότε
διαχωρίζονται οι φάσεις σχεδίασης προγράμματος (design) από την
υλοποίηση του προγράμματος (implementation)
• Ο ψευδοκώδικας είναι ένα μαθηματικό μοντέλο του αλγόριθμου,
εκφραζόμενο σε μια μορφή που θυμίζει (αλλά δεν είναι) γλώσσα
προγραμματισμού
• Η ιδέα είναι ότι από τον ψευδοκώδικα είναι απλή η διαδικασία της
υλοποίησης (αναλογία μεταξύ Αρχιτέκτονα που σχεδιάζει και
Εργολάβου που ακολουθεί πιστά το σχέδιο για την ανέγερση μιας
οικοδομής)
18
ΠΑΡΑΔΕΙΓΜΑ ΨΕΥΔΟΚΩΔΙΚΑ
•
Μία πιθανή μορφή ψευδοκώδικα είναι:
let name1, name2 (ορισμός μεταβλητών)
get name1, name2 (διάβασε τις μεταβλητές name1, name2
από κάποια μονάδα εισόδου)
record name1, name2 (αποθήκευσε τις τρέχουσες τιμές των μεταβλητών name1,
name2
σε κάποια εξωτερική μονάδα – π.χ. Δίσκο)
name1  έκφραση (αποθήκευσε την τιμή της έκφρασης
στη μεταβλητή name1
if expression then
A
else
B
endif
19
ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ
•
•
Προγραμματισμός δεν είναι μόνο η υλοποίηση ενός αλγόριθμου σε
μία κατάλληλη για το πρόβλημα γλώσσα (C, C++, Java, Pascal,
Fortran, Cobol κλπ.)
Ο Προγραμματισμός εμπεριέχει:
1. Την ανάλυση των απαιτήσεων του προβλήματος
α. Λειτουργικές απαιτήσεις (functional requirements analysis)
β. Μη-λειτουργικές απαιτήσεις (non-functional requirements
analysis)
..................Επιλυση Προβλήματος .............
2. Τη σχεδίαση τού προγράμματος (θεωρούμε ότι ήδη έχουμε
κάνει την επιλογή – σχεδίαση του κατάλληλου αλγόριθμου
όπως είπαμε στη διαφάνεια σχετικά με την επίλυση ενός
προβλήματος (design specifications)
3. Την υλοποίηση του προγράμματος σε μία κατάλληλη
γλώσσα για το πρόβλημα (implementation)
4. Τον έλεγχο του προγράμματος ώστε να πιστοποιηθεί η ορθή
λειτουργία του σε σχέση με τις λειτουργικές και μηλειτουργικές απαιτήσεις (testing)
5. Τη συντήρηση του για την διόρθωση λαθών, προσθήκη νέων
λειτουργιών, και την προσαρμογή του σε άλλα συστήματα 20
(maintenance)
ΠΡΟΓΡΑΜΜΑΤΑ ΚΑΙ ΒΙΒΛΙΟΘΗΚΕΣ
• Μία τυπική εφαρμογή αποτελείται:
– Από το πηγαίο κώδικα που κατά το πλείστον (ή καθ’ ολοκληρία)
υλοποιεί ένα αλγόριθμό της λύσης του προβλήματος
– Από κώδικα που υποστηρίζει γενικές λειτουργίες που ίσως
χρειάζεται ο πηγαίος κώδικας (π.χ. Εκτύπωση, τριγωνομετρικές
συναρτήσεις κλπ.)
– Αυτός ο κώδικας υποστήριξης ονομάζεται βιβλιοθήκη (library)
– Οι βιβλιοθήκες που χρειάζονται και ο πηγαίος κώδικας
μεταφράζονται (compiled) και ενοποιούνται (linked) σε ένα
συμβολικό πρόγραμμα, το οποίο με τη σειρά του
συμβολομεταφράζεται σε γλώσσα μηχανής
– Υπάρχουν ευτυχώς πολλές βιβλιοθήκες για διάφορες
λειτουργίες, οπότε δεν χρειάζεται να υλοποιήσουμε κώδικα γι’
αυτές τις λειτουργίες. Όποτε τις χρειαζόμαστε, απλά τις
21
εισάγουμε (include) στο πηγαίο κώδικά μας.
ΣΧΗΜΑΤΙΚΗ ΠΑΡΟΥΣΙΑΣΗ
LIB 1
LIB 2
LIB 3
Include
ΠΗΓΑΙΟΣ ΚΩΔΙΚΑΣ
ΕΦΑΡΜΟΓΗΣ
Μετάφραση &
Συμβολομεταφραση
ΓΛΩΣΣΑ ΜΗΧΑΝΗΣ
22
Δομή του προγράμματος
• Το πρόγραμμα αποτελείται από:
– Τη συνάρτηση main
– Πιθανόν από μια ή περισσότερες άλλες συναρτήσεις
– Μια ή περισσότερες καθολικές (γενικές) μεταβλητές
• Διαφορές από την Pascal:
– κύριο πρόγραμμα, διαδικασίες και συναρτήσεις δε
διαφοροποιούνται
– το κύριο πρόγραμμα ονομάζεται main
– οι διαδικασίες έχουν αποτέλεσμα void
– όλες οι συναρτήσεις στο ίδιο επίπεδο
– δεν επιτρέπονται φωλιασμένες συναρτήσεις
– μόνο πέρασμα παραμέτρων ατά τιμή (call by value)
– Το πέρασμα κατά αναφορά επιτυγχάνεται με τη χρήση δεικτών
23
ΠΑΡΑΔΕΙΓΜΑ
• Ένα απλό πρόγραμμα της C:
Εντολή
Προ-επεξεργασίας
Εντολή εισαγωγής βιβλιοθήκης για
χρήση συναρτήσεων είσοδου/έξοδου
Βιβλιοθήκη
#include <stdio.h>
Η αρχική συνάρτηση main
void main()
{
Τύπος
printf(“Hello World.\n”);
Επιστροφής
της main
}
Η συνάρτηση βιβλιοθήκης printf που
έχει ορισθεί στη βιβλιοθήκη stdio και
επιτρέπει την εκτύπωση στην οθόνη
(standard output)
24
AKOMH ENA ΠΑΡΑΔΕΙΓΜΑ
• Κι’άλλο ένα απλό πρόγραμμα της C με
επιστροφή τιμής από τη συνάρτηση main:
#include <stdio.h>
int main()
{
printf(“Hello World.\n”);
return(1);
}
25
ΜΕΤΑΦΡΑΣΗ ΚΑΙ ΕΝΟΠΟΙΗΣΗ
ΜΕ ΤΗ ΠΑΡΟΥΣΙΑ ΒΙΒΛΙΟΘΗΚΗΣ
•
Για να μεταφράσουμε πηγαίο κώδικα της C σε Γλώσσα Μηχανής
υπό τη παρουσία βιβλιοθηκών ο compiler εκτελεί τα παρακάτω
βήματα.
1.
Προ-επεξεργασία: Το πηγαίο πρόγραμμα πρώτα πηγαίνει σε μία
εφαρμογή (που έρχεται με τον compiler) και ονομάζεται προεπεξεργαστής (pre-processor). Ο προ-επεξεργαστής είναι κάτι σαν
επεξεργαστής κειμένου (προσθέτει,αφαιρεί, και μεταβάλει το
«κείμενο» του πηγαίου προγράμματος (source code). Όλες οι εντολές
που είναι να εκτελεσθούν απο τον προ-επεξεργαστή ξεκινούν με το
σύμβολο #. Συγκεκριμένα η #include<stdio.h> παίρνει το πηγάιο
κώδικα της stdio.h και τον εισάγει στη θέση της εντολής
#include<stdio.h> . Ουσιαστικά μετά την προεπεξεργασία δέν
υπάρχουν πλέον εντολές που ξεκινούν με #.
2.
Μετάφραση και Συμβολομετάφραση. Tα βήματα αυτά παράγουν
αντικειμενικό κώδικα – object code (σχεδόν γλώσσα μηχανής)
3.
Εννοποίηση (linking). Το βήμα αυτό εννοποιεί αντικειμενικό κώδικα
(πιθανόν απο διαφορετικά αρχεία πηγαίου κώδικα) σε ένα εκτελέσιμο
αρχείο (π.χ. .exe) σε καθαρή γλώσσα μηχανής.
26
ΓΕΝΙΚΗ ΜΟΡΦΗ ΑΠΛΟΥ
ΠΡΟΓΡΑΜΜΑΤΟΣ C
directives
main()
{
statements
}
#include <stdio.h>
void main()
{
printf(“Hello World.\n”);
}
27
DIRECTIVES
•
Είναι εντολές για τον προ-επεξεργαστή
•
Χρησιμοποιούνται συνήθως για τις παρακάτω περιπτώσεις:
– Να εισάγουν βιβλιοθήκες π.χ.
• #include <stdio.h>
• #include “myBestLibrary.h”
– Να ορίσουν σταθερές π.χ.
• #define FREEZING_POINT_CELCIUS 0.0
• #define FREEZING_POINT_FARHENEIT 32.0
• #
– Να εισάγουν πηγαίο κώδικα ανάλογα με συγκεκριμένες συνθήκες που
υπολογίζονται από τον προ-επεξεργαστή π.χ.
• #define DEBUG1
…………………….
…………………….
#if DEBUG
printf(“To print the values of %d\n”, i)
#endif
28
ΣΥΝΑΡΤΗΣΕΙΣ
•
Οι συναρτήσεις είναι σαν τις ρουτίνες/υπο-ρουτίνες (routines, subroutines, procedures)
σε άλλες γλώσσες προγραμματισμού.
•
Ουσιαστικά είναι τα δομικά υλικά ενός προγράμματος. Οι συναρτήσεις πρέπει το κατά το
δυνατόν να παράγουν όσο το δυνατόν πιο συγκεκριμένη λειτουργια (high cohesion) καί
να εξαρτώνται όσο το δυνατόν λιγότερο η μία από την άλλη (low coupling).
•
Υπάρχουν δύο μεγάλες κατηγορίες συναρτήσεων:
–
–
Συναρτήσεις βιβλιοθήκης – library functions (είναι κομμάτι της βιβλιοθήκης)
Συναρτήσεις εφαρμογών – application functions (ορίζονται από τον προγραμματιστή)
•
Οι συναρτήσεις της C αποτελούνται από εντολές
•
Μία συνάρτηση μπορεί να υπολογίζει ένα αποτέλεσμα καί να το επιστρέφει στο σημείο
της κλήσης (αλλά αυτό δεν είναι πάντα απαραίτητο) π.χ.
Το κύριο
πρόγραμμα
void main() {
int i = 0;
………
………
i = addOne(i)
………;
}
int addOne(int j)
{
j = j+1;
return (j);
}
Ορισμός της
συνάρτησης
29
Η ΣΥΝΑΡΤΗΣΗ main
• Η συνάρτηση main είναι μία ειδική συνάρτηση
που πρέπει να έχει ορισθεί σε κάθε C
πρόγραμμα
• Η συνάρτηση main είναι η πρώτη συνάρτηση
που καλείται σε ένα C πρόγραμμα. Η κλήση
γίνεται αυτόματα από το λειτουργικό σύστημα
όταν το πρόγραμμα αρχίζει να «τρέχει».
• Η συνάρτηση main μπορεί να επιστρέφει, ή να
μην επιστρέφει κάποιο αποτέλεσμα
30
ΕΝΤΟΛΕΣ
• Οι εντολές ορίζουν συγκεκριμένες λειτουργίες τις οποίες
εκτελεί ένα πρόγραμμα σαν μέρος του αλγόριθμου που
υλοποιεί
• Υπάρχουν πολλά είδη εντολών όπως οι:
–
–
–
–
Ανάθεση (assignment statement)
Εντολές συνθήκης (conditional statements)
Εντολές βρόγχου - επανάληψης (iterative statements)
Εντολές έκφρασης (expression statements)
• Οι εντολές τελειώνουν πάντα με υποδιαστολή (;) –
semicolon – ενώ τα directives έχουν πάντα μήκος μία
γραμμή
31
ΣΧΟΛΙΑ
•
Ένα καλό πρόγραμμα δεν είναι μόνο συντακτικά σωστό, γρήγορο, καί συμβατό με τις
απαιτήσεις του χρήστη, αλλά και τεκμηριωμένο με σχόλια
•
Τα σχόλια δεν μεταφράζονται από τον compiler ο οποίος τα θεωρεί σαν κενούς
χαρακτήρες
•
•
Τα σχόλια στη C ορίζονται ανάμεσα στά σύμβολα /* καί */ π.χ.
/* this is a comment in C */
Βασική αρχή είναι να έχουμε ένα ευπαρουσίαστο καί εύκολο να διαβαστεί πρόγραμμα
(διευκολύνει τη συντήρησή του) π.χ.
/**********************************************************
* Name: main.c
*
* Author: John Smith
*
* Purpose: Translate Celcius degrees to Farheneit *
* Date/Version: 12/12/02 v1.1
*
************************************************************/
•
Το παρακάτω είναι λάθος
/* Nested /* comments */ are wrong! */
32
ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ (απλοί)
• Ακέραιοι αριθμοί
int
char
• Καθορισμός προσήμανσης
signed
unsigned
• Καθορισμός μεγέθους
short
long
• Αριθμοί κινητής υποδιαστολής
float
double
33
ΠΙΝΑΚΑΣ ΑΠΛΩΝ ΤΥΠΩΝ
ΔΕΔΟΜΕΝΩΝ
char , signed char , unsigned char
signed short int , unsigned short int
signed int , unsigned int
signed long int , unsigned long int
float
double
long double
•Με κόκκινο χρώμα όσα μπορούν να παραλειφθούν.
34
ΜΕΤΑΤΡΟΠΗ ΤΥΠΩΝ ΚΑΤΑ ΤΗΝ
ΑΝΑΘΕΣΗ
• Οι μετατροπές τύπων συμβαίνουν και με τον τελεστή ανάθεσης π.χ.
Α=Β
• Η έκφραση στα δεξιά του τελεστή (=) προβιβάζεται στον τύπο της
μεταβλητής στα αριστερά του τελεστή ανάθεσης
• Αυτό όμως μπορεί να προκαλέσει προβλήματα όπως αναφέρθηκε
προηγουμένως αν η μεταβλητή είναι «χαμηλότερου» τύπου.
• Παράδειγμα.
Εάν d είναι double, και i είναι int τότε η ανάθεση d = i; Θα
προκαλέσει την μετατροπή της ακέραιας μεταβλητής i σε τύπο
double ώστε η ανάθεση να επιτευχθεί. Όμως η ανάθεση i = d θα
προκαλέσει τον υποβιβασμό της double μεταβλητής d σε τύπο int
οπότε το δεκαδικό μέρος της d θα χαθεί.
35
ΣΦΑΛΜΑΤΑ ΥΠΟΛΟΓΙΣΜΩΝ ΣΕ
ΕΚΦΡΑΣΕΙΣ
• Σφάλματα στον υπολογισμό αριθμητικών εκφράσεων μπορούν να
παρουσιασθούν λόγω
– Χρήσης περιορισμένου αριθμού ψηφίων
– Χρήσης τεχνικών προσέγγισης της τιμής μίας συνάρτησης ή έκφρασης
αντί του άμεσου υπολογισμού της τιμής της
Παράδειγμα
Η πρόσθεση των αριθμών 563.8, 631.9, και 321.6 όταν είμαστε
περιορισμένοι σε τέσσερα ψηφία έχει σαν αποτέλεσμα 1518, και
αποτέλεσμα 1517! όταν προσθέσουμε 321.6, 631.9, και 563.8 (η
πρόσθεση γίνεται ανά δύο αριθμούς)
• Από το παράδειγμα βλέπουμε ότι η διάταξη των όρων του
αθροίσματος επηρεάζει το τελικό αποτέλεσμα. Η σωστή απάντηση
είναι 1517.3. Το αποτέλεσμα 1518 έχει απόλυτο σφάλμα 0.7, και
σχετικό σφάλμα 0.7/1517.3 = 0.00046
36
ΑΜΕΣΟ ΚΑΙ ΣΧΕΤΙΚΟ ΣΦΑΛΜΑ
• Εάν ορίσουμε:
Α: την σωστή τιμή μίας έκφρασης ή
συνάρτησης
Α:την προσεγγιστική τιμή
Τότε:
αΑ = Α – Α είναι το απόλυτο σφάλμα
εΑ = αΑ/Α είναι το σχετικό σφάλμα
37
ΑΜΕΣΗ ΜΕΤΑΤΡΟΠΗ (cast)
•
•
Εκτός από τις αυτόματες μετατροπές η C επιτρέπει στον χρήστη να αλλαξει
άμεσα τον τύπο μιάς μεταβλητής ή μίας έκφρασης με την χρήση του τελεστή
cast.
Η σύνταξη της εντολής που επιτρέπει την αλλαγή του τύπου απο τον
χρήστη είναι:
(Τύπος) Έκφραση
όπου Τύπος είναι κάποιος από τους τύπους πυ έχουν ορισθεί σέ ένα
πρόγραμμα της C και Έκφραση οποιαδήποτε έκφραση της C.
• Η αλλαγή του τύπου με την παραπάνω εντολή έχει την ίδια προτεραιότητα
με τους άλλους μοναδιαίους τελεστές.
•
Η συνηθέστερη χρήση του τελεστή σε αριθμητικές εκφράσεις είναι για την
αποφυγή απωλειών κλασματικών μερών (π.χ. σε μια διαίρεση ακεραίων),
καί την αποφυγή υποβιβασμού τύπου λόγω ανάθεσης (π.χ. (double) i = d)
38
ΜΕΤΑΒΛΗΤΕΣ
•
•
Οι μεταβλητές σ’ ένα πρόγραμμα επιτρέπουν την αποθήκευση
δεδομένων και την προσπέλαση στη δυναμική (RAM) και στατική
(files) μνήμη του Η/Υ
Στη C οι μεταβλητές πρέπει:
1.
2.
3.
4.
•
Να έχουν ορισθεί σε κάποια εντολή δήλωσης, συνήθως στην αρχή
ενός αρχείου πηγαίου κώδικα, ή στην αρχή μιας συνάρτησης
Να έχουν συγκεκριμένο τύπο
Να έχουν μία αρχική τιμή πριν χρησιμοποιηθούν για πρώτη φορά
Τα δεδομένα (τιμές) που αποθηκεύονται στη μεταβλητή πρέπει να
είναι του ίδιου ή συμβατού τύπου με αυτού της μεταβλητής
Γι’ αρχή θα θεωρήσουμε δύο τύπους int καί float
39
ΟΝΟΜΑΤΑ ΜΕΤΑΒΛΗΤΩΝ
• Τα ονόματα των μεταβλητών σ΄ένα πρόγραμμα C πρέπει
να αρχίζουν με γράμμα καί μπορουν να περιέχουν
αλφαριθμητικούς χαρακτήρες.
• Επίσης δεν μπορούν να περιέχουν ειδικούς χαρακτήρες
όπως #, &, * κλπ.
• Υπάρχουν συγκεκριμένα ονόματα τα οποία αναφέρονται
σε λέξεις κλειδιά της C
•
Τα ονόματα των μεταβλητών είναι ευαισθητα στην δομή
τους (Κεφαλαίοι, μικροί χαρακτήρες) π.χ. AVariable ≠
Avariable
40
ΛΕΞΕΙΣ ΚΛΕΙΔΙΑ
auto
double
int
struct
break
else
long
switch
case
enum
register
typedef
char
extern
return
union
const
float
short
unsigned
continue
for
Signed
void
default
goto
sizeof
volatile
do
if
static
while
Οι παραπάνω λέξεις κλειδιά δεν μπορούν να χρησιμοποιηθούν σαν ονόματα
μεταβλητών του προγράμματος
41
ΕΝΤΟΛΕΣ ΟΡΙΣΜΟΥ
ΜΕΤΑΒΛΗΤΩΝ
•
Για να ορίσουμε μια μεταβλητή πρέπει πρώτα να ορίσουμε τον τύπο και μετά το
όνομα της μεταβλητής π.χ.
int i;
int j = 50; /* ορισμός ακέραιας μεταβλητής *
* με αρχική τιμή
*/
•
Η γενική μορφή είναι
τύπος <ονομαΜεταβλητής>
•
Οπότε στο κύριο πρόγραμμα main η γενική μορφή είναι:
type main()
{
declarations
statements
}
int main()
{
int i = 0;
i = i +1;
return (i);
}
42
ΟΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ
int x;
int x, y, z;
double r;
unsigned long abc;
• Αρχικοποίηση
int x = 1;
int x, y = 0, z = 2;
double r = 1.87;
unsigned long abc = 42000000;
43
ΣΤΑΘΕΡΕΣ
(i)
• Ακέραιες
42
0
-1
42L
42UL
037
0x1f
42U
δεκαδικές
οκταδικές
δεκαεξαδικές
unsigned & long
• Κινητής υποδιαστολής
42.0
-1.3
2.99e8
42.0F
42.0L
δεκαδικές
με δύναμη του 10
float & long double
44
ΣΤΑΘΕΡΕΣ
(ii)
• Χαρακτήρα
'a'
'0'
'$'
• Ειδικοί χαρακτήρες
\n
\'
\\
\t
\"
\0
\037
\x1f
αλλαγή γραμμής
απόστροφος
χαρακτήρας \ (backslash)
αλλαγή στήλης (tab)
εισαγωγικό
χαρακτήρας με ASCII = 0 (null)
» με ASCII = 37 (οκταδικό)
» με ASCII = 1f (δεκαεξαδικό)
45
ΣΤΑΘΕΡΕΣ
(iii)
• Συμβολοσειρές
"abc" "Hello world!\n"
"a\"51\""
• Δηλώσεις σταθερών
const int size = 10, num = 5;
const double pi = 3.14159;
const char newline = '\n';
46
ΚΑΛΕΣ ΠΡΑΚΤΙΚΕΣ ΟΝΟΜΑΣΙΑΣ
ΜΕΤΑΒΛΗΤΩΝ
• Χρήση μικρών χαρακτήρων (όχι κεφαλαίων)
• Μη χρήση μικρών και κεφαλαίων για δύο
διαφορετικές μεταβλητές π.χ one καί ONE
• Χρήση μνημονικών ονομάτων π.χ.
interestRate αντί ir
• Κατανοητή σύνταξη για πολύπλοκα ονόματα π.χ.
interestRate, ή interest_Rate αντί
interestrate
47
ΕΝΤΟΛΗ ΑΝΑΘΕΣΗΣ
• Οι μεταβλητές λαμβάνουν τιμές με συκγεκριμένη
εντολή ανάθεσης
• Η εντολή είναι της μορφής:
Μεταβλητή = έκφραση
όπου η έκφραση μπορεί να είναι μια σταθερή τιμή,
ένας μαθηματικός τύπος, το αποτέλεσμα κλήσης μιάς
συνάρτησης κλπ.
• Η έκφραση θα πρέπει να παράγει ένα
αποτέλεσμα που να είναι συμβατό με τον τύπο
της μεταβλητής
48
ΠΑΡΑΔΕΙΓΜΑ (1)
#include <stdio.h>
float main()
{
float height, base, area;
height = 10.2;
base = 3.6;
printf(“The height of the triangle is: %f\n”, height);
printf(“The base of the triangle is: %f\n”, base);
area = (height * base)/2;
printf(“The area of the triangle is %f\n”, area);
return (area);
}
49
ΠΑΡΑΔΕΙΓΜΑ (2)
#include <stdio.h>
float main()
{
float height, base, area;
printf(“Enter the height of the triangle:”);
scanf(“%f”, &height);
printf(“\n”);
printf(“Enter the base of the triangle”);
scanf(%f”, &base);
printf(“\n”);
printf(“The height of the triangle is: %f\n”, height);
printf(“The base of the triangle is: %f\n”, base);
area = (height * base)/2;
printf(“The area of the triangle is %f\n”, area);
return (area);
}
50
ΠΑΡΑΔΕΙΓΜΑ (3)
#include <stdio.h>
#define FREEZING_POINT_IN_FARHENHEIT 32
#define SCALE_FACTOR (5.0 / 9.0)
float main()
{
float farhenheit, celcius;
printf(“Enter the temperature in Farhenheit:”);
scanf(“%f”, &farhenheit);
celcius = (farhenheit – FREEZING_POINT_IN_FARHENHEIT) *
SCALE_FACTOR;
printf(“The celcius equivalent temperature of %f is %.1f \n”, farhenheit, celcius);
return (area);
}
51
ΕΚΤΥΠΩΣΗ ΜΕ ΤΗΝ ΣΥΝΑΡΤΗΣΗ
printf
• Απλοί τύποι δεδομένων
– int
– char
– double
– string
%d
%c
%lf
%s
• Παράδειγμα
printf("%d %lf %c %s\n",
42, 1.2, 'a', "hello");
• Αποτέλεσμα
42 1.200000 a hello
52
ΕΙΣΑΓΩΓΗ ΔΕΔΟΜΕΝΩΝ ΜΕ ΤΗ
ΣΥΝΑΡΤΗΣΗ scanf
• Ίδιοι κωδικοί για τους απλούς τύπους
• Παράδειγμα
int n;
double d;
char c;
scanf("%d", &n);
scanf("%lf", &d);
scanf("%c", &c);
53
ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΕΣ
ΤΕΧΝΙΚΕΣ
ΚΩΣΤΑΣ ΚΟΝΤΟΓΙΑΝΝΗΣ
ΓΙΑΝΝΗΣ ΜΑΪΣΤΡΟΣ
ΑΝΔΡΕΑΣ ΣΤΑΦΥΛΟΠΑΤΗΣ
ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ
ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ
Ε.Μ.Π.
54
ΠΑΡΑΔΕΙΓΜΑ
#include <stdio.h>
void main ()
{
int celcius;
double farenheit;
printf("Give the temperature (C): ");
scanf("%d", &celcius);
farenheit = 9.0 * celcius / 5.0 + 32.0;
printf(" %d degrees Celcius "
"is %lf degrees Farenheit\n",
celcius, farenheit);
}
55
ΤΕΛΕΣΤΕΣ ΚΑΙ ΕΚΦΡΑΣΕΙΣ (i)
• Αριθμητικοί τελεστές
+
-
*
/
%
• Σχεσιακοί τελεστές
==
!=
<
>
<=
>=
• Λογικοί τελεστές
&&
||
!
• π.χ.
λογική σύζευξη
λογική διάζευξη
λογική άρνηση
(και)
(ή)
(όχι)
(x % 3 != 0) && !finished
56
ΤΕΛΕΣΤΕΣ ΚΑΙ ΕΚΦΡΑΣΕΙΣ (ii)
• Τελεστές bit προς bit (bitwise)
&
|
^
~
σύζευξη bit
διάζευξη bit
αποκλειστική διάζευξη bit
άρνηση
<<
>>
ολίσθηση bit αριστερά
ολίσθηση bit δεξιά
(AND)
(OR)
(XOR)
(NOT)
• Παράδειγμα
(0x0101 & 0xfff0) << 2

0x0400
57
ΤΕΛΕΣΤΕΣ ΚΑΙ ΕΚΦΡΑΣΕΙΣ (iii)
• Τελεστής συνθήκης
(a >= b) ? a : b
• Τελεστής παράθεσης
a-1, b+5
• Τελεστές ανάθεσης
a = b+1
a += x
ισοδύναμο με
a = a + x
• Τελεστές αύξησης και μείωσης
a++
++a
a---a
τιμή πριν τη μεταβολή
τιμή μετά τη μεταβολή
58
EΝΤΟΛΕΣ ΚΑΙ ΕΛΕΓΧΟΣ ΡΟΗΣ (i)
• Κενή εντολή
;
• Εντολή ανάθεσης τιμής και εντολή έκφρασης
a = b+5;
a++;
a--;
• Εντολή if
if (a >= b)
max = a;
else
max = b;
59
EΝΤΟΛΕΣ ΚΑΙ ΕΛΕΓΧΟΣ ΡΟΗΣ (ii)
• Σύνθετη εντολή
(block)
if (a >= b) {
min = b;
max = a;
}
else {
max = b;
min = a;
}
• Ορισμός νέας εμβέλειας
για μεταβλητή
Είναι
if (x < y) {
int temp = x;
διαφορετικές
μεταβλητές!
x = y;
y = temp;
}
Γενικά είναι κακή επιλογή να ορίζουμε
μεταβλητές με το ίδιο όνομα αλλά με
διαφορετικές εμβέλειες σε ένα πρόγραμμα,
διότι δημιουργεί σύγχυση στη κατανόηση
60
του κώδικα και μειώνει τη συντηρησιμότητά του
EΝΤΟΛΕΣ ΚΑΙ ΕΛΕΓΧΟΣ ΡΟΗΣ (iii)
while (συνθήκη)
εντολή
• Εντολή while
int i = 1, s = 0;
while (i <= 10) {
s = s + i;
i++;
}
συνθήκη
ψευδής
αληθής
εντολή
61
EΝΤΟΛΕΣ ΚΑΙ ΕΛΕΓΧΟΣ ΡΟΗΣ (iv)
do
εντολή
while (συνθήκη);
εντολή
συνθήκη
ψευδής
•
Εντολή do-while
int i = 1, s = 0;
do
s += i++;
while (i <= 10);
•
αληθής
Εντολή do-while
int i = 1, s = 0;
do {
i=i+1;
s = s+i;
}
while (i <= 10);
62
EΝΤΟΛΕΣ ΚΑΙ ΕΛΕΓΧΟΣ ΡΟΗΣ (v)
for (αρχικοποίηση ;
συνθήκη ;
βήμα)
εντολή
αρχικοποίηση
συνθήκη
ψευδής
αληθής
εντολή
• Εντολή for
βήμα
int i, s;
for (i=1, s=0; i <= 10; i++)
s = s + i;
63
EΝΤΟΛΕΣ ΚΑΙ ΕΛΕΓΧΟΣ ΡΟΗΣ (vi)
• Εντολή break
int s;
for (i=0, s=0; i < 10; i++) {
int x;
scanf("%d", &x);
if (x < 0)
break;
s += x;
}
printf("Sum is: %d\n", s);
64
EΝΤΟΛΕΣ ΚΑΙ ΕΛΕΓΧΟΣ ΡΟΗΣ (vii)
• Εντολή continue
int s;
for (i=0, s=0; i < 10; i++) {
int x;
scanf("%d", &x);
if (x < 0)
continue;
s += x;
}
printf("Sum is: %d\n", s);
65
EΝΤΟΛΕΣ ΚΑΙ ΕΛΕΓΧΟΣ ΡΟΗΣ (viii)
• Εντολή switch
switch (ch) {
case 'a':
printf("alpha\n");
break;
case 'b':
case 'c':
printf("beta or c\n");
break;
default:
printf("other\n");
}
66
EΝΤΟΛΕΣ ΚΑΙ ΕΛΕΓΧΟΣ ΡΟΗΣ (ix)
• Ετικέτες και εντολή goto
int i = 1, s = 0;
loop:
s += i++;
if (i < 10)
goto loop;
printf("The sum is %d\n", s);
Η χρήση του goto δεν συνιστάται διότι δημιουργεί δυσκολία στη κατανόηση
της λογικής ροής του προγράμματος και συνεπώς μειώνει τη
συντηρησιμότητά του. Γενικά η χρήση του goto αποφεύγεται στο
δομημένο προγραμματισμό.
67
ΠΑΡΑΔΕΙΓΜΑ
int a_variable; /* Ορισμός μεταβλητής γενικής εμβέλειας */
void main () /* Ορισμός κύριας συνάρτησης */
{
a_function(6); /* Κλήση συνάρτησης */
}
void a_function (int x)
{
a_variable = another_function(x, x+1);
}
int another_function (int x, int y)
{
return x * y;
}
Η τιμή της μεταβλητής a_variable μετά τη κλήση «a_function(6)» στη κύρια
68
συνάρτηση main και πριν τη λήξη του προγράμματος είναι 42