Καρχαρίαςςς Δημοσ. 11 Νοεμβρίου 2012 Δημοσ. 11 Νοεμβρίου 2012 Καλημερα! Οπως λεει και ο τιτλος ειμαι νεος στον προγραμματισμο και θελω να ξεκινισω να μαθω την c. Εχω ηδη ενα βιβλιο αλλα ειναι πολυ κακογραμμενο και ασαφης! Το βιβλιο που εχω λεγεται "Η Τέχνη και Επιστήμη της C" απο τις εκδοσεις "ΚΛΕΙΔΆΡΙΘΜΟΣ" Τωρα αν εχετε καμια ιδεα ποιο βιβλιο να αγορασω για να κανω σωστη δουλεια θα ημουν υποχρεος. Χρησιμοποιω το DEV C++ Ευχαριστω εκ των πρωτερων καλη σας μερα!
migf1 Δημοσ. 11 Νοεμβρίου 2012 Δημοσ. 11 Νοεμβρίου 2012 "C Programming, a Modern Approach - 2nd Edition", by K.N.King Κι εδώ η σελίδα του: http://knking.com/books/c2/
imitheos Δημοσ. 12 Νοεμβρίου 2012 Δημοσ. 12 Νοεμβρίου 2012 Αν ψάξεις στο παρόν υπο-φόρουμ θα βρεις πολλά νήματα για το συγκεκριμένο θέμα. Το βιβλίο του King που πρότεινε ο migf1 είναι πάρα πολύ καλό και το συστήνει πολύς κόσμος. Αν και δεν νομίζω να βρεις πουθενά την παλαιότερη έκδοση, παρόλα αυτά να τονίσουμε ότι θέλεις την 2η έκδοση γιατί έχει πολλές βελτιώσεις. Επίσης μη χρησιμοποιείς το Dev-C++ γιατί είναι αρχαίο και με πολλά προβλήματα. Ο migf1 είχε γράψει ένα θέμα για μια βελτιωμένη έκδοση του Dev-C++ και για το οποίο είχε γράψει την Ελληνική μετάφραση (νομίζω δηλαδή ότι ήταν για το Dev-c++ δεν θυμάμαι). Ψάξε να βρεις το νήμα. Εναλλακτικά μπορείς να χρησιμοποιήσεις Eclipse, Visual Studio (υπάρχει δωρεάν έκδοση), Codelite, και πολλά άλλα IDE. Το Codelite ειδικά είναι πολύ ελαφρύ και στα Windows έρχεται ενσωματωμένο με τον MinGW compiler οπότε δεν χρειάζεται πολύ παίδεμα στην εγκατάστασή του. Απόφυγε Ελληνικά βιβλία γιατί όντως τα περισσότερα είναι κακογραμμένα και γράφουν πολλές ανακρίβειες και λάθη. Αν θέλεις οπωσδήποτε Ελληνικό, δεν γνωρίζω κάποιο πολύ καλό. Σίγουρα απόφυγε αυτό. Συνήθως προτείνουμε το βιβλίο Η Γλώσσα C σε βάθος σαν καλή επιλογή αλλά γράφει κάποια πράγματα που με χαλάνε. 1) Στη σελίδα 65 αναφέρει "Για παράδειγμα στην παράσταση που ακολουθεί θα υπολογιστεί πρώτα η παράσταση μέσα στις παρενθέσεις" Η παράσταση είναι η "a > b && (a == c || a < c)" Οι λογικοί τελεστές ακολουθούν αριστερή -> δεξιά φορά και ο AND έχει μεγαλύτερη προτεραιότητα από τον OR οπότε πρώτα θα εκτελεστεί το a > b αντί για την παράσταση μέσα στις παρενθέσεις. Επίσης οι λογικοί τελεστές για λόγους απόδοσης ακολουθούν τη λειτουργία "short circuit" δηλαδή αν το a είναι μικρότερο του b, τότε η παράσταση μέσα στις παρενθέσεις δεν θα υπολογιστεί καθόλου. 13) Στη σελίδα 277 αναφέρει "η πρόταση που ακολουθεί δηλώνει δύο μεταβλητές δείκτη σε int, τις p1 και p2." και στο βελάκι αναφέρει "Οι μεταβλητές p1 και p2 δηλώνονται ως δείκτες σε int!". Η πρόταση είναι "int* p1, p2;" Σε αυτή την περίπτωση η p2 είναι απλός int και μόνο η p1 είναι δείκτης (η πρόταση είναι συντακτικά ίδια με την "int *p1, p2" στην οποία φαίνεται πιο εύκολα αυτό που λέω). 14) Στη σελίδα 316 ορίζεται ένας δισδιάστατος πίνακας a[4][3] και αναφέρει πως ο a είναι "δείκτης σε δείκτες τύπου int". Αυτό δεν είναι σωστό. Στις περισσότερες εκφράσεις, ο a θα μετατραπεί όντως σε δείκτη αλλά θα γίνει "δείκτης σε πίνακα τριών int" όχι διπλός δείκτης. 16) Στη σελίδα 325 ορίζεται ο πίνακας lex[10] και μετά έχουμε lex="Νίκος". Έπειτα εξηγείται "Η παραπάνω πρόταση είναι λανθασμένη. Παρόλο που αρχικά φαίνεται να δουλεύει σωστά, είναι αιτία πολλών προβλημάτων". Εφόσον έχουμε ορίσει πίνακα και όχι δείκτη, δεν θα πρέπει να παίξει καν η παραπάνω ανάθεση. Ο compiler θα πρέπει να βαρέσει error. Η λειτουργία αυτή περιγράφεται πιο αναλυτικά στο παράδειγμα 12.6. Η λειτουργία περιγράφεται σωστά αλλά και πάλι ισχύει αν έχουμε ορίσει δείκτη και όχι πίνακα, πχ. char *lex; lex = malloc(50); lex = "Νίκος"; 17) Στη σελίδα 389 που μιλάει για τα bit fields, αναφέρει πως η δομή καταλαμβάνει χώρο 14 byte (8 για double, 4 για int, 1 για char, 1 για το bit field). Ο χώρος των bit fields εξαρτάται από τον compiler και συνήθως ανάγεται στον τύπο δεδομένων δηλαδή ενώ τα τρία πεδία χρειάζονται 3 bits οπότε 1 byte είναι αρκετό, το πιο πιθανό είναι να καταλάβουν 4 byte που χρειάζεται ένας unsigned int σε 32bit. 18) Σε πολλά παραδείγματα του κεφαλαίου των αρχείων χρησιμοποιείται ως συνθήκη ο EOF ή η συνάρτηση feof με αποτέλεσμα να μην λειτουργεί σωστά το πρόγραμμα. πχ στο πρόγραμμα της σελίδας 416 εμφανίζεται ένας παραπάνω χαρακτήρας από αυτούς που έχει το αρχείο (εμφανίζεται σαν χαρακτήρας το -1 που είναι το EOF) 19) Στη σελίδα 420 αναφέρει ότι ο χαρακτήρας EOF μπορεί να εμφανιστεί σαν κανονικό byte αν το αρχείο είναι δυαδικό. Παλαιότερα σε DOS χρησιμοποιούταν ο χαρακτήρας 0x1A ως σήμανση του τέλους του αρχείου για αυτό και πήρε καταχρηστικά το τίτλο "χαρακτήρας EOF". Αυτό όμως δεν συμβαίνει πια και η "σταθερά" EOF που χρησιμοποιεί η C δεν υφίσταται ως χαρακτήρας (για αυτό και ορίζεται να έχει αρνητική τιμή) απλά συμβολίζει την κατάσταση "τελείωσε το αρχείο". 20) Στη σελίδα 421 αναφέρει πως η συνάρτηση fgets διαβάζει είτε ένα πλήθος χαρακτήρων όσο η τιμή της παραμέτρου mikos. Σε κάθε περίπτωση προσθέτει ένα χαρακτήρα αλλαγής γραμμής. Αυτό δεν είναι απολύτως σωστό. Η fgets θα διαβάσει ένα χαρακτήρα λιγότερο από το mikos ώστε να εισάγει πάντα τον χαρακτήρα '\0'. Αν όμως αυτό που διαβαστεί είναι μικρότερο από "mikos-1" τότε ο χαρακτήρας newline που θα διαβαστεί διατηρείται και δεν αφαιρείται. 21) Στη σελίδα 508 αναφέρει ότι η μόνη διαφορά μεταξύ malloc και calloc είναι ο τρόπος κλήσης ενώ η calloc μηδενίζει κιόλας τη εκχωρημένη μνήμη. Τα παραπάνω είναι κάποια χτυπητά λάθη που έχει η τελευταία έκδοση που κυκλοφόρησε πριν λίγο καιρό και θα διορθωθούν στην επόμενη ανατύπωση του βιβλίου. Εκτός αυτών όμως υπάρχουν και κάποιες (κατά τη γνώμη μου) κακές πρακτικές όπως η χρήση Dev-C++, gets, κτλ οι οποίες δεν θα διορθωθούν. Αν δεν σου είναι εμπόδιο η ξένη γλώσσα, προτίμησε αυτό του King. 1
Star_Light Δημοσ. 12 Νοεμβρίου 2012 Δημοσ. 12 Νοεμβρίου 2012 Ναι. Αυτο με το δεικτης σε δεικτη οταν κανει αναφορα σε δισδιάστατους πίνακες υπάρχει και σε άλλο ελληνικο βιβλιο και οντως ειναι λάθος. Δεν υπάρχει διπλος δεικτης σε αυτο το σημειο ειναι κατι που υπεραναλυθηκε και στο θρεντ με τις ερωτησεις για την C. Η Τεταρτη έκδοση του Εγχειριδιου της C του Μαριου Γκιουρδα εμφανιζει επισης αυτο το λαθος στην Σελ. 365 Σε αυτο το παράδειγμα , ειδατε οτι ο multi ειναι ενας δεικτης προς το multi[0] . Ειδατε επισης οτι multi[0] ειναι ενας δεικτης προς το multi[0][0] . Ως εκ τουτου ο multi ειναι ενας δεικτης προς εναν δεικτη. Εν κατακλείδι ενστερνίζομαι τις απόψεις των migf1 , imitheos για την προτροπη ως προς το ξενογλωσσο βιβλιο δεδομενου οτι εκτος απο την ακριβεια στην προσεγγιση της γλωσσας δινεται η εξτρα δυνατοτητα να εξασκησεις και τα αγγλικα σου. Με ενα σμπάρο 2 τριγώνια στον ιδιο χρονο. Αρα αποδοτικοτερο διαβασμα αρα κερδος χρονου αρα το επιλεγουμε. Το ελληνικο βιβλιο μπορεις να το χρησιμοποιησεις συμπληρωματικα για να ανατρεξεις αν δεν εχεις καταλαβει κατι καλα στο ξενογλωσσο . Αλλα οχι σαν κύριο οδηγο εκμάθησης. Για IDE προτείνω codeblocks αν εισαι χρηστης των Windows ... κατεβαινει αμεσως και πολυ ευκολα με ενσωματωμενο compiler.... ενω το Geany για Linux με δεδομενο οτι ειναι εγκατεστημένος ο gcc που σε μενα ο 4.4.5 ήταν μαζι με την διανομη εκτος και αν τον ειχα κανει εγκατασταση μετα εγω απο τα repositories δεν θυμαμαι.
migf1 Δημοσ. 12 Νοεμβρίου 2012 Δημοσ. 12 Νοεμβρίου 2012 ... Αυτο με το δεικτης σε δεικτη οταν κανει αναφορα σε δισδιάστατους πίνακες υπάρχει και σε άλλο ελληνικο βιβλιο και οντως ειναι λάθος. Δεν υπάρχει διπλος δεικτης σε αυτο το σημειο ειναι κατι που υπεραναλυθηκε και στο θρεντ με τις ερωτησεις για την C. Η Τεταρτη έκδοση του Εγχειριδιου της C του Μαριου Γκιουρδα εμφανιζει επισης αυτο το λαθος στην Σελ. 365 Σε αυτο το παράδειγμα , ειδατε οτι ο multi ειναι ενας δεικτης προς το multi[0] . Ειδατε επισης οτι multi[0] ειναι ενας δεικτης προς το multi[0][0] . Ως εκ τουτου ο multi ειναι ενας δεικτης προς εναν δεικτη. ... Δεν είναι καθόλου λάθος, ως ερμηνεία βρίσκεται σε απόλυτη αρμονία με το παράδειγμα του προτύπου (το έχω παραθέσει από χτες, αλλά φαίνεται δεν το είδες, οπότε ορίστε ξανά...) ISO C11 ... 4. EXAMPLE Consider the array object defined by the declaration int x[3][5]; Here x is a 3 × 5 array of ints; more precisely, x is an array of three element objects, each of which is an array of five ints. In the expression x, which is equivalent to (*((x)+(i))), x is first converted to a pointer to the initial array of five ints. Then i is adjusted according to the type of x, which conceptually entails multiplying i by the size of the object to which the pointer points, namely an array of five int objects. The results are added and indirection is applied to yield an array of five ints. When used in the expression x[j], that array is in turn converted to a pointer to the first of the ints, so x[j] yields an int. @topic-starter: Για την ελληνική μετάφραση του σύγχρονου dev-c++ fork, το σχετικό νήμα είναι εδώ: http://www.insomnia....υ-orwell-dev-c/ Αν και προσωπικά για IDE θα σου συνιστουσα είτε το CodeLite που ανέφερε ο imitheos, αν δεν θέλεις πολλά-πολλά (αν κι έχει πάααρα πολλά) είτε το Code::Blocks που ανέφερε ο StarLight, αν θέλεις full-blown, cross-platform IDE.
Καρχαρίαςςς Δημοσ. 12 Νοεμβρίου 2012 Μέλος Δημοσ. 12 Νοεμβρίου 2012 Κατεβασα E-BOOK αυτου που μου προταθηκε αρχικα και οντως τα εξηγει πολυ καλα ολα... > #include <stdio.h> { printf("To C or Not To C: Here is the question.\n"); return 0; } Τι λετε καλα τα παω;
imitheos Δημοσ. 12 Νοεμβρίου 2012 Δημοσ. 12 Νοεμβρίου 2012 Κατεβασα E-BOOK αυτου που μου προταθηκε αρχικα και οντως τα εξηγει πολυ καλα ολα... > #include <stdio.h> { printf("To C or Not To C: Here is the question.\n"); return 0; } Τι λετε καλα τα παω; Τζάμι τα πας, καλή συνέχεια Η main που πήγε ? 1
poulinos Δημοσ. 12 Νοεμβρίου 2012 Δημοσ. 12 Νοεμβρίου 2012 τα Posts μεταφερθηκαν διοτι ο τοπικ σταρτερ μιλαει για βιβλιακαι εχετε αναλυσει αλλα θεματα που δεν ανηκαν στο παρον θεμα και μεταφερθηκαν στο γενικοτερο θεμα.thaxnss kai plz keep this topic clean
migf1 Δημοσ. 14 Νοεμβρίου 2012 Δημοσ. 14 Νοεμβρίου 2012 τα Posts μεταφερθηκαν διοτι ο τοπικ σταρτερ μιλαει για βιβλιακαι εχετε αναλυσει αλλα θεματα που δεν ανηκαν στο παρον θεμα και μεταφερθηκαν στο γενικοτερο θεμα.thaxnss kai plz keep this topic clean Ευχαριστούμε και συγγνώμη.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα