Τα πάντα για την C

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Τα πάντα για την C

Δημοσίευσηαπό Ilias95 » 29 Μαρ 2012, 14:23

migf1 έγραψε:Όταν είπα πως είναι καλή άσκηση, δεν εννοούσα τόσο τον κώδικα όσο την σκέψη που έπρεπε να προηγηθεί για τον σχεδιασμό της συνάρτησης ώστε να είναι αφενός γενικής χρήσης (reusable) και αφετέρου ασφαλής (bullet-proof). Ήθελα δηλαδή να σε βάλω λίγο στο γενικότερο πνεύμα για συγγραφή ασφαλούς & reusable κώδικα. Το reusable είναι σημαντικό στη C, επειδή σου εξοικονομεί πολύ χρόνο σε μελλοντικά πρότζεκτ, για να μην γράφεις ξανά και ξανά τον ίδιο κώδικα.

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

Ίσως να μην είναι κακό να θεωρούμε αρχικά δεδομένο ότι θα έχουμε good input. Το σημαντικό είναι να βρούμε μια όμορφη λύση του προβλήματος νομίζω.
Έτσι κι αλλιώς συνήθως για αποφύγουμε undefined behavior δεν αρκούν μερικές if;

Από εκεί και πέρα όταν θα ξεκινήσω ένα project εννοείται ότι θα προσέξω όσο το δυνατόν περισσότερο και θα προσπαθήσω να προβλέψω οποιαδήποτε "άσχημη" περίπτωση, όπως επίσης να γράφω re-usable συναρτήσεις που θα μπορώ να χρησιμοποιήσω και μετέπειτα.

Αν διαφωνείς σε αυτό θα χαιρόμουν πολύ να ακούσω την άποψη σου.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό Ilias95 » 29 Μαρ 2012, 14:24

migf1 έγραψε:Και μια μικρή άσκηση ανεξάρτητη από strings, πως θα φτιάχνατε έναν μετρητή αριθμών στην κονσόλα χρησιμοποιώντας μόνο στάνταρ C (όχι εξωτερικές βιβλιοθήκες ούτε platform dependent συναρτήσεις/header files).

Δηλαδή να του δίνεται έναν αριθμό, π.χ. 1000000 και να αρχίσει να μετράει από το 0 έως αυτόν τον αριθμό, εμφανίζοντας όλους τους ενδιάμεσους αριθμούς μέσα σε προκαθορισμένο χώρο (να δίνει δηλαδή την αίσθηση του μετρητή).

Δηλαδή θα δίνουμε και ένα βήμα στην συνάρτηση;
Κάτι τέτοιο;
Κώδικας: Επιλογή όλων
>>> range(0, 30, 3)
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
>>>

(Το 3 στο τέλος της range() είναι το βήμα)
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 29 Μαρ 2012, 14:57

Ilias95 έγραψε:
...
Αν διαφωνείς σε αυτό θα χαιρόμουν πολύ να ακούσω την άποψη σου.

Δεν είμαι σίγουρος αν συμφωνώ ή διαφωνώ, διότι υπάρχουν valid points και στις 2 απόψεις.

Σε αυτή που εξέφρασα εγώ το valid point είναι η αποφυγή κακών συνηθειών, για τις οποίες η ιστορία διδάσκει πως αν αυτοματοποιηθούν εξαρχής στο μυαλό όποιου μαθαίνει, τότε αυξάνονται δραματικά οι πιθανότητες να μεταφέρει έστω και μια από αυτές σε κώδικα παραγωγής (που αυτόματα σημαίνει bug).

Στη C το error-checking είναι κρίσιμης σημασίας, γιατί δεν έχει από πίσω της κάποιο managed framework να πιάνει (ενίοτε και να διορθώνει αυτόματα) run-time σφάλματα. Το βασικά από αυτά είναι:

α) τα memory leaks στη δυναμική διαχείριση μνήμης (δεν έχεις φτάσει ακόμα εκεί, αλλά εν πολλοίς σημαίνει "ορφανά" malloc()/calloc()/realloc(), δηλαδή χωρίς αντίστοιχα free() ).

β) τα λεγόμενα "dangling pointers" ή "wild pointers", τα οποία εν πολλοίς μεταφράζονται σε έλεγχο με NULL για ορίσματα συναρτήσεων που είναι δείκτες (καθώς και πάντα αρχικοποίηση σε NULL κατά τον ορισμό οποιουδήποτε δείκτη, string ή όχι).

γ) τα "bounding errors", που εν πολλοίς σημαίνει έλεγχοι ώστε οι indexers των arrays να μην ξεπερνάνε τα όρια του array, ούτε το πάνω (overflow) ούτε το κάτω (underflow)

δ) έλεγχοι για τα όρια των μεταβλητών που διαβάζουμε από την κύρια είσοδο

Αυτά τα 4 είναι τα βασικά, τα 3 εκ των οποίων βρίσκονται ήδη εντός ύλης σε όσα έχεις διαβάσει στο βιβλίο ;)

Το ιδανικό για μένα θα ήταν να φτιάξεις re-usable συναρτήσεις όπου είναι δυνατόν για τις παραπάνω κατηγορίες (όπως για παράδειγμα η mySCANF()) και να τις χρησιμοποιείς σε ΟΛΕΣ τις ασκήσεις που κάνεις. Με αυτό τον τρόπο ΔΕΝ σου εντυπώνονται κακές συνήθειες κατά τη διάρκεια της εκμάθησής σου ;)

ΥΓ. Για τον μετρητή, έχεις Windows να ανεβάσω το executable της λύσης, ώστε να δεις τι εννοώ;
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 29 Μαρ 2012, 15:09

migf1 έγραψε:
... (καθώς και πάντα αρχικοποίηση σε NULL κατά τον ορισμό οποιουδήποτε δείκτη, string ή όχι)...

Για να είμαι ακριβής, πάντα αρχικοποίηση σε NULL κατά τον ορισμό οποιουδήποτε δείκτη (string ή όχι) δεν χρησιμοποιείται άμεσα.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό Ilias95 » 29 Μαρ 2012, 15:12

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

Οπότε θα προσπαθήσω να ακολουθήσω από τώρα την τακτική που προτείνεις.

migf1 έγραψε:ΥΓ. Για τον μετρητή, έχεις Windows να ανεβάσω το executable της λύσης, ώστε να δεις τι εννοώ;

Όχι. Μπορείς να παραθέσεις μία session του προγράμματος;
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 29 Μαρ 2012, 15:29

Αυτό εδώ εννοώ, αλλά χωρίς να αλλάζει γραμμή... τα νούμερα αυξάνονται στην ίδια περιοχή, στην ίδια γραμμή πάντα (έχω κάνει κολάζ στην εικόνα :lol:)

Εικόνα
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό Ilias95 » 29 Μαρ 2012, 15:46

Πάλι δεν μπορώ να καταλάβω τι ακριβώς κάνει το πρόγραμμα.
Γεωμετρική πρόοδος δεν είναι. Ούτε αριθμητική. :P
Ποια η σχέση μεταξύ του πρώτου αριθμού με τον δεύτερο και του δεύτερου με τον τρίτο και τι εννοείς τα νούμερα αυξάνονται στην ίδια περιοχή;
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 29 Μαρ 2012, 15:53

Καμία ρε συ, απλώς μετράει με βήμα 1 από το 0 έως το νούμερο που του δίνεις. Η άσκηση δεν είναι αλγοριθμική. Είναι απλά για να βρείτε πως μπορείτε να δημιουργήσετε εφέ μετρητή στην κονσόλα, με στάνταρ C ;)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό Ilias95 » 29 Μαρ 2012, 16:08

migf1 έγραψε:Καμία ρε συ, απλώς μετράει με βήμα 1 από το 0 έως το νούμερο που του δίνεις. Η άσκηση δεν είναι αλγοριθμική. Είναι απλά για να βρείτε πως μπορείτε να δημιουργήσετε εφέ μετρητή στην κονσόλα, με στάνταρ C ;)

Δεν ξέρω αν κατάλαβα καλά, αλλά εννοείς κάτι τέτοιο;

Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <unistd.h>

int main(void)
{
for (int i = 0; i < 10; i++) {
printf("%d", i);
sleep(1);
putchar('\b');
}
return 0;
}


Βέβαια αυτό δεν δουλεύει. Για κάποιο λόγο όσο χρησιμοποιώ την sleep δεν εκτυπώνεται τίποτα από την printf() και εκτυπώνεται μόνο στο τέλος.
Επίσης δεν ξέρω αν είναι η sleep platform independent. Η όταν λες standard C εννοείς να μη χρησιμοποιήσουμε καθόλου header files;
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 29 Μαρ 2012, 16:16

Το ΄πιασες ρε "γατόνι", αυτή είναι η κεντρική ιδέα, δηλαδή η χρήση του χαρακτήρα '\b' :)
Τώρα μένει να βρεις πως θα το βάλεις να πηγαίνει τόσες θέσεις προς τα πίσω όσα είναι τα ψηφία του εκάστοτε προηγούμενου αριθμού που τύπωσε ;)

ΥΓ. Δεν χρειάζεσαι τη sleep, απλά βάλτο να τυπώνει μέχρι ένα μεγάλο νούμερο για να φανεί το εφέ.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι