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

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

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

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

Δημοσίευσηαπό Star_Light » 24 Μαρ 2012, 16:35

Ilias95 έγραψε:
Τι εννοείς δεν δουλεύει;
Στο παραπάνω παράδειγμα η goto δεν χρησιμεύει σε απολύτως τίποτα. Έτσι κι αλλιώς ο κώδικας της ex θα εκτελεστεί ανεξάρτητα της τιμής του n.


Aκριβως εχεις δικιο. Για αυτο και στα περισσοτερα παραδειγματα βαζουν απο πανω την ετικετα της goto.
Γνώσεις ⇛ 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

Δημοσίευσηαπό Star_Light » 24 Μαρ 2012, 16:50

Τωρα καταλαβαινω γιατι δεν θελουν να την χρησιμοποιούν γιατι ειναι μπελάς πχ εμενα για να μην μου εκτυπωνει και αρνητικους εβαλα αυτο εδω

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

#include<stdio.h>
int main()
{
int n;

printf(" Give n : \n");
scanf("%d" , &n);

if( n > 0 )
{
ex:
printf(" %d " , n);
}

if( n > 0 )
goto ex;


return 0;
}


βλακειες! Εκμεταλευεται την ετικέτα της που εχει ηδη οριστει.
Γνώσεις ⇛ 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

Δημοσίευσηαπό migf1 » 24 Μαρ 2012, 17:05

Και μιας και έχω όρεξη και λίγο διαθέσιμο χρόνο, δες Ηλία πως μπορείς να αντιμετωπίσεις με δυναμική διαχείριση μνήμης το πρόβλημα των immutable string ορισμάτων μιας συνάρτησης.

Μορφοποιημένος Κώδικας: Επιλογή όλων
char *s_dup2upper( char *s )    /* duplicate s & uppercase it */
{
char *snew = NULL;

/* sanity checks */
if ( !s )
return NULL;
if ( '\0' == *s )
return s;

/* δυναμική δημιουργία αντιγράφου του s */
snew = calloc( 1+strlen(s), sizeof(char) ); /* δέσμευση μνήμης, μεγέθους 1+strlen() chars */
if ( !snew )
return NULL; // out of memory
strcpy( snew, s );

/* "κεφαλοποίηση" του αντιγράφου */
for (char *cp=snew; (*cp = (char)toupper( (int)(*cp) ); cp++)
; /* void */

/* επιστροφή δείκτη στην αρχή του αντιγράφου */
return snew;
}

Η συνάρτηση αυτή δημιουργεί δυναμικά ένα αντίγραφο του s, το οποίο και "κεφαλοποιεί". Η τιμή επιστροφής της είναι ένας δείκτης στην αρχή του αντίγραφου, ενώ σε περίπτωση αποτυχίας επιστρέφει είτε NULL (αν το s ήταν ανύπαρκτο, δλδ NULL, ή αν η απέτυχε η δέσμευση μνήμης για το αντίγραφο) είτε έναν δείκτη στην αρχή του original s (αν το s ήταν κενό, δλδ s[0] = '\0' ).

Πλέον αλλάζει η λογική όπως την ξέρουμε με τα στατικά ορισμένα strings, και η κλήση της συνάρτησης γίνεται κάπως έτσι...

Μορφοποιημένος Κώδικας: Επιλογή όλων
int main( void )
{
char s[] = "This is our orignal s";
char *sdup = s_dup2upper(s); /* δημιουργία "κεφαλοποιημένου" αντιγράφου */

if ( !sdup ) {
puts( "out of memory" );
exit( EXIT_FAILURE);
}

puts( sdup ); /* τύπωμα του αντιγραφου */
free( sdup ); /* απελευθέρωση της μνήμης που έχει δεσμευτεί δυναμικά για το αντίγραφο */

exit( EXIT_SUCCESS );
}

Πλέον μπορούμε να εφαρμόσουμε την s_dup2upper() και σε immutable όρισμα, διότι πολύ απλά η συνάρτηση δεν δουλεύει πάνω του, αλλά σε ένα αντίγραφο που το δημιουργεί εσωτερικά, το τροποποιεί και μας το επιστρέφει.

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

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

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

Δημοσίευσηαπό migf1 » 24 Μαρ 2012, 17:11

Ουπς, λάθος παράδειγμα... για να δείξουμε το ότι η s_dup2upper() δουλεύει και με immutable όρισμα, δεν χρειαζόμαστε το s στην main(), την καλούμε απευθείας...

Μορφοποιημένος Κώδικας: Επιλογή όλων
int main( void )
{
char *sdup = s_dup2upper( "This is our orignal string" ); /* δημιουργία "κεφαλοποιημένου" αντιγράφου */

if ( !sdup ) {
puts( "out of memory" );
exit( EXIT_FAILURE);
}

puts( sdup ); /* τύπωμα του αντιγραφου */
free( sdup ); /* απελευθέρωση της μνήμης που έχει δεσμευτεί δυναμικά για το αντίγραφο */

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

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

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

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

By the way, δυστυχώς οι περισσότερες ασκήσεις στο κεφάλαιο με τα strings είναι να τροποποιήσεις προγράμματα που είχες γράψει παλαιότερα κάτι που πολλές φορές είναι ανιαρό.
Έτσι έλυσα μόνο κάποιες επιλεκτικά (και άλλες απλά τις υλοποίησα στο μυαλό μου) και αφού κάνω τον string-tokenizer που πρότεινες και την άλλη άσκηση που σκέφτηκα εγώ θα φύγω παρακάτω...
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 24 Μαρ 2012, 17:48

Ναι, το είδα κι εγώ αυτό στο βιβλίο... είναι όντως ανιαρό. Βέβαια, έχει κάποιες ενδιαφέρουσες, όπως π.χ. τις s_isanagram() , s_reverse(), s_ispalindrome()... ενδιαφέρουσες από θέμα εξάσκησης (και μπορείς να τις συγκρίνεις κατόπιν με τον κώδικα των αντίστοιχων συναρτήσεων της LIBS: http://x-karagiannis.gr/prog/libs/ (άνοιξε δεξιά το "libs additional functions" για μια σύντομη περιγραφή τους, συν ότι μπορείς να πάρεις και ιδέες ;) ... ο κώδικας της LIBS είναι ένα μόνο αρχείο και μπορείς να τον κατεβάσεις από το site, αν θες να κάνεις διασταύρωση με δικές σου λύσεις).

Ο string-tokenizer είναι πολύ όμορφη και πάρα πολύ χρήσιμη συνάρτηση, και λογικά δεν θα το καταφέρεις πολύ εύκολα να είναι re-usable. Είναι όμως "εντός ύλης" σε αυτά που έχεις διαβάσει μέχρι στιγμής στο βιβλίο, οπότε go for it :)

Αυτή με τα ζώα, προτείνω να μην την προσπαθήσεις καθόλου ακόμα... κατά πάσα πιθανότητα και θα σε παιδέψει πάρα πολύ και μάλλον δεν θα την καταφέρεις κιόλας με τρόπο re-usable. Καλύτερα να την κάνεις αργότερα, όταν θα έχεις προχωρήσει κι άλλο στην ύλη (dynamic memory, structures/unions, ενδεχομένως και linked-lists).
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό Star_Light » 24 Μαρ 2012, 19:52

ΠΑΙΔΙΑ αν μπορειτε να επισημανετε αριθμητικα τις ασκησεις που δεν αξιζει να ασχοληθει καποιος στο κεφαλαιο με τα strings. -.-
Αν και συμφωνα με το τελευταιο ποστ του migf1 θα τις βρω μολις παω στο κεφαλαιο :geek:
Γνώσεις ⇛ 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

Δημοσίευσηαπό Star_Light » 24 Μαρ 2012, 19:54

α! Και για οποιον θέλει (επειδη δεν εχει το βιβλιο του King παρομοιο παράδειγμα) να ενα καλο παραδειγματακι με συνετη χρηση της goto που εφτιαξα το μεσημερι.

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

#include <stdio.h>
int main(void)
{
int n;

printf(" Give a nonzero integer : \n");
scanf("%d" , &n);

if ( n == 0 )
goto ex1;

else if( n < 0)
goto ex2;

else
goto ex3;

ex1:
printf(" You gave zero number");
goto end;

ex2:
printf(" You gave negative number");
goto end;

ex3:
printf(" %d " , n);
goto end;

end: ;

return 0;
}
Γνώσεις ⇛ 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

Δημοσίευσηαπό migf1 » 24 Μαρ 2012, 20:31

Star_Light έγραψε:α! Και για οποιον θέλει (επειδη δεν εχει το βιβλιο του King παρομοιο παράδειγμα) να ενα καλο παραδειγματακι με συνετη χρηση της goto που εφτιαξα το μεσημερι.

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

#include <stdio.h>
int main(void)
{
int n;

printf(" Give a nonzero integer : \n");
scanf("%d" , &n);

if ( n == 0 )
goto ex1;

else if( n < 0)
goto ex2;

else
goto ex3;

ex1:
printf(" You gave zero number");
goto end;

ex2:
printf(" You gave negative number");
goto end;

ex3:
printf(" %d " , n);
goto end;

end: ;

return 0;
}

Μόνο συνετή χρήση του goto δεν είναι αυτό (συνετή χρήση είναι το παράδειγμα που ποστάρισα στην προηγούμενη σελίδα). Το συγκεκριμένο μπορεί να μετατραπεί σε συνετή χρήση του goto ως εξής:

Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
int main(void)
{
int n;

printf("Give a nonzero, positive integer: ");
scanf("%d" , &n);

if ( 0 == n ) {
puts("*** error: you gave zero");
goto exit_error;
}

if ( n < 0) {
puts("*** error: you gave a negative number");
goto exit_error;
}

printf("%d\n" , n);
return 0;

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

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

Δημοσίευσηαπό Star_Light » 24 Μαρ 2012, 20:37

Δοκιμασε να το "χακαρεις" :D και να μου πεις γιατι δεν ειναι συνετη χρηση του goto!

Αν δεν βαριεσαι....
Γνώσεις ⇛ 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
Εκτύπωση

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

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