Παραδείγματα & Ασκήσεις στην C

...ασύγχρονα μαθήματα γλώσσας C

Re: Παραδείγματα & Ασκήσεις στην C

Δημοσίευσηαπό linuxs » 11 Ιούλ 2011, 16:49

migf1 έγραψε: παραλλαγή που παρα
migf1 έγραψε:Βασικά έκανε πλάκα ο linuxs ;)

Το πρόγραμμά σου φίλε Qdata δεν δουλεύει σωστά. Π.χ. δοκίμασέ το με είσοδο: -10, 999
Ούτε είναι λιγότερες γραμμές, είναι 12 έναντι 11 του δικού μου, αλλά εσύ υπολογίζεις μια ακόμα μεταβλητή, το πλήθος των διψήφιων (που εγώ δεν το υπολογίζω, δεν κατάλαβα ότι το ζητάει η εκφώνηση). Άρα είναι ίδιες γραμμές, αφού το ότι εσύ χρησιμοποιείς return αντί για exit και ότι δεν βάζεις γραμμή που να ζητάει από τον χρήστη να πατήσει ENTER πριν τον τερματισμό δεν λογίζονται γραμμές για την επίλυση της άσκησης.

Γενικώς πάντως ο compiler διαγράφει όλα τα κενά (χαρακτήρες και γραμμές) πριν ξεκινήσει το compilation, οπότε το να έχει κάποιος παραπάνω κενές γραμμές η πιο αραιή σύνταξη στον κώδικά του δεν επηρεάζει σε τίποτα την ταχύτητα εκτέλεσης του προγράμματος (καθυστερεί λίγο παραπάνω το compilation). Οπότε η τελευταία παραλλαγή που παραθέτεις, επί της ουσίας απλά κάνει τελείως δυσανάγνωστο τον κώδικα χωρίς καμία ουσιαστική ωφέλεια.


:P :thumbup: Αγγίζεις τον βέλτιστο προγραμματιστή! ;)
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

Re: Παραδείγματα & Ασκήσεις στην C

Δημοσίευσηαπό migf1 » 11 Ιούλ 2011, 17:16

Χεχεχε, thanks αλλά απέχω πάρα πολύ από το να αγγίζω καν τον βέλτιστο προγραμματιστή! Απλά ξέρω πολύ καλή C. Αν με βάλεις να γράψω κώδικα σε άλλη γλώσσα που δεν την ξέρω καλά, δεν θα μπορέσω να αντεπεξέλθω καλύτερα από ότι ο μέσος όρος.

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

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

do {
printf("Enter number #%d: ", total+1);
scanf("%d", &num);
if ( ABS(num) > 9 && ABS(num) < 100 ) // 2-digit number
sum2 += num;
total++;
} while (num != 999);


μπορεί να γίνει έτσι...
Κώδικας: Επιλογή όλων

int temp;
do {
printf("Enter number #%d: ", total+1);
scanf("%d", &num);
temp = ABS(num);
if ( temp > 9 && temp < 100 ) // 2-digit number
sum2 += num;
total++;
} while (num != 999);

Με κόστος την εκχώρηση στην έξτρα μεταβλητή temp γλιτώνουμε 1 παραπανίσια σύγκριση μέσα στο loop (αφού όπως όλα τα macros έτσι και το ABS() αντικαθιστά inline το όνομά του με το κομμάτι κώδικα που του αντιστοιχεί από το #define του).

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

if ( (nums > 0 ? nums : -nums) > 9 && (nums > 0 ? nums : -nums) < 100 ) // 2-digit number

δηλαδή 4 συγκρίσεις, με τις 2 μάλιστα από αυτές να έχουν και else παρακλάδι

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

Re: Παραδείγματα & Ασκήσεις στην C

Δημοσίευσηαπό migf1 » 11 Ιούλ 2011, 17:20

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

if ( temp < 0)
temp = -temp;
if ( temp > 9 && temp < 100 ) // 2-digit number
sum2 += num;

Εξαλείφει το else παρακλάδι.

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

Re: Παραδείγματα & Ασκήσεις στην C

Δημοσίευσηαπό linuxs » 11 Ιούλ 2011, 17:41

Ενδιαφέρον θα ήταν να χρησιμοποιηθεί και παραλληλισμός! ;) ...αλλα δυστυχώς έχω μόνο θεωρητικές γνώσεις... :(
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

Re: Παραδείγματα & Ασκήσεις στην C

Δημοσίευσηαπό Qdata » 11 Ιούλ 2011, 17:45

migf1 έγραψε:Γενικώς πάντως ο compiler διαγράφει όλα τα κενά (χαρακτήρες και γραμμές) πριν ξεκινήσει το compilation, οπότε το να έχει κάποιος παραπάνω κενές γραμμές η πιο αραιή σύνταξη στον κώδικά του δεν επηρεάζει σε τίποτα την ταχύτητα εκτέλεσης του προγράμματος (καθυστερεί λίγο παραπάνω το compilation). Οπότε η τελευταία παραλλαγή που παραθέτεις, επί της ουσίας απλά κάνει τελείως δυσανάγνωστο τον κώδικα χωρίς καμία ουσιαστική ωφέλεια.


Ναι, δεν το έλεγα στα σοβαρά.Χειρότερα είναι ένα μονοκόμματο πράγμα από την όμορφη δομή του προγράμματός σου.Συγχωρέστε με για λάθη αλλά τώρα μαθαίνω τα βασικά της γλώσσας. :oops:
Linux User: #530165
Γνώσεις ⇛ Linux: Μέτριο ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 11.04 32bit σε Intel(R) Atom(TM) CPU N270 @ 1.60GHz
(Notebook) Προδιαγραφές ⇛ 2x Intel(R) Atom(TM) CPU N270 @ 1.60GHz │ 1016MB │ HDA-Intel - HDA Intel -- USB-Audio - USB AUDIO│ 1024x600 pixels
Νέος στο Linux?Οδηγοί - How to - Tutorials
Qdata
powerTUX
powerTUX
 
Δημοσιεύσεις: 1875
Εγγραφή: 18 Ιουν 2010, 19:40
Τοποθεσία: Σέρρες
IRC: dimos
Εκτύπωση

Re: Παραδείγματα & Ασκήσεις στην C

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

Qdata έγραψε:ικά της γλώσ
:P
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ Linux: Μέτριο┃Προγραμματισμός: C┃Αγγλικά: Καλά
Λειτουργικό ⇛ Linux Ubuntu 10.4 LTS
Προδιαγραφές ⇛ Intel Pentium @T4500 2.3GHz│ 512GB VRAM│ 500 HDD│ ATI RADEON HD545v 512 MB │ Screen: 15.6''
Άβαταρ μέλους
linuxs
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 1060
Εγγραφή: 02 Ιούλ 2010, 13:19
Τοποθεσία: GR
IRC: linuxs
Εκτύπωση

Re: Παραδείγματα & Ασκήσεις στην C

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

Qdata έγραψε:@Star_Light :P :D Μόνο άλλαξε το #define και κάνε το έτσι:
Κώδικας: Επιλογή όλων
#define N 0


δεν μου το χτυπησε ο μεταγλωτιστης παντως το ερωτηματικο :/
Thanks για την επισημανση.

migf1 έγραψε:
maenolis έγραψε:Α γιατί χάρηκα ότι έγινε εδώ αυτό!! Επειδή εδώ το μέσο μπακάλικο δεν αρκείται στην C αλλά τα θέλει όλα...

Δεν ξέρω καθόλου αν σε γλώσσες τύπου Ruby και Python λύνεται πιο εύκολα αυτή η άσκηση. Σε C πάντως δεν θα την χαρακτήριζα εύκολη. Ειδικά αν θελήσουμε να διατηρήσουμε απείραχτα τα κενά διαστήματα μεταξύ των λέξεων.

Αν δηλαδή, το: "γεια___σου__ρε______κόσμε_άπονε" θελήσουμε να το κάνουμε: "άπονε_κόσμε______ρε__σου_γεια" είναι ολίγον παλουκάκι (όπου _ κενό διάστημα). Εγώ αν είναι θα σας δείξω έναν τρόπο που ναι μεν αντιστρέφει τις λέξεις, αλλά στο αποτέλεσμα τις διαχωρίζει με ένα μόνο κενό ανάμεσα στη κάθεμιά τους (κι ας έχει περισσότερα η αυθεντική πρόταση).

Απλά πείτε μου αν θέλει κάποιος να δοκιμάσει μόνος του πριν ποστάρω τον κώδικα.


σε PHP ειναι το πιο ευκολο παντως λολ :P

migf1 έγραψε:
Γενικώς πάντως ο compiler διαγράφει όλα τα κενά (χαρακτήρες και γραμμές) πριν ξεκινήσει το compilation, οπότε το να έχει κάποιος παραπάνω κενές γραμμές η πιο αραιή σύνταξη στον κώδικά του δεν επηρεάζει σε τίποτα την ταχύτητα εκτέλεσης του προγράμματος (καθυστερεί λίγο παραπάνω το compilation). Οπότε η τελευταία παραλλαγή που παραθέτεις, επί της ουσίας απλά κάνει τελείως δυσανάγνωστο τον κώδικα χωρίς καμία ουσιαστική ωφέλεια.


Ο compiler το κανει αυτο?? ή ο προεπεξεργαστης? :S Παλι λαθος θα το εγραψαν εκει που το διαβαζα... ε ρε με αυτες τις πηγες τους!!!!!!
Λιγο δυσκολο να το χεις εσυ migf1 λαθος :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

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

Star_Light έγραψε:δεν μου το χτυπησε ο μεταγλωτιστης παντως το ερωτηματικο :/
Thanks για την επισημανση.


Όντως.Ούτε εμένα μου έβγαλε σφάλμα ο gcc με το ερωτηματικό.Δεν ξέρω γιατί.
Πάντως η κύρια σύνταξη είναι:
Κώδικας: Επιλογή όλων
#define ΣΤΑΘΕΡΆ ΤΙΜΉ
Linux User: #530165
Γνώσεις ⇛ Linux: Μέτριο ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 11.04 32bit σε Intel(R) Atom(TM) CPU N270 @ 1.60GHz
(Notebook) Προδιαγραφές ⇛ 2x Intel(R) Atom(TM) CPU N270 @ 1.60GHz │ 1016MB │ HDA-Intel - HDA Intel -- USB-Audio - USB AUDIO│ 1024x600 pixels
Νέος στο Linux?Οδηγοί - How to - Tutorials
Qdata
powerTUX
powerTUX
 
Δημοσιεύσεις: 1875
Εγγραφή: 18 Ιουν 2010, 19:40
Τοποθεσία: Σέρρες
IRC: dimos
Εκτύπωση

Re: Παραδείγματα & Ασκήσεις στην C

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

Qdata έγραψε:
Star_Light έγραψε:δεν μου το χτυπησε ο μεταγλωτιστης παντως το ερωτηματικο :/
Thanks για την επισημανση.


Όντως.Ούτε εμένα μου έβγαλε σφάλμα ο gcc με το ερωτηματικό.Δεν ξέρω γιατί.
Πάντως η κύρια σύνταξη είναι:
Κώδικας: Επιλογή όλων
#define ΣΤΑΘΕΡΆ ΤΙΜΉ

Βασικά τα macros απλά αντικαθιστούν το όνομά τους με τον κώδικα που τους βάζουμε στο #define τους. Το ; που δεν βάζουμε στο τέλος του κώδικά τους, το βάζουμε όταν καλούμε το όνομά τους.

Π.χ. αν έχουμε ένα macro που δίνει το ελάχιστο μεταξύ 2 αριθμών...
Κώδικας: Επιλογή όλων

#define MIN(x,y) (x) < (y) ? x : y

όταν το καλέσουμε, θα βάλουμε ; στο τέλος εμείς. Π.χ.
Κώδικας: Επιλογή όλων

int a=10, b=20, c;

c = MIN(a,b);

Αν όμως έχουμε ένα macro που είναι μια συνθήκη, π.χ. αν το όρισμά του είναι ψηφίο...
Κώδικας: Επιλογή όλων

#define ISDIGIT(c) ( (c) >= '0' && (c) <= '9' )

τότε όταν το καλέσουμε σε ένα if δεν θα του βάλουμε ; στο τέλος...
Κώδικας: Επιλογή όλων


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

Re: Παραδείγματα & Ασκήσεις στην C

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

Star_Light έγραψε:
[snip]
Ο compiler το κανει αυτο?? ή ο προεπεξεργαστης? :S Παλι λαθος θα το εγραψαν εκει που το διαβαζα... ε ρε με αυτες τις πηγες τους!!!!!!
Λιγο δυσκολο να το χεις εσυ migf1 λαθος :P

Βασικά ο compiler καλεί τον preproccessor, αλλά η κάθε εταιρεία κάνει τα... δικά της!

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

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

  • ΣΧΕΤΙΚΑ ΘΕΜΑΤΑ
    ΑΠΑΝΤΗΣΕΙΣ
    ΠΡΟΒΟΛΕΣ
    ΣΥΓΓΡΑΦΕΑΣ

Επιστροφή στο Μαθήματα C