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.
int qoshish(int a, int b) {
return a + b;
}
// Chaqirish
int natija = qoshish(5, 3); // 82. Nima uchun funksiya?
Funksiyasiz
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
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
return_type function_name(parameters) {
// body
return value;
}Misol:
int qoshish(int a, int b) {
int sum = a + b;
return sum;
}Qismlar:
| Qism | Tushuntirish |
|---|---|
int | Return type — qaytaradigan tur |
qoshish | Funksiya nomi |
(int a, int b) | Parametrlar |
{ ... } | Body (kod) |
return sum; | Qiymat qaytarish |
4. main funksiyasi
Har C dasturda main bor:
int main(void) {
// dastur kodi
return 0;
}int— main 0 qaytaradi (success)void— argument yo'qreturn 0— muvaffaqiyatli tugash
5. Funksiya yaratish — qadamlar
- Qaror qabul qilish — funksiya nima qiladi?
- Parametrlar — nima kerak?
- Return type — nima qaytaradi?
- Body — algoritm
- Test — sinash
6. Misol: Kvadrat funksiyasi
#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
#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:
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
void salomlash(void) {
// parameter yo'q
}void parameter — funksiya hech qanday argument olmaydi.
Aslida void yozish majburiy emas, lekin C uslubida yaxshi:
void salomlash() { ... } // OK
void salomlash(void) { ... } // Yaxshiroq10. Funksiyani chaqirish
int sum = qoshish(5, 3);qoshish— funksiya nomi(5, 3)— arguments (argumentlar)- Qiymat — natija
Argument vs Parameter
int qoshish(int a, int b) { // a va b — parameterlar
return a + b;
}
qoshish(5, 3); // 5 va 3 — argumentlar11. Function prototype
#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
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
int absolute(int n) {
if (n < 0) {
return -n;
}
return n;
}Void return
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
#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
#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_prime — 1 (true) yoki 0 (false) qaytaradi.
15. Funksiyalar bir-birini chaqiradi
#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
#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
#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
// 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
- Bitta vazifa qiladi (Single Responsibility)
- Qisqa — 20–30 qator
- Aniq nom
- Comment kerak bo'lsa
- 3-4 dan ko'p parameter yo'q
- Side effect'sizroq (faqat olib, qaytaradi)
Yomon funksiya
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
int qoshish(int a, int b) {
return a + b;
}
int kvadrat(int n) {
return n * n;
}20. Common pitfalls
1. Return unutish
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
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:
double doira_yuzasi(double r) {
return 3.14 * r * r;
}3. Parameter ko'paytirish
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
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:
#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:
#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:
#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:
#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:
#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:
#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.c — pow o'rniga o'zingiznikini yozing:
#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:
#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
$ cd ~/c-darslari
$ mkdir 4-oy-dars-7
$ # fayllarni shu joyga
$ git add .
$ git commit -m "feat: dars 7 - functions"
$ git pushAsosiy tushunchalar (lug'at)
| Termin | Qisqacha izoh |
|---|---|
| Function | Qayta ishlatish kod bloki |
| Return type | Qaytaradigan tur |
| Parameter | Funksiya kiruvchi |
| Argument | Chaqirayotgan qiymat |
| Return | Qiymat qaytarish |
| void | Bo'sh, qiymat yo'q |
| Prototype | Funksiya e'lon (oldindan) |
| main() | Asosiy funksiya |
| DRY | Don't Repeat Yourself |
| Single Responsibility | Bir funksiya — bir vazifa |
| Function call | Funksiyani chaqirish |
| Side effect | Funksiyaning tashqi holatni o'zgartirishi |