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

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

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

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

Δημοσίευσηαπό stamatiou » 01 Σεπ 2011, 23:12

Εγώ δεν έχω καταλάβει γιατί υπάρχει αυτό return (int)(*s1 - *--s2);
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 01 Σεπ 2011, 23:35

stamatiou έγραψε:Εγώ δεν έχω καταλάβει γιατί υπάρχει αυτό return (int)(*s1 - *--s2);

Από τη στιγμή που η συνάρτηση επιστρέφει μια οποιαδήποτε αρνητική ή μια οποιαδήποτε θετική τιμή ανάλογα με το αν ο πρώτος ανόμοιος χαρακτήρας στο 1o string έχει μικρότερο ή μεγαλύτερο ASCII code από τον αντίστοιχο χαρακτήρα του 2ου string, μας αρκεί να αφαιρέσουμε το ASCII code του χαρακτήρα στο 2ο string από το ASCII code του αντίστοιχου χαρακτήρα στο 1ο string.

Δηλαδή, *s1 - *s2 :)

Αυτός είναι ο κυρίαρχος υπολογισμός για την τιμή επιστροφής της συνάρτησης, ο ας τον πούμε default. Το loop που προηγείται, χρησιμοποιείται αφενός για να βρει τον 1ο ανόμοιο χαρακτήρα ανάμεσα στα 2 strings, κι αφετέρου για να αντιμετωπίσει επί μέρους συνθήκες τερματισμού, όπως είναι όταν τελειώσουν οι χαρακτήρες του s1 χωρίς να έχει βρεθεί ανόμοιος :)

Το *--s2 στον 2ο όρο της αφαίρεσης στον κυρίαρχο υπολογισμό, επαναφέρει τον δείκτη του 2ου string μια θέση προς τα πίσω, πριν πραγματοποιήσει την αφαίρεση... βρείτε μόνοι σας το γιατί ως άσκηση (hint: κάντε trace τον αλγόριθμο με διάφορα test-cases για τα strings s1 και s2 :) )
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 01 Σεπ 2011, 23:49

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

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

Δημοσίευσηαπό migf1 » 01 Σεπ 2011, 23:50

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

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

Δημοσίευσηαπό Star_Light » 02 Σεπ 2011, 00:17

Κώδικας: Επιλογή όλων
while (*s1==*s2++)


ουσιαστικα εδω βάζεις μαζι και την αύξηση του δεικτη *s2
και το while υπάρχει οσο ειναι τα περιεχόμενα των δεικτών όμοια οκ?

μετα

Κώδικας: Επιλογή όλων
if(!*s1++)

αυτο δεν καταλαβαινω λιγο....

το

Κώδικας: Επιλογή όλων
return (int)(*s1- *--s2);


το διαβαζω τωρα :P
Γνώσεις ⇛ 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 » 02 Σεπ 2011, 00:29

το if(!*s1++) ελέγχει το παρόν s1 αν είναι '\0' και το αυξάνει κατά ένα, το ίδιο θα μπορούσαμε φαντάζομαι να κάνουμε και στο while αντί για το if....
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 02 Σεπ 2011, 00:32

stamatiou έγραψε:το if(!*s1++) ελέγχει το παρόν s1 αν είναι '\0' και το αυξάνει κατά ένα, το ίδιο θα μπορούσαμε φαντάζομαι να κάνουμε και στο while αντί για το if....


Ναι σωστα μολις τωρα ημουν ετοιμος να το γραψω... ουσιαστικα το

Κώδικας: Επιλογή όλων
if(!*s1++)


λεει πως άν δεν υπάρξει s1 δείκτης (δεν ξερω αν το εκφραζω και σωστα) αν δηλαδη πλεον ενω αυξανεται φτασει σε ενα σημειο να δειξει στο '\0' τελος συμβολοσειρας δηλαδη τοτε επεστρεψε τιμη 0.

Απο οσο λεει ο migf1 αν ειναι ανομοιοι οι δυο δεικτες η συνάρτηση επιστρέφει αρνητικη τιμή αν καταλαβα καλα?

EDIT: Λαθος... αρνητικη επιστρεφει αν ο 1ος ειναι μεγαλυτερος απο τον δευτερο.... αν για παραδειγμα αφαιρεσω τον χαρακτηρα 'A' απο τον 'C'

τοτε ειναι

Κώδικας: Επιλογή όλων
putchar(65) - putchar(68) = A-D = 65 - 68 = -3


:D

και φυσικα αυτο το οποιο επιστρεφει το κάνει αριθμητικη τιμη δηλαδη int μεσω του μετατροπεα (int )

επιστρεφει πχ οτι οι χαρακτήρες απέχουν κατα n μεταξυ τους.... αν n ειναι το αποτελεσμα της αφαίρεσης.

ενταξει τα βάλαμε τα σχολια αρα την τελειωσαμε την ασκηση :lol: :lol:
Τελευταία επεξεργασία από Star_Light και 02 Σεπ 2011, 00:49, έχει επεξεργασθεί 3 φορά/ες συνολικά
Γνώσεις ⇛ 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 » 02 Σεπ 2011, 00:37

Star_Light έγραψε:
stamatiou έγραψε:το if(!*s1++) ελέγχει το παρόν s1 αν είναι '\0' και το αυξάνει κατά ένα, το ίδιο θα μπορούσαμε φαντάζομαι να κάνουμε και στο while αντί για το if....


Ναι σωστα μολις τωρα ημουν ετοιμος να το γραψω... ουσιαστικα το

Κώδικας: Επιλογή όλων
if(!*s1++)


λεει πως άν δεν υπάρξει s1 δείκτης (δεν ξερω αν το εκφραζω και σωστα) αν δηλαδη πλεον ενω αυξανεται φτασει σε ενα σημειο να δειξει στο '\0' τελος συμβολοσειρας δηλαδη τοτε επεστρεψε τιμη 0.

Απο οσο λεει ο migf1 αν ειναι ανομοιοι οι δυο δεικτες η συνάρτηση επιστρέφει αρνητικη τιμή αν καταλαβα καλα?

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

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

Δημοσίευσηαπό Star_Light » 02 Σεπ 2011, 00:39

stamatiou έγραψε:
Ναι και σε αυτό φροντίζει η παρακάτω γραμμή ;)


οχι εγραψα μπουρδα... ξαναδιαβασε να δεις το εκανα EDIT.

P.S Κουτι μας επεσε το ASCII που καναμε χθες και σημερα στα δικτυα ετσι? Λες και κατι ηξερα και το εβαλα.
Γνώσεις ⇛ 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++

Δημοσίευσηαπό Star_Light » 02 Σεπ 2011, 00:46

φιλε migf1 οταν μπεις κοιταξε σε παρακαλω τα ποστ μου πιο πάνω με τα σχολια της συναρτηση να μου πεις αν τα εχω σωστα γιατι θελω να στην κλέψω :lol: :lol: ειναι φοβερη ασκηση. Τωρα μενει μονο να βρουμε το γιατι κανει αυτη την αφαιρεση.
Γνώσεις ⇛ 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
Εκτύπωση

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

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