Kuelewa Vigezo vya Kazi katika C: Mwongozo Kamili kwa Wanaoanza

1. Msingi ya Hoja za Kazi katika Lugha ya C

Nini ni Hoja?

Hoja ni data inayopitishwa kutoka nje ya kazi wakati inaitwa. Kwa kutumia hoja, kazi zinaweza kukubali maadili mbalimbali ya kuingiza na kuziprosesa kwa mujibu. Kujua vizuri matumizi ya hoja katika C ni muhimu kwa kuandika programu zinazoweza kutumika tena na rahisi kubadilisha.

Hoja Halisi na Hoja Rasmi

Maadili yanayotolewa na msimbo unaoitwa ni hoja halisi (pia inajulikana kama hoja), wakati vichangiaji vinavyopokea maadili haya katika ufafanuzi wa kazi vinaitwa hoja rasmi (pia inajulikana kama vigezo). Kwa mfano, katika PrintScore(score);, score ni hoja halisi, na katika void PrintScore(int score), score ni hoja rasmi. Kuelewa tofauti ni muhimu kwa kutumia kazi kwa usahihi.

2. Tofauti Kati ya Hoja Halisi na Hoja Rasmi

Hoja Halisi

Hoja halisi ni maadili maalum yanayopitishwa kwa kazi wakati wa simu. Kwa mfano, katika PrintScore(100);, 100 ni hoja halisi. Maadili haya yanatumwa kwa kazi na yanatumika ndani yake.

Hoja Rasmi

Hoja rasmi ni majina ya vichangiaji vya muda vinavyotumiwa katika ufafanuzi wa kazi ili kupokea data. Hoja rasmi hurejelea maadili ya hoja halisi ndani ya kazi, lakini huwezi kubadilisha thamani nje ya kazi. Kwa mfano, katika void PrintScore(int score), score ni hoja rasmi.

3. Mbinu za Kupitisha Hoja

Kupitisha kwa Thamani

Kupitisha kwa thamani inamaanisha thamani ya hoja halisi inakopiwa kwa hoja rasmi. Katika hali hii, mabadiliko ya hoja rasmi ndani ya kazi hayaathiri hoja halisi ya asili. Hebu tuangalie mfano:

void LevelUp(int lv) {
    lv++;
}

int main() {
    int level = 1;
    LevelUp(level);
    printf("Level: %dn", level); // Output: Level: 1
}

Katika mfano huu, lv inaongezwa ndani ya LevelUp, lakini thamani ya level katika main haibadiliki. Faida ya kupitisha kwa thamani ni kwamba inalinda data ya asili, lakini inaweza kuongeza matumizi ya kumbukumbu wakati wa kupitisha data kubwa.

Kupitisha kwa Pointer

Kupitisha kwa pointer inamaanisha kupitisha anwani ya hoja halisi kwa kazi. Hii inaruhusu kazi kubadilisha moja kwa moja thamani ya hoja halisi.

void LevelUp(int *plv) {
    (*plv)++;
}

int main() {
    int level = 1;
    LevelUp(&level);
    printf("Level: %dn", level); // Output: Level: 2
}

Hapa, thamani ya level inabadilishwa moja kwa moja ndani ya LevelUp. Faida ni kwamba unaweza kubadilisha au kurudisha maadili mengi, lakini udhibiti usio sahihi wa pointer unaweza kusababisha makosa au uvujaji wa kumbukumbu, kwa hivyo tumia kwa uangalifu.

4. Michanganyiko ya Hoja na Maadili Yanayorudishwa

Kazi Zenye Hoja, Hakuna Thamani Inayorudishwa

Kazi hizi zinachukua hoja lakini hazirudishi thamani. Kwa mfano, void PrintScore(int score) inapokea alama kama hoja na inaonyesha tu.

Kazi Bila Hoja, Zenye Thamani Inayorudishwa

Kazi hizi hazichukui hoja lakini zinarudisha thamani. Kwa mfano, int GetCurrentScore() inahesabu na kurudisha alama ya sasa.

Kazi Zenye Hoja na Thamani Inayorudishwa

Kazi hizi zinakubali hoja na zinarudisha matokeo. Kwa mfano, int Add(int a, int b) inapokea nambari mbili na kurudisha jumla yao. Kazi kama hizi ni rahisi kubadilisha na zinatumika sana.

5. Ukurudia na Hoja

Nini ni Ukurudia?

Ukurudia ni mbinu ambapo kazi inajiita yenyewe. Ni bora kwa kuvunja matatizo kuwa matatizo madogo, lakini udhibiti usio sahihi unaweza kusababisha uvujaji wa mkusanyiko.

Mfano wa Ukurudia

Mfano ufuatao hutumia hoja ili kugawanya nambari mara kwa mara kwa 2 kupitia ukurudia:

int funcA(int num) {
    if(num % 2 != 0) {
        return num;
    }
    return funcA(num / 2);
}

int main() {
    int result = funcA(20);
    printf("Result: %dn", result); // Output: Result: 5
}

Here, funcA recursively calls itself, using the argument to repeat the process. Recursion makes code concise for repetitive tasks, but always define a proper termination condition to avoid infinite loops.

6. Makro za Aina ya Kazi na Hoja

Makro za Aina ya Kazi ni Nini?

Makro za aina ya kazi ni makro ambazo hupokea hoja na hubadilishwa na msimbo wakati wa ukusanyaji. Hii inaweza kuboresha utendaji wakati wa utekelezaji.

Mfano wa Makro ya Aina ya Kazi

Makro ifuatayo inahesabu idadi ya vipengele katika safu:

#define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0]))

int main() {
    int arr[10];
    printf("Array size: %dn", ARRAY_SIZE(arr)); // Output: Array size: 10
}

Makro za aina ya kazi hubadilishwa kabla programu iendeshwa, hivyo hakuna mzigo wa wakati wa utekelezaji. Kwa kuwa hazikaguliwi kwa aina, zinaweza kutumika na aina yoyote ya data, lakini tumia kwa tahadhari ili kuepuka tabia zisizotarajiwa.

7. Kazi na Hoja katika Maktaba ya Kawaida ya C

Kutumia Kazi za Maktaba ya Kawaida

C hutoa kazi nyingi za maktaba ya kawaida, nyingi yao hutumia hoja kwa majukumu mbalimbali. Kwa mfano, kazi ya printf inakubali hoja zenye urefu unaobadilika na inaonyesha data kulingana na muundo ulioainishwa.

Mfano wa Kazi ya Maktaba ya Kawaida

Hapa kuna mfano unaotumia kazi ya printf:

printf("Name: %s, Age: %dn", "Alice", 30); // Output: Name: Alice, Age: 30

Mfano huu unaonyesha jinsi printf inavyotumia hoja kuonyesha maandishi na nambari. Kutumia kazi za maktaba ya kawaida kunaboresha usomaji wa msimbo na ufanisi.

8. Muhtasari

Kutumia Hoja za Variadic

Lugha ya C inaruhusu hoja za variadic, ambazo huruhusu kazi kupokea idadi inayobadilika ya hoja. Hii inaelezwa kwa kutumia mduara (...) katika ufafanuzi wa kazi. Hoja za variadic zinawezesha uundaji wa kazi ambazo zinaweza kushughulikia idadi isiyojulikana ya vigezo. printf ni mfano wa kawaida, ikikubali hoja tofauti kulingana na muundo wa maandishi.

Mfano wa Hoja za Variadic

Kazi ifuatayo inapokea nambari nyingi za integer kupitia hoja za variadic na kurudisha jumla yao:

#include <stdarg.h>
#include <stdio.h>

int sum(int count, ...) {
    va_list args;
    va_start(args, count);
    int total = 0;

    for (int i = 0; i < count; i++) {
        total += va_arg(args, int);
    }

    va_end(args);
    return total;
}

int main() {
    printf("Sum: %dn", sum(4, 1, 2, 3, 4)); // Output: Sum: 10
}

Katika mfano huu, kazi ya sum inapokea integer nyingi na kurudisha jumla yao. Unatumia makro kama va_list, va_start, va_arg, na va_end kushughulikia hoja za variadic.

Vidokezo Muhimu

Unapotumia hoja za variadic, zingatia kwa makini idadi na aina hoja zilizotumwa. Ikiwa mpigaji na ufafanuzi wa kazi hawakubaliani juu ya idadi ya hoja au aina, inaweza kusababisha tabia zisizotarajiwa au programu kuanguka.

Matumizi ya Kitaalamu na Hoja

Matumizi Mazuri ya Hoja

Kutumia hoja kwa ufanisi huongeza usomaji na matumizi tena yaimbo. Kwa mfano, wakati kazi nyingi zinashughulikia data sawa, ni bora kupitisha data kama hoja badala ya kutumia vigezo vya kimataifa. Hii inaongeza uhuru wa kazi na kupunguza athari za pembeni kwenye msimbo mwingine.

Ufanisi wa Kumbukumbu na Utendaji

Unapopitisha data kubwa, kutumia viashiria kama hoja husaidia kuokoa kumbukumbu. Ikiwa unapita safu kubwa au muundo kwa thamani, data yote inakopishwa; kwa viashiria, anwani tu ndiyo inapitishwa, na hivyo kupunguza matumizi ya kumbukumbu.

Mazoea Mazuri ya Uandishi wa Msimbo

Unapobuni kazi, zingatia kwa umakini idadi na aina za hoja zinazohitajika. Kupitisha hoja zisizo za lazima kunafanya matumizi ya kazi kuwa magumu na kunaweza kusababisha hitilafu. Kwa upande mwingine, kupitisha waziwazi data zote zinazohitajika kama hoja kunaboresha uwazi wa msimbo na uratibu.

9. Mbinu za Juu Zinazohusiana na Hoja

Kazi za Callback

Kazi ya kurejesha (callback function) ni kazi inayopitishwa kama hoja kwa kazi nyingine na inayoitwa ndani yake. Hii inaruhusu muundo wa programu unaobadilika, hasa katika programu inayoendeshwa na matukio au programu asynkronasi.

#include <stdio.h>

void executeCallback(void (*callback)(int)) {
    callback(10);
}

void printValue(int val) {
    printf("Value: %dn", val);
}

int main() {
    executeCallback(printValue); // Output: Value: 10
}

Katika mfano huu, printValue inapitishwa kama callback na inatekelezwa ndani ya executeCallback.

Viashiria vya Kazi

Viashiria vya kazi vinakuruhusu kutendana na kazi kama anuwai. Unaweza kupitisha kazi kama hoja au kuita kazi tofauti kwa nguvu wakati wa utekelezaji, ambayo ni muhimu sana kwa muundo wa code unaobadilika.

#include <stdio.h>

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

int main() {
    int (*operation)(int, int) = add;
    printf("Result: %dn", operation(2, 3)); // Output: Result: 5
}

Hapa, kazi ya add imetajwa kwa kiashiria cha kazi operation na inaitwa kama anuwai.

10. Hoja za Kazi na Udhibiti wa Kumbukumbu

Kumbukumbu ya Nguvu na Hoja

Katika C, unaweza kutenga kumbukumbu kwa nguvu kwa kutumia malloc na free. Wakati wa kupitisha pointer kwa kumbukumbu iliyotengwa kwa nguvu kama hoja, lazima udhibiti kumbukumbu kwa uangalifu ili kuepuka uvujaji.

#include <stdlib.h>
#include <stdio.h>

void allocateMemory(int **ptr, int size) {
    *ptr = (int *)malloc(size * sizeof(int));
}

int main() {
    int *arr;
    allocateMemory(&arr, 5);
    for (int i = 0; i < 5; i++) {
        arr[i] = i + 1;
    }
    for (int i = 0; i < 5; i++) {
        printf("%d ", arr[i]); // Output: 1 2 3 4 5
    }
    free(arr); // Free the memory
}

Hapa, allocateMemory inatenga kumbukumbu kwa nguvu, na pointer inapitishwa kama hoja. Udhibiti usio sahihi wa kumbukumbu unaweza kusababisha uvujaji wa kumbukumbu, kwa hivyo kuwa mwangalifu.

年収訴求