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

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

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

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

Δημοσίευσηαπό Star_Light » 05 Οκτ 2011, 17:16

Περα απο τους δεικτες προσφατα ανακάλυψα πως δεν έγκειται δυσκολια μονο σε αυτους για εναν αρχαριο.

Το προβλημα έγκειται και επισης στο γεγονος οτι δεν δινεται καταλληλη προσοχη και σε αλλες πολυ βασικες λεπτομερειες
ενος προγραμματος πχ οι αγκύλες. Πριν ακομη πας στους δεικτες δηλαδη.

Σε ποια σημεία θα μπουν κτλπ.... καθοριζει απολυτα την ροη ενος προγραμματος! Και αυτο το βλεπεις 100% οταν θα παιξεις
με for μεσα σε μια while και μια if ακομη ή και ενθετες if . Εχω δικά μου παραδείγματα :D
Γνώσεις ⇛ 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 » 05 Οκτ 2011, 17:35

Λοιπον ξεκινάω μια ωραία κατα την γνώμη μου ασκησούλα

Έστω ο κώδικας :

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

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

int i , x , y=1;
x=1 , i ;

//while(x<10)
//{

for(i=1; i<10; i++)
if((i==5) || (i==3))
printf("\n Hi");
printf("\n%d",y);
if(y){
printf("\nHello FOlks");
printf("\nHow are you");
}
//x++;
//}


return 0;

}


1. Γιατι το y στην πρώτη if θα εκτελεστεί 1 φορα ;

2. Πως μπορούμε (χωρις να βάλουμε καποια προσθετη εντολή)
να εκτυπώσουμε το y οσες φορες εκτελείται το loop της for ;

3. Πως μπορούμε να βάλουμε την if να "επιτρέπει" στο y ποσες φορές θα εκτελεστεί
σύμφωνα με την τρέχουσα συνθήκη της ;

4. Άν έχουμε το παρακάτω

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


value=0;
while(value<10)
{
for( counter=0; counter<5; counter++ )
{
if(value==2)
continue;
printf("\n%d",value);
}
value++;
}


Η τιμή 2 δεν θα εκτυπωθεί λογω της if ?

:D Για οσους θέλουν να στίψουν κυριολεκτικα τον κώδικα! Να μην λάβετε υποψιν την while που έχω ουτως η αλλως μαρκάρει σαν σχολια
ηταν για κατι δικες μου δοκιμες ;)
Γνώσεις ⇛ 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 » 06 Οκτ 2011, 16:07

stamatiou έγραψε:
migf1 έγραψε:Που λέει για το table_cleanup()? δεν το βλέπω.

ΥΓ1. Ναι, για debugging είναι.
ΥΓ2. Δοκίμασες τον debugger της Pelles-C? Εκεί είναι πολύ πιο ξεκάθαρα τα πράγματα!

Το Table_Cleanup μου το λέει στον gdb.

Άμα δεν μου πεις τι σου λέει για την table_cleanup() πως θα καταλάβω τι πρόβλημα υπάρχει;

έγραψε:
ΥΓ2. Όχι, μαθαίνω από τον gdb γιατί τον χρησιμοποιεί ένα βιβλίο που διαβάζω αυτόν το καιρό, αλλά τα frames και το backtrace τι είναι;

Βάλε τον debugger της Pelles-C για να δεις που έχει πρόβλημα η συνάρτηση που έχεις φτιάξει, είναι πολύ πιο εύχρηστος από τον gdb (ή βάλε printf() γραμμές μέσα στην προβληματική σου συνάρτηση να σου τυπώνουν τιμές μεταβλητών σε ενδιάμεσα στάδια).
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 06 Οκτ 2011, 16:10

Star_Light έγραψε:Περα απο τους δεικτες προσφατα ανακάλυψα πως δεν έγκειται δυσκολια μονο σε αυτους για εναν αρχαριο.

Το προβλημα έγκειται και επισης στο γεγονος οτι δεν δινεται καταλληλη προσοχη και σε αλλες πολυ βασικες λεπτομερειες
ενος προγραμματος πχ οι αγκύλες. Πριν ακομη πας στους δεικτες δηλαδη.

Σε ποια σημεία θα μπουν κτλπ.... καθοριζει απολυτα την ροη ενος προγραμματος! Και αυτο το βλεπεις 100% οταν θα παιξεις
με for μεσα σε μια while και μια if ακομη ή και ενθετες if . Εχω δικά μου παραδείγματα :D

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

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

Δημοσίευσηαπό migf1 » 06 Οκτ 2011, 16:35

Star_Light έγραψε:Λοιπον ξεκινάω μια ωραία κατα την γνώμη μου ασκησούλα

Έστω ο κώδικας :

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

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

int i , x, y=1;
x=1 , i ;

//while(x<10)
//{

for(i=1; i<10; i++)
if((i==5) || (i==3))
printf("\n Hi");
printf("\n%d",y);
if(y){
printf("\nHello FOlks");
printf("\nHow are you");
}
//x++;
//}


return 0;

}


1. Γιατι το y στην πρώτη if θα εκτελεστεί 1 φορα ;

2. Πως μπορούμε (χωρις να βάλουμε καποια προσθετη εντολή)
να εκτυπώσουμε το y οσες φορες εκτελείται το loop της for ;

3. Πως μπορούμε να βάλουμε την if να "επιτρέπει" στο y ποσες φορές θα εκτελεστεί
σύμφωνα με την τρέχουσα συνθήκη της ;

Κοίτα, όταν απευθυνόμαστε σε παιδιά που κάνουν τα πρώτα τους βήματα ο σκοπός είναι να τους διευκολύνουμε να μάθουν και και όχι να τους τα κάνουμε ακόμα πιο δύσκολα. Π.χ. καταλαβαίνω πως τον παραπάνω κώδικα τον έχεις βάλει επίτηδες χωρίς indentation (tabs) και κενά διαστήματα για να δυσκολέψεις την άσκηση. Η συμπύκνωση του κώδικα παραπάνω είναι παράδειγμα προς αποφυγή!

Ο σωστός τρόπος είναι κάπως έτσι:

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

#include <stdio.h>

int main( void )
{
int i, y = 1;

for ( i=1; i < 10; i++ )
if ( (i == 5) || (i == 3) )
printf("\n Hi");

printf("\n%d", y);

if ( y )
{
printf("\nHello FOlks");
printf("\nHow are you");
}

return 0;

}

και να εξηγηθεί πως το indentation είναι βασική τεχνική για να καταλαβαίνει κανείς με την 1η ματιά τη ροή του κώδικα.

έγραψε:
4. Άν έχουμε το παρακάτω

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


value=0;
while(value<10)
{
for( counter=0; counter<5; counter++ )
{
if(value==2)
continue;
printf("\n%d",value);
}
value++;
}


Η τιμή 2 δεν θα εκτυπωθεί λογω της if ?

:D Για οσους θέλουν να στίψουν κυριολεκτικα τον κώδικα! Να μην λάβετε υποψιν την while που έχω ουτως η αλλως μαρκάρει σαν σχολια
ηταν για κατι δικες μου δοκιμες ;)

Ομοίως κι εδώ, όπου ο κώδικας θα πρέπει να γραφτεί κάπως έτσι...

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

value = 0;
while ( value < 10 )
{
for ( counter = 0; counter < 5; counter++ )
{
if ( value == 2 )
continue;

printf("\n%d", value);
}

value++;
}


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

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

Δημοσίευσηαπό Star_Light » 06 Οκτ 2011, 17:29

Πολυ σωστο και ωραιο αυτο με τα κενα που λες. Ναι δεν τα εβαλα για να δυσκολεψω τα πραγματα.
Μ αρεσουν τα δυσκολα ειμαι commando! Περα απο αυτο ομως ηθελα να καταλαβω ποσο μπορει να αλλαξει
η ροη και τελικα το αποτελεσμα που παραγει ενας κωδικας με μερικες διαφοροποιησεις στις αγκυλες.

Απλα πιστευω προσωπικα πως οταν καποιος αντιμετωπισει εξαρχης την δυσκολια θα ειναι πιο καλα προετοιμασμενος
απο εναν που αντιμετωπιζει την ευκολια και εχει γνωμονα αυτη. Καποιες φορες με το να διευκολυνεις την ζωη σου
κερδιζεις χρονο αλλα και η δυσκολια προσφερει αρκετα εφοδια σε τετοιες περιπτωσεις. Δικια μου ειναι η εμπνευση
αυτης της ασκησης !

Αφου κάποιος καταλαβει τα παραπάνω μετα μπορει να γράφει μη συμπυκνωμενο κωδικα
για να βοηθαει τους συναδελφους του στην αναγνωση του.
Γνώσεις ⇛ 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 » 06 Οκτ 2011, 17:51

Star_Light έγραψε:
...
Αφου κάποιος καταλαβει τα παραπάνω μετα μπορει να γράφει μη συμπυκνωμενο κωδικα
για να βοηθαει τους συναδελφους του στην αναγνωση του.

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

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

Δημοσίευσηαπό Star_Light » 06 Οκτ 2011, 17:59

migf1 έγραψε:
Star_Light έγραψε:
...
Αφου κάποιος καταλαβει τα παραπάνω μετα μπορει να γράφει μη συμπυκνωμενο κωδικα
για να βοηθαει τους συναδελφους του στην αναγνωση του.

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


Κανεις δεν διαφωνει για τα κενα. Απλα εγω λεω για τις αγκυλες.
Ακομη και κενο να βάλεις εκει που λες η 4η ερωτηση παραμένει 4η ερώτηση
καθως θελει να εξετάσει αν κάποιος καταλαβαίνει πραγματικα ή οχι.
Δεν με πειραζει το κενό εμενα. Και την ωρα που εγραφα το παραδειγμα το εγραφα βιαστικα
και για αυτο και δεν το εβαλα.
Θα παραθεσω τον κωδικα το βραδυ παλι που θα εχω χρονο να σου δειξω τι ακριβως εννοω. ;)
Γνώσεις ⇛ 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 » 06 Οκτ 2011, 18:18

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

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

Δημοσίευσηαπό Star_Light » 06 Οκτ 2011, 18:59

migf1 έγραψε:Ναι βρε, κατάλαβα τι εννοείς για τις αγκύλες. Ως έξτρα info είναι αυτό που έγραψα για την ευκρίνεια του κώδικα, κυρίως διότι νόμιζα πως τον είχες επίτηδες συμπυκνωμένο. Όσο για την 4η ερώτηση, ναι λόγω του if δεν θα τυπωθεί το 2.


ΑΝ μου επιτρέπεις διαφωνώ. Το if σταματά εκει που θα βρεί το 1ο ερωτηματικό (αν εχω καταλαβει σωστα)
στην προκειμενη σταματά στο continue ... Και οι 2 αυτες γραμμες θεωρουνται μερη της if ας πουμε. Και οχι ξεχωριστες προτασεις.
Δεν πιστευω πως το if σχετίζεται καθολου με την printf. Απλα βάζεις continue για να συνεχισεις ( την continue δεν την εχω διαβασει ακομη 100%)
καταλαβαινεις τι θελω να σου πω?

Τμημα της if θα ηταν μονο εαν

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


if ( ) {
.....
} ;

και οχι

if()
...

} -> δεν ειναι αγκυλη της if
Γνώσεις ⇛ 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
Εκτύπωση

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

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