ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Φροντιστήριο: Τύποι, Πίνακες, Συναρτήσεις (Κεφάλαια 7-8-9, KNK-2ED)

Σχετικά έγγραφα
ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Μεθόδων Επίλυσης Προβλημάτων

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

Η εντολή if-else. Η απλή μορφή της εντολής if είναι η ακόλουθη: if (συνθήκη) { Η γενική μορφή της εντολής ifelse. εντολή_1; εντολή_2;..

Παραδείγματα. Γράψτε ένα πρόγραμμα που να τυπώνει τη μέση τιμή ενός συνόλου μη αρνητικών αριθμών

Υπολογισμός - Εντολές Ελέγχου

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

Γλώσσα Προγραμματισμού C. Προγραμματισμός HY: Γλώσσα Προγραμματισμού C. Γρήγορος Πίνακας Αναφοράς Σύνταξης. Εισήγηση #4. Επαναληπτικές δομές:

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

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

12. Συναρτήσεις (Μέρος ΙI)

ΕΡΓΑΣΤΗΡΙΟ 1 - ΣΗΜΕΙΩΣΕΙΣ

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

Διάλεξη 6: Δείκτες και Πίνακες

Πίνακες. 1 Πίνακες. 30 Μαρτίου 2014

Προγραμματισμός Ι. Χαρακτήρες. Πανεπιστήμιο Πελοποννήσου Τμήμα Πληροφορικής & Τηλεπικοινωνιών

Παρακάτω δίνεται o σκελετός προγράμματος σε γλώσσα C. Σχολιάστε κάθε γραμμή του κώδικα.

ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ C ΣΕΙΡΑ 2 η

6. ΠΙΝΑΚΕΣ & ΑΛΦΑΡΙΘΜΗΤΙΚΑ

ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ. for (παράσταση_1; παράσταση_2; παράσταση_3) εντολή επόμενη εντολή

Ασκήσεις σε Επαναληπτικούς Βρόχους και Συναρτήσεις. Επανάληψη για την ενδιάμεση εξέταση. (Διάλεξη 13)

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

int abs( int x ), επιστρέφει την απόλυτη τιμή του ακεραίου x Πχ abs( 11) ισούται με 11, abs(34) ισούται με 34 double fb( fabs( double x ), επιστρέφει

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β

Υπολογισμός - Εντολές Επανάληψης

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

Μεθόδων Επίλυσης Προβλημάτων

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

Κεφάλαιο Πίνακες Ι. (Διάλεξη 16)

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

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

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

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

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 8 η : Συναρτήσεις Χειµερινό Εξάµηνο 2011

Προγραμματισμό για ΗΜΥ

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

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

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

5. ΒΡΟΧΟΙ ΕΠΑΝΑΛΗΨΗΣ (Β' μέρος: while - do..while)

Γλώσσα Προγραμματισμού C

Ενότητα 5: «Εισαγωγή στον Προγραμματισμό. Απλές ασκήσεις με γλώσσα C»

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

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

Μεθόδων Επίλυσης Προβλημάτων

Διάλεξη 5η: Εντολές Επανάληψης

Διάλεξη 12η: Δείκτες, μέρος 2

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

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

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

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

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

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

που θα δώσει αποτέλεσµα 48, λόγω της αριστερής προσεταιριστικότητας των τελεστών / και *, ενώ η επιθυµητή αντικατάσταση θα ήταν η

Σε γενικές γραμμές, είναι καλή πρακτική να γράϕουμε προγράμματα C που αποτελούνται από πολλές και μικρές συναρτήσεις, παρά από λίγες και μεγάλες.

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

Είδη εντολών. Απλές εντολές. Εντολές ελέγχου. Εκτελούν κάποια ενέργεια. Ορίζουν τον τρόπο με τον οποίο εκτελούνται άλλες εντολές

Κεφάλαιο 4: Συνθήκες Έλεγχου (if-else, switch) και Λογικοί τελεστές / παραστάσεις. (Διάλεξη 8)

Αρχές Προγραμματισμού

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

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

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

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

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

Απλά Προγράμματα. Βήματα: 1. Καθορισμός παράστασης δεδομένων στη μνήμη 2. Αλγόριθμος βήματα που περιγράφουν την επεξεργασία των δεδομένων

Επεξεργασία κειμένου και συμβολοσειρών σε C

Κεφάλαιο Πίνακες Ι. ( ιάλεξη 15) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

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

Βήματα: μνήμη 2. Αλγόριθμος βήματα που περιγράφουν την επεξεργασία των δεδομένων. Δομές Δεδομένων + Αλγόριθμοι = Προγράμματα

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

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

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

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

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

Κεφάλαιο : Επαναλήψεις (oι βρόγχοιfor, do-while) (Διάλεξη 10) Εντολές Επανάληψης που θα καλυφθούν σήμερα

ΕΠΛ131 Αρχές Προγραμματισμού

Προγραμματισμός Η/Υ Ι (Χρήση της C) 6 η Θεωρία ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ

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

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

Διάλεξη 5: Δείκτες και Συναρτήσεις

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

Εξοικείωση με το πρόγραμμα DEV C++ Επικοινωνία Χρήστη - Υπολογιστή

Ενότητα 4: «Εισαγωγή στον Προγραμματισμό. Τα πρώτα προγράμματα σε γλώσσα C»

Συναρτήσεις και διαδικασίες

Τυχαίοι αριθμοί Αλφαριθμητικά και χαρακτήρες

Κεφάλαιο 8.7. Πίνακες & Συναρτήσεις ( ιάλεξη 17) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Μεθόδων Επίλυσης Προβλημάτων

Κεφάλαιο : Επαναλήψεις (for, do-while)

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

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

Προγραμματισμός Υπολογιστών με C++

Αντικειμενοστρεφής Προγραμματισμός

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

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

Προγραμματισμός Ι. Θεματική ενότητα 8: Δημιουργία προγραμμάτων

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

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

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

Transcript:

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Φροντιστήριο: Τύποι, Πίνακες, Συναρτήσεις (Κεφάλαια 7-8-9, KNK-2ED) Τμήμα Πληροφορικής, Πανεπιστήμιο Κύπρου http://www.cs.ucy.ac.cy/courses/epl232 Το μάθημα αυτό δομήθηκε βάση των διαλέξεων του Αναπλ. Καθηγητή Δημήτρη Ζεϊναλιπούρ Χαρακτήρες (Char) Εργαλεία 1

Ανάγνωση και Γράψιμο Χαρακτήρων χρησιμοποιώντας τις scanf και printf Το σύμβολο %c επιτρέπει στις scanf και printf να διαβάζουν και να γράφουν ένα χαρακτήρα: char ch; scanf("%c", &ch); /* reads one character */ printf("%c", ch); /* writes one character */ scanf δεν παραλείπει τους χαρακτήρες κενού διαστήματος (space). Για να αναγκάσουμε την scanf να παραλείπει τους χαρακτήρες κενού διαστήματος γράφουμε ένα space πριν την ανάγνωση του %c: scanf(" %c", &ch); Ανάγνωση και Γράψιμο Χαρακτήρων χρησιμοποιώντας τις getchar και putchar Για είσοδο και έξοδο μονού χαρακτήρα, οι getchar και putchar μπορούν να χρησιμοποιήθούν αντί των scanf και printf. Η putchar γράφει ένα χαρακτήρα: putchar(ch); Κάθε φορά που καλείτε η getchar, διαβάζει ένα χαρακτήρα: ch = getchar(); Η getchar επιστρέφει ένα int και όχι μια τιμή char, οπότε η ch είναι συνήθως τύπου int. Παρομοίως με την scanf, η getchar δεν παραλείπει το χαρακτήρα κενού διαστήματος. Εργαλεία 2

Ανάγνωση και Γράψιμο Χαρακτήρων χρησιμοποιώντας τις getchar και putchar Η χρήση των getchar και putchar (αντί των scanf και printf) εξοικονομεί χρόνο εκτέλεσης. getchar και putchar είναι πολύ πιο απλές από τις scanf και printf, που έχουν σχεδιαστεί για να διαβάζουν και να γράφουν πολλά είδη δεδομένων σε μια ποικιλία μορφών. Ανάγνωση και Γράψιμο Χαρακτήρων χρησιμοποιώντας τις getchar και putchar Έστω το scanf loop που χρησιμοποιήσαμε για να παραλείψουμε την υπόλοιπη γραμμή εισόδου: do { scanf("%c", &ch); while (ch!= '\n'); Ξαναγράφοντας αυτό το loop με χρήση της getchar : do { ch = getchar(); while (ch!= '\n'); Εργαλεία 3

Ανάγνωση και Γράψιμο Χαρακτήρων χρησιμοποιώντας τις getchar και putchar Moving the call of getchar into the controlling expression allows us to condense the loop: while ((ch = getchar())!= '\n') ; The ch variable isn t even needed; we can just compare the return value of getchar with the new line character: while (getchar()!= '\n') ; Προσδιορισμός του μήκους ενός μηνύματος Το πρόγραμμα length.c τυπώνει το μήκος ενός μηνύματος που δίνεται από το χρήστη: Enter a message: Brevity is the soul of wit. Your message was 27 character(s) long. Το μήκος περιλαμβάνει τα κενα (spaces) και τα σημεία στίξης (punctuation), αλλά όχι τη νέα γραμμή στο τέλος τα πρότασης. Μπορούμε να γίνει χρήση τόσο της scanf όσο και της getchar. Οι περισσότεροι προγραμματιστές σε C θα προτιμούσαν την getchar. length2.c είναι ένα μικρότερο πρόγραμμα που εξαλείφει τη μεταβλητή που χρησιμοποιείται για την αποθήκευση του χαρακτήρα που διαβάζεται από την getchar. Εργαλεία 4

Προσδιορισμός του μήκους ενός μηνύματος length.c /* Determines the length of a message */ #include <stdio.h> int main(void) { char ch; int len = 0; printf("enter a message: "); ch = getchar(); while (ch!= '\n') { len++; ch = getchar(); printf("your message was %d character(s) long.\n", len); return 0; Προσδιορισμός του μήκους ενός μηνύματος length2.c /* Determines the length of a message */ #include <stdio.h> int main(void) { int len = 0; printf("enter a message: "); while (getchar()!= '\n') len++; printf("your message was %d character(s) long.\n", len); return 0; Εργαλεία 5

Μετατροπή χαρακτήρων τηλεφώνου σε αριθμό Γράψτε ένα πρόγραμμα που μετατρέπει τα αλφαβητικά ψηφία ενός τηλεφώνου σε αριθμούς. Enter phone number: 1-800-COLLECT Αποτέλεσμα: 1-800-2655328 Προσδιορισμός του μήκους ενός μηνύματος #include <stdio.h> int main(void) { char ch; printf("enter phone number: "); while ((ch = getchar())!= '\n') switch (ch) { case 'A': case 'B': case 'C': putchar('2'); break; case 'D': case 'E': case 'F': putchar('3'); break; case 'G': case 'H': case 'I': putchar('4'); break; case 'J': case 'K': case 'L': putchar('5'); break; case 'M': case 'N': case 'O': putchar('6'); break; case 'P': case 'R': case 'S': putchar('7'); break; case 'T': case 'U': case 'V': putchar('8'); break; case 'W': case 'X': case 'Y': putchar('9'); break; default: putchar(ch); break; putchar('\n'); return 0; Εργαλεία 6

Αλλαγή ώρας Γράψτε ένα πρόγραμμα που παίρνει από τον χρήστη την ώρα σε 12 ώρη μορφή (πμ, μμ) και την μετατρέπει σε 24 ώρη μορφή. Enter a 12-hours time: 9:11 PM Equivalent: 21:11 Αλλαγή ώρας #include <ctype.h> #include <stdio.h> int main(void) { int hours12, hours24, minutes; char am_pm; printf("enter a 12-hour time: "); scanf("%d:%d %c", &hours12, &minutes, &am_pm); /* Note: scanf potentially leaves an 'm' in the keyboard buffer. If the * program had included additional input, the rest of the input line would * need to be skipped before continuing (e.g., using the idiom on p. 141). */ hours24 = hours12 % 12; if (toupper(am_pm) == 'P') hours24 += 12; printf("equivalent 24-hour time: %.2d:%.2d\n", hours24, minutes); return 0; Εργαλεία 7

Arrays Αντιστροφή μιας σειράς αριθμών Το πρόγραμμα reverse.c ζητά από τον χρήστη να εισάγει μια σειρά από αριθμούς, και στην συνέχεια την εκτυπώνει σε αντίστροφη σειρά: Enter 10 numbers: 34 82 49 102 7 94 23 11 50 31 In reverse order: 31 50 11 23 94 7 102 49 82 34 Το πρόγραμμα αποθηκεύει τους αριθμούς σε έναν πίνακα καθώς διαβάζονται και, στη συνέχεια, περνά από τον πίνακα ανάποδα, εκτυπώνοντας τα στοιχεία ένα προς ένα. Εργαλεία 8

Αντιστροφή μιας σειράς αριθμών /* Reverses a series of numbers */ #include <stdio.h> #define N 10 int main(void) { int a[n], i; reverse.c printf("enter %d numbers: ", N); for (i = 0; i < N; i++) scanf("%d", &a[i]); printf("in reverse order:"); for (i = N - 1; i >= 0; i--) printf(" %d", a[i]); printf("\n"); return 0; Έλεγχος αριθμού για επαναλαμβανόμενα ψηφία Το πρόγραμμα repdigit.c ελέγχει αν κάποιο από τα ψηφία ενός αριθμού εμφανίζεται περισσότερες από μία φορές. Αφού ο χρήστης εισαγάγει έναν αριθμό, το πρόγραμμα εκτυπώνει είτε Repeated digit ή No repeated digit: Enter a number: 28212 Repeated digit Ο αριθμός 28212 έχει επαναλαμβανόμενο ψηφίο(2), ενώ ο αριθμός 9357 δεν έχει. Εργαλεία 9

Έλεγχος αριθμού για επαναλαμβανόμενα ψηφία Το πρόγραμμα χρησιμοποιεί έναν πίνακα από 10 Boolean τιμές για να παρακολουθεί ποια ψηφία εμφανίζονται σε έναν αριθμό. Αρχικά, κάθε στοιχείο της digit_seen είναι false. Όταν δίνεται ένας αριθμός n, το πρόγραμμα εξετάζει κατά τα ψηφία του n ένα προς ένα, αποθηκεύοντας το τρέχον ψηφίο σε μια μεταβλητή που ονομάζεται digit. Εάν το digit_seen[digit] είναι true, τότε το digit εμφανίζεται τουλάχιστον δύο φορές στο n. Εάν το digit_seen[digit] είναι false, τότε το digit δεν έχει ξαναεμφανιστεί, οπότε το πρόγραμμα ορίζει το digit_seen[digit] σε true και συνεχίζει. Έλεγχος αριθμού για επαναλαμβανόμενα ψηφία /* Checks numbers for repeated digits */ #include <stdbool.h> /* C99 only */ #include <stdio.h> int main(void) { bool digit_seen[10] = {false; int digit; long n; printf("enter a number: "); scanf("%ld", &n); while (n > 0) { digit = n % 10; if (digit_seen[digit]) break; digit_seen[digit] = true; n /= 10; if (n > 0) printf("repeated digit\n"); else printf("no repeated digit\n"); return 0; repdigit.c Εργαλεία 10

Υπολογισμός τόκων Το πρόγραμμα interest.c Εκτυπώνει έναν πίνακα που δείχνει την αξία των $100 που επενδύονται με διάφορους συντελεστές τόκων για μια περίοδο ετών. Ο χρήστης θα εισαγάγει ένα επιτόκιο και τον αριθμό των ετών που θα επενδυθούν τα χρήματα. Ο πίνακας θα δείχνει την αξία των χρημάτων σε διαστήματα ενός έτους με το επιτόκιο αυτό και τους επόμενους τέσσερις υψηλότερους συντελεστές υποθέτοντας ότι ο τόκος θα υπολογίζεται μία φορά το χρόνο. Υπολογισμός τόκων Δείτε πώς μοιάζει το πρόγραμμα: Enter interest rate: 6 Enter number of years: 5 Years 6% 7% 8% 9% 10% 1 106.00 107.00 108.00 109.00 110.00 2 112.36 114.49 116.64 118.81 121.00 3 119.10 122.50 125.97 129.50 133.10 4 126.25 131.08 136.05 141.16 146.41 5 133.82 140.26 146.93 153.86 161.05 Εργαλεία 11

Υπολογισμός τόκων Οι αριθμοί στη δεύτερη γραμμή εξαρτώνται από τους αριθμούς στην πρώτη γραμμή, επομένως είναι λογικό να αποθηκεύεται η πρώτη γραμμή σε έναν πίνακα. Οι τιμές στον πίνακα χρησιμοποιούνται στη συνέχεια για τον υπολογισμό της δεύτερης γραμμής. Αυτή η διαδικασία μπορεί να επαναληφθεί για τις επόμενες σειρές. Το πρόγραμμα χρησιμοποιεί ένθετες εντολές for. Το outer loop μετρά από το 1 μέχρι τον αριθμό των ετών που ζήτησε ο χρήστης. Το inner loop υπολογίζει το επιτόκιο από τη χαμηλότερη αξία του στην υψηλότερη τιμή του. Υπολογισμός τόκων interest.c /* Prints a table of compound interest */ #include <stdio.h> #define NUM_RATES ((int) (sizeof(value) / sizeof(value[0]))) #define INITIAL_BALANCE 100.00 int main(void) { int i, low_rate, num_years, year; double value[5]; printf("enter interest rate: "); scanf("%d", &low_rate); printf("enter number of years: "); scanf("%d", &num_years); printf("\nyears"); for (i = 0; i < NUM_RATES; i++) { printf("%6d%%", low_rate + i); value[i] = INITIAL_BALANCE; printf("\n"); for (year = 1; year <= num_years; year++) { printf("%3d ", year); for (i = 0; i < NUM_RATES; i++) { value[i] += (low_rate + i) / 100.0 * value[i]; printf("%7.2f", value[i]); printf("\n"); return 0; Εργαλεία 12

Multidimensional Arrays Dealing a Hand of Cards Το πρόγραμμα deal.c απεικονίζει δύο διαστάσεων πίνακες και σταθερούς πίνακες. Το πρόγραμμα μοιράζει ένα τυχαίο χαρτί από μια τυπική τράπουλα. Κάθε χαρτί μπορεί να ανήκει σε μια οικογένεια suit (clubs, diamonds, hearts, or spades) και έχει ένα βαθμό rank (δύο, τρία, τέσσερα, πέντε, έξι, εφτά, οχτώ, εννιά, δέκα, βαλές, ντάμα, ρήγας, ή άσσος). Copyright 2008 W. W. Norton & Company. All rights reserved. 26 Εργαλεία 13

Dealing a Hand of Cards Ο χρήστης θα καθορίσει πόσα χαρτιά θα πρέπει να μοιραστούν: Enter number of cards in hand: 5 Your hand: 7c 2s 5d as 2h Προβλήματα που πρέπει να επιλυθούν: Πώς θα διαλέξουμε τα τυχαία χαρτιά; Πώς θα αποφύγουμε να πάρουμε το ίδιο φύλλο δύο φορές; Dealing a Hand of Cards Η επιλογή τυχαίων χαρτιών μπορεί αν γίνει με διάφορους τρόπους time (from <time.h>) επιστρέφει την τρέχουσα ώρα, κωδικοποιημένη σε έναν μόνο αριθμό. srand (from <stdlib.h>) προετοιμάζει τη γεννήτρια τυχαίων αριθμών του C. rand (from <stdlib.h>) παράγει έναν φαινομενικά τυχαίο αριθμό κάθε φορά που καλείται. Με τη χρήση του %, μπορούμε να ορίσουμε την κλίμακα των τιμών που επιστρέφει η rand έτσι ώστε να εμπίπτει πάντα μεταξύ του 0 και του 3 (για τα suits) ή μεταξύ του 0 και 12 (για τα ranks). Εργαλεία 14

Dealing a Hand of Cards Ο πίνακας in_hand χρησιμοποιείται για να παρακολουθεί ποια φύλλα έχουν ήδη επιλεγεί. Ο πίνακας έχει 4 γραμμες και 13 στήλες, και κάθε στοιχείο του αντιστοιχεί σε ένα από τα 52 χαρτιά της τράπουλας. Όλα τα στοιχεία θα αρχικοποιηθούν σε false. Κάθε φορά που επιλέγουμε ένα τυχαίο χαρτί, Θα ελέγξουμε αν το στοιχείο της in_hand είναι true ή false. Αν είναι true, τότε επιλέγουμε ένα άλλο χαρτί. Αν είναι false, τότε αποθηκεύουμε το true στο στοιχείο το πίνακα για μελλοντική χρήση. Dealing a Hand of Cards Μόλις επαληθεύσουμε ότι ένα χαρτί είναι "νέο", θα πρέπει να μεταφράσουμε την αριθμητική του κατάταξη σε χαρακτήρες και στη συνέχεια να προβάλουμε το χαρτί. Για τη μετατροπή του rank και του suit σε χαρτί τράπουλας, θα ορίσουμε δύο πίνακες χαρακτήρων μια για το rank και μια για το suit και, στη συνέχεια, θα χρησιμοποιήσουμε τους αριθμούς σαν δείκτες στους πίνακες. Αυτοί οι πίνακες δεν θα αλλάξουν κατά την εκτέλεση του προγράμματος, οπότε θα οριστούν σαν const. Εργαλεία 15

Dealing a Hand of Cards deal.c /* Deals a random hand of cards */ #include <stdbool.h> /* C99 only */ #include <stdio.h> #include <stdlib.h> #include <time.h> #define NUM_SUITS 4 #define NUM_RANKS 13 int main(void) { bool in_hand[num_suits][num_ranks] = {false; int num_cards, rank, suit; const char rank_code[] = {'2','3','4','5','6','7','8', '9','t','j','q','k','a'; const char suit_code[] = {'c','d','h','s'; Dealing a Hand of Cards srand((unsigned) time(null)); printf("enter number of cards in hand: "); scanf("%d", &num_cards); printf("your hand:"); while (num_cards > 0) { suit = rand() % NUM_SUITS; /* picks a random suit */ rank = rand() % NUM_RANKS; /* picks a random rank */ if (!in_hand[suit][rank]) { in_hand[suit][rank] = true; num_cards--; printf(" %c%c", rank_code[rank], suit_code[suit]); printf("\n"); return 0; Εργαλεία 16

Functions Έλεγχος εάν ένας αριθμός είναι πρώτος Το πρόγραμμα prime.c ελέγχει κατά πόσο ένας αριθμός είναι πρώτος: Enter a number: 34 Not prime Το πρόγραμμα χρησιμοποιεί μια συνάρτηση που ονομάζεται is_prime που επιστρέφει true αν η παράμετρος του είναι πρώτος αριθμός και false όταν δεν είναι. Η is_prime διαιρεί την παράμετρο n με καθέναν από τους αριθμούς 2 και την τετραγωνική ρίζα του n; Αν το υπόλοιπο είναι ποτέ 0, το n δεν είναι πρώτος αριθμός. Εργαλεία 17

Έλεγχος εάν ένας αριθμός είναι πρώτος /* Tests whether a number is prime */ #include <stdbool.h> /* C99 only */ #include <stdio.h> bool is_prime(int n) { int divisor; prime.c if (n <= 1) return false; for (divisor = 2; divisor * divisor <= n; divisor++) if (n % divisor == 0) return false; return true; Έλεγχος εάν ένας αριθμός είναι πρώτος int main(void) { int n; printf("enter a number: "); scanf("%d", &n); if (is_prime(n)) printf("prime\n"); else printf("not prime\n"); return 0; Εργαλεία 18