gemrap.pages.dev









Hur ser ett funktionsanrop ut

Funktioner

Hur man använder funktioner

En funktion brukar ofta liknas nära enstaka "svart låda", var man stoppar in en alternativt flera värden, samt ut får man nya värden. Funktioner existerar många viktigt på grund av en överskådligare samt mer lättprogrammerat program.

Vi besitter redan använt standardfunktionerna printf() samt scanf(), samt ni besitter sett enstaka tredjeplats standardfunktion, putchar().

Funktioner inom C tar emot värden inom parenteser (jfr. printf("hejdu")), samt antar själva värdet dem returnerar.


  • hur ser  en funktionsanrop ut

  • Den sista satsen är kapabel låta klurig, dock oss bör försöka förklara sålunda utmärkt oss kan.

    Tänk dig för att oss besitter ett funktion likt heter summera(). (Om namngivningen vid funktioner: identisk regler gäller liksom till variabler.) Den tar emot numeriskt värde värden, numeriskt värde heltal. Våran funktion adderar dessa numeriskt värde heltal, samt returnerar summan.

    därför på denna plats skulle anropet mot denna funktion titta ut:

    int summa;
     
    summa = summera(4, 8);
     
    //nu besitter variabeln summa värdet 12

    Eftersom ni redan visste hur funktionsanrop sker, då ni besitter använt både printf() samt scanf() sen tidigare, sålunda plats den angripen inget nytt.

    Nytt existerar däremot hur oss använde funktionen såsom en värde, då oss tilldelade variabeln summa en värde. Detta innebär ett massiv flexibilitet tillsammans funktioner, för att dem kunna användas noggrann såsom en värde.

    Vilka gör det?

    Betänk nästa exempel.

    if (summera(tal1, tal2) < 10) {
        printf("Summan från talen existerar %i\n", summera(tal1, tal2));
    }

    Här kollar oss inledningsvis, returnerar funktionen en värde beneath tio? angående den fullfölja detta, därför skriver oss ut vilket på grund av värde funktionen returnerade.

    eftersom funktionen returnerar en heltal, använder oss %i tillsammans med printf() på grund av för att nedteckna ut värdet. Återigen visar oss på denna plats hur funktioner kunna användas vilket dem värden dem returnerar.

    Hur man skapar funktioner

    Detta möjligen hittills äger varit enstaka tråkig sektion för att studera, eftersom ni ej kunnat testa.

    ni besitter ju trots allt ej funktionen oss använder. idag existerar detta dags för att visa hur man utför funktioner. på denna plats kommer en modell tillsammans föregående funktion, fast tillsammans med koden inom sin helhet.

    #include <stdio.h>
     
    int summera(int a, int b) {
        return a + b;
    }
     
     
    int main() {
        int talett, int taltva;
     
        printf("Skriv in tva heltal, sa skriver jag ut summan!\n");
        printf("Tal 1: ");
        scanf("%i", &talett);
        printf("Tal 2: ");
        scanf("%i", &taltva);
     
        printf("Summan ar: %i\n", summera(talett, taltva));
     
        return 0;
    }

    I main() existerar detta faktiskt ej därför många nytt, oss initierar numeriskt värde heltalsvariabler, oss skriver ut lite skrivelse, oss läser in värden mot dem båda variablerna.

    Sen kommer detta nya: då oss skriver ut sista texten anropar oss även funktionen summera(). Anropet ser ut noggrann såsom oss lärt oss.

    Det intressanta inom detta kodexempel existerar förstås själva funktionen summera(), samt ej anropet mot den. Definitionen från funktioner ser ut liksom inom detta modell, samt ni känner nog igen flera delar från detta ifrån våran main()-funktion.

    inledande raden, int summera(int a, int b) { säger flera saker.

    Parsning till ett abstrakt syntaxträd: Första satsen är en tilldelning, där variabeln som tilldelas något är n och värdet är ett funktionsanrop till int där parametern är ett funktionsanrop till input

    inledningsvis samt främst, funktionen existerar från heltalstyp (int) samt den heter summera. Sedan inom parentes anges hur flera argument den tar, samt från vilken sort, samt vad dem bör varma inom funktionen. inom vårt fall tar den numeriskt värde argument, båda från heltalstyp, samt dem bör varma a samt b.

    Nästa rad, vilket även existerar enda raden inom funktionen, returnerar en värde.

    detta värde likt returneras blir "funktionens värde". inom detta fall existerar detta från heltalstyp, eftersom funktionen existerar från heltalstyp. Värdet liksom returneras existerar summan från våra numeriskt värde argument, a samt b. då ett return-instruktion körs inom ett funktion, avslutas körningen från funktionen. bör något utföras inuti enstaka funktion bör detta ske innan return sker.

    Detta existerar alltså all magi på baksidan ett simpel funktion!

    liksom ni för tillfället även förmå utläsa, existerar alltså main() från heltalstyp, tar ej emot några argument (än inom samtliga fall, den kan utföra detta angående man vill), samt den returnerar 0 dit den anropades.

    Hur man använder funktioner

    likt oss berättade inom sektion 1 existerar detta systemet vilket anropar main(), samt systemet tolkar nollan likt för att programmet avslutades utan fel.

    Varning: variabler tillsammans tillsammans med funktioner kunna existera krångligt, ifall man ej känner mot vilket vilket kallas scope vid engelska. varenda variabel besitter alltså en scope, inom vilket den existerar.

    då körningen från programmet går utanför detta scope kommer variabeln för att tas försvunnen. Detta existerar viktigt för att hålla koll vid.

    Den svarta ifyllda pilen motsvarar ett synkront funktionsanrop, t

    enstaka variabels scope existerar oftast funktionen den existerar initialiserad inom. detta innebär för att, inom förra exemplet, känner ej våran summera()-funktion mot variablerna talett samt taltva. Skulle man försöka komma åt dem inom summera()-funktionen skulle man erhålla en fel. vid identisk sätt går detta ej för att anlända åt variablerna a alternativt b inom main()-funktionen, till således fort summera() besitter körts tydligt existerar dessa variabler borttagna.

    Detta plats alltså anledningen för att summera ej kunde summera talett samt taltva egen, utan oss plats tvugna för att vandra via a samt b.

    Funktioner likt ej returnerar någonting

    Alla funktioner såsom existerar från typen int, char, double alternativt någon från dem andra typerna oss listar inom sektion 2ska returnera en värde.

    Att du ska f¨orst˚a antalet arguments koppling till hur programmet ¨ar skrivet och att f˚a intution f¨or sinusfunktioner och deras frekvens, amplitud och fas

    detta finns däremot en undantag, den mystiska typen void. Funktioner från denna typ får inte returnera värden, samt ifall funktionen existerar från denna typ behöver man ej ens äga tillsammans ett return-rad. Man kunna ifall man behöver äga enstaka tom return, utan något värde, dock man måste ej.

    mot vilken nytta existerar då dessa funktioner? är kapabel man fråga sig. Jo, självklart ett hel sektion, ifall man besitter fantasi. dock desto viktigare kommer detta bli sen, då oss kommer in vid pekare.

    ett objekt av klass X anropar klass Y’s metod doA

    Dock önskar oss vandra in vid dessa funktioner ändå idag, till för att äga detta gjort.

    #include <stdio.h>
     
    void skriv_ut_tal(int a) {
        printf("Argumentet jag fick var: %i\n", a);
    }
     
    int main() {
        skriv_ut_tal(34);
        return 0;
    }

    Detta måste artikel våran kortaste main()-funktion någonsin!

    Allt den utför existerar för att anropa vår alldeles egna utskriftsfunktion, samt sen slutföra. Vår utskriftsfunktion utför inget annat än för att notera ut talet den får likt argument.

    Här kommer en mer avancerat modell vid void-funktion. Den tar emot ett sträng liksom argument, samt skriver ut den. Notera för att detta schema inte någonsin anropar printf().

    på denna plats kommer eventuellt lite nytt, sålunda håll inom dig!

    #include <stdio.h>
     
    void skriv_ut_strang(char str[]) {
        int i;
     
        i = 0;
        while (str[i] != '\0') {
            putchar(str[i]);
            i++;
        }
        putchar('\n');
    }
     
     
    int main() {
        char namn[30];
     
        printf("Vad heter du?

    ");
        gets(namn);
     
        skriv_ut_strang(namn);
     
        return 0;
    }

    Och, liksom vanligt kommer jag börja förklara main()-funktionen, eftersom detta även existerar var exekveringen från koden börjar.

    • Hur ser ett funktionsanrop ut? Kan de se olika ut, förutom till namn, och vad beror det på? Reflektionsfrågor: • Vad händer med inmatningsströmmen när användaren matar in en datatyp som inte överensstäm-mer med variabeln vi läser in till? • Vissa formatteringar ”hänger kvar” tills nästa utskrift

    Initialiseringen från vår sträng bör ej artikel främmande, angående ni besitter läst sektion 8. ej heller bör printf() artikel något nytt nära detta denna plats laget. nästa rad existerar däremot intressant. Den läser in ett sträng mot våran array. på denna plats finns enstaka små sak för att påpeka, skriv ej in en värde längre än 29 indikator (arrayen existerar 30 poster utdragen, den sista behövs till nulltecknet vilket avslutar ett sträng).

    gets() står på grund av get string, alltså plocka upp eller ta enstaka sträng (från användaren). Denna lagras sedan inom arrayen såsom existerar argument mot funktionen.

    Varning: Notera utebliven användning från scanf() på grund av för att plocka upp eller ta strängen! Självklart går detta för att nyttja scanf() på grund av detta, dock den klipper från strängen nära inledande mellanrum, vilket ej ständigt existerar vad man önskar.

    Därför föredrar jag för att notera egna funktioner på grund av för att studera in strängar, på grund av full övervakning. Tills vidare duger gets(). existerar ni den experimenterande typen liksom önskar, efter detta avsnitt, testa för att notera ett funktion till för att studera in strängar är kapabel jag ge ledtråden för att getc() läser in en indikator.

    för att notera ett stränginläsande funktion anser dock jag existerar lite överkurs vid den på denna plats nivån, således bli ej förkrossad ifall ni ej får mot detta. :)

    Sedan sker en anrop vid våran utskrivningsfunktion, samt efter detta avslutas programmet.

    Vår utskrivningsfunktion kräver lite extra tilltanke på grund av för att förstå. inledningsvis samt främst tar den en argument liksom existerar ett array från char-värden.

    Notera dem tomma hakparenteserna. för att detta går för att utföra beror vid för att oss skickar enstaka array liksom argument, samt vår nya array kommer automatiskt för att bli lika massiv såsom vår gamla. (Faktum existerar för att våran nya array egentligen ej ens existerar ett färsk array, utan samma array!

    Bry dig ej till många angående detta än, mer ifall detta kommer då oss går in vid pekare.)

    Sedan deklarerar oss heltalet inom, samt tilldelar detta värde 0, inget konstigt tillsammans detta. nästa loop drar nytta från hur strängar fungerar inom C. således länge bokstaven tillsammans siffra inom, inte existerar lika tillsammans nulltecknet, sålunda bör den notera ut bokstaven samt öka vid inom.

    vid sålunda sätt kommer oss för att nedteckna ut samtliga tecken inom strängen tills oss stöter vid nulltecknet (som betyder för att strängen besitter tagit slut). då nulltecknet existerar upptäckt avslutas loopen, samt enstaka radbrytning skrivs ut.

    Varning: återigen önskar oss påpeka: detta existerar viktigt för att null-tecknet kommer tillsammans inom strängen!

    inom detta senaste schema framträda detta klart hur viktigt detta existerar, på grund av vilket sker angående detta ej finns tillsammans med något nulltecken? Då kommer inom behärska erhålla således höga värden likt typ 1627378... samt tecken nr 1627378 finns ej. Programmet kommer leta vid något område inom minnet detta helt ej får gräva i.

    Detta fanns troligtvis den längsta delen hittills, dock ni äger även fått känna till nästan allt ifall funktioner.

    Dessutom äger ni fått enstaka extralektion ifall strängar. Ja, strängar inom C är svårt.