Δημοσιεύτηκε: 28 Ιούλ 2011, 10:51
migf1 έγραψε:
[snip]
ΑΝ είμαστε όλοι οκ με την λύση που έδωσα για την άσκηση αυτή και δεν έχουμε απορίες (αν έχετε απορίες, ΓΡΑΨΤΕ ΤΕΣ να τις λύσουμε) δείτε έναν ακόμα τρόπο επίλυσης της άσκησης και πείτε αν δεν καταλαβαίνετε κάτι και τι, για να το λύσουμε κι αυτό πριν πάμε παρακάτω. Ξεκινήστε να τον διαβάζετε από την main() στο τέλος και όποια συνάρτηση συναντάτε δείτε τον κώδικά της...
Βασικά, μάλλον είναι καλύτερα να γράψω και 2 λόγια, ε;
Λοιπόν στον 2ο τρόπο έχω φτιάξει ξεχωριστές συναρτήσεις για κάθε τύπο μεταβλητής που θέλω να διαβάσω. Οπότε όταν θέλω να διαβάσω π.χ. έναν int, καλώ την get_int και της περνάω σαν όρισμα την διεύθυνση της int μεταβλητής που θέλω να διαβάσει η συνάρτηση (αντίστοιχο δηλαδή του: scanf('%d", &x) ).
Θα μπορούσαμε να πούμε πως οι αντιστοιχίες είναι οι εξής:
- η get_char( &c ) αντιστοιχεί με scanf("%c", &c)
- η get_int( &n ) αντιστοιχεί με scanf("%d", &n)
- η get_long( &n ) αντιστοιχεί με scanf("%ld", &n)
- η get_int( &x ) αντιστοιχεί με scanf("%f", &x)
Το βασικό μειονέκτημα αυτής της προσέγγισης είναι πως δεν μπορούμε να διαβάσουμε πολλές μεταβλητές ταυτόχρονα στην ίδια γραμμή εισόδου. Δηλαδή όσες τιμές και να πληκτρολογήσουμε, οι συναρτήσεις αυτές διαβάζουν μονάχα την πρώτη (αυτό θα το λύσουμε αργότερα, γιατί χρειάζονται να μάθουμε άλλα πράγματα πρώτα).
Προς τι όμως όλη αυτή η βαβούρα;
Καταρχήν, όπως έχουμε πει γλιτώνουμε το πρόβλημα με τα απομεινάρια στη γραμμή εισόδου. Δοκιμάστε δυο παραλλαγές του κώδικα, μια με τις συναρτήσεις get_ που φτιάξαμε παραπάνω και μια με τα scanf που τους αντιστοιχούν. Στην κάθε παραλλαγή πληκτρολογήστε στην είσοδο περίεργα δεδομένα, π.χ πολλές τιμές αντί για μια που ζητάει το πρόγραμμα σε κάθε είσοδο. Θα δείτε πως η παραλλαγή με τα scanf θα "προσπερνάει" αναπάντητες πολλές από τις ερωτήσεις του προγράμματος.
Ο άλλος ΒΑΣΙΚΟΤΑΤΟΣ λόγος για την προσέγγιση που αναλύουμε είναι πως στην συντριπτική πλειοψηφία των γραφικών περιβαλλόντων (GUI) π.χ. Gnome, KDE, Windows, και σχεδόν οποιοδήποτε άλλο η είσοδος διαβάζεται ΠΑΝΤΑ ως string. Οπότε είναι ΕΩΣ ΚΑΙ ΑΠΑΡΑΙΤΗΤΟ να ξέρουμε πως να μετατρέπουμε strings σε int, long, float, κλπ (όπως και το ανάποδο, να μετατρέπουμε δηλαδή τις μεταβλητές μας int, long, float, κλπ σε strings για να τις τυπώσουμε στην οθόνη... αυτό το κάνουμε ήδη με την printf αλλά θα το δούμε αργότερα και με την sprintf).
Οπότε, δείτε τους 2 τρόπους επίλυσης της άσκησης και γράψτε ότι απορίες έχετε πριν προχωρήσουμε σε 3ο τρόπο επίλυσης.