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

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

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

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

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

Star_Light έγραψε:
migf1 έγραψε:

ΥΓ. Σχετικά με την scanf, η δική μου απορία είναι: γιατί δεν δοκιμάζεις στα πράξη αυτό που ρωτάς για να δεις πως συμπεριφέρεται; Λιγότερο χρόνο θα σε είχε πάρει :P


Παράθεση σου εκανα επειδη εσυ λες πως δεν ειναι δομη δεδομένων ενω η wikipedia ναι και μπερδευτηκα.
Φυσικα εψαξα για την scanf και θα επανέλθω σε λιγο με αναλυτικό παραδειγμα για οποιον θέλει να ασχοληθει
μαζι της! Αν θελει καποιος να καταλαβαινει ΠΟΥ ειναι ακριβως το προβλημα και δεν πρεπει να τη χρησιμοποιει
πιστευω ειναι χρησιμο να μεινει λιγο περισσοτερο εστιαζοντας σε αυτην.

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

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

Δημοσίευσηαπό Star_Light » 03 Μαρ 2012, 17:40

ε ναι.

Οταν η 2η "παραμετρος" της for δώσει FALSE == 0 σταματά το loop και άρα και το σώμα του.
Γνώσεις ⇛ 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 » 03 Μαρ 2012, 17:44

Απλα δεν ειδα στην αρχη το

πινακες = arrays ωστε να καταλαβω οτι το εξηγεις απο την μεταφραστική σκοπιά :lol: :lol:
γιατι οταν λες σκετο οτι a!=b σημαινει οτι το a δεν ειναι b
Γνώσεις ⇛ 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

Δημοσίευσηαπό Ilias95 » 03 Μαρ 2012, 20:12

Έστω ότι είμαι σε έναν βρόγχο:
Μορφοποιημένος Κώδικας: Επιλογή όλων
while (1) {
switch (n) {
case 0:
//do something
break;
case 1:
break;
}
}

Τα break αναφέρονται στο switch.
Αν θέλω τα break να αναφέρονται στον βρόχο του πιο πάνω επιπέδου (τον while στην προκειμένη) μπορώ να κάνω κάτι για να αποφύγω την χρήση του goto;

Είναι καλύτερα μήπως να αλλάξω το switch σε if statements;
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

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

Λοιπον.... τελικα αυτο που ειχα πει οτι οταν o '\n' φεύγει σαν είσοδος απο μια scanf σε 2η (επειδη συμφωνα με την λειτουργια της ποτε δεν διαβαζει τον τελευταιο χαρακτηρα αλλαγης γραμμης αλλα τον θέτει put back που λεει και μεσα για επομενη κληση της) και οτι λαμβάνεται σαν space / blank character στην 2η ειναι μεν σωστο αλλα δεν γινεται skip. Εκτος και αν μεσα στο format string ο προγραμματιστης έχει προνοησει να έχει βάλει έναν ordinary character μαζι με το conversion specification %c. Σε αυτη τη περίπτωση η scanf θα ταιριάξει το ένα αυτο κενό με οσα κενα πληκτρολογησει ο χρήστης οπως λεει και σελιδα 45 και θα αντιστοιχισει μετα τον χαρακτήρα που θα δωσει στο %c πλεον. (Θα κανει δηλαδη το απαραιτητο locate) .

ΕΠισης τα κενά τα κανει skip εγγυημενα ενω ψαχνει για ακέραιους. Παρακατω παραθέτω ενα παράδειγμα :

Κώδικας: Επιλογή όλων
#include<stdio.h>
int main(void)
{

char c1 , c2 , c3 ,c4 , c5 , c6;
//int i;
//char c7=' ';

printf(" Give a character: ");
scanf(" %c" , &c1);

printf(" Give a character : ");
scanf(" %c" , &c2 );

printf(" Give a character: ");
scanf("%c" , &c3);

printf(" Give a character: ");
scanf("%c" , &c4);

printf(" Give a character: ");
scanf("%c", &c5);

printf(" Give a character: ");
scanf("%c" , &c6);

printf(" Character is: %c" , c1);
printf(" Character is : %c" , c2);
printf(" Character is: %c " , c3);
printf(" Character is: %c " , c4);
printf(" Character is: %c " , c5);
printf(" Character is: %c " , c6);
return 0;
}


Στο παραπάνω παράδειγμα θα "δουλεψουν" μονο τα c1 , c2 , c4 , c6 υπο την έννοια οτι μονο αυτα θα δειξουν κάποιον χαρακτήρα που θα δώσει ο χρήστης και τα αλλα δουλευουν απλα δειχνουν κενο. Ο κωδικας δουλεύει ως εξης....
Δινεις αρχικα εναν χαρακτηρα και τον \n μιας και πατάς επομενη γραμμη στον φλοιό ηο '\n' δεν διαβαζεται καν απο την 1η και παει απευθειας σαν εισοδος στην 2η οπου κανει την αντιστοιχιση μιας και έχουμε αφησει ηδη ενα κενο μεσα στο format string και περιμενει εναν ακομη χαρακτηρα... τον δινεις και πατας αλλαγη γραμμης.... στην 3η scanf παιρνει απλα το '\n' και παει στην 4η "καθαρος" πλεον ο φλοιος χωρις ας πουμε κατι... στο 4 πληκτρολογεις εναν χαρακτηρα και επειδη παλι λογω της ιδιας δουλειας... στην 5η scanf διαβάζεται ο κενος ενω στην 6 πληκτρολογεις παλι εναν δικο σου χαρακτηρα... για αυτο το λογο οι c1,c2,c4,c6 θα δουλεψουν σε εισαγωγικα μεσα στην printf και οχι οι c3 , c5 με την εννοια οτι δινουν κενο.

ΣΥμφωνα επισης με την θεωρια.... δεν ειναι υποχρεωτικο αν εγω βαλω εναν ordinary κενο μεσα στο format string της scanf να πρεπει και στα δεδομενα εισοδου να εχω κανει το ιδιο.....

ισως επιστρεψω και με ενα παραδειγμα ακομη που στην 2η scanf δεχεται και ακεραιο μαζι με χαρακτηρα αλλα εκει χανεται η μπαλα και γινεται πιο περιπλοκο. ΕΙδωμεν...

ελπιζω να μην τα εχω καταλαβει λαθος :)

To οτι δεν ειναι θεμα της γλώσσας τα προβληματα της scanf μαλλον το θεωρουν οτι οφειλεται σε προγραμματιστικη κακομεταχειριση και οχι τοσο στην "προβληματικοτητα" της συναρτησης.
Γνώσεις ⇛ 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 » 03 Μαρ 2012, 20:37

Yπάρχει λάθος στο παραπάνω ποστ. :(

Οι c3 , c5 δεν ειναι ακριβως οι κενοί χαρακτήρες όταν εκτυπώνονται απο τις printf
μπορει κάποιος να το διαπιστώσει αν ζητήσει να εκτυπωθούν απο την printf οι αριθμητικες τιμές
αυτων.

Κώδικας: Επιλογή όλων
printf(" Character is: %d " , c3);
printf(" Character is: %d " , c5);


Aπλα επειδη υπάρχει ισοδυναμία στην scanf μεταξυ ενος χαρακτηρα αλλαγής γραμμης και ενος κενου μπορούμε να βάλουμε
τον ordinary space μεσα στο format string της scanf.

κατα τα αλλα η τιμη που θα εκτυπωθει απο τα παραπανω θα ειναι 10 οποτε ανατρέχοντας σε έναν πινακα ASCII θα δουμε οτι
αυτο αντιστοιχει στον χαρακτηρα αλλαγης γραμμης και οχι στον κενο ο οποιος ειναι
ο 32.

Κώδικας: Επιλογή όλων
char c7=' ';
printf(" blank space character has value: %d" ,c7);


http://www.google.gr/imgres?imgurl=http ... CB4Q9QEwAw
Γνώσεις ⇛ 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

Δημοσίευσηαπό stamatiou » 03 Μαρ 2012, 20:48

Ilias95 έγραψε:Έστω ότι είμαι σε έναν βρόγχο:
Μορφοποιημένος Κώδικας: Επιλογή όλων
while (1) {
switch (n) {
case 0:
//do something
break;
case 1:
break;
}
}

Τα break αναφέρονται στο switch.
Αν θέλω τα break να αναφέρονται στον βρόχο του πιο πάνω επιπέδου (τον while στην προκειμένη) μπορώ να κάνω κάτι για να αποφύγω την χρήση του goto;

Είναι καλύτερα μήπως να αλλάξω το switch σε if statements;

Για το break δεν γνωρίζω αλλά μπορείς π.χ. να κάνεις μια μεταβητή χ και στο while να βάλεις να σταματάει όταν το χ είναι 1, έτσι, μέσα στο switch θα βάλεις ότι χ = 1 και θα βγεις από το while.
1Γνώσεις→Linux: Αρχάριος┃Προγραμματισμός:Αρχάριος┃Αγγλικά:Μέτριος
2Λειτουργικό→Arch Linxu 32bit
3Προδιαγραφές→2x AMD AthlonX2 DualCore QL-66 ‖ RAM 1751 MiB ‖ Hewlett-Packard 308C - Hewlett-Packard Compaq 615
4Κάρτες γραφικών:ATI RS780M/RS780MN [Radeon HD 3200 Graphics][1002:9612]
5Δίκτυα:eth0:Marvell 88E8042 PCI-E Fast Ethernet Controller [11ab:4357] (rev 10)⋮eth1: Broadcom BCM4312 802.11b/g LP-PHY [14e4:4315](rev 01)
Πρωσοπική Ιστοσελίδα: http://giwrg98.co.cc
Άβαταρ μέλους
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό Ilias95 » 03 Μαρ 2012, 20:55

stamatiou έγραψε:Για το break δεν γνωρίζω αλλά μπορείς π.χ. να κάνεις μια μεταβητή χ και στο while να βάλεις να σταματάει όταν το χ είναι 1, έτσι, μέσα στο switch θα βάλεις ότι χ = 1 και θα βγεις από το while.

Σωστό αυτό που λες.

Θα μπορούσε να γίνει:
Κώδικας: Επιλογή όλων
_Bool running = 1;
while (running)
...

Το θέμα είναι ότι όταν θέλουμε να σταματήσουμε τον βρόχο αν έχουμε πολλές cases μέσα στην switch θα πρέπει να ορίζουμε σε κάθε μία απ' αυτές:
Κώδικας: Επιλογή όλων
running = 0;

Δηλαδή για 7 cases θα επαναληφθεί 7 φορές η παραπάνω γραμμή.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 03 Μαρ 2012, 21:09

Ilias95 έγραψε:
stamatiou έγραψε:Για το break δεν γνωρίζω αλλά μπορείς π.χ. να κάνεις μια μεταβητή χ και στο while να βάλεις να σταματάει όταν το χ είναι 1, έτσι, μέσα στο switch θα βάλεις ότι χ = 1 και θα βγεις από το while.

Σωστό αυτό που λες.

Θα μπορούσε να γίνει:
Κώδικας: Επιλογή όλων
_Bool running = 1;
while (running)
...

Το θέμα είναι ότι όταν θέλουμε να σταματήσουμε τον βρόχο αν έχουμε πολλές cases μέσα στην switch θα πρέπει να ορίζουμε σε κάθε μία απ' αυτές:
Κώδικας: Επιλογή όλων
running = 0;

Δηλαδή για 7 cases θα επαναληφθεί 7 φορές η παραπάνω γραμμή.

Εντάξει, είναι και αυτό μια λύση :D
1Γνώσεις→Linux: Αρχάριος┃Προγραμματισμός:Αρχάριος┃Αγγλικά:Μέτριος
2Λειτουργικό→Arch Linxu 32bit
3Προδιαγραφές→2x AMD AthlonX2 DualCore QL-66 ‖ RAM 1751 MiB ‖ Hewlett-Packard 308C - Hewlett-Packard Compaq 615
4Κάρτες γραφικών:ATI RS780M/RS780MN [Radeon HD 3200 Graphics][1002:9612]
5Δίκτυα:eth0:Marvell 88E8042 PCI-E Fast Ethernet Controller [11ab:4357] (rev 10)⋮eth1: Broadcom BCM4312 802.11b/g LP-PHY [14e4:4315](rev 01)
Πρωσοπική Ιστοσελίδα: http://giwrg98.co.cc
Άβαταρ μέλους
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 03 Μαρ 2012, 21:36

Ilias95 έγραψε:
...
Τα break αναφέρονται στο switch.
Αν θέλω τα break να αναφέρονται στον βρόχο του πιο πάνω επιπέδου (τον while στην προκειμένη) μπορώ να κάνω κάτι για να αποφύγω την χρήση του goto;

Είναι καλύτερα μήπως να αλλάξω το switch σε if statements;

Καλύτερα με if ναι, δυστυχώς στη C δεν υπάρχει άλλος τρόπος εκτός από το goto... τα break αναφέρονται πάντα στον δικό τους επίπεδο. Το συγκεκριμένο πρόβλημα έχω διαβάσει σε κάποιο βιβλίο (μάλλον στο "Expert C Programming", αν θυμάμαι σωστά) πως ήταν υπεύθυνο για ζημιά εκατομμυρίων δολαρίων σε κάποια μεγάλη εφαρμογή, στην Αμερική... δεν θυμάμαι λεπτομέρειες.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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