Συναρτήσεις στον Προγραμματισμό C με Παραδείγματα: Αναδρομικό & Ενσωματωμένο

⚡ Έξυπνη Σύνοψη

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

  • 🧩 Ποιες λειτουργίες κάνουν: Μια συνάρτηση ομαδοποιεί επαναχρησιμοποιήσιμες οδηγίες, έτσι ώστε ένα μεγάλο πρόγραμμα να χωρίζεται σε μικρότερα, διαχειρίσιμα υποπρογράμματα που είναι πιο εύκολα στην αποσφαλμάτωση.
  • 📚 Δύο τύποι: Οι συναρτήσεις βιβλιοθήκης όπως οι printf και scanf είναι έτοιμες, ενώ οι συναρτήσεις που ορίζονται από τον χρήστη γράφονται από τον προγραμματιστή.
  • 📝 Τρία μέρη: Η χρήση μιας συνάρτησης περιλαμβάνει τη δήλωσή της ή το πρωτότυπο, τον ορισμό ή το σώμα της και την κλήση που την εκτελεί.
  • 🎯 επιχειρήματα: Οι τιμές μεταβιβάζονται κατά θέση και, από προεπιλογή, κατά τιμή, επομένως η αρχική μεταβλητή παραμένει αμετάβλητη μέσα στην καλούμενη συνάρτηση.
  • 🌐 Πεδίο εφαρμογής: Οι τοπικές μεταβλητές παραμένουν μόνο μέσα στη συνάρτησή τους, ενώ οι καθολικές και οι στατικές μεταβλητές διατηρούν τις τιμές τους σε όλο το πρόγραμμα ή μεταξύ κλήσεων.
  • 🤖 Βοήθεια AI: Το GitHub Copilot και οι βοηθοί τεχνητής νοημοσύνης υποστηρίζουν συναρτήσεις C, προτείνουν τύπους επιστροφών και επισημαίνουν ελλείπουσες επιστροφές ή ασύμβατα ορίσματα.

Λειτουργίες στον προγραμματισμό C

Τι είναι μια συνάρτηση στο C;

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

Τι είναι μια συνάρτηση στο C

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

Βιβλιοθήκη Vs. Λειτουργίες που καθορίζονται από το χρήστη

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

Στον προγραμματισμό «C», οι συναρτήσεις χωρίζονται σε δύο τύπους:

  1. Λειτουργίες βιβλιοθήκης
  2. Λειτουργίες που καθορίζονται από το χρήστη

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

Ενώ, μια συνάρτηση που ορίζεται από το χρήστη είναι ένας τύπος συνάρτησης στην οποία πρέπει να γράψουμε ένα σώμα μιας συνάρτησης και να καλέσουμε τη συνάρτηση κάθε φορά που απαιτούμε από τη συνάρτηση να εκτελέσει κάποια λειτουργία στο πρόγραμμά μας.

Μια συνάρτηση που ορίζεται από το χρήστη στο C γράφεται πάντα από τον χρήστη, αλλά αργότερα μπορεί να είναι μέρος της βιβλιοθήκης 'C'. Είναι ένα σημαντικό πλεονέκτημα του προγραμματισμού «C».

Οι λειτουργίες προγραμματισμού C χωρίζονται σε τρεις δραστηριότητες όπως:

  1. Δήλωση συνάρτησης
  2. Ορισμός συνάρτησης
  3. Κλήση λειτουργίας

Δήλωση λειτουργίας

Δήλωση συνάρτησης σημαίνει την εγγραφή ενός ονόματος για ένα πρόγραμμα. Είναι ένα υποχρεωτικό μέρος για τη χρήση συναρτήσεων στον κώδικα. Σε μια δήλωση συνάρτησης, απλώς καθορίζουμε το όνομα μιας συνάρτησης που θα χρησιμοποιήσουμε στο πρόγραμμά μας, όπως μια δήλωση μεταβλητής. Δεν μπορούμε να χρησιμοποιήσουμε μια συνάρτηση εκτός αν δηλωθεί σε ένα πρόγραμμα. Μια δήλωση συνάρτησης ονομάζεται επίσης "Πρωτότυπο συνάρτησης".

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

return_data_type function_name (data_type arguments);
  • Ο τύπος_δεδομένων_επιστροφής: είναι ο τύπος δεδομένων της συνάρτησης τιμής που επιστρέφεται στην εντολή κλήσης.
  • Το όνομα_συνάρτησης: ακολουθείται από παρενθέσεις
  • Τα ονόματα των ορισμάτων με τις δηλώσεις τύπων δεδομένων τους τοποθετούνται προαιρετικά μέσα στις παρενθέσεις.

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

#include <stdio.h>
/*Function declaration*/
int add(int a,b);
/*End of Function declaration*/
int main() {

Λάβετε υπόψη ότι μια συνάρτηση δεν επιστρέφει απαραίτητα μια τιμή. Σε αυτήν την περίπτωση, χρησιμοποιείται η λέξη-κλειδί void.

Για παράδειγμα, η δήλωση συνάρτησης output_message υποδεικνύει ότι η συνάρτηση δεν επιστρέφει μια τιμή: void output_message();

Ορισμός λειτουργίας

Ορισμός συνάρτησης σημαίνει απλώς την εγγραφή του σώματος μιας συνάρτησης. Ένα σώμα μιας συνάρτησης αποτελείται από εντολές που πρόκειται να εκτελέσουν μια συγκεκριμένη εργασία. Ένα σώμα συνάρτησης αποτελείται από ένα ή ένα μπλοκ εντολών. Είναι επίσης υποχρεωτικό μέρος μιας λειτουργίας.

int add(int a,int b)	//function body	
{
	int c;
	c=a+b;
	return c;
}

Κλήση λειτουργίας

Μια κλήση συνάρτησης σημαίνει την κλήση μιας συνάρτησης όποτε απαιτείται σε ένα πρόγραμμα. Κάθε φορά που καλούμε μια συνάρτηση, εκτελεί μια λειτουργία για την οποία σχεδιάστηκε. Μια κλήση συνάρτησης είναι ένα προαιρετικό μέρος ενός προγράμματος.

  result = add(4,5);

Εδώ είναι ο πλήρης κώδικας:

#include <stdio.h>
int add(int a, int b);	//function declaration
int main()
{
	int a=10,b=20;
	int c=add(10,20); 	//function call
	printf("Addition:%d\n",c);
	getch();
}
int add(int a,int b)	//function body
{
	int c;
	c=a+b;
	return c;
}

Παραγωγή:

Addition:30

Επιχειρήματα Λειτουργίας

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

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

Θεωρούμε το ακόλουθο πρόγραμμα που δείχνει παραμέτρους που μεταβιβάζονται με τιμή:

int add (int x, int y); 
int main() {
  int a, b, result;
  a = 5;
  b = 10;
  result = add(a, b);
  printf("%d + %d\ = %d\n", a, b, result);
return 0;}
int add (int x, int y) { 
x += y;
  return(x);}

Η έξοδος του προγράμματος είναι:

5 + 10 = 15

Λάβετε υπόψη ότι οι τιμές των a και b μεταβιβάστηκαν για να προσθέσετε συνάρτηση δεν άλλαξαν επειδή μόνο η τιμή της μεταβιβάστηκε στην παράμετρο x.

Μεταβλητό εύρος

Μεταβλητό εύρος σημαίνει την ορατότητα των μεταβλητών σε έναν κώδικα του προγράμματος.

Στη C, οι μεταβλητές που δηλώνονται μέσα σε μια συνάρτηση είναι τοπικές σε αυτό το μπλοκ κώδικα και δεν μπορούν να αναφερθούν εκτός της συνάρτησης. Ωστόσο, οι μεταβλητές που δηλώνονται εκτός όλων των συναρτήσεων είναι καθολικές και προσβάσιμες από ολόκληρο το πρόγραμμα. Οι σταθερές που δηλώνονται με #define στην κορυφή ενός προγράμματος είναι προσβάσιμες από ολόκληρο το πρόγραμμα. Θεωρούμε το ακόλουθο πρόγραμμα που εκτυπώνει την τιμή της καθολικής μεταβλητής τόσο από την κύρια όσο και από τη συνάρτηση που ορίζεται από τον χρήστη:

#include <stdio.h>
int global = 1348;
void test();
int main() {
  printf("from the main function : global =%d \n", global);
  test () ;
return 0;}

void test (){
printf("from user defined function : global =%d \n", global);}

Αποτέλεσμα:

from the main function : global =1348
from user defined function : global =1348

Συζητάμε τις λεπτομέρειες του προγράμματος:

Μεταβλητό εύρος

  1. Δηλώνουμε μια ακέραια καθολική μεταβλητή με 1348 ως αρχική τιμή.
  2. Δηλώνουμε και ορίζουμε μια συνάρτηση test() που ούτε λαμβάνει ορίσματα ούτε επιστρέφει τιμή. Αυτή η συνάρτηση εκτυπώνει μόνο την καθολική τιμή μεταβλητής για να αποδείξει ότι οι καθολικές μεταβλητές είναι προσβάσιμες οπουδήποτε στο πρόγραμμα.
  3. Εκτυπώνουμε την καθολική μεταβλητή μέσα στην κύρια συνάρτηση.
  4. Καλούμε τη συνάρτηση δοκιμής για να εκτυπώσουμε την καθολική τιμή της μεταβλητής.

Στο C, όταν τα ορίσματα μεταβιβάζονται σε παραμέτρους συνάρτησης, οι παράμετροι λειτουργούν ως τοπικές μεταβλητές που θα καταστραφούν κατά την έξοδο από τη συνάρτηση.

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

Στατικές Μεταβλητές

Οι στατικές μεταβλητές έχουν τοπική εμβέλεια. Ωστόσο, δεν καταστρέφονται κατά την έξοδο από τη λειτουργία. Επομένως, μια στατική μεταβλητή διατηρεί την τιμή της για πάντα και μπορεί να προσπελαστεί όταν η συνάρτηση εισαχθεί ξανά. Μια στατική μεταβλητή αρχικοποιείται όταν δηλώνεται και χρειάζεται το πρόθεμα static.

Το παρακάτω πρόγραμμα χρησιμοποιεί μια στατική μεταβλητή:

#include <stdio.h>
void say_hi();
int main() {    
  int i;
  for (i = 0; i < 5; i++) { say_hi();}
   return 0;}
void say_hi() {
  static int calls_number = 1;
  printf("Hi number %d\n", calls_number);
  calls_number ++; }

Το πρόγραμμα εμφανίζει:

Hi number 1
Hi number 2
Hi number 3
Hi number 4
Hi number 5

Αναδρομικές συναρτήσεις

Θεωρήστε το παραγοντικό ενός αριθμού που υπολογίζεται ως εξής: 6! =6* 5 * 4 * 3 * 2 * 1.

Αυτός ο υπολογισμός γίνεται ως επαναλαμβανόμενος υπολογισμός του γεγονότος * (γεγονός -1) έως ότου το γεγονός ισούται με 1.

Μια αναδρομική συνάρτηση είναι μια συνάρτηση που καλεί τον εαυτό της και περιλαμβάνει μια συνθήκη εξόδου για να ολοκληρώσει τις αναδρομικές κλήσεις. Στην περίπτωση του υπολογισμού του παραγοντικού αριθμού, η συνθήκη εξόδου είναι γεγονός ίση με 1. Η αναδρομή λειτουργεί με «στοίβαξη» κλήσεων έως ότου η συνθήκη εξόδου είναι αληθής.

Για παράδειγμα:

#include <stdio.h>
int factorial(int number);
int main() {    
  int x = 6;
  printf("The factorial of %d is %d\n", x, factorial(x)); 
  return 0;}
int factorial(int number) {
 if (number == 1)    return (1); /* exiting condition */
  else
    return (number * factorial(number - 1));
}

Το πρόγραμμα εμφανίζει:

 The factorial of 6 is 720

Εδώ, συζητάμε τις λεπτομέρειες του προγράμματος:

Αναδρομικές συναρτήσεις

  1. Δηλώνουμε την αναδρομική παραγοντική μας συνάρτηση που παίρνει μια ακέραια παράμετρο και επιστρέφει το παραγοντικό αυτής της παραμέτρου. Αυτή η λειτουργία θα καλέσει τον εαυτό της και θα μειώσει τον αριθμό μέχρι να επιτευχθεί η έξοδος ή η βασική συνθήκη. Όταν η συνθήκη είναι αληθής, οι τιμές που δημιουργήθηκαν προηγουμένως θα πολλαπλασιαστούν η μία με την άλλη και θα επιστραφεί η τελική παραγοντική τιμή.
  2. Δηλώνουμε και αρχικοποιούμε μια ακέραια μεταβλητή με τιμή”6″ και στη συνέχεια εκτυπώνουμε την παραγοντική της τιμή καλώντας την παραγοντική μας συνάρτηση.

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

Αναδρομικές συναρτήσεις

Ενσωματωμένες Λειτουργίες

Η συνάρτηση στον προγραμματισμό C χρησιμοποιείται για την αποθήκευση των εντολών που χρησιμοποιούνται πιο συχνά. Χρησιμοποιείται για τη διαμόρφωση του προγράμματος.

Κάθε φορά που καλείται μια συνάρτηση, ο δείκτης εντολών μεταβαίνει στον ορισμό της συνάρτησης. Μετά την εκτέλεση μιας συνάρτησης, ο δείκτης εντολών επιστρέφει στη δήλωση από όπου μεταπήδησε στον ορισμό της συνάρτησης.

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

Σε μια ενσωματωμένη λειτουργία, μια κλήση συνάρτησης αντικαθίσταται απευθείας από έναν πραγματικό κωδικό προγράμματος. Δεν μεταπηδά σε κανένα μπλοκ επειδή όλες οι λειτουργίες εκτελούνται εντός της ενσωματωμένης συνάρτησης.

Οι ενσωματωμένες συναρτήσεις χρησιμοποιούνται κυρίως για μικρούς υπολογισμούς. Δεν είναι κατάλληλα όταν εμπλέκονται μεγάλοι υπολογιστές.

Μια ενσωματωμένη συνάρτηση είναι παρόμοια με την κανονική συνάρτηση με τη διαφορά ότι η λέξη-κλειδί ενσωματωμένη βρίσκεται πριν από το όνομα της συνάρτησης. Οι ενσωματωμένες συναρτήσεις δημιουργούνται με την ακόλουθη σύνταξη:

inline function_name ()
{
    //function definition
}

Ας γράψουμε ένα πρόγραμμα για την υλοποίηση μιας ενσωματωμένης συνάρτησης.

inline int add(int a, int b)		//inline function declaration
{
	return(a+b);
}
int main()
{
	int c=add(10,20);
	printf("Addition:%d\n",c);
	getch();
}

Παραγωγή:

Addition: 30

Το παραπάνω πρόγραμμα δείχνει τη χρήση μιας ενσωματωμένης συνάρτησης για πρόσθεση δύο αριθμών. Όπως μπορούμε να δούμε, έχουμε επιστρέψει την πρόσθεση σε δύο αριθμούς εντός της συνάρτησης inline μόνο χωρίς να γράψουμε επιπλέον γραμμές. Κατά την κλήση συνάρτησης μόλις περάσαμε τιμές στις οποίες πρέπει να κάνουμε πρόσθεση.

Συχνές Ερωτήσεις

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

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

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

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

Η συνάρτηση main() είναι το σημείο εισόδου από όπου ξεκινά η εκτέλεση κάθε προγράμματος C. Το λειτουργικό σύστημα την καλεί πρώτα και η τιμή επιστροφής της, συνήθως 0, σηματοδοτεί την επιτυχία. Μπορεί να χρειαστούν argc και argv για να ληφθούν ορίσματα γραμμής εντολών.

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

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

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

Συνοψίστε αυτήν την ανάρτηση με: