C-ohjelmoinnin toiminnot esimerkein: Rekursiivinen & Inline

⚡ Älykäs yhteenveto

C-ohjelmoinnin funktiot ovat uudelleenkäytettäviä koodilohkoja, jotka jakavat suuren ohjelman pienempiin aliohjelmiin, mikä helpottaa sen ymmärtämistä, testaamista ja muokkaamista. Jokaisella funktiolla on deklaraatio, määritelmä ja kutsuosa.

  • 🧩 Mitä funktiot tekevät: Funktio ryhmittelee uudelleenkäytettävät käskyt, joten suuri ohjelma jakautuu pienempiin, hallittavisiin aliohjelmiin, joita on helpompi debugata.
  • 📚 Kaksi tyyppiä: Kirjastofunktiot, kuten printf ja scanf, ovat valmiita, kun taas käyttäjän määrittämät funktiot kirjoittaa ohjelmoija.
  • 📝 Kolme osaa: Funktion käyttöön liittyy sen deklarointi eli prototyyppi, sen määritelmä eli runko ja kutsu, joka sitä suorittaa.
  • 🎯 argumentit: Arvot välittyvät sijainnin ja oletusarvoisesti arvon mukaan, joten alkuperäinen muuttuja pysyy muuttumattomana kutsutun funktion sisällä.
  • 🌐 Soveltamisala: Paikalliset muuttujat elävät vain funktionsa sisällä, kun taas globaalit ja staattiset muuttujat säilyttävät arvonsa ohjelman läpi tai kutsujen välillä.
  • 🤖 AI-apu: GitHub Copilot ja tekoälyavustajat tukevat C-funktioita, ehdottavat paluuarvotyyppejä ja merkitsevät puuttuvia palautuksia tai yhteensopimattomia argumentteja.

C-ohjelmoinnin toiminnot

Mikä on funktio C:ssä?

Toiminto C-ohjelmoinnissa on uudelleenkäytettävä koodilohko, joka helpottaa ohjelman ymmärtämistä, testaamista ja muokkaamista muuttamatta kutsuvaa ohjelmaa. Funktiot jakavat koodin ja moduloivat ohjelman parempien ja tehokkaampien tulosten saavuttamiseksi. Lyhyesti sanottuna suurempi ohjelma jaetaan useisiin aliohjelmiin, joita kutsutaan funktioiksi.

Mikä on funktio C:ssä

Kun jaat suuren ohjelman useisiin toimintoihin, on helppoa hallita jokaista toimintoa erikseen. Aina kun ohjelmassa tapahtuu virhe, voit helposti tutkia vialliset toiminnot ja korjata vain ne virheet. Voit helposti soittaa ja käyttää toimintoja aina kun niitä tarvitaan, mikä säästää automaattisesti aikaa ja tilaa.

Kirjasto vs. Käyttäjän määrittämät toiminnot

Jokaisessa C-ohjelmassa on ainakin yksi funktio, joka on päätoiminto, mutta ohjelmalla voi olla mikä tahansa määrä toimintoja. C:n pääfunktio () on ohjelman aloituspiste.

C-ohjelmoinnissa funktiot jaetaan kahteen tyyppiin:

  1. Kirjaston toiminnot
  2. Käyttäjän määrittämät toiminnot

Ero kirjaston ja käyttäjän määrittämien funktioiden välillä C:ssä on, että meidän ei tarvitse kirjoittaa koodia kirjastofunktiolle. Se on jo olemassa otsikkotiedostossa, jonka sisällytämme aina ohjelman alkuun. Sinun tarvitsee vain kirjoittaa funktion nimi ja käyttää sitä oikean syntaksin kanssa. Printf, scanf ovat esimerkkejä kirjastotoiminnoista.

Sen sijaan käyttäjän määrittämä funktio on eräänlainen funktio, jossa meidän on kirjoitettava funktion runko ja kutsuttava funktiota aina, kun vaadimme funktiota suorittamaan jonkin toiminnon ohjelmassamme.

Käyttäjän määrittämä funktio C:ssä on aina käyttäjän kirjoittama, mutta myöhemmin se voi olla osa 'C'-kirjastoa. Se on C-ohjelmoinnin suuri etu.

C-ohjelmointitoiminnot on jaettu kolmeen toimintoon, kuten

  1. Toimintoilmoitus
  2. Toiminnon määritelmä
  3. Toimintakutsu

Toimintoilmoitus

Funktion deklarointi tarkoittaa ohjelman nimen kirjoittamista. Se on pakollinen osa funktioiden käyttämiseksi koodissa. Funktion deklaroinnissa määritämme vain funktion nimen, jota aiomme käyttää ohjelmassamme, kuten muuttujadeklaraatiossa. Emme voi käyttää funktiota, ellei sitä ole deklaroitu ohjelmassa. Funktion deklarointia kutsutaan myös "funktion prototyypiksi".

Funktioilmoitukset (kutsutaan prototyypiksi) tehdään yleensä pääfunktion () yläpuolelle ja ovat yleisessä muodossa:

return_data_type function_name (data_type arguments);
  • return_data_type: on kutsuvalle lausekkeelle palautetun arvofunktion tietotyyppi.
  • Funktion_nimi:-merkkiä seuraa sulkeet
  • Argumenttien nimet ja niiden tietotyyppimäärittelyt (valinnaisesti) sijoitetaan sulkeisiin.

Tarkastellaan seuraavaa ohjelmaa, joka näyttää kuinka kuutiofunktio määritellään kokonaislukumuuttujan kuutioarvon laskemiseksi

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

Muista, että funktio ei välttämättä palauta arvoa. Tässä tapauksessa käytetään avainsanaa void.

Esimerkiksi funktion output_message ilmoitus osoittaa, että funktio ei palauta arvoa: void output_message();

Toiminnon määritelmä

Funktiomäärittely tarkoittaa vain funktion rungon kirjoittamista. Toiminnon runko koostuu lauseista, jotka suorittavat tietyn tehtävän. Funktiorunko koostuu yhdestä lauseesta tai lausekkeesta. Se on myös pakollinen osa toimintoa.

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

Toimintakutsu

Funktiokutsu tarkoittaa funktion kutsumista aina, kun sitä vaaditaan ohjelmassa. Aina kun kutsumme funktiota, se suorittaa toiminnon, jota varten se on suunniteltu. Funktiokutsu on valinnainen osa ohjelmaa.

  result = add(4,5);

Tässä on koko koodi:

#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;
}

lähtö:

Addition:30

Funktion argumentit

Funktion argumentteja käytetään tarvittavien arvojen vastaanottamiseen funktiokutsulla. Ne ovat yhteensopivia sijainnin mukaan; ensimmäinen argumentti välitetään ensimmäiselle parametrille, toinen toiselle parametrille ja niin edelleen.

Oletusarvoisesti argumentit välitetään arvon mukaan, jolloin kutsuttavalle funktiolle annetaan kopio tiedoista. Itse välitetty muuttuja ei muutu.

Tarkastelemme seuraavaa ohjelmaa, joka näyttää arvon kautta välitetyt parametrit:

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);}

Ohjelman tulos on:

5 + 10 = 15

Muista, että a:n ja b:n arvoja välitettiin lisätoimintoon, koska sitä ei muutettu, koska vain sen arvo välitettiin parametriin x.

Vaihteleva soveltamisala

Muuttujan laajuus tarkoittaa muuttujien näkyvyyttä ohjelman koodissa.

C-kielessä funktion sisällä deklaroidut muuttujat ovat paikallisia kyseiselle koodilohkolle, eikä niihin voida viitata funktion ulkopuolella. Funktioiden ulkopuolella deklaroidut muuttujat ovat kuitenkin globaaleja ja käytettävissä koko ohjelmasta. Ohjelman alussa #define-merkillä deklaroidut vakiot ovat käytettävissä koko ohjelmasta. Tarkastellaan seuraavaa ohjelmaa, joka tulostaa globaalin muuttujan arvon sekä pääfunktiosta että käyttäjän määrittämästä funktiosta:

#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);}

Tulos:

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

Keskustelemme ohjelman yksityiskohdista:

Vaihteleva soveltamisala

  1. Ilmoitamme kokonaisluvun globaalin muuttujan, jonka alkuarvo on 1348.
  2. Ilmoitamme ja määritämme test()-funktion, joka ei ota argumentteja eikä palauta arvoa. Tämä toiminto tulostaa vain globaalin muuttujan arvon osoittaakseen, että globaaleihin muuttujiin pääsee käsiksi missä tahansa ohjelmassa.
  3. Tulostamme globaalin muuttujan pääfunktion sisällä.
  4. Kutsumme testifunktiota globaalin muuttujan arvon tulostamiseksi.

C:ssä, kun argumentteja välitetään funktion parametreille, parametrit toimivat paikallisina muuttujina, jotka tuhoutuvat funktiosta poistuttaessa.

Kun käytät globaalit muuttujat, käytä niitä varoen, koska ne voivat johtaa virheisiin ja ne voivat muuttua missä tahansa ohjelmassa. Ne tulee alustaa ennen käyttöä.

Staattiset muuttujat

Staattisilla muuttujilla on paikallinen laajuus. Ne eivät kuitenkaan tuhoudu toiminnosta poistuttaessa. Siksi staattinen muuttuja säilyttää arvonsa ikuisesti ja sitä voidaan käyttää, kun funktio syötetään uudelleen. Staattinen muuttuja alustetaan, kun se ilmoitetaan, ja se tarvitsee etuliitettä staattinen.

Seuraava ohjelma käyttää staattista muuttujaa:

#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 ++; }

Ohjelma näyttää:

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

Rekursiiviset toiminnot

Tarkastellaan luvun kertomaa, joka lasketaan seuraavasti 6! =6 * 5 * 4 * 3 * 2 * 1.

Tämä laskutoimitus suoritetaan toistuvasti laskemalla tosiasia * (fakta -1), kunnes tosiasia on yhtä kuin 1.

Rekursiivinen funktio on toiminto, joka kutsuu itseään ja sisältää poistumisehdon rekursiivisten kutsujen lopettamiseksi. Tekijälukulaskelman tapauksessa poistumisehto on tosiasia, joka on yhtä suuri kuin 1. Rekursio toimii "pinoamalla" kutsuja, kunnes poistumisehto on tosi.

Esimerkiksi:

#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));
}

Ohjelma näyttää:

 The factorial of 6 is 720

Täällä keskustelemme ohjelman yksityiskohdista:

Rekursiiviset toiminnot

  1. Ilmoitamme rekursiivisen tekijäfunktiomme, joka ottaa kokonaislukuparametrin ja palauttaa tämän parametrin kertoimen. Tämä toiminto kutsuu itseään ja pienentää numeroa, kunnes poistuminen tai perusehto saavutetaan. Kun ehto on tosi, aiemmin luodut arvot kerrotaan keskenään ja lopullinen tekijäarvo palautetaan.
  2. Ilmoitamme ja alustamme kokonaislukumuuttujan arvolla ”6″ ja tulostamme sitten sen kertoimen arvon kutsumalla tekijäfunktiota.

Tarkastellaan seuraavaa kaaviota ymmärtääksesi paremmin rekursiivista mekanismia, joka koostuu funktion kutsumisesta itseään, kunnes perustapaus tai stop-kohtaus saavutetaanping ehto saavutetaan, ja sen jälkeen keräämme edelliset arvot:

Rekursiiviset toiminnot

Sisäiset toiminnot

C-ohjelmoinnin funktiota käytetään tallentamaan useimmin käytetyt käskyt. Sitä käytetään ohjelman modulointiin.

Aina kun funktiota kutsutaan, käskyosoitin hyppää funktion määritelmään. Toiminnon suorittamisen jälkeen käskyosoitin putoaa takaisin lauseeseen, josta se hyppäsi funktion määritelmään.

Aina kun käytämme toimintoja, vaadimme ylimääräistä osoitin siirry funktion määritelmään ja palaa lauseeseen. Käytämme sisäisiä toimintoja poistaaksemme tällaisten osoitinpäiden tarpeen.

Inline-funktiossa funktiokutsu korvataan suoraan todellisella ohjelmakoodilla. Se ei hyppää mihinkään lohkoon, koska kaikki toiminnot suoritetaan rivifunktion sisällä.

Inline-funktioita käytetään enimmäkseen pieniin laskelmiin. Ne eivät sovellu suuriin tietokoneisiin.

Inline-funktio on samanlainen kuin tavallinen funktio, paitsi että avainsanan teksti on ennen funktion nimeä. Sisäiset funktiot luodaan seuraavalla syntaksilla:

inline function_name ()
{
    //function definition
}

Kirjoitetaan ohjelma inline-funktion toteuttamiseksi.

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();
}

lähtö:

Addition: 30

Yllä oleva ohjelma esittelee rivifunktion käyttöä kahden luvun lisäämiseen. Kuten näemme, olemme palauttaneet kahden luvun lisäyksen vain rivifunktion sisällä kirjoittamatta ylimääräisiä rivejä. Toiminnon kutsun aikana olemme juuri välittäneet arvot, joille meidän on suoritettava yhteenlasku.

UKK

Arvon perusteella kutsuttava funktio kopioi argumentin funktioon, joten muutokset pysyvät paikallisina ja alkuperäinen muuttuja säilyy koskemattomana. Viittauksen perusteella kutsuttava funktio välittää muuttujan osoitteen osoittimen kautta, jolloin funktio voi muokata kutsujan alkuperäistä dataa suoraan.

Varsinainen parametri on reaaliarvo tai muuttuja, jonka kutsuja välittää funktiokutsun aikana. Muodollinen parametri on funktion määritelmässä nimetty paikkamerkki, joka vastaanottaa sen. Ne yhdistetään sijainnin mukaan, ensimmäinen ensimmäiseen, toinen toiseen.

AC-funktio palauttaa return-lausekkeella suoraan vain yhden arvon. Jos haluat lähettää takaisin useita tuloksia, kääri ne rakenteeseen, täytä taulukko tai anna osoittimia argumentteina, jotta funktio kirjoittaa jokaisen tuloksen kutsujan omiin muuttujiin.

Funktiot tuovat uudelleenkäytettävyyttä, jolloin yksi lohko suoritetaan useita kertoja, ja modulaarisuutta, joka jakaa suuren ohjelman pienempiin osiin. Ne myös parantavat luettavuutta, yksinkertaistavat testausta ja virheenkorjausta sekä piilottavat monimutkaiset yksityiskohdat yhden nimen taakse, mikä säästää kehitysaikaa.

main()-funktio on aloituskohta, josta jokainen C-ohjelma aloittaa suorituksen. Käyttöjärjestelmä kutsuu sitä ensin, ja sen paluuarvo, yleensä 0, merkitsee onnistumista. Komentoriviargumenttien vastaanottamiseen saatetaan tarvita argc ja argv.

Rekursio sopii ongelmiin, joissa on luonnostaan ​​toistuva rakenne, kuten puun läpikäyminen tai kertomat, jolloin koodi on lyhyempää ja selkeämpää. Iteraatio toimii yleensä nopeammin ja käyttää vähemmän muistia, koska se välttää toistuvat kutsut. Valitse rekursio selkeyden ja iteraatio suorituskyvyn parantamiseksi suurilla syötteillä.

Kyllä. Tekoälykoodausavustaja voi kirjoittaa C-funktion selkokielisestä kehotteesta, ehdottaa parametreja ja paluutyyppejä sekä merkitä virheitä, kuten puuttuvan paluun tai epäsuhtaisen argumentin. Käännä ja testaa luotu funktio aina ennen kuin luotat siihen.

GitHub Copilot kirjoittaa C-funktioita, täydentää rungon funktion nimellä tai lyhyellä kommentilla ja ehdottaa deklaraatioita, silmukoita ja rekursiivisia kutsuja. Se usein lisää vastaavan prototyypin main()-funktion yläpuolelle, vaikka logiikkaa kannattaa silti tarkastella.

Tiivistä tämä viesti seuraavasti: