Εισαγωγή στη C

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
alex599
Δημοσιεύσεις: 66
Εγγραφή: 17 Δεκ 2008 01:11
Τοποθεσία: Πάτρα

Εισαγωγή στη C

Δημοσίευση από alex599 » 20 Απρ 2009 13:17

Μια μικρή βοήθεια για τους νέους προγραμματιστές στους οποίους συνιστώ να ξεκινήσουν με τη C.

Η βασική δομή ενός προγράμματος είναι η εξής:

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

main(){
   δηλώσεις μεταβλητών;
   εκτελέσιμες προτάσεις;
}
Για να μπορέσουμε να εκτυπώσουμε ένα απλό μήνυμα στην οθόνη του υπολογιστή μας χρησιμοποιείται η συνάρτηση printf() η οποία ορίζεται στο αρχείo επικεφαλίδας stdio.h το οποίο πρέπει να συμπεριλάβουμε με την οδηγία #include πριν από την main(). Έτσι ένα απλό πρόγραμμα είναι το εξής:

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

#include <stdio.h>
main&#40;&#41;&#123;
    printf&#40;"Hello Freestuff!!"&#41;;
&#125;
Οι βασικοί τύποι δεδομένων είναι οι εξής:
int:Ακέραιοι αριθμοί (χωρίζονται και σε short,long,unsigned)
float:Αριθμοί κινητής υποδιαστολής μονής ακρίβειας (7 δεκαδικά ψηφία)
double:Αριθμοί κινητής υποδιαστολής διπλής ακρίβειας (14 δεκαδικά ψηφία)
char:Ένας μόνο χαρακτήρας

Ένα απλό παράδειγμα κώδικα είναι το εξής:

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

#include <stdio.h>
main&#40;&#41;&#123;
    int i=11;
    float f=34,567;
    char c='a';
    printf&#40;"Ακέραιος αριθμός&#58;%d",i&#41;;
    printf&#40;"Κινητής υποδιαστολής&#58;%.3f",f&#41;;
    printf&#40;"Χαρακτήρας&#58;%c",c&#41;;
&#125;
Για να εκτυπώσουμε μεταβλητές ανάλογα με τον τύπο τους τοποθετούμε στην printf() ένα συνδυασμό χαρακτήρων όπως φαίνεται στο παράδειγμα, και μετά χωρισμένη με κόμμα από το string την μεταβλητή η τιμή της οποίας αντικαθιστά τον συνδυασμό χαρακτήρων.

Για να μπορέσουμε να έχουμε είσοδο από τον χρήστη μέσω του πληκτρολογίου χρησιμοποιείται η συνάρτηση scanf() που ορίζεται και αυτή στο stdio.h. Χρησιμοποιούνται οι ίδιοι συνδυασμοί που χρησιμοποιούνται και στην printf() για εισαγωγή δεδομένων ανάλογα με τον τύπο δεδομένων.Παράδειγμα:

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

#include <stdio.h>
main&#40;&#41;&#123;
    int i;
    float f;
    char c;
    printf&#40;"Δώστε έναν ακέραιο αριθμό&#58;"&#41;;
    scanf&#40;"%d",&i&#41;;
    printf&#40;"Δώστε έναν πραγματικό αριθμό&#58;"&#41;;
    scanf&#40;"%f",&f&#41;;
    printf&#40;"Δώστε έναν χαρακτήρα&#58;"&#41;;
    scanf&#40;"%c",&c&#41;;
&#125;
Στην πρόταση scanf("%d",&i) το & χρησιμοποιείται για να τοποθετηθεί η τιμή που θα δωθεί από το χρήστη στη διεύθυνση της μνήμης που έχει δεσμευτεί για αυτήν την μεταβλητή.

Κάθε μεταβλητή έχει μια συγκεκριμένη διεύθυνση στη μνήμη και συγκεκριμένο μέγεθος ανάλογα με τον τύπο δεδομένων της. Η εντολή &a μας δίνει τη διεύθυνση της μεταβλητής a ενώ η εντολή sizeof(a) μας δίνει το μέγεθος της.

TIP: Αν χρησιμοποιήσετε τον Dev-C++ για τη συγγραφή και τη μεταγλώττιση του κώδικα σας δεν θα σας δέχεται ελληνικούς χαρακτήρες εκτός και αν πχ μετά τη δήλωση των μεταβλητών σας δώσετε την εντολή system("chcp 1253"); και στην κονσόλα όπου τρέχει το εκτελέσιμο αλλάξετε τη γραμματοσειρά σε Lucida concole. Επίσης πρέπει να δώσετε την εντολή system("pause") πριν από την τελευταία αγκύλη του προγράμματος σας για να γίνει πάγωμα της κονσόλας και να δείτε αποτελέσματα. Η συνάρτηση system() ορίζεται στο stdlib.h το οποίο πρέπει να συμπεριλάβεται πριν την main().
while(!dead()) ++knowledge;

Άβαταρ μέλους
ThyClub
Honorary Member
Δημοσιεύσεις: 5312
Εγγραφή: 17 Νοέμ 2003 00:21
Τοποθεσία: Hell's Kitchen
Επικοινωνία:

Εισαγωγή στη C

Δημοσίευση από ThyClub » 20 Απρ 2009 15:14

Έγινε βοήθημα. Πολύ καλό ευχαριστούμε

alex599
Δημοσιεύσεις: 66
Εγγραφή: 17 Δεκ 2008 01:11
Τοποθεσία: Πάτρα

Εισαγωγή στη C

Δημοσίευση από alex599 » 03 Μάιος 2009 02:46

Παιδιά, να το συνεχίσω και άλλο ή να το αφήσουμε ως μόνο μια μικρή εισαγωγή στη γλώσσα?
while(!dead()) ++knowledge;

Άβαταρ μέλους
Kainourios
Ruby Moderator
Δημοσιεύσεις: 504
Εγγραφή: 18 Μάιος 2005 16:20
Τοποθεσία: Κορυδαλλός
Επικοινωνία:

Εισαγωγή στη C

Δημοσίευση από Kainourios » 03 Μάιος 2009 16:01

Ωραίο tutorial, ενδιαφέρον αυτό με τα ελληνικά. Προσωπικά θα με ενδιέφερε ένα tutorial για το πώς γίνονται διάφορα είδη input validations στην C (το scanf είναι λίγο σπάσιμο για input).

Άβαταρ μέλους
cordis
Administrator, [F|H]ounder, [C|S]EO
Δημοσιεύσεις: 27616
Εγγραφή: 09 Οκτ 1999 03:00
Τοποθεσία: Greece
Επικοινωνία:

Εισαγωγή στη C

Δημοσίευση από cordis » 03 Μάιος 2009 18:46

alex599 έγραψε:Παιδιά, να το συνεχίσω και άλλο ή να το αφήσουμε ως μόνο μια μικρή εισαγωγή στη γλώσσα?
όσο έχεις όρεξη πήγαινέ το.. φαντάζομαι ότι όταν μαζευτούν μερικά θα αρχίσουν και οι απορίες. ;)
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

alex599
Δημοσιεύσεις: 66
Εγγραφή: 17 Δεκ 2008 01:11
Τοποθεσία: Πάτρα

Εισαγωγή στη C

Δημοσίευση από alex599 » 07 Μάιος 2009 01:17

όπως και σε άλλες γλώσσες προγραμματισμού έτσι και η C διαθέτει δομές αλλαγής ροής του προγράμματος.

Η εντολή if εκτελεί κώδικα αν και μόνο αν είναι αληθής μια συνθήκη και συντάσσεται ως:

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

if&#40;ΛογικήΣυνθήκη1&#41;&#123;
    Προτάσεις;
&#125;
else if&#40;ΛογικήΣυνθήκη2&#41;&#123;
   Προτάσεις;
&#125;
...
else if&#40;ΛογικήΣυνθήκηΝ&#41;&#123;
   Προτάσεις;
&#125;
else&#123;
   Προτάσεις;
&#125;
Ανάλογα με το ποια ΛογικήΣυνθήκη είναι αληθής εκτελείται και το αντίστοιχο block προτάσεων.

Η εντολή switch-case ελέγχει αν μια παράσταση ισούται με κάποιες σταθερές μόνο τύπου int ή char και συντάσσεται ως εξής:

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

switch&#40;παράσταση&#41;&#123;
     case σταθερά1&#58;
          προτάσεις;
          break;
     case σταθερά2&#58;
          προτάσεις;
          break;
     ...
     case σταθεράΝ&#58;
          προτάσεις;
          break;
      default&#58;
          προτάσεις;
          break;
&#125;
Η εντολή break μεταφέρει τον έλεγχο του προγράμματος μετά την switch. Ανάλογα με ποια σταθερά ισούται η παράσταση εκτελούνται οι αντίστοιχες προτάσεις ενώ αν δεν ισούται με καμία εκτελούνται οι προτάσεις της default.

Ο τριαδικό τελεστής ή τελεστής συνθήκης ? συντάσσεται ως εξής:

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

&#40;Συνθήκη&#41; ? Πρόταση1 &#58; Πρόταση2
και ουσιαστικά ανάλογα με το αν η συνθήκη είναι αληθής εκτελείται η πρόταση1 ενώ αν είναι ψευδής εκτελείται η πρόταση2. Οι προτάσεις είναι απλές και όχι σύνθετες.
while(!dead()) ++knowledge;

alex599
Δημοσιεύσεις: 66
Εγγραφή: 17 Δεκ 2008 01:11
Τοποθεσία: Πάτρα

Εισαγωγή στη C

Δημοσίευση από alex599 » 05 Ιουν 2009 12:14

Η αγαπημένη μου εντολή στη C δεν είναι άλλη από αυτή που ουσιαστικά καταστρέφει τον δομημένο προγραμματισμό, η goto, η οποία έχει την ιδιότητα να μεταφέρει τον έλεγχο του προγράμματος σε διάφορα σημεία του. Χρησιμοποιεί ταμπέλες, οι οποίες δείχνουν τα διάφορα σημεία του προγράμματος και συντάσσονται ως εξής:

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

Label&#58;
και η goto συντάσσεται:

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

goto Label;
Φυσικά επειδή είμαι σίγουρος ότι οι νέοι προγραμματιστές καταλάβατε τα πάντα, δείτε ένα παράδειγμα, όπου κάνω πρόσθεση 10 αριθμών που δίνονται από το πληκτρολόγιο:

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

#include <stdio.h>
int main&#40;&#41;&#123;
    int number,counter=0,sum=0;
    repeat&#58;&#123;
        ++counter;
        printf&#40;"Δώστε έναν αριθμό&#58;"&#41;;
        scanf&#40;"%d",&number&#41;;
        sum+=number;
        if&#40;counter<10&#41;&#123;
            goto Repeat;
        &#125;
    &#125;
    printf&#40;"άθροισμα&#58;%d",sum&#41;;
    return 0;
&#125;
Οι αγκύλες δίπλα από την ετικέτα Repeat είναι βοηθητικές για να δούμε απλά το block εντολών που θα γίνεται επανάληψη.

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

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

while&#40;ΛογικήΣυνθήκη&#41;&#123;
    ΕντολέςΒρόχου;
&#125;
H οποία κάνει επανάληψη ενός block εντολών όσο η ΛογικήΣυνθήκη είναι αληθής.

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

do&#123;
   ΕντολέςΒρόχου;
&#125;while&#40;ΛογικήΣυνθήκη&#41;;
H οποία κάνει επανάληψη όσο η ΛογικήΣυνθήκη είναι αληθής!
ώπα...και οι δύο while και do-while είναι ίδιες δηλαδή??
ΟΧΙ, στην δεύτερη έχουμε τουλάχιστον μία επανάληψη ενώ στην πρώτη μπορεί να μην μπούμε κάν στον βρόχο και επιπλέον παρατηρήστε το ερωτηματικό στον τέλος της do-while..μην το ξεχνάτε...

Και η τελευταία:

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

for&#40;Πρόταση1;Πρόταση2;Πρόταση3&#41;&#123;
    ΕντολέςΒρόχου;
&#125;
όπου η Πρόταση1 εκτελείται μία φορά και συνήθως αρχικοποιεί κάποιον μετρητή, η πρόταση2 είναι η ΛογικήΣυνθήκη, που όσο είναι αληθής τρέχει ο βρόχος και η Πρόταση3 εκτελείται με το πέρας μιας επανάληψης του βρόχου και συνήθως αλλάζει την Πρόταση2.

Έτσι ο αλγόριθμος του αρχικού μας παραδείγματος θα μπορούσε να γίνει:

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

int counter=0,number,sum=0;
while &#40;counter<10&#41;&#123;
      printf&#40;"Δώστε έναν αριθμό&#58;"&#41;;
      scanf&#40;"%d",&number&#41;;
      sum+=number;
      ++counter;
&#125;
printf&#40;"Άθροισμα&#58;%d",sum&#41;;

ή 

int counter,number,sum=0;
for&#40;counter=0;counter<10;counter++&#41;&#123;
      printf&#40;"Δώστε έναν αριθμό&#58;"&#41;;
      scanf&#40;"%d",&number&#41;;
      sum+=number;
&#125;
printf&#40;"Άθροισμα&#58;%d",sum&#41;;
Παρατηρήστε τις ΜΙΚΡΟ-διαφορές των εντολών επανάληψης. Ό,τι γράφεται με for μπορεί να γραφεί με while και do-while!Δεν ισχύει το αντίστροφο.

Αν όμως κάποια στιγμή θέλουμε να σταματήσουμε ή να συνεχίσουμε βίαια τον βρόχο??
Τότε χρησιμοποιούμε τις break και continue που λειτουργούν...σαν διακόπτες!

Η εντολή:

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

break;
σταματάει την επανάληψη του πιο εσωτερικού βρόχου. (Ανν θυμάστε χρησιμοποιείται και στην switch-case).

Η εντολή:

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

continue;
αναγκάζει την επόμενη επανάληψη παραλείποντας όλες τις εντολές που είναι κάτω από αυτήν, πάντα του πιο εσωτερικού βρόχου.

Τι εννοώ πιο εσωτερικό βρόχο? Σκεφτείται ένα τέτοιο πράγμα:

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

while&#40;logik1&#41;&#123;
    while&#40;logik2&#41;&#123;
          while&#40;logik3&#41;&#123;
                 break;
          &#125;
          continue;
    &#125;
&#125;
όπου η break αναγκάζει τον τερματισμό της τρίτης while και η continue αναγκάζει την επόμενη επανάληψη της δεύτερης while.

Αυτά για την ώρα..

Σχόλιο:Όποιος θέλει να βοηθήσει να το κάνουμε καλύτερο το βοήθημα, ευχαρίστως να πάρει μέρος..
while(!dead()) ++knowledge;

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Εισαγωγή στη C

Δημοσίευση από dva_dev » 05 Ιουν 2009 17:30

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

Εξάλλου μην ξεχνάμε πως ότι μπορεί να γίνει, με οποιαδήποτε συνδιασμό οποιονδήποτε εντολών επανάληψης, μπορεί να γίνει χρησιμοποιώντας μόνο με if+goto.

Η εμπειρία στον προγραμματισμό είναι που θα κάνει τον κώδικα σπαγγέτι ή έργο τέχνης. (Και για να γίνει κάτι σπαγγέτι αρκεί να δώσεις οποιαδήποτε γλώσσα προγραμματισμού ισχυρίζεται ότι παράγει δομημένο κώδικα σε κάποιον αρχάριο).

alex599
Δημοσιεύσεις: 66
Εγγραφή: 17 Δεκ 2008 01:11
Τοποθεσία: Πάτρα

Εισαγωγή στη C

Δημοσίευση από alex599 » 05 Ιουν 2009 22:51

Δεν θα διαφωνήσω-τουναντιον συμφωνώ απόλυτα-άλλωστε όπως λέω στην αρχή είναι η αγαπημένη μου εντολή, αλλά για τους αρχάριους δεν προτείνεται...
while(!dead()) ++knowledge;

alex599
Δημοσιεύσεις: 66
Εγγραφή: 17 Δεκ 2008 01:11
Τοποθεσία: Πάτρα

Εισαγωγή στη C

Δημοσίευση από alex599 » 07 Ιουν 2009 17:45

Tι γίνεται όταν θέλουμε να αποθηκεύσουμε πολλές πληροφορίες μαζί?
Τότε μπορούμε να κάνουμε χρήση πινάκων...

Ένας πίνακας μπορεί να έχει όσες διαστάσεις θέλουμε και δηλώνεται γενικά ως εξής:

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

type ArrayName&#91;length1&#93;&#91;length2&#93;...&#91;lenghtN&#93;;
H πιο απλή μορφή πίνακα είναι ο μονοδιάστατος πίνακας, τον οποίο μπορούμε να τον φανταστούμε σα μια σειρά από συνεχόμενες θέσεις μνήμης, που έχουν ένα αριθμό αναφορά ξεκινώντας από το 0.

Ο πιο συχνός τρόπος προσπέλασης των στοιχείων ενός μονοδιάστατου πίνακα είναι:

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

int i,table&#91;20&#93;;
for&#40;i=0;i<20;i++&#41;&#123;
    table&#91;i&#93;=rand&#40;&#41;;
    printf&#40;"%d\n",table&#91;i&#93;&#41;;
&#125;
όπου η συνάρτηση rand() ορίζεται στο stdlib.h και παράγει τυχαίους μη αρνητικούς αριθμούς.

Από του πολυδιάστατους πίνακες, οι πιο χρήσιμοι είναι οι δισδιάστατοι, που τους φανταζόμαστε ως θέσεις μνήμης με διάταξη γραμμές-στήλες με ζεύγη αριθμών αναφοράς που ξεκινάνε από το 0,0.

Ο πιο συχνος τρόπος χρήσης τους:

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

int i,j,table&#91;20&#93;&#91;20&#93;;
for&#40;i=0;i<20;i++&#41;&#123;
    for&#40;j=0;j<20;j++&#41;&#123;
       table&#91;i&#93;&#91;j&#93;=rand&#40;&#41;;
       printf&#40;"%d\n",table&#91;i&#93;&#91;j&#93;&#41;;
    &#125;
&#125;
Αυτά τα λίγα...πιο μετά θα παρουσιάσω κάποιες ασκήσεις που αφορούν τους πίνακες για εξάσκηση και που φυσικά αφορούν γενικά τον προγραμματισμό και όχι μόνο τη C.
while(!dead()) ++knowledge;

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 2 επισκέπτες