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

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

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

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

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

Προσπάθησα να το κάνω μεσ counters αλλά δεν είμαι σίγουρος αν δουλεύει....
Spoiler: show
Κώδικας: Επιλογή όλων
int s_compare( const char *s1, const char *s2 )
{
int i1 = 0, i2 = 0;
while ( s1[i1++] == s2[i2++] )
if ( !s1[i1] )
return 0;

return (int)(s1[i1] - s2[i2]);
}
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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

λοιπον θα κανω μια δοκιμη να πω την απαντηση σε spoiler σταματίου μην αντιγράψεις θα σε κυνηγήσω :D λοιπον επειδη ομως οπως φανταζομαι η απαντηση μπορει (τι μπορει δηλαδη σιγουρα δεν θα ειναι σωστη) λεω να παραθεσω και λιγο πως δουλευει ο αλγοριθμος για να μην με περασετε για παντελως ανιδεο) :lol: ας δουμε την αναλυση του αλγοριθμου (με ενα παράδειγμα)

Spoiler: show
Κώδικας: Επιλογή όλων


εστω s1[]="ABCD"
s2[]="ABCH"

o αλγοριθμος θα συγκρίνει με τους *s1 & *s2 μεχρι και το (D,H) στο (D,H) "σπαει" επειδη πεφτει πανω σε ανόμοιους χαρακτήρες.

*s1-*s2 => A-E => 65 - 72 = -7 στην συνέχεια ο δείκτης πάει μια θέση πιο κάτω (μειώνεται) δηλαδη προς τα αριστερά για να σηματοδοτήσει ακριβως εκει πως ήταν το τέλος (είναι) το τέλος της όμοιας συμβολοσειράς?

Γνώσεις ⇛ 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 » 02 Σεπ 2011, 01:13

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

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

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

migf1 έγραψε:Back, έβλεπα Law & Order στο Star (κι έχει κάνει διάλειμμα :lol:) ... μισό να δω τι έχετε γράψει :)

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

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

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

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

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

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

@Star_Light:

Σωστά το κατάλαβες αυτό με την αφαίρεση των ASCII codes :)

Για το !*s1++ το κατάλαβες νομίζω κι αυτό σωστά, αλλά δεν το εξέφρασες σωστά με λόγια.

Ανεπτυγμένο, το:
Κώδικας: Επιλογή όλων

if ( !*s1++ ) return 0;

γράφεται ως εξής:
Κώδικας: Επιλογή όλων

if ( *s1 == '\0' ) { s1++; return 0; }


Και η σταδιακή του σύμπτυξη πάει κάπως έτσι:
Κώδικας: Επιλογή όλων

if ( *s1 == 0 ) { s1++; return 0; }

Κώδικας: Επιλογή όλων

if ( *s1++ == 0 ) return 0;

Κώδικας: Επιλογή όλων

if ( ! ( *s1++ ) ) return 0;

Κώδικας: Επιλογή όλων

if ( !*s1++ ) return 0;

Με λόγια, εξετάζει αν το περιεχόμενο του δείκτη s1 (δλδ ο χαρακτήρας *s1) ισούται με '\0' και είτε ισούται είτε δεν ισούται με '\0' το περιεχόμενο, ο δείκτης μετακινείται στον επόμενο χαρακτήρα αμέσως μετά τη σύγκριση, πριν ακόμα αποφασίσει το πρόγραμμα αν θα μπει ή όχι στο κυρίως σώμα του if (η απόφαση παίρνεται με τον δείκτη να δείχνει στον αρχικό χαρακτήρα αλλά μέσα στο κυρίως σώμα του if ο δείκτης έχει πάει ήδη στον επόμενο χαρακτήρα).

Μπορείς να το βάλεις μέσα στη συνθήκη του while loop αν θέλεις, αλλά τότε αλλάζει ελαφρώς η λογική, γιατί τότε ναι μεν πάλι θα σταματάει το loop είτε όταν βρεθεί ανόμοιος χαρακτήρας είτε όταν τελειώσουν οι χαρακτήρες του 1ου string, αλλά χάνεις την δυνατότητα να επιστρέψεις την τιμή 0 όταν ικανοποιηθεί η 2η συνθήκη. Θα πρέπει να την ξανά ελέγξεις, πλέον έξω από το loop (μετά το τέλος του δλδ) για να μπορέσεις να την διαχωρίσεις ως προς το τι θα επιστρέψεις ( δλδ return 0 ) κι εκεί αρχίζει να χαλάει λίγο το πράγμα.
Τελευταία επεξεργασία από migf1 και 02 Σεπ 2011, 02:46, έχει επεξεργασθεί 10 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 02 Σεπ 2011, 02:16

Btw, σας δίνω και μερικά test-cases για να κάνετε trace τον κώδικα (ενδεχομένως με χαρτί και μολύβι)

Κώδικας: Επιλογή όλων

char s1[] = "a", s2[] = "a";

char s1[] = "a", s2[] = "b";

char s1[] = "a", s2[] = "ab;

char s1[] = "ab", s2[] = "a";

char s1[] = "ab", s2[] = "ba";

char s1[] = "", s2[] = "a";

char s1[] = "a", s2[] = "";

char s1[] = "abc", s2[] = "abd";

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

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

Δημοσίευσηαπό migf1 » 02 Σεπ 2011, 02:33

Πάντως παιδιά, ο πιο απλός τρόπος για να μη μπερδεύετε τους δείκτες, είναι τον κάθε δείκτη να τον φαντάζεστε σαν ένα βελάκι που δείχνει σε έναν χαρακτήρα... s το βελάκι, *s o χαρακτήρας. Και μπορείτε να μετακινείται το βελάκι (συνήθως με s++ ή s--) σε άλλον χαρακτήρα όποτε θέλετε.
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, 02:54

τελικα η δικη μου σκέψη ειχε καμια απήχηση? :/

EDIT: οΠΑ ακυρο νομιζα οτι απαντησες στον stamatiou :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
Εκτύπωση

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

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

Star_Light έγραψε:τελικα η δικη μου σκέψη ειχε καμια απήχηση? :/

EDIT: οΠΑ ακυρο νομιζα οτι απαντησες στον stamatiou :lol:

αυτο που ειπα για την μείωση ????

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

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

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