Προτάσεις, εκφράσεις, τελεστές Βασικά στοιχεία ελέγχου προγράμματος
Προτάσεις Εντολή (Πρόταση): μια πλήρης οδηγία προς τον υπολογιστή. Η εντολή τελειώνει με ; Ο μεταγλωττιστής δεν λαμβάνει υπόψη τα κενά διαστήματα και τους χαρακτήρες στηλοθέτη (tabs), εκτός από συμβολοσειρές. Τι συμβαίνει με την ακόλουθη δήλωση; printf( "Καλημέρα" );
Σύνθετες Προτάσεις Σύνθετη πρόταση (ενότητα ή μπλοκ): ομάδα προτάσεων της C μέσα σε άγκιστρα { } Παράδειγμα: { printf("Καλημέρα\n"); printf("Καληνύχτα"); }
Προσοχή Κρατήστε το στυλ γραφής σταθερό Διατηρείστε τη στοίχιση σε μια ενότητα Μην απλώνετε μια απλή πρόταση σε πολλές γραμμές
Εκφράσεις Έκφραση: οτιδήποτε υπολογίζει μια αριθμητική τιμή x = 5; x = y * 2; z = y * 2; x = z = y * 2; x = 5 * (y + 20);
Τελεστές Τελεστής εκχώρησης (=) Μαθηματικοί τελεστές Σχεσιακοί τελεστές Λογικοί τελεστές
Μαθηματικοί Τελεστές Μοναδιαίοι Μαθηματικοί Τελεστές ++, -- : Αυξάνει/μειώνει κατά ένα τον τελεστέο προθεματικά: τροποποιούν τον τελεστέο πριν χρησιμοποιηθεί επιθεματικά: τροποποιούν τον τελεστέο αφού χρησιμοποιηθεί
Παράδειγμα /* Δείχνει την προθεματική και επιθεματική μορφή του μοναδιαίου τελεστή */ #include <stdio.h> int main(void) { int a, b; /* Θέσε a και b ίσους με 5 */ a = b = 5; /* Εκτύπωσε τους μειώνοντας κατά ένα κάθε φορά */ /* Προθεματική μορφή για b, επιθεματική για a */ printf("\n%d %d", a--, --b); return 0; }
Μαθηματικοί Τελεστές Δυαδικοί μαθηματικοί τελεστές Πρόσθεση + Πρόσθεση + Αφαίρεση - Πολλαπλασιασμός * Διαίρεση / Υπόλοιπο διαίρεσης (modulo) %
Παράδειγμα Να γραφεί ψευδοκώδικας και το αντίστοιχο πρόγραμμα σε C το οποίο θα διαβάζει από το πληκτρολόγιο αριθμό δευτερολέπτων (μέχρι 65000) και θα επιστρέφει τον αριθμό σε ώρες, λεπτά και δευτερόλεπτα.
Παράδειγμα (συνέχεια) /* Δείχνει τη χρήση του τελεστή υπολοίπου */ /* Εισάγουμε τον αριθμό δευτερολέπτων και μετατρέπει */ /* σε ώρες, λεπτά και δευτερόλεπτα. */ #include <stdio.h> /* Ορισμός σταθερών */ #define SECS_PER_MIN 60 #define SECS_PER_HOUR 3600 int main(void) { unsigned seconds, minutes, hours, secs_left, mins_left; /* Εισαγωγή αριθμού δευτερολέπτων */ printf("Enter number of seconds (< 65000): "); scanf("%d", &seconds);
Παράδειγμα (συνέχεια) hours = seconds / SECS_PER_HOUR; minutes = seconds / SECS_PER_MIN; mins_left = minutes % SECS_PER_MIN; secs_left = seconds % SECS_PER_MIN; printf("%u seconds is equal to ", seconds); printf("%u h, %u m, and %u s", hours, mins_left, secs_left); return 0; }
Παράδειγμα (συνέχεια) Έστω ότι δίνουμε 10000 δευτερόλεπτα hours = seconds / SECS_PER_HOUR = 10000 / 3600 = 2 minutes = seconds / SECS_PER_MIN = 10000/60 = 166; mins_left = minutes % SECS_PER_MIN = 166 % 60 = 46 ; Ισοδύναμο με το (10000 - 2* 3600) / 60 secs_left = seconds % SECS_PER_MIN = 10000 % 60 = 40;
Προτεραιότητα τελεστών x = 4 + 5 * 3; Ποιο είναι το αποτέλεσμα; Σειρά εκτέλεσης: ++, -- * / % + - Συντελεστές στο ίδιο επίπεδο: από αριστερά στα δεξιά
Προσοχή Χρησιμοποιείτε παρενθέσεις! Βοηθούν στην αναγνωσιμότητα των εκφράσεων Προτιμήστε να διασπάσετε μια έκφραση σε δύο ή περισσότερες εντολές
Σχεσιακοί τελεστές Ίσο == Μεγαλύτερο > Μικρότερο < Ίσο == Μεγαλύτερο > Μικρότερο < Μεγαλύτερο ή ίσο >= Μικρότερο ή ίσο <= Άνισο (διαφορετικό) !=
Παράδειγμα Τι αποτέλεσμα έχουν οι ακόλουθες εκφράσεις; 5 == 1 5 > 1 5 != 2 (5 + 10) == (3 * 5)
Η εντολή if if (έκφραση) εντολή; if (έκφραση) { εντολή1; εντολή2; … εντολήΝ; }
Παράδειγμα Να γραφεί ψευδοκώδικας και το αντίστοιχο πρόγραμμα σε C το οποίο θα διαβάζει από το πληκτρολόγιο δύο αριθμούς χ και ψ και θα τυπώνει ποιος είναι μεγαλύτερος (ή αν είναι ίσοι!)
Παράδειγμα /* Δείχνει τη χρήση του if */ #include <stdio.h> int main(void) { int x, y; /* Εισαγωγή των αριθμών */ printf("\nInput an integer value for x: "); scanf("%d", &x); printf("\nInput an integer value for y: "); scanf("%d", &y);
Παράδειγμα (συνέχεια) /* Έλεγχος των τιμών και εκτύπωση αποτελεσμάτων */ if (x == y) printf("x is equal to y"); if (x > y) printf("x is greater than y"); if (x < y) printf("x is smaller than y"); return 0; }
Εάν .. αλλιώς if (έκφραση) { εντολές } else {
Παράδειγμα (1/2) /* Παράδειγμα χρήσης if .. else */ #include <stdio.h> int main(void) { int x, y; /* Εισαγωγή αριθμών */ printf("\nInput an integer value for x: "); scanf("%d", &x); printf("\nInput an integer value for y: "); scanf("%d", &y);
Παράδειγμα (2/2) /* Έλεγχος τιμών και εκτύπωση αποτελεσμάτων */ if (x == y) printf("x is equal to y"); else if (x > y) printf("x is greater than y"); printf("x is smaller than y"); return 0; }
if … else ... Το else συσχετίζεται με το πλησιέστερο if if (sex == 'M') if (age >= 18) printf("Must join the army\n"); else printf("Women don't have to join the army\n"); Για διαφορετική αντιστοίχιση χρησιμοποιήστε αγκύλες if (sex == 'M'){ printf(""Must join the army\n""); }
Υπολογισμός Σχεσιακών Εκφράσεων Οι εκφράσεις με σχεσιακούς τελεστές δίνουν αποτέλεσμα! 0 -> ψευδής μη μηδενικό (συνήθως 1) -> αληθής Δείτε το επόμενο παράδειγμα και υπολογίστε τα αποτελέσματα
Παράδειγμα /* Υπολογισμός σχεσιακών εκφράσεων */ #include <stdio.h> int main(void) { int a; a = (5 == 5); /* Τι αποτέλεσμα δίνει; */ printf("\na = (5 == 5)\na = %d", a); a = (5 != 5); /* Τι αποτέλεσμα δίνει; */ printf("\na = (5 != 5)\na = %d", a); a = (12 == 12) + (5 != 1); /* Τι αποτέλεσμα δίνει;*/ printf("\na = (12 == 12) + (5 != 1)\na = %d", a); return 0; }
Συνηθισμένα λάθη Χρήση τελεστή ανάθεσης αντί του τελεστή ισότητας if (x = 7) printf("x είναι ίσο με 7"); και αντίστροφα x == 7;
Προτεραιότητες… Οι μαθηματικοί τελεστές έχουν μεγαλύτερη προτεραιότητα από τους σχεσιακούς τελεστές Οι τελεστές < <= > >= έχουν προτεραιότητα μεγαλύτερη των != == Πώς θα υπολογισθεί η ακόλουθη έκφραση: x == y > z
Προσοχή Μη βάζετε εντολές εκχώρησης σε προτάσεις if Μη χρησιμοποιείτε τελεστή ανισότητας σε εντολή if else Προτιμήστε το if (a == 1) … else … έναντι του if (a != 1) … else … Προσοχή στις συγκρίσεις ισότητας με πραγματικούς αριθμούς if (100.0 + 100.0 * 0.08 == 108.0) printf("Equal\n"); Ο έλεγχος ισότητας των a και b πρέπει να γράφεται ως if (fabs(a - b) < 0.0001)
Λογικοί Τελεστές AND && OR || NOT ! Τι αποτελέσματα θα δώσουν οι ακόλουθες εκφράσεις; (5 == 5) && (6 != 2) (5 > 1) || (6 < 1) (2 == 1) && (5 == 5) !(5 == 4)
Προσοχή Μια τιμή μηδέν αναπαριστά το ψευδές Μια μη μηδενική τιμή αναπαριστά το αληθές Τι θα συμβεί κατά την εκτέλεση της επόμενης έκφρασης; x = 128; if (x) printf("%d", x);
Και άλλες προτεραιότητες… Η προτεραιότητες τελεστών είναι: τελεστής άρνησης (!) μαθηματικοί τελεστές σχεσιακοί τελεστές && || ΄Δείτε το ακόλουθο παράδειγμα
Παράδειγμα #include <stdio.h> /* Αρχικοποίηση μεταβλητών. Σημειώστε ότι η c δεν είναι μικρότερη της d, συνθήκη που εξετάζουμε */ int main(void){ int a = 5, b = 6, c = 5, d = 1; int x; /* Εξέταση της έκφρασης χωρίς παρενθέσεις */ x = a < b || a < c && c < d; printf("\n Without parentheses the expression evaluates as %d", x); /* Εξέταση της έκφρασης με παρενθέσεις */ x = (a < b || a < c) && c < d; printf("\n With parentheses the expression evaluates as %d", x); return 0; }
Παράδειγμα Προσοχή στον τελεστή άρνησης int main(void){ int a = 5, b = 6; int x; /* Εξέταση της έκφρασης χωρίς παρενθέσεις */ x = ! a < b; printf("\n Without parentheses the expression evaluates as %d", x); x = ! (a < b); printf("\n With parentheses the expression evaluates as %d", x); return 0; }
Τελεστές Σύνθετης Εκχώρησης Ισοδύναμο με x *= y x = x * y y -= y x = x - y a /= b a = a / b a += 1 a = a + 1 y %= 5 y = y % 5 x += y / 8 x = x + (y / 8)
Τελεστής συνθήκης έκφραση1 ? έκφραση2 : έκφραση 3 εάν έκφραση1 αληθής τότε όλη η έκφραση παίρνει την τιμή της έκφραση2 αλλιώς παίρνει την τιμής της έκφραση3 Π.χ. z = (x > y)? x : y; Ποια είναι η αντίστοιχη έκφραση με if .. else; Η προτεραιότητά του είναι μικρότερη απ’ όλους τους τελεστές, εκτός από αυτούς της εκχώρησης και σύνθετης εκχώρησης
Τελεστής Κόμμα x = (a++, b++); Υπολογίζονται και οι δύο εκφράσεις από αριστερά στα δεξιά Ολόκληρη η έκφραση αποτιμάται στην τιμή της δεξιάς έκφρασης Έχει τη χαμηλότερη προτεραιότητα απ’ όλους τους τελεστές
Τελεστές επιπέδου bit Σύζευξη επιπέδου bit (bitwise AND) & Εφαρμόζονται σε ακέραιες ποσότητες (char, short, int, long, long long) Σύζευξη επιπέδου bit (bitwise AND) & Διάζευξη επιπέδου bit (bitwise OR) | Αποκλειστική διάζευξη επιπέδου bit (xor) ^ Συμπλήρωμα ως προς 1 ~
Τελεστές επιπέδου bit Παραδείγματα 22 & 5 = 0001 0110 & 0000 0101 = 0000 0100 = 4 22 | 5 = 0001 0110 | 0000 0101 = 0001 0111 = 23 22 ^ 5 = 0001 0110 ^ 0000 0101 = 0001 0011 = 19 ~ 22 = ~ 0001 0110 = 1110 1001 = 233 (unsigned) -23 (signed) ΠΡΟΣΟΧΗ: Στο if ΠΑΝΤΑ χρησιμοποιούμε τους λογικούς τελεστές (&&, ||, !) ΟΧΙ τους τελεστές επιπέδου bit
Προσοχή! ΜΗΝ συγχέετε τους λογικούς τελεστές &&, ΙΙ και ! με τους τελεστές επιπέδου bit &, | και ~ 9 && 6 αληθές 9 & 6 ψευδές ! 1 = ψευδές ~1 = αληθές (-2)
Λίγα για πίνακες (1/3) Πίνακας (διάταξη): μια ομάδα στοιχείων ιδίου τύπου Τα στοιχεία διαχωρίζονται μεταξύ τους με χρήση δείκτη Πίνακας: μια ή περισσότερες διαστάσεις Ορισμός: int data[1000]; Ορίζει έναν πίνακα με 1000 θέσεις ακεραίων Το πρώτο στοιχείο βρίσκεται στη θέση data[0]
Λίγα για πίνακες (2/3) Μπορούμε να δώσουμε τιμή σε μια θέση του πίνακα: data[10] = 12; ή εάν έχουμε ορίσει int count = 10; data[count] = 12; Ποιος είναι ο δείκτης του τελευταίου στοιχείου του πίνακα data[] ;
Λίγα για πίνακες (3/3) Ο πίνακας μπορεί να έχει πάνω από μία διαστάσεις char crossword[15][15]; πίνακας χαρακτήρων 15 γραμμών και 15 στηλών int a[50][100]; πίνακας ακεραίων με 50 γραμμές και 100 στήλες double b[10][20][30]; Αναφερόμαστε σε ένα στοιχείο του πίνακα παραθέτοντας δείκτες για όλες τις διαστάσεις crossword[3][5] = 'A'; b[2][7][9] = 7.2;
Δομές επανάληψης Επανάληψη εντολών (for, while και do .. while)
Η εντολή while Αποτιμάται η συνθήκη Εάν είναι αληθής εκτελείται η εντολή (ή οι εντολές) Η εκτέλεση επιστρέφει στο βήμα 1
Δηλώσεις while count = 1; while (count <= 20) { printf("%d\n", count); count++; } int choice = 0; while (choice != 99) scanf("%d", &choice);
Δηλώσεις while int values[100]; int counter = 0; int choice = 0; while (counter < 100 && choice != 99) { printf("Enter the %d number ", counter + 1); scanf("%d", &choice); values[counter] = choice; counter++; printf("\n"); }
Δηλώσεις while while (number < 1 || number > 10) { printf("Enter a number between 1 and 10"); scanf("%d", &number); printf("\n"); }
For H for έχει τη δομή: for (αρχική έκφραση; συνθήκη; αύξηση) { σώμα επανάληψης; /* εντολές */ } Αποτιμάται η αρχική έκφραση Αποτιμάται η συνθήκη Εάν είναι ψευδής τερματίζεται η εκτέλεση της επανάληψης και συνεχίζεται το πρόγραμμα με την επόμενη εντολή που ακολουθεί την επανάληψη Εάν είναι αληθής εκτελείται το σώμα της επανάληψης Εκτελείται η αύξηση Η εκτέλεση επιστρέφει στο βήμα 2
Παράδειγμα /* Δείχνει μια απλή πρόταση for */ #include <stdio.h> int main(void){ int count; /* Εκτυπώνει τους αριθμούς 1 μέχρι 20 */ for (count = 1; count <= 20; count++) printf("%d\n", count); return 0; }
Δηλώσεις for for (count = 100; count > 0; count--) int count = 1; for ( ; count <= 20; count++) count = 1; for (printf("Επανάληψη…."); count <= 20; count++) for (count = 0; count < 1000 && array[count] !=0; count++) printf("%d\n", array[count]); for (count = 0; count < 1000 && array[count]; ) printf("%d\n", array[count++]);
Δηλώσεις for int choice = 1; for ( ; choice != 99; ) scanf("%d", &choice); /**************/ /* nested for */ for (row = 10; row > 0; row--){ for (col = 35; col > 0; col--) printf("X"); printf("\n"); }
Η εντολή do .. while Εκτελείται η εντολή Αποτιμάται η συνθήκη Εάν είναι αληθής επιστρέφει στο βήμα 1
Δήλωση do .. while int get_menu_choice(void) { int choice = 0; do { printf("\n************************\n"); printf("1. Add a Record\n"); printf("2. Change a Record\n"); printf("3. Delete a Record\n"); printf("4. Quit\n"); printf("\nEnter your choice: "); scanf("%d", &choice); } while (choice < 1 || choice > 4) return choice; }
Προσοχή Μη φτιάχνετε τεράστιες προτάσεις for χρησιμοποιώντας τον τελεστή , Προτιμήστε το while (x != 0) αντί του while (x) Χρησιμοποιείτε τη for αντί της while αν θέλετε να δώσετε αρχικές τιμές και την αύξηση σε ένα βρόχο
Ένθεση Επαναλήψεων Επιτρέπεται η ένθεση βρόχων Πρέπει ο εξωτερικός να περιλαμβάνει τον εσωτερικό εξ ολοκλήρου for (count =1; count < 100; count++) { do { printf("test"); scanf("%d", &x); } /* Τέλος του for */ } while (x != 0); /* Τέλος του while */
Ένθεση Επαναλήψεων for (count =1; count < 100; count++) { do { printf("test"); scanf("%d", &x); } while (x != 0); /* Τέλος του while */ } /* Τέλος του for */
Ερωτήσεις Ποια πρόταση επιλέγουμε μεταξύ των for, while και do .. while; Μπορούμε να ενθέσουμε διαφορετικές εντολές επανάληψης; Ποια είναι η τιμή του δείκτη του πρώτου στοιχείου ενός πίνακα;
Βρείτε το σφάλμα do { printf("Enter a number\n"); printf("Enter 0 to terminate \n"); printf("You Entered %d \n", x); if (x) printf("I Quit … \n"); } while (x != 0); /* Τέλος του while */
Βρείτε το σφάλμα for (count = 1; count < MAXVALUES; count++); printf("Counter = %d\n", count);
Η εντολή switch switch (συνθήκη) { case πρότυπο1: εντολές; break; ….. default: εντολές; }
Η εντολή switch printf("Enter season number (1-4): "); scanf("%d\n", &season); switch (season) { case 1: printf("Winter\n"); break; case 2: printf("Spring\n"); case 3: printf("Summer\n“); case 4: printf("Autumn\n"); default: printf("Wrong season number (%d)\n“, season) }
Η εντολή switch switch (choice) { case 1: { addRecord(); break; } changeRecord(); case 3: { deleteRecord(); case 4: { quitProgram(); default: printErrorMessage();