ΚΕΦΑΛΑΙΟ 5 - ΣΥΝΑΡΤΗΣΕΙΣ

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

ΚΕΦΑΛΑΙΟ 5 - ΣΥΝΑΡΤΗΣΕΙΣ

Δημοσίευσηαπό linuxs » 25 Μαρ 2011, 01:21

Κεφάλαιο 5 - Συναρτήσεις

...τι περιλαμβάνει αυτό το κεφάλαιο:
Στο κεφάλαιο αυτό θα δούμε τι είναι μια συνάρτηση, πως δημηουργείται, γιατί δημιουργήται και πως μπορούμε να την χρησιμοποιήσουμε! Θα δούμε την διαφορά όταν έχουμε και όταν δεν έχουμε συναρτήσεις στο ΙΔΙΟ πρόβλημα και τέλος, θα δούμε λίγα πραγματάκια για δείκτες σχετικά με τις συναρτήσεις.

Τι είναι μια συνάρτηση
Ας δώσουμε έναν ορισμό σχετικά με το τί είναι μια συνάρτηση! Μια συνάρτηση λοιπόν, είναι ένα κομμάτι κώδικα η μια ανεξάρτητη ενότητα αν θέλετε, που εκτελεί μια συγκεκριμένη εργασία και μπορεί να επιστρέφει η όχι μια τιμή.
Οι συναρτήσεις διευκολύνουν πολύ εναν προγραμματιστή και στην πραγματικότητα είναι ένας τρόπος να διαμοιράσουμε τον κώδικα μας σε πολλά υπο-προβληματα! Θυμηθείτε πως, έχοντας ένα αρχικό προβλημα αν καταφέρουμε να το "σπάσουμε" σε υπο-προβλήματα και ίσως αυτά σε άλλα πιο μικρά υπο-προβλήματα ουσιαστικά έχουμε την λύση. ;) Γιατί? Όσο, μεγάλο πρόβλημα κι αν είναι το αρχικό διαχωρίζοντας το σε υπο-προβλήματα έχουμε να λύσουμε πολύ πιο απλά και εύκολα προβλήματα, απο τα οποία πολλές φορες οι λύσεις είναι και αυτονόητες κι αν όχι είναι τελοςπάντων πολύ απλές! Αυτό είναι πολύ σημαντικό ως προγραμματιστικη τεχνική και χρησιμοποιείται κατα κόρον στα μεγάλα και πολύπλοκα προγράμματα! Στο σημείο αυτό θα ήθελα να δώσω ένα απλό παράδειγμα...

Στο παράδειγμά μας θα διαβάζουμε δυο αριθμους και θα τους προσθέτουμε εκτυπώνοντας το αποτέλεσμα:
...χωρίς συνάρτηση:
Κώδικας: Επιλογή όλων
#include <stdio.h>

int main( ){
int a, b, sum=0 ;
scanf("%d", &a) ;
scanf("%d", &b) ;
sum = a + b ;
printf( "Το άθροισμα είναι: %d\n", a+b ) ;
return 0 ;
}


...με συνάρτηση:
Κώδικας: Επιλογή όλων
#include <stdio.h>

int cal_sum (int a, int b ) {
return a+b;
}

int main( ){
int a, b, sum = 0 ;
scanf("%d", &a) ;
scanf("%d", &b) ;
sum = cal_sum(a, b);
printf( "Το άθροισμα είναι: %d\n", sum ) ;
return 0 ;
}



Δημιουργία συνάρτησης
Στο πρόγραμμά μας μπορούμε να έχουμε πολλές συναρτήσεις. Τα προγράμματα αποτελούνται απο τις βιβλιοθήκες που βρίσκονται στην αρχή και μετά την Main(κύρια συνάρτηση). Οι επιπλέον συναρτήσεις μπορούν να βρίσκονται πάνω η κα΄τω απο την main. Υπάρχει μια μικρή διαφορά όμως!

  • Συναρτήσεις που υλοποιούνται πάνω απο την main: Το μόνο που χρειάζεται να κάνουμε είναι να την υλοποιήσουμε σωστά.
  • Συναρτήσεις που υλοποιούνται κάτω απο την main: Εκτός απο την υλοποίηση(ίδια όπως και στην πρώτη περίπτωση) θα πρέπει πάνω απο την main να την ορίσουμε-δηλώσουμε. αυτό γίνεται γράφοντας με την σειρά:
    1. τον τύπο επιστροφής(πχ. int, float,... )
    2. το όνομα της συνάρτησης,
    3. και τα ορίσματα που δέχεται.
    Προσέξτε την σειρά που ορίζετε τις συναρτήσεις αν ακολουθήσετε την δεύτερη περίπτωση. Υπάρχει περίπτωση να τις ορίσετε με τέτοια σειρά ώστε να καλείτε μια συνάρτηση στη οποία χρησιμοποιήτε κάτι που το δηλώνετε σε μια άλλη συνάρτηση παρακάτω. Με άλλα λόγια θα πρέπει πρίν χρησιμοποιήτε κάτι(πχ. μια μεταβλητή) να το έχετε δηλώσει-αρχικοποιήσει στην main η σε κάποια συνάρτηση που έχετε ήδη καλέσει!!!

Πέρασμα παραμέτρων
Χρησιμοποιώντας συναρτήσεις θα πρέπει κάποια στιγμή να περάσουμε τις παραμέτρους απο την main. Αυτό γίνεται με πολλούς τρόπους απο τους οποίους οι πιο συνηθισμένοι είναι με:
  • με αναφορά
  • με τιμή

Στο πέρασμα των παραμέτρων με τιμή περνάμε αυτούσια την τιμή των μεταβλητών και κάθε φορά που αλλάζει κάτι καθώς εκτελείται η συνάρτηση αλλάζει και στην μνήμη. Αντίθετα στο πέρασμα με αναφορα΄(by reference) αυτό που γίνεται είναι να χρησιμοποιύμε δείκτες έτσι ώστε κάθε μεταβλητή που χρησιμοποιούμε στην συνάρτηση να δείχνει στο χώρο μνήμης που είναι δεσμευμένο απο την main. Παρακάτω θα δείτε λίγο πιο αναλυτικά αυτους τους δύο τρόπους. Στην ουσία είναι δυο βήματα, πρώτα όταν καλούμε την συνάρτηση και μετά όταν περνάμε τις παραμέτρουυς στην συνάρτηση.

Πέρασμα παραμέτρων με τιμή...
Όταν καλούμε την συνάρτηση απο την main απλά γράφουμε το όνομα των μεταβλητών. Για παράδειγμα, αν θέλουμε να περάσουμε 2 ακεραίους και έναν πίνακα τύπου float θα κάναμε το εξής:
Κώδικας: Επιλογή όλων
main() {
function(a, b, A); /* το a,b είναι οι δυο ακέραιοι και A ο πίνακας */
}


Συνεχίζοντας με την υλοποίηση της συνάρτησης, εδώ βάζουμε τον τύπο & όνομα μεταβλητής. Με άλλα λόγια έστω οτι θέλουμε να συνεχίσουμε το παραπάνω παράδειγμα. Όταν υλοποιούμε την συνάρτηση θα πρέπει να γράψουμε;
Κώδικας: Επιλογή όλων
void function(int a, int b, float A[]){
// ... υλοποίηση της συνάρτησης με κώδικα
}


Πέρασμα παραμέτρων με αναφορά...
συνεχίζεται...
Τελευταία επεξεργασία από linuxs και 11 Ιουν 2011, 20:25, έχει επεξεργασθεί 4 φορά/ες συνολικά
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ 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: ΚΕΦΑΛΑΙΟ 5 - ΣΥΝΑΡΤΗΣΕΙΣ

Δημοσίευσηαπό clepto » 10 Ιουν 2011, 23:26

να ρωτήσω κάτι...είμαι αρχάριος οπότε μπορεί να πω πατάτα...δεν θα έπρεπε να ήταν έτσι;
Κώδικας: Επιλογή όλων
scanf("%d", &a) ;
scanf("%d", &b) ;

ώστε να διαβάσει και τον αριθμό b;
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 13.04 raring 3.8.0-30-generic 64bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 Intel Core i7-3537U CPU @ 2.00GHz ‖ RAM 3840 MiB ‖ ASUS K56CB
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Atheros Inc. AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a)
clepto
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4102
Εγγραφή: 07 Ιαν 2010, 16:27
Τοποθεσία: Πάτρα
Launchpad: christriant
IRC: Clepto
Εκτύπωση

Re: ΚΕΦΑΛΑΙΟ 5 - ΣΥΝΑΡΤΗΣΕΙΣ

Δημοσίευσηαπό migf1 » 11 Ιουν 2011, 01:15

Ναι! Προφανώς ξέχασε να αλλάξει το &a σε &b ο linuxs μετά το copy & paste :)
clepto έγραψε:να ρωτήσω κάτι...είμαι αρχάριος οπότε μπορεί να πω πατάτα...δεν θα έπρεπε να ήταν έτσι;
Κώδικας: Επιλογή όλων
scanf("%d", &a) ;
scanf("%d", &b) ;

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

Re: ΚΕΦΑΛΑΙΟ 5 - ΣΥΝΑΡΤΗΣΕΙΣ

Δημοσίευσηαπό linuxs » 11 Ιουν 2011, 12: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: ΚΕΦΑΛΑΙΟ 5 - ΣΥΝΑΡΤΗΣΕΙΣ

Δημοσίευσηαπό clepto » 11 Ιουν 2011, 12:43

:)
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 13.04 raring 3.8.0-30-generic 64bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 Intel Core i7-3537U CPU @ 2.00GHz ‖ RAM 3840 MiB ‖ ASUS K56CB
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Atheros Inc. AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a)
clepto
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4102
Εγγραφή: 07 Ιαν 2010, 16:27
Τοποθεσία: Πάτρα
Launchpad: christriant
IRC: Clepto
Εκτύπωση

Re: ΚΕΦΑΛΑΙΟ 5 - ΣΥΝΑΡΤΗΣΕΙΣ

Δημοσίευσηαπό linuxs » 11 Ιουν 2011, 12:47

Εδώ και κάτι μήνες κοιτούσα συνεχώς μήπως και έχει κάποιος απορία η έχω λα΄θος κτλ. Τίποτα, τώρα που είχες κάποια θέματα εσύ εγώ έχω εξεταστικη΄και δυστυχώς δεν μπορώ να αφιερώσω χρόνο για 10 μέρες ακόμη. ;)
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ 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: ΚΕΦΑΛΑΙΟ 5 - ΣΥΝΑΡΤΗΣΕΙΣ

Δημοσίευσηαπό clepto » 11 Ιουν 2011, 13:16

δεν πειράζει ρε συ...θα με βοηθήσουν τα άλλα παιδιά!
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 13.04 raring 3.8.0-30-generic 64bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 Intel Core i7-3537U CPU @ 2.00GHz ‖ RAM 3840 MiB ‖ ASUS K56CB
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Atheros Inc. AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a)
clepto
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4102
Εγγραφή: 07 Ιαν 2010, 16:27
Τοποθεσία: Πάτρα
Launchpad: christriant
IRC: Clepto
Εκτύπωση

Re: ΚΕΦΑΛΑΙΟ 5 - ΣΥΝΑΡΤΗΣΕΙΣ

Δημοσίευσηαπό migf1 » 11 Ιουν 2011, 15:25

clepto έγραψε:δεν πειράζει ρε συ...θα με βοηθήσουν τα άλλα παιδιά!

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

Re: ΚΕΦΑΛΑΙΟ 5 - ΣΥΝΑΡΤΗΣΕΙΣ

Δημοσίευσηαπό stamatiou » 20 Ιουν 2011, 18:59

linuxs έγραψε:[b]Κεφάλαιο 5 - Συναρτήσεις
return a+b;

2 ερωτήσεις:
1.Αντί για return, δεν μπορούσες να χρησιμοποιήσεις printf;
2.Στο scanf, γιατί χρησιμοποίησες δείκτες; Γενικά, μπορείς να μου δώσεις ένα παράδειγμα που πρέπει να χρησιμοποιήσουμε μόνο δείκτη και γιατί πρέπει;
Ευχαριστώ πολύ....
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: ΚΕΦΑΛΑΙΟ 5 - ΣΥΝΑΡΤΗΣΕΙΣ

Δημοσίευσηαπό linuxs » 20 Ιουν 2011, 19:08

stamatiou έγραψε:
linuxs έγραψε:[b]Κεφάλαιο 5 - Συναρτήσεις
return a+b;

2 ερωτήσεις:
1.Αντί για return, δεν μπορούσες να χρησιμοποιήσεις printf;
2.Στο scanf, γιατί χρησιμοποίησες δείκτες; Γενικά, μπορείς να μου δώσεις ένα παράδειγμα που πρέπει να χρησιμοποιήσουμε μόνο δείκτη και γιατί πρέπει;
Ευχαριστώ πολύ....


Μιλας γενικότερα για το προγράμματα που χρησιμοποιώ return? Αν ναι, δεν έχει καμία σχέση το return με το printf. Λοιπόν, το return όπως σε κάθε συνάρτηση έτσι και στην Main σου επιστρέφει μια τιμή. Κατανοητό? το οτι βάζω στην main "return 0" δεν παίζει κα΄ποιο ρόλο. Δηλαδή δεν θα δείς κάποιο αποτέλεσμα. Στην ουσία(απο προγραμματισμό συστήματος) επιστρέφεις 0 στην init αν δεν κάνω λάθος που είνα η πρώτη διεργασία που εκτελέστεικε στον υπολογιστή σου. Αυτή έκανε παιδιά τα παιδιά παιδιά κτλ. Ξεφεύγω πολύ όμως...αυτό που θα πρέπει να κρατήσεις είναι οτι αν σε κα΄ποια συνάρτηση έχεις επιστροφή με int float κτλ θα υπάρχει ένα τουλάχιστον return. Αν όχι και ε΄΄ιναι void δεν βάζεις καθόλου return. Το printf απο την άλλη εκτυπώνειι κάτι σστο stdout-οθόνη. δεν έχει καμιά σχέση με επιστροφή τιμών.

Στο scanf ΔΕΝ χρησιμοποιώ δείκτες. το & που ίσως σε μπερδεύει είαναι κάποιο address μόνο. Απλά σκέψου οτι όταν θέλουμε να διαβάσουμε ζητάμε να διαβάσουμε απο κάποια διεύθυνση απο κάποια μνήμη. Με την απάντηση μου η μισή ερώτηση σου δεν στέκει οπότε πες μου που θέλεις να εμβαθύνω... :)

καλή συνέχεια...
Αν το πρόβλημά μας επιλυθεί. Επιλέγουμε το θέμα που βοήθησε στην επίλυση και πατάμε το κουμπάκι Εικόνα.
Γνώσεις ⇛ 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
Εκτύπωση

Επόμενο

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