Λύσειςασκήσεων εργαστηρίου
Πράξεις κλασµάτων Στην άσκηση αυτή θέλουµε να υπολογίσουµε το άθροισµα, τη διαφορά, το γινόµενο και το πηλίκο δύο κλασµάτων. Το σύµβολο της πράξης αποθηκεύεταιστηνµεταβλητή $praxi. Στη συνέχεια κάνουµε τους απαραίτητους ελέγχους ώστε να µην έχουµε διαίρεση µε το 0. Στην περίπτωση που έχουµε 0 σε κάποιο παρονοµαστή ή πράξηδιαίρεσηκαι 0 στοναριθµητήτουδιαιρέτη (δεύτερουκλάσµατος) θέλουµεναµηνσυνεχίζεταιηεκτέλεσητουπρογράµµατος. Με την εντολή switch υπολογίζουµε τον αριθµητή και τον παρονοµαστή του αποτελέσµατος ανάλογα µε την πράξη που έχουµε αποθηκευµένη στην µεταβλητή $praxi. Αν στην µεταβλητή αυτή έχουµε αποθηκεύσει σύµβολο διαφορετικό από αυτό των τεσσάρων πράξεων θέλουµε να τυπώνεται µήνυµα λάθους και το πρόγραµµα να τερµατίζει. Για το λόγο αυτό χρησιµοποιούµε την βοηθητική µεταβλητή $res που όταν είναι false η πράξη είναι επιτρεπτή. Στη συνέχεια διακρίνουµε περιπτώσεις που το αποτέλεσµα της πράξης είναι αρνητικό. Κάνουµε τις µετατροπές µε τις απόλυτες τιµές αριθµητή και παρονοµαστήκαικρατούµετοπρόσηµογιανατοεµφανίσουµεστοτέλος. Σε διαφορετική περίπτωση δεν θα εµφανιζόταν το πρόσηµο πριν το ακέραιο µέρος ή σε περόπτωση που είχα αριθµητή και παρονοµαστή µικρότερο του µηδενός θα είχα ακέραιο µέρος µικτού θετικό και αριθµητή και παρονοµαστή αρνητικούς.
$praxi="+"; $flag=0; $res=false; $ar1=7; $par1=10; $ar2=1; $par2=8; if (($par1==0)or($par2==0)or(($ar2==0)&&($x=="/"))) print "lathos data"; else { switch ($praxi){ case "+": $ar=$ar1*$par2+$ar2*$par1; $par=$par1*$par2; break; case "-": $ar=$ar1*$par2-$ar2*$par1; $par=$par1*$par2; break; case "*": $ar=$ar1*$ar2; $par=$par1*$par2; break; case "/": $ar=$ar1*$par2; $par=$par1*$ar2; break; default: $res=true; print "wrong praxh"; if ($res==false) { echo "o arithmitis isoute me $ar kai exei typo dedomenwn: ". gettype($ar)."<br/>"; echo "o paronomastis isoute me $par kai exei typo dedomenwn: ". gettype($par)."<br/>"; $y=$ar/$par; if ($ar*$par<0) {$flag=1; $ar=abs($ar); $par=abs($par); else if ($ar<0 and $par<0) {$ar=abs($ar); $par=abs($par); print "To phliko ths diaireshs isoutai me $y"; settype($y,integer); // το ακέραιο µέρος του πηλίκου ειναι το ακέραιο µέρος του µικτού $z=$ar%$par; /* το υπολοιπο της διαίρεσης αριθµητή και παρονοµαστη είναι ο αριθµητής του κλασµατικού µέρους του µικτού*/ if ($flag==1) print "<br /> O miktos exei akeraio meros -$y, arithmiti $z, paronomasti $par."; else print "<br /> O miktos exei akeraio meros $y, arithmiti $z, paronomasti $par.";
Τετραψήφιοι Η άσκηση που ακολουθεί υπολογίζει και εκτυπώνει µε διάφορους τρόπους τους τετραψήφιους εκείνους που έχουν την ιδιότητα να είναι ίσοι µε το άθροισµα της τέταρτης δύναµης των ψηφίων τους. Οι αριθµοί αυτοί είναι οι: 1634, 8208, 9474. (1634=1 4 +6 4 +3 4 +4 4 ) Στην πρώτη προτεινόµενη λύση µε ένα βρόχο σχηµατίζω όλους τους τετραψήφιους. Για καθένα από αυτούς αποµονώνω το ψηφίο των χιλιάδων παίρνοντας το ακέραιο µέρος του πηλίκου της διαίρεσης του τετραψήφιου µε το 1000. Στη συνέχεια από το υπόλοιπο της διαίρεσης του τετραψήφιου µε το 1000 κρατώ τον τριψήφιο που σχηµατίζεται από τα τρία τελευταία ψηφία του τετραψήφιου. ιαιρώντας µε το 100 αυτή τη φορά και ακολουθώντας αντίστοιχα την διαδικασία που περιγράφηκε για τις χιλιάδες αποµονώνω το ψηφίο των εκατοντάδων κ.λπ. Στη δεύτερη προτεινόµενη λύση διαιρώ τον τετραψήφιο µε το 10 και το µεν υπόλοιποµουδίνειτιςµονάδεςτοδεακέραιοµέροςτουπηλίκουτον τριψήφιοπουσχηµατίζεταιαπότα 3 πρώταψηφίατουτετραψήφιου. Συνεχίζοντας να διαιρώ µε το 10 παίρνω τις δεκάδες και τον διψήφιο που σχηµατίζεται από τα 2 πρώτα ψηφία του τετραψήφιου. Και συνεχίζω µε τον ίδιο τρόπο. Στην τρίτη προτεινόµενη λύση χρησιµοποιώ φωλιασµένα loops προκειµένου νασχηµατίσωτοντετραψήφιοκαιναέχωέτσιεξαρχήςέναέναταψηφία του.
for ($i=1000; $i<10000; $i++){ /* ιαιρώ τον τετραψήφιο µε το 1000 και κρατώ το ακέραιο µέρος του πηλίκου. Αυτό µου δίνει το ψηφίο των χιλιάδων, του οποίου υπολογίζω την τέταρτη δύναµη.*/ $xil=$i/1000; settype($xil,integer); $xil=$xil*$xil*$xil*$xil; /*Το υπόλοιπο της διαίρεσης του τετραψήφιου µε το 1000 µου δίνει τον τριψήφιο. Για παράδειγµα αν ο αριθµός µου είναι ο 3587 το υπόλοιπο της διαίρεσης µε το 1000 µου δίνει το 587. Αποθηκεύω τον τριψήφιο στο $p τονδιαιρώµετο 100 καικρατώτοακέραιοµέρος. Έχωέτσιτοψηφίοτωνεκατοντάδωνπουτο υψώνω στην τέταρτη δύναµη*/ $p=$i%1000; $ek=$p/100; settype($ek,integer); $ek=$ek*$ek*$ek*$ek; //Συνεχίζω µε τον ίδιο τρόπο προκειµένου να υπολογίσω το ψηφίο των δεκάδων $p=$p%100; $dek=$p/10; settype($dek,integer); $dek=$dek*$dek*$dek*$dek; //Οι µονάδες προκύπτουν πλέον εύκολα από το υπόλοιπο της διαίρεσης του νέου πηλίκου µε το 10. $mon=$p%10; $mon=$mon*$mon*$mon*$mon; if ($i==$xil+$ek+$dek+$mon) //Προσοχή στα δύο ίσον που σηµαίνουν σύγκριση. print $i. "<br />";
for ($i=1000;$i<10000;$i++){ $mon=$i%10; //Το υπόλοιπο της διαίρεσης του τετραψήφιου µε το 10 µου δίνει τις µονάδες $mon=$mon*$mon*$mon*$mon; $p1=(int)($i/10); /*Το ακέραιο µέρος του πηλίκου της διαίρεσης του τετραψήφιου µε το 10 µου δίνει τον τριψήφιο που αποτελείται από τα τρία πρώτα ψηφία του αριθµού για παράδειγµα το ακέραιο µέρος του πηλίκου της διαίρεσης του 1634 µε το 10 είναι 163.*/ $dek=$p1%10; //Το υπόλοιπο της διαίρεσης του τριψήφιου µε το 10 µου δίνει τις δεκάδες $dek=$dek*$dek*$dek*$dek; $p2=(int)($p1/10); /*Το ακέραιο µέρος του πηλίκου της διαίρεσης του τριψήφιου µε το 10 µου δίνει τον διψήφιο. Για το παράδειγµά µαςτο 16*/ $ek=$p2%10; //Το υπόλοιπο της διαίρεσης του διψήφιου µε το 10 µου δίνει τις εκατοντάδες $ek=$ek*$ek*$ek*$ek; $xil=(int)($p2/10); //Το ακέραιο µέρος του πηλίκου της διαίρεσης του διψήφιου µε το 10 µου δίνει τις χιλιάδες $xil=$xil*$xil*$xil*$xil; if ($i==$xil+$ek+$dek+$mon) print ("$i <br />"); Οι δύο κάθετες χρησιµοποιούνται για να δηλώσουν πως το υπόλοιπο της γραµµής είναι σχόλια. (//) Η κάθετος αστεράκι χρησιµοποιείται για να γράψω σχόλια σε περισσότερες από µία γραµµές. (/*...σχόλια... */)
for ($i=1;$i<10;$i++) //Θέλω τετραψήφιο αριθµό άρα το ψηφίο των χιλιάδων παίρνει τιµές από 1 έως 9 for ($j=0;$j<10;$j++) for ($k=0;$k<10;$k++) for($l=0;$l<10;$l++){ $x=1000*$i +100*$j+10*$k+$l; //υπολογίζωτοντετραψήφιο $xil=$i*$i*$i*$i; $ek=$j*$j*$j*$j; $dek=$k*$k*$k*$k; $mon=$l*$l*$l*$l; if ($x==$xil+$ek+$dek+$mon) print $x."<br /> "; Στη λύση που προτείνεται εδώ χρησιµοποιώ πολλά loops το ένα µέσα στο άλλο προκειµένου να σχηµατίσω τον τετραψήφιοαπόόλεςτιςπιθανέςτιµέςπουµπορείναπάρουνταψηφίατου. Μεαυτότοντρόποαποφεύγωτις πολλές διαιρέσεις και τα υπόλοιπα.