ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 7 Ο Αριθμητικές πράξεις Τυχαίοι αριθμοί Εφαρμογές σε προβλήματα ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 1
Εισαγωγή Οι αριθμητικές πράξεις που εκτελούνται στον υπολογιστή αποτελούν το κυρίως έργο του. Μη ξεχνάμε ότι ου υπολογιστές δημιουργήθηκαν για να επιλύουν σύνθετα επιστημονικά προβλήματα. Στην C διατίθενται οι αριθμητικοί τελεστές +, -, *, /, %, ++, -- με βάση τους οποίους μπορούμε να υλοποιήσουμε αριθμητικούς υπολογισμούς. Ωστόσο στις αριθμητικές παραστάσεις μπορεί να συνυπάρχουν μερικοί από αυτούς τους τελεστές οπότε υπάρχει το ερώτημα με ποια σειρά θα εκτελεστούν. Το αποτέλεσμα της παράστασης εξαρτάται από τη σειρά αυτή. Π.χ. x=30-12/6+6 το αποτέλεσμα θα είναι x=9, x=34 ή x=29. Αν εκτελέσει από αριστερά προς το δεξιά τις πράξεις με τη σειρά που τις βρίσκει θα είχαμε 30-12=18 και στη συνέχεια αυτό το διαιρέσει με το 6 θα είχαμε 3 και θα προσέθετε το 6 οπότετελικάθαείχαμε9. Αν εκτελέσει από δεξιά προς τα αριστερά τις πράξεις με τη σειρά που τις βρίσκει θα είχαμε 6+6=12 στη συνέχεια 12/12 =1 αυτό θα το αφαιρέσει από το 30 και θα καταλήξει x=29. Αντίθετα αν διαιρέσει πρώτα το 12 με το 6 θα είχαμε 2 και θα το αφαιρούσε από το 30 θα απέμενε 28 οπότε προσθέτοντας το 6 θα κατέληγε στο x=34. ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 2
Προτεραιότητα αριθμητικών τελεστών Η προτεραιότητα τον αριθμητικών τελεστών είναι αρχικά οι *, /, % και μάλιστα αν οι τελεστές αυτοί εμφανίζονται αριστερά και δεξιά μιας μεταβλητής τότε εκτελείται πρώτα αυτός που βρίσκεται αριστερότερα και μετά ο άλλος. Από άποψη προτεραιότητας ακολουθούν στη συνέχεια οι + και με την ίδια αρχή σε περίπτωση που ενεργούν στην ίδια μεταβλητή. Έτσι το σωστό αποτέλεσμα στην προηγούμενη παράσταση είναι το 34. Είναι πολύ χρήσιμο, γιανααποφεύγονταισφάλματα, αλλά και για να είναι ευανάγνωστο το πρόγραμμα να χρησιμοποιούνται παρενθέσεις ακόμα και εκεί που δεν μπορούν να αποφευχθούν. Όπως στην παράσταση 8*(7-6+5)%(4+3/2)-1. Τι αποτέλεσμα θα λαμβάνατε από αυτή την παράσταση. Είστε βέβαιοι για αυτό που αποφασίσατε; Για να υπολογιστεί ο μέσος όρος βέβαια δυο ακεραίων απαιτούνται σίγουρα παρενθέσεις. Για παράδειγμα ο μέσος όρος του 7 και 8 για να υπολογισθεί πρέπει να γραφεί (7+8)/2 γιατί αλλιώς θα διαιρούσε μόνο τον ένα και στο αποτέλεσμα θα πρόσθετε τον άλλο. Είστε βέβαιοι ότι ακόμα και έτσι θα εμφανίσει το σωστό αποτέλεσμα; Δοκιμάστε το. ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 3
Μετατροπή τύπων Στον προγραμματισμό με C μπορούμε να συνδυάζουμε διαφορετικούς τύπου αριθμητικών δεδομένων και ο μεταγλωττιστής εφαρμόζει την αυτόματη μετατροπή τύπου. Αυτό σημαίνει ότι αν προστεθεί ακέραιος με πραγματικό το αποτέλεσμα θα εμφανισθεί αυτόματα ως πραγματικός. Για να γίνει αυτό πρέπει ένας τουλάχιστον όρος της παράστασης να έχει υποδιαστολή. Αλλιώς διατηρεί τον τύπο δεδομένων και στα προηγούμενα παραδείγματα θα εμφανίσει λάθος αποτέλεσμα. Στον μέσο όρο του 7 και 8 θα εμφανίσει 7. Θα αποκόψει το δεκαδικό μέρος του αποτελέσματος. Ενώ αν ο παρονομαστής το 2 γραφόταν ως 2. θα εμφάνιζε σωστά 7.5 Δοκιμάστε το!!! Υπάρχει βέβαια και η δυνατότητα ρητής δήλωσης μετατροπής όπου ο προγραμματιστής δηλώνει τον νέο τύπο δεδομένων που επιθυμεί. Η δήλωση αυτή γίνεται με (float) (double) κ.ο.κ. Για παράδειγμα στο μέσο όρο θα ήταν (n 1 +n 2 +n 3 + n N )/(float) N ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 4
Τυχαίοι αριθμοί Οι τυχαίοι αριθμοί είναι εξαιρετικά χρήσιμοι σε επιστημονικά προγράμματα όπως για παράδειγμα οι προσομοιώσεις αλλά και παιχνίδια του υπολογιστή. Οι τυχαίοι αριθμοί που παράγονται από υπολογιστή λέγονται ψευδοτυχαίοι γιατί δεν δημιουργούνται από τυχαία δραστηριότητα π.χ. κληρωτίδα. Για την παραγωγή τέτοιων αριθμών χρησιμοποιείται η συνάρτηση rand() η οποία κάθε φορά που καλείται επιστρέφει διαφορετικό ακέραιο αριθμό από 0 μέχρι τον RAND_MAX που έχει ορισθεί στο περιβάλλον εργασίας. Η συνάρτηση βρίσκεται στη διασύνδεση stdlib.h η οποία βέβαια πρέπει να δηλωθεί ως. Υπάρχει βέβαια τρόπος να αλλάξουμε όπως επιθυμούμε τα όρια των τυχαίων αριθμών ανάλογα με την περίσταση, στο ζάρι από 1 μέχρι 6, στο ΛΟΤΤΟ από 1 μέχρι 49 και στο νόμισμα κορώνα-γράμματα. Ας δοκιμάσουμε την παραγωγή τυχαίων αριθμών από 1 μέχρι 49. Αυτό μπορεί να γίνει αν το διάστημα από 0 μέχρι τον RAND_MAX το αναγάγουμε από 1 μέχρι 49. Ας μελετήσουμε τα 2 επόμενα παραδείγματα. ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 5
Παραδείγματα τυχαίων αριθμών int i, temp; {printf("ο ΜΕΓΙΣΤΟΣ ΤΥΧΑΙΟΣ ΑΡΙΘΜΟΣ ΕΙΝΑΙ : %d\n", RAND_MAX); printf("το ΠΡΟΓΡΑΜΜΑ ΠΑΡΑΓΕΙ 6 ΤΥΧΑΙΟΥΣ ΑΡΙΘΜΟΥΣ ΤΟΥ ΛΟΤΤΟ \n"); for(i=1;i<7;i++) { temp=temp%49+1; printf("%5d",temp); return 0;} #include <time.h> int i,temp; {srand((int) time(null)); printf("ο ΜΕΓΙΣΤΟΣ ΤΥΧΑΙΟΣ ΑΡΙΘΜΟΣ ΕΙΝΑΙ : %d\n", RAND_MAX); printf("το ΠΡΟΓΡΑΜΜΑ ΠΑΡΑΓΕΙ 6 ΤΥΧΑΙΟΥΣ ΑΡΙΘΜΟΥΣ ΤΟΥ ΛΟΤΤΟ \n"); for(i=1;i<7;i++){ temp=temp%49+1; printf("%5d",temp);} returnσινατκασ 0;} Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 6
Εφαρμογές σε προβλήματα #include <time.h> #include <time.h> #include <math.h> int MKD(int n1, int n2); int protos(int n); {int i,n1,n2,temp; {int i,temp; srand((int) time(null)); srand((int) time(null)); for(i=1;i<=10;i++) { for(i=1;i<=10;i++) { n1=temp%2000+1; temp=temp%12+1; if(protos(temp)>0) printf("ο αριθμός %d δεν είναι n2=temp%2000+1; πρώτος\n",temp); else printf("ο αριθμός %d είναι πρώτος \n",temp);} printf("ο ΜΚΔτων%d και %d είναι o %d\n",n1,n2,mkd(n1,n2));} return 0; return 0;} } int MKD(int n1, int n2) int protos(int n) { { int i, limit; int r=1; if(n<=1) return (1); while(r>0) { if(n==2) return (0); r=n1%n2; if(n%2==0) return (1); if(r==0) break; limit=sqrt(n)+1; n1=n2; for (i=3; i<=limit; i+=2) { if(n%i==0) return (1);} n2=r; } return (0); return (n2); } } ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 7