C (8)

46
Περιεχόμενα Εισαγωγή στις printf και scanf Εντολές και Εκφράσεις Αριθμητικοί τελεστές Τελεστές Σύνθετης Ανάθεσης Μετατροπή τύπων Τελεστές Αύξησης και Μείωσης Σχεσιακοί Τελεστές Λογικοί Τελεστές

description

σημειώσεις

Transcript of C (8)

Περιεχόμενα

• Εισαγωγή στις printf και scanf• Εντολές και Εκφράσεις• Αριθμητικοί τελεστές• Τελεστές Σύνθετης Ανάθεσης• Μετατροπή τύπων• Τελεστές Αύξησης και Μείωσης• Σχεσιακοί Τελεστές• Λογικοί Τελεστές

Εκτύπωση με την printf• Απλοί τύποι δεδομένων και χαρακτήρες μορφοποίησης

– int %d– unsigned %u– char %c– double %lf– string %s

Παράδειγμαprintf("Hello %s.\n", "World");printf("This class runs from %d to %d.", 9, 12);ΑποτέλεσμαHello World.This class runs from 9 to 12.

Ανάγνωση με την scanfΧρησιμοποιούνται οι ίδιοι κωδικοί όπως και στηνprintf.Παράδειγμαint n, m;double d;char c;scanf("%d %d", &n, &m);scanf("%lf", &d);scanf("%c", &c);

Ένα πιο σύνθετο παράδειγμα#include <stdio.h>void main ()int n;printf("Give me a number: ");scanf("%d", &n);printf("Here is the number: %d\n", n);printf("and its square: %d\n", n*n);

Εντολές• Μία εντολή είναι μια οδηγία προς τον υπολογιστή

για να κάνει κάτι. Οι εντολές στη C τελειώνουνπάντα με το ερωτηματικό ;

• Για παράδειγμα μια εντολή ανάθεσης είναι ηsum = a+b;• Στις εντολές τα κενά, οι αλλαγές γραμμής, κλπ. δεν

έχουν σημασία. Η παραπάνω εντολή θα μπορούσενα γραφεί

sum =a+b;

με το ίδιο ακριβώς αποτέλεσμα.

Σύνθετες εντολές (i)• Μια σύνθετη εντολή ή μπλοκ, είναι δύο ήπερισσότερες εντολές ομαδοποιημένες μέσα σεάγκιστρα.

• Στην C, οπουδήποτε μπορεί να εμφανιστεί μιαεντολή μπορεί να εμφανιστεί και ένα μπλοκ.

Παράδειγμαsum = a + b;printf("\nThe sum of a and b is:

%d\n",sum);

Σύνθετες εντολές (ii)• Είναι καλή ιδέα τα άγκιστρα να τοποθετούνται στηνίδια στήλη και οι εντολές 3-5 χαρακτήρες πιο μέσα.

Παράδειγμα

a = 1;b = 2;

c = 3;d = 4;

Η κενή εντολή• Η κενή εντολή είναι ένα ερωτηματικό μόνο τουσε μια γραμμή.

;• Χρησιμοποιείται όταν συντακτικά απαιτείται ηύπαρξη εντολής αλλά δεν μπορούμε ναπαρέχουμε καμιά.

Εκφράσεις (i)• Μια έκφραση είναι οτιδήποτε μπορεί να υπολογιστείσε κάποια αριθμητική τιμή.

• Οι εκφράσεις είναι συνδυασμοί σταθερών,μεταβλητών, τελεστών και κλήσεων συναρτήσεων.

Παραδείγματαa + b + c 2.0 * x + 1.03.77 + sqrt(x)

• Όταν μια έκφραση έχει πολλούς τελεστές η τιμή τηςεξαρτάται από την προτεραιότητα των τελεστών.10 / 2 + 5 + 2 * 3 / 2 = ?

Εκφράσεις (ii)• Το ίσον (=) είναι ο κυριότερος τελεστήςανάθεσης στη C.

• Μια έκφραση ανάθεσης είναι για παράδειγμα ηi = 7 /* χωρίς ερωτηματικό στο τέλος */

Η μεταβλητή i παίρνει την τιμή 7, και η έκφρασησαν σύνολο παίρνει επίσης την ίδια τιμή!

Εκφράσεις (iii)• Αντίθετα, μια εντολή ανάθεσης παίρνει τημορφήvariable = expression;

• Αυτό σημαίνει ότι εκφράσεις ανάθεσηςμπορούν να ανατεθούν σε κάποια άλλημεταβλητή.j = (i = 7);x = (y = 5) + (z = 7);x = y = z = 0;

Εκφράσεις (iv)• Οι αναθέσεις στη C διαφέρουν από τιςμαθηματικές αναθέσεις. Η μαθηματικήεξίσωση

x + 1 = 0δε μπορεί να γίνει εντολή ανάθεσης γράφοντας

x + 1 = 0; /* γιατί όχι; */• Έχει όμως νόημα να γράψουμε

x = x + 1; /* γιατί; */

Τελεστές• Ένας τελεστής είναι ένα σύμβολο πουσηματοδοτεί την εκτέλεση κάποιας πράξης σεένα ή περισσότερα ορίσματα.

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

• Οι βασικές κατηγορίες τελεστών είναι οι– Αριθμητικοί– Σχεσιακοί– Λογικοί– bit προς bit

Αριθμητικοί τελεστές (i)• Οι δυαδικοί (binary) αριθμητικοί τελεστές στη Cείναι οι:+ - * / %οι οποίοι αντιστοιχούν στις πράξεις: πρόσθεση,αφαίρεση, πολ/σμός, διαίρεση και υπόλοιπο διαίρεσης(modulus).

• Λέγονται δυαδικοί γιατί δέχονται δύο ορίσματα, όπωςστην έκφραση a+b.

• Ο τελεστής - είναι και μοναδιαίος (unary), όπως στην-a

Αριθμητικοί τελεστές (ii)• Ο τελεστής της διαίρεσης (/) όταν εφαρμοστεί πάνωσε ακέραιους δίνει ακέραιο (διαγράφει το δεκαδικόμέρος).

Παραδείγματα:1/2 = 0, 5/2 = 2, -9/4 = -2

• Η έκφραση a%b διαβάζεται “a modulo b” καιεπιστρέφει το υπόλοιπο της διαίρεσης του a με το b.

Παραδείγματα:7%2 = 1, 12%3 = 0

• Στις εκφράσεις a/b και a%b, το b πρέπει να είναιδιάφορο του 0.

Προτεραιότητα τελεστών (i)• Οι τελεστές έχουν κανόνες προτεραιότητας πουκαθορίζουν ακριβώς πως υπολογίζονται οιεκφράσεις.

• Η έκφραση 1+2*3 έχει τιμή 7, γιατί οπολ/σμός έχει μεγαλύτερη προτεραιότητα απότην πρόσθεση.

• Μια ισοδύναμη έκφραση είναι η 1+(2*3)• Χρησιμοποιώντας παρενθέσεις μπορούμε νααλλάξουμε την προτεραιότητα των τελεστών:

(1+2)*3 = 9

Προτεραιότητα τελεστών (ii)• Όταν σε μια έκφραση εμφανίζονται δύο ήπερισσότεροι τελεστές με την ίδιαπροτεραιότητα τότε αυτοί υπολογίζονταισύμφωνα με τον ακόλουθο πίνακα:

Προτεραιότητα τελεστών (iii)

Για εξάσκηση ... (διαθέσιμα στo site euroconverter.c, VATComputation.c, Time.c, triwnymo.zip )

/********************************************************* time.c ** This program uses the operators / and % (modulo) ** to convert a number of seconds given by the user to ** days, hours, minutes and seconds.... *********************************************************/

#include<stdio.h>

#define SECS_PER_MIN 60#define SECS_PER_HOUR 3600#define SECS_PER_DAY 86400

void main()

/* The following variables are used to keep the number of seconds, minutes, hours and days respectively */

long seconds, mins, hours, days;

printf("Enter number of seconds: ");scanf("%ld", &seconds);printf("\n%ld seconds is equal to ", seconds);days = seconds / SECS_PER_DAY;seconds = seconds % SECS_PER_DAY;hours = seconds / SECS_PER_HOUR;seconds = seconds % SECS_PER_HOUR;mins = seconds / SECS_PER_MIN;seconds = seconds % SECS_PER_MIN;printf("%ld days, %ld hours, %ld minutes and %ld seconds\n",

days, hours, mins, seconds);

Τελεστές σύνθετης ανάθεσης (i)• Εκτός από το ίσον (=) που είναι ένας από τους κυριότερουςτελεστές ανάθεσης, υπάρχουν και μερικοί άλλοι πουσυνδυάζουν την ανάθεση με μια αριθμητική πράξη.

• Αυτοί είναι οι+= -= *= /= %= ...

και η σύνταξή τους είναι ίδια με της απλής ανάθεσης.• Έτσι αν Τ είναι ένας από τους τελεστές +, -, *, /, %κλπ., τότε η σύνταξη

variable T= expressionαποτελεί συντομογραφία τηςvariable = variable T expression

Τελεστές σύνθετης ανάθεσης (ii)

• Οι τελεστές αυτοί έχουν την ίδιαπροτεραιότητα και συσχέτιση με τον τελεστή =

Παραδείγματα:

Προτεραιότητα τελεστών

Μετατροπή τύπων

• Οι κύριοι τύποι δεδομένων στη C είναι οι:Τύπος Λέξη κλειδίcharacter charinteger intshort integer shortlong integer longfloating point number float-||- (double precision) double

Μετατροπή τύπων (i)

• Όταν μια έκφραση της C εκτιμάται, η υπολογιζόμενητιμή έχει ένα συγκεκριμένο τύπο δεδομένων.

• Για παράδειγμα, αν τα x, y είναι τύπου int, τότε και ητιμή της x+y είναι του ίδιου τύπου int.

• Αν όμως τα x, y είναι διαφορετικού τύπου, τότε ηx+y είναι μια μικτή έκφραση.

• Σε αυτή την περίπτωση η έκφραση μετατρέπεταιαυτόματα ώστε να έχει κάποιο συγκεκριμένο τύπο.

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

Μετατροπή τύπων (ii)

Παράδειγμα:• Έστω ότι στην έκφραση x+y, ο x είναι τύπου int και

ο y τύπου double.• Τότε η τιμή του x προβιβάζεται σε double και η

τιμή της x+y είναι τύπου double.Προσοχή:• Η αποθηκευμένη τιμή του x στη μνήμη δεν αλλάζει!

Μόνο ένα αντίγραφο του x μετατρέπεται κατά τηδιάρκεια του υπολογισμού της έκφρασης.

Αυτόματη μετατροπή έκφρασης (i)• Έστω μια έκφραση x T y, για κάποιο τελεστή Τ.Πρώτα• Κάθε char ή short προβιβάζεται σε int. Κάθε unsigned

char ή unsigned short προβιβάζεται σε unsigned (int).Έπειτα• Αν μετά το πρώτο βήμα η έκφραση είναι μικτού τύπου ηέκφραση μετατρέπεται σύμφωνα με την ακόλουθη ιεραρχία: int <unsigned <long <unsigned long <float <double

Αυτόματη μετατροπή έκφρασης (ii)

Έστω οι ακόλουθες δηλώσεις:char c; double d; float f; int i;long l; short s; unsigned u;Έκφραση Τελικός Τύποςc-s/i intu*3-i unsignedu*3.0 –i doublef*3-i floatc+1 intc+1.0 float3*s+l long

Μετατροπή με εκχώρηση• Οι προβιβασμοί συμβαίνουν και με τον τελεστήανάθεσης.

• Η έκφραση στα δεξιά του τελεστή = προβιβάζεταιστον τύπο της μεταβλητής στα αριστερά του τελεστή.

• Αυτό όμως μπορεί να προκαλέσει και υποβιβασμό ανη μεταβλητή είναι χαμηλότερου τύπου.

Παράδειγμα.• d=i; Θα προκαλέσει προβιβασμό της ακέραιας

μεταβλητής i σε τύπο double.• i=d; Θα προκαλέσει υποβιβασμό της double

μεταβλητής i σε τύπο int. Το κλασματικόμέρος της d θα χαθεί!

Άμεση μετατροπή (i)

• Εκτός από τις έμμεσες μετατροπές που συμβαίνουναυτόματα υπάρχουν και οι άμεσες μετατροπές ήαλλαγές τύπου (casts).

• Η αλλαγή τύπου είναι όμοια με τον προβιβασμό με τηδιαφορά ότι η αλλαγή υπόκειται στον έλεγχο τουπρογραμματιστή και όχι του compiler.

• Η σύνταξή της είναι η εξής:(Τύπος) Έκφραση

όπου Τύπος είναι κάποιος από τους βασικούς τύπους τηςC και Έκφραση οποιαδήποτε έκφραση της C.

Άμεση μετατροπή (ii)

Παραδείγματα(float) i(int) (3-3.14 *x)(double) i+3• Ο τελεστής (Τύπος) είναι ένας μοναδιαίος τελεστήςκαι έχει την ίδια προτεραιότητα με τους άλλουςμοναδιαίους τελεστές.

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

Προτεραιότητα αριθμητικώντελεστών

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

Προτεραιότητα αριθμητικώντελεστών

Τελεστές αύξησης και μείωσης (i)• Οι τελεστές αύξησης ++ και μείωσης – είναι μοναδιαίοιτελεστές και έχουν την ίδια προτεραιότητα με το μοναδιαίο –

• Εφαρμόζονται σε μεταβλητές αλλά όχι σε σταθερές ήεκφράσεις και έχουν σαν αποτέλεσμα την αύξηση ή μείωση τηςμεταβλητής κατά 1.

Παραδείγματα:++count count =count +1count++ count =count +1i-- i=i-1--i i=i-1100++ /* Λάθος */--(a+b) /* Λάθος */

Τελεστές αύξησης και μείωσης (ii)• Όταν οι τελεστές ++ και -- εμφανίζονται μέσα σε εκφράσειςέχει σημασία αν οι τελεστές βρίσκονται πριν τη μεταβλητή (ωςπρόθεμα) ή μετά τη μεταβλητή (ως επίθεμα).

• Ως πρόθεμα, οι τελεστές αυτοί τροποποιούν τη μεταβλητή πρινχρησιμοποιηθεί σε μια έκφραση.

• Ως επίθεμα, οι τελεστές τροποποιούν τη μεταβλητή αφούχρησιμοποιηθεί.

• Παράδειγμα 1: Παράδειγμα 2:x=10; x=10;y=x++; y=++x;z=y++; z=++y;(x=11, y=11, z=10) (x=11, y=12, z=12)

Προτεραιότητα τελεστών ++ και --

Παράδειγμα

Σχεσιακοί τελεστές (i)• Οι σχεσιακοί τελεστές χρησιμοποιούνται για να συγκρίνουν εκφράσεις και

φαίνονται παρακάτω:μικρότερο: <μεγαλύτερο: >μικρότερο ή ίσο: <=μεγαλύτερο ή ίσο: >=ίσο: ==• Αν e1, e2 είναι δύο εκφράσεις τότε ισχύουν τα εξής:e1 == e2 Είναι οι εκφράσεις ίσες ;e1 > e2 Είναι η e1 μεγαλύτερη από την e2;e1 < e2 Είναι η e1 μικρότερη από την e2;e1 >= e2 Είναι η e1 μεγαλύτερη ή ίση από την e2;e1 <= e2 Είναι η e1 μικρότερη ή ίση από την e2;e1 != e2 Είναι η e1 διαφορετική από την e2;• Οι τελεστές αυτοί είναι όλοι δυαδικοί και επιστρέφουν είτε 1 είτε 0ανάλογα με το αν η σύγκριση είναι αληθής ή ψευδής.

Σχεσιακοί τελεστές (iii)

Σχεσιακοί τελεστές (iv)

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

Σχεσιακοί τελεστές (v)

Λογικοί τελεστές (i)

• Οι λογικοί τελεστές χρησιμοποιούνται για νασυνδυάσουν εκφράσεις και φαίνονται παρακάτω:

! (not) && (and) || (or)• Ο μοναδιαίος τελεστής ! (άρνηση) μπορεί ναεφαρμοστεί σε οποιαδήποτε έκφραση.

• Αν η έκφραση είναι μηδενική, τότε η άρνηση τηςείναι η τιμή 1. Αν η έκφραση είναι μη μηδενική, τοαποτέλεσμα είναι η τιμή 0.

Τιμή expression !expressionμηδενική 1μη μηδενική 0

Λογικοί τελεστές (ii)

• Αν e1, e2 είναι δύο εκφράσεις, τότε οι δυαδικοίτελεστές && (λογικό και), || (λογικό ή) λειτουργούνσύμφωνα τα παρακάτω:

• Η σύνθετη έκφραση e1 && e2 είναι αληθής (1) ανκαι μόνο αν και οι δύο επιμέρους εκφράσεις είναι μημηδενικές. Στην αντίθετη περίπτωση είναι ψευδής (0).

• Η σύνθετη έκφραση e1 || e2 είναι ψευδής (0) αν καιμόνο αν και οι δύο επιμέρους εκφράσεις είναιμηδενικές. Στην αντίθετη περίπτωση είναι αληθής (1).

Λογικοί τελεστές (iii)

Λογικοί τελεστές (iv)• Η προτεραιότητα των λογικών τελεστών σεσχέση με τους προηγούμενους φαίνεται στονακόλουθο πίνακα:

Ο τελεστής συνθήκης• Ο τελεστής συνθήκης (? :) είναι ο μόνος τελεστής πουδέχεται τρία ορίσματα.• Η σύνταξή του είναι expr1 ? expr2 : expr3και η σημασία του είναι εξής:Αν η expr1 είναι αληθής (μη μηδενική) τότε όλη ηέκφραση παίρνει την τιμή της expr2. Αλλιώς αν είναι

ψευδής (μηδενική) τότε η έκφραση παίρνει την τιμή τηςexpr3.Παραδείγματα:printf("The largest of a and b is: %d",(a>b)?a:b);

Προτεραιότητα τελεστών