Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Αν και δε διαφωνώ γενικά με όσα λες, συνήθως η C δε διδάσκεται με τον τρόπο τον οποίο εννοείς. Εμείς, πχ, την έχουμε ως πρώτη γλώσσα προγραμματισμού και μαθαίνουμε γενικές αρχές προγραμματισμού (αρχεία, πίνακες, συναρτήσεις, πράξεις κλπ). Τη χρησιμοποιούμε και σε μεγαλύτερα εξάμηνα για pipes/sockets/forks/threads/MPI κλπ αλλά αυτό που θέλω να πω είναι ότι συνήθως η C χρησιμοποιείται για τη διδασκαλία πραγμάτων που δε θα έπρεπε να διδάσκονται με C. Αυτό που σε νοιάζει στο πρώτο εξάμηνο είναι να διαβάσεις ένα string ή ένα integer για να κάνεις μερικά απλά πράγματα. Όχι να κάθεσαι να ψάχνεις γιατί η scanf δε σου δουλεύει. Δεν είναι λογικό να περιμένεις από κάποιον (ή έστω την πλειοψηφία) να καταλάβει τις ιδιοτροπίες της C στο 1ο εξάμηνο, όταν το πρώτο μάθημα αρχιτεκτονικής είναι στο 3ο. Αν μου πεις ότι σε μια σχολή κάνουν από το πρώτο εξάμηνο αρχιτεκτονικές και λοιπά hardware-ίστικα μαθήματα τότε ναι, δώσε C και δώσε πόνο. Αλλά διαφωνώ κάθετα με τη χρήση της C ως γλώσσα εκμάθησης αλγοριθμικής σκέψης.

Δεν φταίει η C αν την διδάσκουν/μαθαίνουν με αμφιλεγόμενο τρόπο. Ως γλώσσα είναι κι αυτή (όπως όλες οι δημοφιλείς) μια χαρά γλώσσα για να εισαχθεί κάποιος στον προγραμματισμό.

 

Ένα μόνο παράδειγμα, για να μη γράφουμε σεντόνια πάλι. Γράφεις:

...

Αυτό που σε νοιάζει στο πρώτο εξάμηνο είναι να διαβάσεις ένα string ή ένα integer για να κάνεις μερικά απλά πράγματα. Όχι να κάθεσαι να ψάχνεις γιατί η scanf δε σου δουλεύει.

...

Για μένα, αυτό που θα έπρεπε να σε μάθει ως επίδοξο προγραμματιστή ο καθηγητής σου στο 1ο σου εξάμηνο, είναι πως σε ΟΛΕΣ τις γλώσσες αυτό που διαβάζεις είναι ΠΑΝΤΑ string (ούτε integer, ούτε float, ούτε τίποτα άλλο... μόνο strings). Την μετατροπή από string σε οτιδήποτε άλλο την κάνει η συνάρτηση που χρησιμοποιείς για το διάβασμα.

 

Και αντί να σε ξεκινήσει με scanf() για μένα θα έπρεπε να σε ξεκινήσει με fgets() ή με δικιά σας υλοποίηση, και κατόπιν sscanf() ή strtoXXX()

  • Απαντ. 40
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Συχνή συμμετοχή στο θέμα

Δημοσ.

Προσωπικά δεν το βρίσκω καθόλου τραγικό να εξηγείς και να δείχνεις σε έναν επίδοξο προγραμματιστή το πώς και γιατί λειτουργούν τα πράγματα (στην προκειμένη το διάβασμα εισόδου), αντί να τον βομβαρδίζεις με black-boxes και να του λες (υποθέτω) μην ασχολείσαι με πως & γιατί λειτουργεί αυτό από κάτω... τα από κάτω θα τα βρεις έτοιμα. Έτοιμα άραγε από ποιους; Από οικοδόμους ας πούμε; Προφανώς όχι, από προγραμματιστές είναι φτιαγμένα και τα "από κάτω".

Ακριβώς όπως τα λες, υποθέτεις και γι' αυτό παρουσιάζεις για πολλοστή φορά μια κατακρεουργημένη έκδοση του επιχειρήματος της άλλης πλευράς (γνωστό και ως strawman).

 

Για την ακρίβεια δεν υποθέτεις μόνο αυτό αλλά επιπλέον ότι θα "βομβαρδίσεις" με "black boxes", πράγμα που είναι τουλάχιστον αστείο μιας και η οποιαδήποτε printf και scanf είναι ακριβώς το ίδιο black box με την οποιαδήποτε βασική συνάρτηση εισόδου/εξόδου που θα διδάξεις... μόνο που βασικά δε δουλεύει καλά. Και εν πάσει περιπτώσει για σένα ίσως το βασικό "μία για input και μία για output" μπορεί να θεωρείται βομβαρδισμός, αλλά δεν ισχύει το ίδιο για όλους.

 

Το "επιχείρημα" των οικοδόμων, ακόμα κι αν αυτή ήταν η ουσία του (που όπως είπα κάθε άλλο παρά είναι) είναι εξίσου αστείο και δε θέλει πολύ μυαλό να το καταλάβει κανείς. Μήπως ξεκινάς να μιλάς στον αρχάριο οδηγό για λόγους σχέσεων κιβωτίου και για το πώς λειτουργεί ο τετράχρονος εσωτερικής καύσης; Προφανώς όχι (το τελευταίο το λες έτσι γιατί αρτηριοσκληρωτικά το προβλέπει το πρόγραμμα σπουδών). Του λες "η πρώτη είναι πιο δυνατή και γι' αυτό πάντα ξεκινάς με αυτή", και όταν με το καλό μάθει τα βασικά μπορεί -- αν είναι σκόπιμο -- να εμβαθύνει περισσότερο. Όπως και δεν του λες πώς θα υπολογίζει με ακρίβεια την απόσταση φρεναρίσματος, ούτε πως λειτουργεί το ABS. Του λες ακριβώς αυτό που παρουσιάζεις σα λάθος: το ABS είναι ένα πράγμα που σου επιτρέπει να πατάς άφοβα το φρένο. Όταν θες να σταματήσεις, πάτα το όσο πάει.

 

Όμως και το "αν είναι σκόπιμο" που είπα είναι μεγάλο "αν", μιας και οι επαγγελματίες οδηγοί (που θα έλεγε κανείς ότι "οφείλουν" να τα ξέρουν) είναι απειροελάχιστο ποσοστό των ερασιτεχνών. Και όταν θέλεις να διδάξεις δε διδάσκεις σε επαγγελματίες εξ ορισμού. Τέλος, ακόμα και σε επαγγελματίες αυτά τα πράγματα που θα πεις διατρέχεις τον κίνδυνο να τα πεις τζάμπα διότι είτε λόγω αλλαγής τεχνολογιών είτε λόγω εξειδίκευσης είτε γιατί απλά δεν έτυχε, ένα σημαντικό ποσοστό γνώσεων θα πάει χαμένο σε σημαντικό ποσοστό επαγγελματιών. Πόσο μάλλον στην πληροφορική όπου τόσο το εύρος των τεχνολογιών όσο και η ταχύτητα με την οποία εξελίσσονται (και εγκαταλείπονται) είναι απείρως μεγαλύτερα.

 

Εν πάσει περιπτώσει, από τη στιγμή που διδάσκεις/μαθαίνεις προγραμματισμό οφείλεις να μπεις ΚΑΙ σε λεπτομέρειες, είτε σου αρέσει είτε όχι (και εννοώ είτε ως δάσκαλος, είτε ως μαθητής).

Όπως έχω γράψει πολλές φορές, ο προγραμματισμός έχει τεράστιο εύρος και δεν χωράνε δογματισμοί.

Εδώ δεν έχω να πω τίποτα, σε κάλυψες μόνος σου.

 

Ειδικά όταν είσαι μαθητής που ξεκινάει, το υγιές & φρόνιμο για μένα είναι να αναπτύξεις από νωρίς μενταλιτέ έρευνας και λεπτομέρειας, αντί για copy & paste. Το ποιο από τα 2 θα χρησιμοποιήσεις, το πότε θα το χρησιμοποιήσεις, και γιατί θα το προτιμήσεις έναντι του άλλου, προϋποθέτει να είσαι εξοικειωμένος ΚΑΙ με τα δυο.

Κανείς δεν διαφωνεί μ' αυτό. Αλλά δεν ξέρω αν νομίζεις ότι με false dilemma αποδεικνύεις κάτι. Λες τα εκατομμύρια (λέμε τώρα) των προγραμματιστών που ξεκίνησαν με π.χ. Java ανέπτυξαν νοοτροπία copy/paste επειδή δε χρειάστηκε να παιδευτούν με τη fgets.

 

Από την άλλη, όποιος επιμένει στα black-boxes ως μόνη σωστή εκπαιδευτική μέθοδο, υπάρχει και η getline() σε όλα τα ports του gcc (και υπάρχουν κι αντίστοιχες συναρτήσεις σε άλλους compilers).

Αν είχες ασχοληθεί σοβαρά με τη διδασκαλία θα ήξερες ότι ο κατάλληλος τρόπος να παρακινήσεις τους μαθητές είναι να τους προβληματίσεις σχετικά με κάτι που νομίζουν ότι έχουν καταλάβει ("πώς νομίζεις λοιπόν ότι λειτουργεί το black box?") και ότι η κατάλληλη στιγμή για να το κάνεις αυτό είναι αφού τους έχεις τραβήξει το ενδιαφέρον.

 

Αλλά πολύ πριν φτάσουμε εκεί θα έπρεπε να έχεις καταλάβει πρώτα πως η "μέθοδος" στην οποία αναφέρεσαι δεν αντιπροσωπεύει την άποψη κανενός απολύτως σ' αυτό το thread, παρά μόνο τον τρόπο με τον οποίο θέλεις να παρουσιάσεις τον προαναφερθέντα αχυράνθρωπο.

Δημοσ.

Από τη μέχρι τώρα εμπειρία μου...

 

Στο τμήμα που φοιτώ, μαθαίνουμε C στο πρώτο εξάμηνο, αλλά στη χρονιά μου είχαμε το πρώτο

μάθημα Αρχιτεκτονικής, Εισαγωγή στους Η/Υ στο δεύτερο εξάμηνο σε MIPS. Το δεύτερο μάθημα,

Οργάνωση Η/Υ και Λειτουργικά Συστήματα στο 2ο έτος, Compilers στο 3ο, ενώ Αρχιτεκτονική Η/Υ

στο 4ο έτος. Να μη βάλω άλλα συναφή που βασίζονται σε C και άντε μέχρι C++. Είμαστε κατ' εξοχήν

system. Οπότε θα ήταν καταστροφή συθέμελη αν μας ξεκινούσαν με κάτι άλλο.

 

Από την άλλη όμως, έστω ότι ξεκινάνε οι σχολές με python. Για να υποστηριχτούν και να έχουν ένα Α

επίπεδο τα μαθήματα Αρχιτεκτονικών, Λειτουργικών και Compilers και τα συναφή πρέπει να γνωρίζουν

και οι φοιτητές την γλώσσα. Πρέπει να υπάρξουν προπαρασκευαστικά μαθήματα C/C++ για τις ανάγκες

αυτών των μαθημάτων. Όπως και να έχει, είτε τους μάθουν οι διδάσκοντες κακές πρακτικές για μία νέα

γλώσσα στην αρχή, είτε αργότερα το ίδιο είναι. Άντε η εμπειρία σου σε Python να σε κάνει να υποψιαστείς

πράγματα σε άλλη γλώσσα αντίστοιχου επιπέδου. Για τη C είναι λίγο πιο δύσκολο.

 

Θέλω να καταλήξω στο γεγονός πως με όποια γλώσσα και να ξεκινήσει κανείς δεν έχει σημασία, αρκεί να

γίνει σωστά. Οι φοιτητές σε καμιά περίπτωση δε πρέπει να θεωρηθούν παθόντες και θύματα αν ξεκινήσουν

με C αντί για Python ή Java. Ίσα ίσα που πρέπει να επιδείξουν δυναμισμό και πείσμα γιατί (κατά κύριο λόγο)

επέλεξαν αυτή την κατεύθυνση επειδή τη γουστάρουν. Πρέπει από την αρχή να μάθουν να μαθαίνουν.

Φαντάζομαι πως οι περισσότεροι από εδώ μέσα που ήμασταν σε μία τέτοια σχολή πιθανόν να ξεκινήσαμε

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

εμπειρία από διδάσκοντα που μπορεί να μην τον ενδιέφερε το θέμα (που μπορεί να τύχει και με άλλες γλώσσες

υψηλότερου επιπέδου).

  • Like 1
Δημοσ.

Δεν είπα ότι φταίει η C, το ίδιο πράγμα λέμε.

Α, νόμιζα πως είπες ότι διαφωνείς κάθετα με τη χρήση της C ως γλώσσα εκμάθησης αλγοριθμικής σκέψης. Ενώ εγώ από την άλλη υποστηρίζω πως δεν έχει σημασία με ποια γλώσσα θα ξεκινήσει κάποιος επίδοξος προγραμματιστής, ιδανικά από τις δημοφιλείς (C included), αρκεί να μην μάθει μόνο μια (και ακόμα χειρότερα, αρκεί να μην μάθει μόνο ένα paradigm).

 

@gon:

 

Η κατάταξη της C ως "χαμηλού επιπέδου" γλώσσα είναι αμφιλεγόμενη. Κι αυτό γιατί δεν υπάρχει στάνταρ ορισμός τέτοιας κατάταξης, και δη διαχρονικός (π.χ. η C όταν βγήκε θεωρούταν "υψηλού επιπέδου"). Σήμερα θα βρεις αρκετά συχνά να χαρακτηρίζεται και πάλι ως "υψηλού επιπέδου", με τις μεταγενέστερες της να χαρακτηρίζονται ως "πολύ υψηλού επιπέδου"... αν κι αυτός ο χαρακτηρισμός είναι επίσης αμφιλεγόμενος, γιατί π.χ. μπορεί να συμπεριλαμβάνει και shell-script languages, τύπου bash). Μια άλλη κατάταξη που θα βρεις συχνά, κατατάσσει τις γλώσσες σε γενιές (με ή χωρίς την προσθήκη "χαμηλού", "υψηλού", κλπ στην ορολογία).

 

Χαμηλού επιπέδου γλώσσα είναι σίγουρα η assembly (ναι, χρησιμοποιείται και σήμερα) οπότε η C σίγουρα είναι σε υψηλότερο επίπεδο από την assembly. Και ακόμα πιο σίγουρα με χρήση 3rd-party libraries μπορεί να μπαίνει με σχετική άνεση και στα χωράφια των "πολύ υψηλού επιπέδου" γλωσσών (αλλά ως γλώσσα επίσης μπαίνει και σε "χαμηλού επιπέδου" χωράφια).

 

 

 

@defacer:

Μιας και είσαι βαθύς γνώστης τόσο της διδασκαλικής μεθοδολογίας, όσο και της αυτοκίνησης, σου προτείνω ευθέως και απερίφραστα να ασχοληθείς με τον συνδυασμό αυτών των δυο και να αφήσεις τον προγραμματισμό για τους προγραμματιστές... μαθητές ή/και δασκάλους.

 

 

Δημοσ.

@migf1

Όταν αναφέρομαι στη C ως χαμηλού επιπέδου, εννοώ ότι είναι

η χαμηλότερου επιπέδου υψηλού επιπέδου γλώσσα. Έχω την

εντύπωση ότι αυτό ισχύει σαν C καθαρή.

  • Moderators
Δημοσ.

Το ίδιο λέμε στο ότι η C μπορεί να διδαχτεί σωστά. Στη σχολή του gon, για παράδειγμα, που εστιάζουν σε low-level πράγματα, η C μπορεί να τους είναι χρήσιμη από την αρχή. Αν το μάθημα δε θέλει να εστιάσει στο πώς διαβάζουμε σωστά ένα string και το θεωρεί trivial, τότε η C δεν είναι καλή γλώσσα γι' αυτό το μάθημα, αυτό εννοώ.

Δημοσ.

@migf1

Όταν αναφέρομαι στη C ως χαμηλού επιπέδου, εννοώ ότι είναι

η χαμηλότερου επιπέδου υψηλού επιπέδου γλώσσα. Έχω την

εντύπωση ότι αυτό ισχύει σαν C καθαρή.

Ναι, νομίζω κι εγώ πως ισχύει έτσι όπως το γράφεις τώρα.

Δημοσ.

 

 

Να μη το διδάξεις με C, αλλά ας μη ξανακάνουμε αυτή την κουβέντα.  :P

 

 

Συμφωνώ. Πιάσε μια java, python, c#, php ή έστω javascript για να τους κανεις εισαγωγή στο προγραματισμο, αλλά προς θεού, όχι c.

 

Εαν είναι να τους μάθεις c, τοτε κάτσε και μάθε τους c και όχι αυτές τις πίπες που βλέπουμε εδώ στο φόρουμ.

 

Αλλά τι να λέμε τώρα... Εδώ βλέπεις καθηγητές να γράφουν main χωρίς int, και ακριβώς απο πανω να σου έχουν ενα declaration "int add(int a, int b)"

  • Like 2
Δημοσ.

Το ίδιο λέμε στο ότι η C μπορεί να διδαχτεί σωστά. Στη σχολή του gon, για παράδειγμα, που εστιάζουν σε low-level πράγματα, η C μπορεί να τους είναι χρήσιμη από την αρχή. Αν το μάθημα δε θέλει να εστιάσει στο πώς διαβάζουμε σωστά ένα string και το θεωρεί trivial, τότε η C δεν είναι καλή γλώσσα γι' αυτό το μάθημα, αυτό εννοώ.

Σόρι για την επιμονή μου, αλλά η ανάγνωση ενός string στην C (trivial ή μη trivial, γιατί μπορείς να διδάξεις ΚΑΙ τα δυο) σε αναγκάζει να μάθεις βασικά πράγματα ταυτόχρονα: π.χ. char, πίνακες και δείκτες (τους δείκτες μπορείς να τους καθυστερήσεις). Το πράγμα αλλάζει αν θεωρείς πως τουλάχιστον τα 2 πρώτα δεν αποτελούν βασική γνώση για οποιονδήποτε θέλει να μάθει να προγραμματίζει σε οποιαδήποτε γλώσσα (είμαι όμως σίγουρος πως κι εσύ τα θεωρείς από τα απολύτως αναγκαία).

 

Έπειτα, και στη C μπορείς να ξεκινήσεις με απολύτως trivial ανάγνωση ενός string:

char input[BUFSIZ];
fgets(input, BUFSIZ, stdin);
αντί για:

char input[BUFSIZ];
gets(input);
χωρίς να κάνεις καμία έκπτωση ούτε στην ασφάλεια, ούτε σε runtime crash σε περίπτωση υπερχείλισης (το πρόβλημα δηλαδή της gets()). Παραμένει το θέμα του stdin-flushing, το οποίο επίσης μπορείς να καθυστερήσεις, μιας και θα είναι πολύ (μα πολύ) πιο σπάνιο να σου δημιουργήσει πρόβλημα συγκριτικά με την scanf()... που δυστυχώς για μένα όλα τα βιβλία σπεύδουν να την χρησιμοποιήσουν από το 1ο η 2ο μάθημα, ως την βασική συνάρτηση εισόδου (στην πράξη δεν την χρησιμοποιεί κανείς για interactive input).

 

Πάμε στα integers τώρα, δηλαδή πόσο πιο trivial είναι η ανάγνωση και μετατροπή της εισόδου σε 10-base ακέραιο στην python...

n = int(input())
ή στην Java...

Scanner input = new Scanner(System.in);
int n = input.nextInt();
/* or
int n = Integer.parseInt(System.console().readLine());
*/
ή στην C#...

int n = Convert.ToInt32(Console.Readline());
/*
or αν δεν θέλεις να φας exception

string input = Console.ReadLine();
int n;
Int32.TryParse(input, out n);
*/
από ότι στην C...

fgets(input, BUFSIZ, stdin);
long int n = strtol(input, NULL, 10);
Ελπίζω να μην θεωρείς trivial ότι μπαίνει σε nested παρενθέσεις ή χωρίζεται με dot για να γίνει one-liner και μη trivial ότι θέλει νέα γραμμή αντί για nested παρένθεση :P

 

Δεν λέω σε καμία περίπτωση πως η C παρέχει όσες HL ευκολίες παρέχουν οι μεταγενέστερες γλώσσες που βασίστηκαν πάνω της, αλλά αφενός το HL δεν είναι πάντα το ζητούμενο, και αφετέρου και η C έχει μια χαρά μηχανισμούς για να εισαχθεί κάποιος στον προγραμματισμό.

 

Η μεγάλη μου ένσταση σε νήματα όπως αυτό, είναι πως πολύ συχνά η C παρουσιάζεται ως κάτι το τραγικό, το απαράδεκτο, το ανεπίτρεπτο, σε αποσπάει από το ζητούμενο, κλπ, κλπ, για 1η γλώσσα. Κάτι τέτοιο δεν ισχύει. Μια χαρά εισαγωγή κάνει κι αυτή στον προγραμματισμό (και πιο συγκεκριμένα στον procedural προγραμματισμό), αλλά θέλει σωστή καθοδήγηση.

 

...

Εαν είναι να τους μάθεις c, τοτε κάτσε και μάθε τους c και όχι αυτές τις πίπες που βλέπουμε εδώ στο φόρουμ.

 

Αλλά τι να λέμε τώρα... Εδώ βλέπεις καθηγητές να γράφουν main χωρίς int, και ακριβώς απο πανω να σου έχουν ενα declaration "int add(int a, int :cool:"

Δυστυχώς :(

 

Εμένα μου την "βαράει" στον εγκέφαλο όταν τους ξεκινάνε με:

 

main() {
   printf( "Hello world!\n" );
}
αντί για...

int main( void )
{
  puts( "Hello world!" );
  return 0;
}
Όπως μου τη βαράει όταν τους ξεκινάνε με scanf() αντί για fgets(); sscanf(); ή fgets(); X x = strtoX();
  • Like 1
Δημοσ.

Για την τελευταία παράγραφο ( είμαι και σε tablet, και δεν Έιμι για quoteαρισματ?...)

 

1) για αυτοδίδακτος. Μακρια!!!! (Πρωσοπικη εμπειρία)

2) για σχολές, βλέπε πανω απάντηση ή να στο ξαναπω. Εαν δεν μπορεις να διδαξεις c, μην ασχολειθεις με c!

  • Moderators
Δημοσ.

Αυτό που θέλω να πω 4 posts τώρα είναι ότι για να ξεκινήσεις με C πρέπει να είσαι βαρβάτος όχι μόνο εσύ, αλλά και αυτός από που θα στην διδάξει. Το θέμα είναι ότι η πλειοψηφία των φοιτητών δεν παρακολουθούν θεωρία, τα ξύνουν και πασαλείβουν στα εργαστήρια, δε διαβάζουν και γράφουν όσο λιγότερο κώδικα μπορούν για να τελειώνουν. Οι καθηγητές πολλές φορές είναι ανίκανοι ή/και αδιάφοροι ή/και είναι εκεί για να δείξουν πόσο μεγάλο τον έχουν. Μην πας μακριά, δες τι άσκηση θέμα εξετάσεων (!!!) μοιράζει ο καθηγητής στο άλλο thread. Εκεί που έχει μειονέκτημα η C κατά τη γνώμη μου σε σχέση με άλλες "πρώτες" γλώσσες είναι ότι η C δαγκώνει πολύ πιο άσχημα άμα πας να κάνεις εξυπνάδες.

 

Συνοψίζοντας, ναι, πιστεύω ότι μπορείς να ξεκινήσεις με C ως πρώτη γλώσσα ακόμα κι αν δεν έχεις καμία εμπειρία από προγραμματισμό. ΑΛΛΑ, πρέπει παράλληλα να μάθεις πράγματα που δεν έχουν άμεση σχέση με προγραμματισμό, πρέπει να λιώσεις στο διάβασμα και να εξασκηθείς πολύ γράφοντας. Θα καθυστερήσεις παραπάνω να κάνεις πράγματα που σε άλλες γλώσσες θα έκανες πιο γρήγορα, αλλά θα αποκτήσεις μια πιο βαθιά εικόνα του τι γίνεται όταν γράφεις ένα πρόγραμμα. Απαραίτητο είναι επίσης αυτός που σε διδάσκει να ξέρει τι του γίνεται και να μη σου βάζει ασκήσεις τύπου γράφω ό,τι μου κατέβει γιατί μπορώ και η γλώσσα με αφήνει (βλ. switch χωρίς break).

Όπως καταλαβαίνεις, αυτό δεν είναι για όλους (ειδικά για τους τρισμέγιστους Έλληνες φοιτητές).

  • Like 2
Δημοσ.

Εαν είναι να τους μάθεις c, τοτε κάτσε και μάθε τους c και όχι αυτές τις πίπες που βλέπουμε εδώ στο φόρουμ.

 

Αλλά τι να λέμε τώρα... Εδώ βλέπεις καθηγητές να γράφουν main χωρίς int, και ακριβώς απο πανω να σου έχουν ενα declaration "int add(int a, int :cool:"

 

Αυτό που θέλω να πω 4 posts τώρα είναι ότι για να ξεκινήσεις με C πρέπει να είσαι βαρβάτος όχι μόνο εσύ, αλλά και αυτός από που θα στην διδάξει.

Παρακάτω παραθέτω ενδεικτικά κάποιες λύσεις που δίνει καθηγητής πανεπιστημίου στις ασκήσεις του βιβλίου του (δεν ξέρω αν τις έγραψε ο ίδιος ή κάποιος διδακτορικός του οπότε αν δεν είναι "λύσεις του καθηγητή" είναι "λύσεις sanctioned από τον καθηγητή"). Είναι πολύ σημαντικό να σημειώσουμε ότι το βιβλίο αναφέρει σε 100 μεριές ότι διδάσκει την C99 αναθεώρηση της γλώσσας.

 

* Το indentation είναι όπως ακριβώς το έχει δώσει *

1ος τρόπος
    my_add(a, 
      int a,b;
   {
       return (a+;
    }

2ος τρόπος
  int a,b;
   my_add( )
     {
        extern a,b;
        return (a+;
      }
Void δεν υπάρχει πουθενά ως όρισμα των συναρτήσεων, τύπος επιστροφής σπάνια υπάρχει (πριν την C99 θεωρούταν ότι επιστρέφει int αν δεν υπήρχε). Για όσους δεν έχουν δει τον 1ο τρόπο γραφής, είναι ο pre-ansi τρόπος δήλωσης (δηλαδή όχι καν για C99 δεν μιλάει το βιβλίο αλλά ούτε καν για C89) όπου δινόταν μόνο το όνομα των μεταβλητών μέσα στις παρενθέσεις και ο τύπος γραφόταν από κάτω πριν το { και ο οποίος είναι deprecated εδώ και χρόνια και επίσης το πρότυπο δηλώνει ότι μπορεί να οδηγήσει σε UB (θα πει κάποιος σε C είναι πολύ εύκολο να έχεις UB αλλά με αυτό το τρόπο είναι γελοίο να έχεις UB και όχι απλά εύκολο).

 

...
typedef char BITE_8;
typedef int BITE_16;
...
 main()
 {
   STRING str;
...
Ο υπόλοιπος κώδικας είναι στο ίδιο στυλ οπότε τον παραλείπω. Το "STRING" δεν είναι δηλωμένο πουθενά σαν typedef, define, whatever. Ως γνωστόν, η μονάδα μέτρησης είναι το ένα bite και επίσης το γνωρίζουν και οι πέτρες ότι το μέγεθος ενός int είναι πάντα 16 bites και παίρνει τιμές από -32768 έως 32767.

 

Με λίγα λόγια, το βιβλίο μιλάει για Turbo C σε DOS και όχι για C (πόσο μάλλον για C99) και εκτός αυτού έχει ένα σωρό κακές πρακτικές που ξεπερνούν και τις συνήθεις κακές πρακτικές που ήταν ευρέως διαδεδομένες την εποχή της Turbo C. Επίσης κάθε παράδειγμα έχει διαφορετικό indentation από το προηγούμενο και κάθε {} του ίδιου παραδείγματος έχουν διαφορετικό indentation από το προηγούμενο {}.

 

Όπως μας περιέγραψε ο gon δεν είναι φυσικά όλοι οι καθηγητές έτσι, αλλά δυστυχώς πολλοί είναι.

  • Like 1
Δημοσ.

Αυτό που θέλω να πω 4 posts τώρα είναι ότι για να ξεκινήσεις με C πρέπει να είσαι βαρβάτος όχι μόνο εσύ, αλλά και αυτός από που θα στην διδάξει. Το θέμα είναι ότι η πλειοψηφία των φοιτητών δεν παρακολουθούν θεωρία, τα ξύνουν και πασαλείβουν στα εργαστήρια, δε διαβάζουν και γράφουν όσο λιγότερο κώδικα μπορούν για να τελειώνουν. Οι καθηγητές πολλές φορές είναι ανίκανοι ή/και αδιάφοροι ή/και είναι εκεί για να δείξουν πόσο μεγάλο τον έχουν. Μην πας μακριά, δες τι άσκηση θέμα εξετάσεων (!!!) μοιράζει ο καθηγητής στο άλλο thread. Εκεί που έχει μειονέκτημα η C κατά τη γνώμη μου σε σχέση με άλλες "πρώτες" γλώσσες είναι ότι η C δαγκώνει πολύ πιο άσχημα άμα πας να κάνεις εξυπνάδες.

Ο βαρβάτος πρέπει να είναι ο δάσκαλος. Ο μαθητής έτσι κι αλλιώς εφόσον μιλάμε για εισαγωγή στον προγραμματισμό είναι "λευκό χαρτί" (προσωπικά δεν με ενδιαφέρουν οι μαθητές που περιγράφεις). Κι αυτό ισχύει για όλες τις γλώσσες προγραμματισμού, όχι μόνο για την C. Ο δάσκαλος έχει την "δυναμική" να σε κάνει είτε να σιχαθείς είτε να γοητευτείς με οποιαδήποτε γλώσσα.

 

Συμφωνώ βεβαίως πως η C δαγκώνει πολύ πιο άσχημα από άλλες γλώσσες άμα πας να κάνεις εξυπνάδες (btw, για μένα όλες οι δημοφιλείς είναι κατάλληλες για πρώτες γλώσσες, οπότε δεν κάνω τέτοιον διαχωρισμό). Συμπληρώνω πως η C++ δαγκώνει ακόμα πιο άσχημα από την C άμα πας να κάνεις εξυπνάδες.

 

Δαγκώνουν πιο άσχημα αυτές οι γλώσσες, πολύ απλά διότι σε αφήνουν να δοκιμάσεις ότι εξυπνάδα θέλεις, μιας και η φιλοσοφία τους είναι πως "ξέρεις τι κάνεις". Είναι καθαρά στο χέρι του δασκάλου να σε καθοδηγήσει, να σου εξηγήσει, να σου δείξει, να σε μάθει να προστατεύεσαι. Μη ξεχνάς πως μιλάμε για εισαγωγή στον προγραμματισμό, όπου κατά κανόνα ο μαθητής είναι "λευκό χαρτί", άρα το περιθώριο για "εξυπνάδες" είναι εν πολλοίς κατευθυνόμενο από τον δάσκαλο, και όχι από τον μαθητή.

 

Παρεμπιπτόντως, για παράδειγμα και η C# θα σε δαγκώσει άμα πας να κάνεις εξυπνάδες με unsafe pointers. Την θεωρείς κι αυτήν ακατάλληλη για 1η γλώσσα λόγω αυτού του χαρακτηριστικού της; Εν ολίγοις, για μένα το ότι μια γλώσσα είναι powerful & ευέλικτη δεν την κάνει apriori ακατάλληλη για εισαγωγή στον προγραμματισμό. Υπάρχουν δεκάδες άλλα χαρακτηριστικά που πρέπει να συνυπολογιστούν.

 

Συνοψίζοντας, ναι, πιστεύω ότι μπορείς να ξεκινήσεις με C ως πρώτη γλώσσα ακόμα κι αν δεν έχεις καμία εμπειρία από προγραμματισμό. ΑΛΛΑ, πρέπει παράλληλα να μάθεις πράγματα που δεν έχουν άμεση σχέση με προγραμματισμό, πρέπει να λιώσεις στο διάβασμα και να εξασκηθείς πολύ γράφοντας. Θα καθυστερήσεις παραπάνω να κάνεις πράγματα που σε άλλες γλώσσες θα έκανες πιο γρήγορα, αλλά θα αποκτήσεις μια πιο βαθιά εικόνα του τι γίνεται όταν γράφεις ένα πρόγραμμα. Απαραίτητο είναι επίσης αυτός που σε διδάσκει να ξέρει τι του γίνεται και να μη σου βάζει ασκήσεις τύπου γράφω ό,τι μου κατέβει γιατί μπορώ και η γλώσσα με αφήνει (βλ. switch χωρίς break).

Όπως καταλαβαίνεις, αυτό δεν είναι για όλους (ειδικά για τους τρισμέγιστους Έλληνες φοιτητές).

Θα μπορούσες να απαριθμήσεις 2-3 πράγματα που δεν έχουν άμεση σχέση με προγραμματισμό και τα οποία πρέπει οπωσδήποτε να ξέρεις αλλιώς δεν μπορείς να ξεκινήσεις με C, ενώ χωρίς να τα ξέρεις μπορείς να ξεκινήσεις με οποιαδήποτε άλλη γλώσσα;

 

Σχετικά με το ότι "θα καθυστερήσεις παραπάνω να κάνεις πράγματα που σε άλλες γλώσσες θα έκανες πιο γρήγορα", ισχύει... αλλά δεν ισχύει για τουλάχιστον τα πρώτα 2/3 του εξαμήνου εισαγωγής σου στον προγραμματισμό, τα οποία τα αναλώνεις σε έννοιες που είναι λίγο-πολύ κοινές σχεδόν σε όλες τις γλώσσες (compilation cycle, σύνταξη, console i/o, operators, expressions, conditionals, loops, κλπ).

 

Η C θα αρχίσει να σε καθυστερεί σε πιο προχωρημένα πράγματα, επειδή δεν έχει σταντάρει (επίτηδες) τεράστια frameworks ως "ενσωματωμένες βιβλιοθήκες". Αυτά έτσι κι αλλιώς σπάνια εμπίπτουν σε εισαγωγικό εξάμηνο προγραμματισμού (έως ποτέ). Ακόμα και σε C όμως, υπάρχουν άπειρες 3rd-party βιβλιοθήκες για αυτά τα πράγματα, αλλά εννοείται πως εκεί είναι συνήθως πλεονέκτημα το σταντάρισμά τους (γράφω "συνήθως", γιατί δεν είναι πάντα... π.χ. η σχολή του gon).

 

Το έγραφα νομίζω και σε κάποιο άλλο ποστ, το πραγματικό ζόρι με τη C είναι να μάθει κανείς να χρησιμοποιεί efficiently ή/και effectively structs, pointers και macros. Και με εξαίρεση τα struct (που είναι πολύ πιο βατά και απαραίτητα ανεξαρτήτως γλώσσας, και μπορούν άνετα να γίνουν introduced και σε εισαγωγικό εξάμηνο) η εμβάθυνση σε δείκτες και σε macros δεν συνηθίζεται σε εισαγωγικά μαθήματα προγραμματισμού με C (έως και ποτέ θα μπορούσα να πω).

  • Moderators
Δημοσ.

Το "βαρβάτος" το είπα με την έννοια κάποιου που ασχολείται κι ενδιαφέρεται να μάθει αυτά που του διδάσκει η C. "Λευκό χαρτί" ναι, αλλά δε σημαίνει ότι όλοι έχουν την όρεξη να μάθουν αυτά τα πράγματα. Μπορεί κάποιον να τον ενδιαφέρει το web, άλλουν τα δίκτυα κλπ. Επίσης, δεν είπα ότι η C++ είναι "καλή" πρώτη γλώσσα, και δεν ξέρω C# για να έχω γνώμη.

 

Το έγραφα νομίζω και σε κάποιο άλλο ποστ, το πραγματικό ζόρι με τη C είναι να μάθει κανείς να χρησιμοποιεί efficiently ή/και effectively structs, pointers και macros. Και με εξαίρεση τα struct (που είναι πολύ πιο βατά και απαραίτητα ανεξαρτήτως γλώσσας, και μπορούν άνετα να γίνουν introduced και σε εισαγωγικό εξάμηνο) η εμβάθυνση σε δείκτες και σε macros δεν συνηθίζεται σε εισαγωγικά μαθήματα προγραμματισμού με C (έως και ποτέ θα μπορούσα να πω).

 

Αυτός είναι ο λόγος για τον οποίο δε μ' αρέσει η C ως πρώτη γλώσσα. Το γεγονός ότι δε μπορείς να κάνεις τίποτα χωρίς pointers και αναγκάζεσαι να μάθεις κάτι το οποίο μπορεί και να μη σου χρειαστεί ποτέ είναι νομίζω αρκετό. Αντίθετα, μπορείς να ξεκινήσεις με μια γλώσσα με την οποία θα μάθεις πράγματα που μπορείς να μεταφέρεις παντού, είτε σ' ενδιαφέρει το system programming είτε το web είτε οτιδήποτε άλλο.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...