Skip to content

7-dars: Funksiyalar — asoslar

Dars haqida

Davomiyligi: 90 daqiqa Maqsad: Talaba C tilida funksiya yaratishi, chaqirishi va qiymat qaytarishni bilishi kerak.

1. Funksiya nima?

Funksiya — qayta ishlatish mumkin bo'lgan kod bloki.

c
int qoshish(int a, int b) {
    return a + b;
}

// Chaqirish
int natija = qoshish(5, 3);  // 8

2. Nima uchun funksiya?

Funksiyasiz

c
int main(void) {
    int a = 5, b = 3;
    int sum = a + b;
    printf("Yig'indi: %d\n", sum);
    
    int c = 10, d = 7;
    int sum2 = c + d;
    printf("Yig'indi: %d\n", sum2);
    
    // har safar takrorlash...
}

Funksiya bilan

c
int qoshish(int a, int b) {
    return a + b;
}

int main(void) {
    printf("%d\n", qoshish(5, 3));
    printf("%d\n", qoshish(10, 7));
    printf("%d\n", qoshish(100, 200));
}

Foydalari:

  • DRY (Don't Repeat Yourself) — takrorlanish yo'q
  • Modular — bo'lakli
  • Test — alohida sinash mumkin
  • Reuse — boshqa joyda ishlatish

3. Funksiya tuzilmasi

c
return_type function_name(parameters) {
    // body
    return value;
}

Misol:

c
int qoshish(int a, int b) {
    int sum = a + b;
    return sum;
}

Qismlar:

QismTushuntirish
intReturn type — qaytaradigan tur
qoshishFunksiya nomi
(int a, int b)Parametrlar
{ ... }Body (kod)
return sum;Qiymat qaytarish

4. main funksiyasi

Har C dasturda main bor:

c
int main(void) {
    // dastur kodi
    return 0;
}
  • int — main 0 qaytaradi (success)
  • void — argument yo'q
  • return 0 — muvaffaqiyatli tugash

5. Funksiya yaratish — qadamlar

  1. Qaror qabul qilish — funksiya nima qiladi?
  2. Parametrlar — nima kerak?
  3. Return type — nima qaytaradi?
  4. Body — algoritm
  5. Test — sinash

6. Misol: Kvadrat funksiyasi

c
#include <stdio.h>

int square(int n) {
    return n * n;
}

int main(void) {
    printf("%d\n", square(5));   // 25
    printf("%d\n", square(10));  // 100
    printf("%d\n", square(7));   // 49
    return 0;
}

7. Bir nechta funksiya

c
#include <stdio.h>

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

int ayirish(int a, int b) {
    return a - b;
}

int kopaytirish(int a, int b) {
    return a * b;
}

int bolish(int a, int b) {
    if (b == 0) {
        printf("Xato: nolga bo'lish\n");
        return 0;
    }
    return a / b;
}

int main(void) {
    int a = 10, b = 3;
    
    printf("Yig'indi: %d\n", qoshish(a, b));
    printf("Ayirma: %d\n", ayirish(a, b));
    printf("Ko'paytma: %d\n", kopaytirish(a, b));
    printf("Bo'linma: %d\n", bolish(a, b));
    
    return 0;
}

8. void funksiyalar

Hech narsa qaytarmaydigan funksiya:

c
void salomlash(void) {
    printf("Salom!\n");
}

void chiqar_qator(int n) {
    for (int i = 0; i < n; i++) {
        printf("%d ", i);
    }
    printf("\n");
}

int main(void) {
    salomlash();          // Salom!
    chiqar_qator(5);      // 0 1 2 3 4
    return 0;
}

void — return yo'q.

9. void parameter

c
void salomlash(void) {
    // parameter yo'q
}

void parameter — funksiya hech qanday argument olmaydi.

Aslida void yozish majburiy emas, lekin C uslubida yaxshi:

c
void salomlash() { ... }      // OK
void salomlash(void) { ... }  // Yaxshiroq

10. Funksiyani chaqirish

c
int sum = qoshish(5, 3);
  • qoshish — funksiya nomi
  • (5, 3)arguments (argumentlar)
  • Qiymat — natija

Argument vs Parameter

c
int qoshish(int a, int b) {  // a va b — parameterlar
    return a + b;
}

qoshish(5, 3);  // 5 va 3 — argumentlar

11. Function prototype

c
#include <stdio.h>

// Prototype — funksiya qayerda yozilishini e'lon qilish
int qoshish(int a, int b);

int main(void) {
    printf("%d\n", qoshish(5, 3));
    return 0;
}

// Funksiya tanasi (main'dan keyin)
int qoshish(int a, int b) {
    return a + b;
}

Nima uchun prototype?

C tartibga bog'liq. Funksiya main'dan keyin yozilsa — prototype kerak.

Yoki funksiyalarni main'dan oldin yozing — prototype shart emas.

12. Return — qaytarish

c
int kattaroq(int a, int b) {
    if (a > b) {
        return a;  // funksiya shu yerda tugaydi
    }
    return b;
}

return — funksiya tugaydi va qiymat qaytaradi.

Bir nechta return

c
int absolute(int n) {
    if (n < 0) {
        return -n;
    }
    return n;
}

Void return

c
void chiqar(int n) {
    if (n < 0) {
        printf("Manfiy raqam\n");
        return;  // qiymat yo'q, lekin funksiya tugaydi
    }
    printf("Musbat: %d\n", n);
}

13. Misol: Faktorial funksiya

c
#include <stdio.h>

long factorial(int n) {
    long result = 1;
    for (int i = 1; i <= n; i++) {
        result *= i;
    }
    return result;
}

int main(void) {
    for (int n = 0; n <= 10; n++) {
        printf("%d! = %ld\n", n, factorial(n));
    }
    return 0;
}

14. Misol: Tub son tekshirish

c
#include <stdio.h>

int is_prime(int n) {
    if (n < 2) return 0;
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) return 0;
    }
    return 1;
}

int main(void) {
    printf("1 dan 30 gacha tub sonlar:\n");
    for (int i = 2; i <= 30; i++) {
        if (is_prime(i)) {
            printf("%d ", i);
        }
    }
    printf("\n");
    return 0;
}

is_prime1 (true) yoki 0 (false) qaytaradi.

15. Funksiyalar bir-birini chaqiradi

c
#include <stdio.h>

int square(int n) {
    return n * n;
}

int sum_of_squares(int a, int b) {
    return square(a) + square(b);
}

int main(void) {
    printf("%d\n", sum_of_squares(3, 4));  // 9 + 16 = 25
    return 0;
}

sum_of_squares — ichida square chaqiradi.

16. Misol: Yoshni hisoblash

c
#include <stdio.h>

int yosh(int tugilgan_yil, int hozirgi_yil) {
    return hozirgi_yil - tugilgan_yil;
}

int kun_soni(int yosh) {
    return yosh * 365;
}

int main(void) {
    int x = yosh(2005, 2026);
    int kun = kun_soni(x);
    
    printf("Yosh: %d\n", x);
    printf("Kunlar: %d\n", kun);
    
    return 0;
}

17. Misol: Geometrik shakllar

c
#include <stdio.h>

const double PI = 3.14159;

double circle_area(double r) {
    return PI * r * r;
}

double circle_perimeter(double r) {
    return 2 * PI * r;
}

double rectangle_area(double w, double h) {
    return w * h;
}

double triangle_area(double base, double height) {
    return 0.5 * base * height;
}

int main(void) {
    printf("Doira (r=5):\n");
    printf("  Yuzasi: %.2f\n", circle_area(5));
    printf("  Perimetri: %.2f\n", circle_perimeter(5));
    
    printf("To'rtburchak (4x6):\n");
    printf("  Yuzasi: %.2f\n", rectangle_area(4, 6));
    
    printf("Uchburchak (base=6, height=4):\n");
    printf("  Yuzasi: %.2f\n", triangle_area(6, 4));
    
    return 0;
}

18. Naming conventions

c
// Yaxshi
int qoshish(int a, int b)
double circle_area(double r)
int is_prime(int n)
void print_menu(void)

// Yomon
int qoshish_func()
int f()
int Add()
int compute_the_sum_of_two_numbers()

Qoidalar:

  • snake_case (C standart)
  • Aniq nom — nima qiladi
  • Qisqa — uzun emas
  • Verb bilan boshlash (ish ko'rsatadi)

19. Yaxshi funksiya qoidalari

Funksiya

  1. Bitta vazifa qiladi (Single Responsibility)
  2. Qisqa — 20–30 qator
  3. Aniq nom
  4. Comment kerak bo'lsa
  5. 3-4 dan ko'p parameter yo'q
  6. Side effect'sizroq (faqat olib, qaytaradi)

Yomon funksiya

c
int hammasi(int a, int b, int c, int d, int e, int f) {
    // 100 qator kod
    // 5 ta vazifani bajaradi
    // Global o'zgaruvchilarni o'zgartiradi
    // Faylga yozadi
}

Yaxshi funksiya

c
int qoshish(int a, int b) {
    return a + b;
}

int kvadrat(int n) {
    return n * n;
}

20. Common pitfalls

1. Return unutish

c
int qoshish(int a, int b) {
    int sum = a + b;
    // return yo'q!
}

Kompiler warning beradi, lekin kompilyatsiya qiladi. Natija — noma'lum.

2. Return type to'g'rimas

c
int doira_yuzasi(int r) {
    return 3.14 * r * r;  // float, lekin int qaytaradi
}

doira_yuzasi(5);  // 78 (78.5 emas — kasr tashlanadi!)

To'g'ri:

c
double doira_yuzasi(double r) {
    return 3.14 * r * r;
}

3. Parameter ko'paytirish

c
int f(int a, int b, int c, int d, int e, int f, int g) { ... }

Ko'p parameter — qiyin. Structlar ishlatish kerak (kelajakdagi mavzu).

4. Prototype yo'q

c
int main(void) {
    qoshish(5, 3);  // qoshish hali e'lon qilinmagan!
    return 0;
}

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

Kompiler xato beradi. Prototype qo'shing yoki funksiyani main'dan oldin yozing.

Darsdagi topshiriqlar

Topshiriq 1 — Asosiy funksiyalar

functions.c:

c
#include <stdio.h>

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

int ayirish(int a, int b) {
    return a - b;
}

int kopaytirish(int a, int b) {
    return a * b;
}

int main(void) {
    printf("5 + 3 = %d\n", qoshish(5, 3));
    printf("10 - 4 = %d\n", ayirish(10, 4));
    printf("6 * 7 = %d\n", kopaytirish(6, 7));
    return 0;
}

Topshiriq 2 — Geometrik shakllar

shapes.c — Dars matni'da berilgan to'liq versiyani yarating.

Quyidagi shakllar uchun yuzasi:

  • Doira
  • To'rtburchak
  • Uchburchak
  • Trapesiya ((a+b)*h/2)
  • Romb (d1*d2/2)

Har biri uchun alohida funksiya.

Topshiriq 3 — Eng katta / eng kichik

max-min.c:

c
#include <stdio.h>

int max(int a, int b) {
    return (a > b) ? a : b;
}

int min(int a, int b) {
    return (a < b) ? a : b;
}

int max3(int a, int b, int c) {
    return max(max(a, b), c);
}

int min3(int a, int b, int c) {
    return min(min(a, b), c);
}

int main(void) {
    printf("Max(5, 10): %d\n", max(5, 10));
    printf("Min(5, 10): %d\n", min(5, 10));
    printf("Max(7, 2, 9): %d\n", max3(7, 2, 9));
    printf("Min(7, 2, 9): %d\n", min3(7, 2, 9));
    return 0;
}

Topshiriq 4 — Faktorial va Fibonacci

fact-fib.c:

c
#include <stdio.h>

long factorial(int n) {
    long result = 1;
    for (int i = 1; i <= n; i++) {
        result *= i;
    }
    return result;
}

long fibonacci(int n) {
    if (n < 2) return n;
    long a = 0, b = 1;
    for (int i = 2; i <= n; i++) {
        long c = a + b;
        a = b;
        b = c;
    }
    return b;
}

int main(void) {
    for (int i = 0; i <= 10; i++) {
        printf("F(%d) = %ld, Fib(%d) = %ld\n", 
               i, factorial(i), i, fibonacci(i));
    }
    return 0;
}

Topshiriq 5 — Tub son

prime-fn.c:

c
#include <stdio.h>

int is_prime(int n) {
    if (n < 2) return 0;
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) return 0;
    }
    return 1;
}

int count_primes(int max) {
    int count = 0;
    for (int i = 2; i <= max; i++) {
        if (is_prime(i)) count++;
    }
    return count;
}

void print_primes(int max) {
    for (int i = 2; i <= max; i++) {
        if (is_prime(i)) printf("%d ", i);
    }
    printf("\n");
}

int main(void) {
    printf("100 gacha tub sonlar:\n");
    print_primes(100);
    
    printf("100 gacha tub sonlar soni: %d\n", count_primes(100));
    printf("1000 gacha tub sonlar soni: %d\n", count_primes(1000));
    
    return 0;
}

Topshiriq 6 — Temperature converter

temp.c:

c
#include <stdio.h>

double celsius_to_fahrenheit(double c) {
    return c * 9.0 / 5.0 + 32;
}

double fahrenheit_to_celsius(double f) {
    return (f - 32) * 5.0 / 9.0;
}

double celsius_to_kelvin(double c) {
    return c + 273.15;
}

int main(void) {
    printf("0°C = %.1f°F\n", celsius_to_fahrenheit(0));
    printf("100°C = %.1f°F\n", celsius_to_fahrenheit(100));
    printf("32°F = %.1f°C\n", fahrenheit_to_celsius(32));
    printf("212°F = %.1f°C\n", fahrenheit_to_celsius(212));
    printf("0°C = %.2f K\n", celsius_to_kelvin(0));
    
    return 0;
}

Topshiriq 7 — Number utilities

utils.c — bir nechta foydali funksiya:

c
#include <stdio.h>

int absolute(int n) {
    return (n < 0) ? -n : n;
}

int is_even(int n) {
    return n % 2 == 0;
}

int sum_digits(int n) {
    int sum = 0;
    n = absolute(n);
    while (n > 0) {
        sum += n % 10;
        n /= 10;
    }
    return sum;
}

int count_digits(int n) {
    if (n == 0) return 1;
    int count = 0;
    n = absolute(n);
    while (n > 0) {
        count++;
        n /= 10;
    }
    return count;
}

int reverse_number(int n) {
    int result = 0;
    int sign = (n < 0) ? -1 : 1;
    n = absolute(n);
    while (n > 0) {
        result = result * 10 + n % 10;
        n /= 10;
    }
    return result * sign;
}

int main(void) {
    int n = -12345;
    
    printf("Raqam: %d\n", n);
    printf("Mutlaq: %d\n", absolute(n));
    printf("Juftmi: %d\n", is_even(absolute(n)));
    printf("Raqamlar yig'indisi: %d\n", sum_digits(n));
    printf("Raqamlar soni: %d\n", count_digits(n));
    printf("Teskari: %d\n", reverse_number(n));
    
    return 0;
}

Topshiriq 8 — Power funksiyasi

power.cpow o'rniga o'zingiznikini yozing:

c
#include <stdio.h>

double my_pow(double base, int exp) {
    if (exp == 0) return 1;
    
    double result = 1;
    int positive_exp = (exp < 0) ? -exp : exp;
    
    for (int i = 0; i < positive_exp; i++) {
        result *= base;
    }
    
    return (exp < 0) ? 1 / result : result;
}

int main(void) {
    printf("2^10 = %.0f\n", my_pow(2, 10));
    printf("3^4 = %.0f\n", my_pow(3, 4));
    printf("2^-3 = %f\n", my_pow(2, -3));
    printf("5^0 = %.0f\n", my_pow(5, 0));
    return 0;
}

Topshiriq 9 — Print funksiyalari

print-helpers.c:

c
#include <stdio.h>

void print_line(int length, char c) {
    for (int i = 0; i < length; i++) {
        putchar(c);
    }
    putchar('\n');
}

void print_box(int width, int height) {
    for (int i = 0; i < height; i++) {
        for (int j = 0; j < width; j++) {
            printf("* ");
        }
        printf("\n");
    }
}

void print_header(const char *title) {
    print_line(30, '=');
    printf("  %s\n", title);
    print_line(30, '=');
}

int main(void) {
    print_header("Mening dasturim");
    print_line(20, '-');
    print_box(5, 3);
    print_line(40, '*');
    
    return 0;
}

Topshiriq 10 — GitHub'ga

bash
$ cd ~/c-darslari
$ mkdir 4-oy-dars-7
$ # fayllarni shu joyga
$ git add .
$ git commit -m "feat: dars 7 - functions"
$ git push

Asosiy tushunchalar (lug'at)

TerminQisqacha izoh
FunctionQayta ishlatish kod bloki
Return typeQaytaradigan tur
ParameterFunksiya kiruvchi
ArgumentChaqirayotgan qiymat
ReturnQiymat qaytarish
voidBo'sh, qiymat yo'q
PrototypeFunksiya e'lon (oldindan)
main()Asosiy funksiya
DRYDon't Repeat Yourself
Single ResponsibilityBir funksiya — bir vazifa
Function callFunksiyani chaqirish
Side effectFunksiyaning tashqi holatni o'zgartirishi

Keyingi dars

8-dars: Funksiyalar — parameter va scope →

Master IT o'quv markazi — o'qitish rejasi