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

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

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

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

Δημοσίευσηαπό Star_Light » 31 Ιούλ 2011, 17:36

Καλησπέρα και απο μένα.... λοιπον πανω κατω ειναι κατανοητά μιας και σιγα σιγα εξικοιωνομαστε ολο και περισσότερο αλλα έχω μερικές απορίες (σιγα μην δεν είχα χαχα)

καταρχήν

1.
ΤΗν do while καταλαβαινω για ποιο σκοπο την χρησιμοποιει ο migf1 θελει τουλαχιστον μια φορα να περαστούν τα ορισματα που θα δωσει ο χρηστης μεσα στην συνάρτηση ωστε να γινει και ο απαραίτητος έλεγχος μετα , εκεινο που δεν καταλαβαινω ομως ειναι αυτο ->

Κώδικας: Επιλογή όλων
while(div2f(x,y,&result)==0);


δηλαδη? μεχρι το while να δώσει μηδενική τιμη? δηλαδη FALSE??? (A!!!!Τωρα σαν να το επιασα.... αλλα θελω και επιβεβαιωση!)

2. Αν καταλαβα καλα αν τον ελεγχο αυτον δεν τον καναμε μεσα στην συναρτηση ποτε ακριβως θα ειχαμε προβλημα???? υπαρχει καποιο ξεκαθαρο και απλο παραδειγματακι???? ή θα μας μπερδεψει οποτε δεν χρειαζεται????

3. Και τωρα θα ρωτησω και κατι πιο "περιεργο" αρχικα η μεταβλητη result δηλωνεται χωρις να αρχικοποιηθει κατι που σημαινει πως στο memory layout εχει μπει στο BSS και μετα δηλαδη σαν δείκτης αποθηκεύεται παλι μεσα στο STACK της συνάρτησης? ΑΥτο δεν μπορω να πιασω τοσο καλα .. ενταξει με το οτι ορισμενοι μεταγλωτιστες αναγνωριζουν αυτοματα πως η συναρτηση περιμενει σαν παραμετρο εναν δεικτη που εχει πει και ο migf1 στο αλλο του τουτοριαλ στο αλλο σαιτ που ελεγε για τους δεικτες αλλα με την μνημη δεν καταλαβαινω ακριβως τι γινεται..... Αν ειναι της παρουσης ας συγκεκριμενοποιηθει και αυτο!!!!
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 31 Ιούλ 2011, 18:10

Star_Light έγραψε:Καλησπέρα και απο μένα.... λοιπον πανω κατω ειναι κατανοητά μιας και σιγα σιγα εξικοιωνομαστε ολο και περισσότερο αλλα έχω μερικές απορίες (σιγα μην δεν είχα χαχα)

καταρχήν

1.
ΤΗν do while καταλαβαινω για ποιο σκοπο την χρησιμοποιει ο migf1 θελει τουλαχιστον μια φορα να περαστούν τα ορισματα που θα δωσει ο χρηστης μεσα στην συνάρτηση ωστε να γινει και ο απαραίτητος έλεγχος μετα , εκεινο που δεν καταλαβαινω ομως ειναι αυτο ->

Κώδικας: Επιλογή όλων
while(div2f(x,y,&result)==0);


δηλαδη? μεχρι το while να δώσει μηδενική τιμη? δηλαδη FALSE??? (A!!!!Τωρα σαν να το επιασα.... αλλα θελω και επιβεβαιωση!)

2. Αν καταλαβα καλα αν τον ελεγχο αυτον δεν τον καναμε μεσα στην συναρτηση ποτε ακριβως θα ειχαμε προβλημα???? υπαρχει καποιο ξεκαθαρο και απλο παραδειγματακι???? ή θα μας μπερδεψει οποτε δεν χρειαζεται????

3. Και τωρα θα ρωτησω και κατι πιο "περιεργο" αρχικα η μεταβλητη result δηλωνεται χωρις να αρχικοποιηθει κατι που σημαινει πως στο memory layout εχει μπει στο BSS και μετα δηλαδη σαν δείκτης αποθηκεύεται παλι μεσα στο STACK της συνάρτησης? ΑΥτο δεν μπορω να πιασω τοσο καλα .. ενταξει με το οτι ορισμενοι μεταγλωτιστες αναγνωριζουν αυτοματα πως η συναρτηση περιμενει σαν παραμετρο εναν δεικτη που εχει πει και ο migf1 στο αλλο του τουτοριαλ στο αλλο σαιτ που ελεγε για τους δεικτες αλλα με την μνημη δεν καταλαβαινω ακριβως τι γινεται..... Αν ειναι της παρουσης ας συγκεκριμενοποιηθει και αυτο!!!!

1. Ελέγχει εάν η συνάρτηση επιστρέψει 0 και 0 θα επιστρέψει μόνο εάν το y είναι 0(Συγνώμη αν είπςε αυτό αλλά δεν το πολυκατάλαβα :P ).
2. Δεν ξέρω :lol:
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 31 Ιούλ 2011, 18:20

βασικα η while απο μονη της δεν ελεγχει τιποτα. Απλα εκτελεί κατι όσο η συνθήκη που έχει ειναι αληθης! Σωστος?

στο σημειο εδω η συνθηκη = div2f(x,y,&result)==0 δηλαδη αν η συναρτηση επιστρεψει FALSE τοτε αυτο δεν ειναι μη μηδενικη τιμη αρα σταματαει εκει!

Π.Σ Στο μεταξυ τωρα καταλαβα ακομη καλυτερα πως "δουλευουν" οι συναρτησεις που επιστρεφουν μια τιμη πχ τυπου int οπως η sscanf και μεσα στα ορισματα τους παιζουν και με δεικτες ;)
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 31 Ιούλ 2011, 18:34

Star_Light έγραψε:βασικα η while απο μονη της δεν ελεγχει τιποτα. Απλα εκτελεί κατι όσο η συνθήκη που έχει ειναι αληθης! Σωστος?

στο σημειο εδω η συνθηκη = div2f(x,y,&result)==0 δηλαδη αν η συναρτηση επιστρεψει FALSE τοτε αυτο δεν ειναι μη μηδενικη τιμη αρα σταματαει εκει!

Π.Σ Στο μεταξυ τωρα καταλαβα ακομη καλυτερα πως "δουλευουν" οι συναρτησεις που επιστρεφουν μια τιμη πχ τυπου int οπως η sscanf και μεσα στα ορισματα τους παιζουν και με δεικτες ;)

Η while λέει απλά: "Αν γίνουμε μαντάρα στη συνάρτηση πάμε πάλι!".
Ελπίζω να βοήθησα :P
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 31 Ιούλ 2011, 18:56

Star_Light έγραψε:εκεινο που δεν καταλαβαινω ομως ειναι αυτο ->

Κώδικας: Επιλογή όλων
while(div2f(x,y,&result)==0);


δηλαδη? μεχρι το while να δώσει μηδενική τιμη? δηλαδη FALSE??? (A!!!!Τωρα σαν να το επιασα.... αλλα θελω και επιβεβαιωση!)

Ναι, αυτό που εξήγησε κι ο φίλος Σταματίου. Όσο η συνάρτηση επιστρέφει 0 (FALSE) το loop επαναλαμβάνεται.

έγραψε:2. Αν καταλαβα καλα αν τον ελεγχο αυτον δεν τον καναμε μεσα στην συναρτηση ποτε ακριβως θα ειχαμε προβλημα???? υπαρχει καποιο ξεκαθαρο και απλο παραδειγματακι???? ή θα μας μπερδεψει οποτε δεν χρειαζεται????

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

έγραψε:3. Και τωρα θα ρωτησω και κατι πιο "περιεργο" αρχικα η μεταβλητη result δηλωνεται χωρις να αρχικοποιηθει κατι που σημαινει πως στο memory layout εχει μπει στο BSS και μετα δηλαδη σαν δείκτης αποθηκεύεται παλι μεσα στο STACK της συνάρτησης? ΑΥτο δεν μπορω να πιασω τοσο καλα .. ενταξει με το οτι ορισμενοι μεταγλωτιστες αναγνωριζουν αυτοματα πως η συναρτηση περιμενει σαν παραμετρο εναν δεικτη που εχει πει και ο migf1 στο αλλο του τουτοριαλ στο αλλο σαιτ που ελεγε για τους δεικτες αλλα με την μνημη δεν καταλαβαινω ακριβως τι γινεται..... Αν ειναι της παρουσης ας συγκεκριμενοποιηθει και αυτο!!!!

Αυτά κάντα όλα... delete :lol: Δεν χρειάζεσαι απολύτως τίποτα από τα παραπάνω για να μάθεις βασικό προγραμματισμό ;)

Ωραίος φίλε Σταματίου σχετικά με τη λύση της προηγούμενης άσκησης! :) :)

Μια μικρή σημείωση μόνο, άσχετη με τη συνάρτηση. Το μήκος 10 που έχεις δώσει στο inbuf, σημαίνει πως αν ο χρήστης σου πληκτρολογήσει περισσότερους από 9 χαρακτήρες στην κύρια είσοδο (στον 10ο βάζει το '\0' η s_get) τότε θα αντιμετωπίσεις πάλι το πρόβλημα του line-buffering και των απομειναριών. Το μήκος του inbuf πρέπει να είναι μεγάλο (πολύ μεγαλύτερο από το μέγιστο πλήθος χαρακτήρων που ενδέχεται να μας πληκτρολογήσει στην είσοδο ο χρήστης, ακόμα κι αν είναι κακόβουλος... για αυτό το βάζω τουλάχιστον 256 εγώ ;) )
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 31 Ιούλ 2011, 18:57

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

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

Δημοσίευσηαπό stamatiou » 31 Ιούλ 2011, 19:00

Ναι!
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 31 Ιούλ 2011, 19:25

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

Το game στην εκφώνησή του είναι απλό: ζητάει από τον χρήστη έναν θετικό αριθμό πάνω από 1 που θα χρησιμοποιηθεί ως ανώτατο όριο, θα βάζει έναν τυχαίο αριθμό από το 1 μέχρι το ανώτατο όριο, και κατόπιν ο χρήστης θα εισαγάγει μαντεψιές. Το πρόγραμμα θα τον καθοδηγεί ως εξής: θα απαντάει "πιο ψηλά" αν η μαντεψιά είναι μικρότερη του σωστού αριθμού, "πιο χαμηλά" αν η μαντεψιά είναι μεγαλύτερη του σωστού αριθμού και "Συγχαρητήρια, το βρήκατε" αν η μαντεψιά είναι ίδια με τον σωστό αριθμό. Στο τέλος θα τυπώνει πόσες μαντεψιές έκανε ο χρήστης μέχρι να βρει το σωστό νούμερο.

Καταρχήν πάρτε ως δεδομένο έναν πίνακα από strings (hints), που θα τον δηλώσετε μέσα στην main ως εξής:
Κώδικας: Επιλογή όλων

char *hints[3] = {
"\tπιο ψηλά\n", // θέση 0
"\tπιο χαμηλά\n", // θέση 1
"\tΣυγχαρητήρια, το βρήκατε\n" // θέση 2
};

Χρησιμοποιήστε μια συνάρτηση με το παρακάτω πρότυπο:
Κώδικας: Επιλογή όλων
int hint_position(int guess, int hidden, int lim);

// όπου guess, η μαντεψιά του χρήστη
// όπου hidden, ο τυχαίος αριθμός που θα βάζει το πρόγραμμα
// όπου lim, το ανώτατο όριο

Η συνάρτηση θα επιστρέφει -1 αν η μαντεψιά του χρήστη είναι εκτός ορίων (δηλαδή μικρότερη από 1 ή μεγαλύτερη του ανώτατου ορίου) αλλιώς θα επιστρέφει τη θέση που έχει το κατάλληλο hint μέσα στον πίνακα hints, ανάλογα με τη μαντεψιά (δλδ αν η μαντεψιά είναι μικρότερη του κρυμμένου αριθμού η συνάρτηση θα επιστρέφει 0, αν είναι μεγαλύτερη θα επιστρέφει 1, αλλιώς 2).

Για να τυπώνετε την απάντηση του προγράμματος σε κάθε μαντεψιά του χρήστη, θα χρησιμοποιείτε την τιμή επιστροφής της hint_position() για να κάνετε index το κατάλληλο string μέσα από τον πίνακα hints.

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

Για να βάλετε το πρόγραμμα να διαλέξει έναν τυχαίο αριθμό, πρώτα ενεργοποιήστε στην αρχή της main τη γεννήτρια τυχαίων αριθμών της C σε μια γραμμή, ως εξής:
Κώδικας: Επιλογή όλων
srand( time(NULL) ); // #include <stdlib.h> και #include <time.h>

Κατόπιν, για να καθορίσετε μεταξύ ποιων ορίων θα διαλέξει τυχαίο αριθμό το πρόγραμμα, χρησιμοποιήστε τη στάνταρ συνάρτηση:
Κώδικας: Επιλογή όλων
int rand( void )
σε συνδυασμό με την αριθμητική πράξη % (modulus).

Δείτε την τεκμηρίωση της rand() για τη χρήση της.

Τα υπόλοιπα υλοποιήστε τα όπως θέλετε.
Τελευταία επεξεργασία από migf1 και 31 Ιούλ 2011, 19:35, έχει επεξεργασθεί 1 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 31 Ιούλ 2011, 19:30

migf1 έγραψε:
Στη συγκεκριμένη περίπτωση του παραδείγματος, αν δεν ελέγξεις μέσα στη συνάρτηση τότε αυξάνεις τον κίνδυνο το πρόγραμμά σου να διαιρέσει με το 0, σε περίπτωση που σου ξεφύγει να κάνεις τον έλεγχο έξω από τη συνάρτηση. Ενώ τώρα και να σου ξεφύγει δεν διαιρεί ποτέ με το 0.


Ναι αλλα γιατι το λες αυτο... υπηρχε ποτε περιπτωση να χρησιμοποιησω 2 ελεγχους? Και εναν μεσα στο σωμα της συναρτησης και εναν εξω απο αυτην και στην main ωστε να υπάρχουν υπόνοιες οτι μπορει να μου ξεφυγει κατι????

migf1 έγραψε:
Star_Light έγραψε:εκεινο που δεν καταλαβαινω ομως ειναι αυτο ->

Κώδικας: Επιλογή όλων
while(div2f(x,y,&result)==0);


δηλαδη? μεχρι το while να δώσει μηδενική τιμη? δηλαδη FALSE??? (A!!!!Τωρα σαν να το επιασα.... αλλα θελω και επιβεβαιωση!)

Ναι, αυτό που εξήγησε κι ο φίλος Σταματίου. Όσο η συνάρτηση επιστρέφει 0 (FALSE) το loop επαναλαμβάνεται.


πφφφφ μπερδευτηκα. Υποτιθεται πως η while συνεχιζει αν δινεται μη μηδενικη τιμη.... δηλαδη στο συγκεκριμενο η μη μηδενικη μας τιμη (λογικα αληθης) ειναι οσο η div2f(x,y,&result) δινει FALSE??????
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 31 Ιούλ 2011, 19:40

Star_Light έγραψε:[Ναι αλλα γιατι το λες αυτο... υπηρχε ποτε περιπτωση να χρησιμοποιησω 2 ελεγχους? Και εναν μεσα στο σωμα της συναρτησης και εναν εξω απο αυτην και στην main ωστε να υπάρχουν υπόνοιες οτι μπορει να μου ξεφυγει κατι????

Κάτσε να το πω αλλιώς: αν σε ένα μεγάλο πρόγραμμα χρειάζεται να καλέσεις την div2f σε καμιά 10αρια σημεία, αντί να κάθεσαι να ελέγχεις αν το y είναι 0 πριν το περάσεις μέσα στη συνάρτηση και στα 10 αυτά σημεία, βάζεις αυτόν τον έλεγχο μέσα στη συνάρτηση μια μόνο φορά ;)

έγραψε:πφφφφ μπερδευτηκα. Υποτιθεται πως η while συνεχιζει αν δινεται μη μηδενικη τιμη.... δηλαδη στο συγκεκριμενο η μη μηδενικη μας τιμη (λογικα αληθης) ειναι οσο η div2f(x,y,&result) δινει FALSE??????

Ναι, το while συνεχίζεται όσο ισχύει η συνθήκη του.... δηλαδή στην περίπτωσή μας, όσο ισχύει το: div2f(x,y,&result) == 0
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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