9-dars: Input/Output — scanf, printf, va boshqalar
Dars haqida
Davomiyligi: 90 daqiqa Maqsad: Talaba foydalanuvchidan ma'lumot olishi (scanf, getchar), formatlangan chiqarish (printf) va interaktiv dasturlar yozishi kerak.
1. Interaktiv dastur
Foydalanuvchi bilan suhbatlashuvchi dastur:
#include <stdio.h>
int main(void) {
int yosh;
printf("Yoshingiz: ");
scanf("%d", &yosh);
printf("Sizning yoshingiz %d\n", yosh);
return 0;
}Ishga tushiring:
Yoshingiz: 25
Sizning yoshingiz 252. printf — chiqarish
Oldingi darslarda ko'rganmiz. Asosiy format specifiers:
printf("%d", x); // int
printf("%f", x); // float
printf("%lf", x); // double
printf("%c", x); // char
printf("%s", x); // string3. scanf — kirish
scanf("%d", &x);Diqqat:
%d— int uchun&x—xning manzili (&— address-of operator)
4. scanf format specifiers
| Format | Tur |
|---|---|
%d | int |
%f | float |
%lf | double |
%c | char |
%s | string (massiv) |
%u | unsigned int |
%ld | long |
%lld | long long |
%x | hex |
%o | octal |
5. Bir nechta o'zgaruvchi scanf
int a, b;
printf("Ikki raqam kiriting: ");
scanf("%d %d", &a, &b);
printf("Yig'indi: %d\n", a + b);Foydalanuvchi:
Ikki raqam kiriting: 5 3
Yig'indi: 86. scanf cheklovlari
scanf — qiyin
scanf — boshlovchilar uchun qiyin. Sabablari:
&ni unutish — keng tarqalgan xato- Buffer muammolari — \n qoladi
- Xato input — dastur muzlab qoladi
CS50'da get_int, get_string kabi maxsus funksiyalar ishlatiladi. Lekin standart C'da — scanf.
7. \n muammo — char bilan
int x;
char c;
scanf("%d", &x);
scanf("%c", &c); // \n qoladi!Yechim — bo'shliq qo'shish:
scanf("%d", &x);
scanf(" %c", &c); // bo'sh joy bilan8. To'liq misol: Yosh kalkulatori
#include <stdio.h>
int main(void) {
int tugilgan_yil;
int hozirgi_yil;
printf("Hozirgi yil: ");
scanf("%d", &hozirgi_yil);
printf("Tug'ilgan yil: ");
scanf("%d", &tugilgan_yil);
int yosh = hozirgi_yil - tugilgan_yil;
printf("Sizning yoshingiz: %d\n", yosh);
return 0;
}9. Misol: Kalkulyator
#include <stdio.h>
int main(void) {
double a, b;
char op;
printf("Birinchi raqam: ");
scanf("%lf", &a);
printf("Operator (+, -, *, /): ");
scanf(" %c", &op);
printf("Ikkinchi raqam: ");
scanf("%lf", &b);
double result;
switch (op) {
case '+': result = a + b; break;
case '-': result = a - b; break;
case '*': result = a * b; break;
case '/':
if (b == 0) {
printf("Xato: nolga bo'lib bo'lmaydi\n");
return 1;
}
result = a / b;
break;
default:
printf("Noma'lum operator\n");
return 1;
}
printf("%.2f %c %.2f = %.2f\n", a, op, b, result);
return 0;
}10. printf formatlash — batafsil
Maydon kengligi
printf("|%5d|", 42); // | 42|
printf("|%-5d|", 42); // |42 |
printf("|%05d|", 42); // |00042|Float formatlar
printf("|%10.2f|", 3.14); // | 3.14|
printf("|%-10.2f|", 3.14); // |3.14 |
printf("|%.0f|", 3.7); // |4| (yaxlitlanadi)Asosiy
printf("%d\n", 100); // 100
printf("%5d\n", 100); // " 100"
printf("%-5d\n", 100); // "100 "
printf("%05d\n", 100); // "00100"
printf("%f\n", 3.14159); // 3.141590
printf("%.2f\n", 3.14159); // 3.14
printf("%.5f\n", 3.14159); // 3.14159
printf("%10.2f\n", 3.14); // " 3.14"
printf("%s\n", "Akmal"); // Akmal
printf("%10s\n", "Akmal"); // " Akmal"
printf("%-10s|\n", "Akmal"); // "Akmal |"
printf("%c\n", 'A'); // A
printf("%x\n", 255); // ff
printf("%X\n", 255); // FF
printf("%o\n", 8); // 1011. Special characters in printf
printf("Tab:\tafter\n"); // Tab: after
printf("Newline:\nafter\n"); // Newline:\nafter
printf("Quote: \"text\"\n"); // Quote: "text"
printf("Backslash: \\\n"); // Backslash: \
printf("Percent: %%\n"); // Percent: %12. getchar va putchar
getchar() — bitta belgi olish. putchar(c) — bitta belgi chiqarish.
#include <stdio.h>
int main(void) {
printf("Bitta harf kiriting: ");
char c = getchar();
printf("Siz kiritdingiz: ");
putchar(c);
putchar('\n');
return 0;
}13. EOF — End Of File
getchar() fayl/input tugagan bo'lsa EOF qaytaradi.
int c; // diqqat: char emas, int — EOF qiymati uchun
while ((c = getchar()) != EOF) {
putchar(c);
}Terminal'da EOF:
- Mac/Linux:
Ctrl + D - Windows:
Ctrl + Z
14. gets va fgets
gets() — XAVFLI
gets() — eski funksiya, buffer overflow muammo. HECH QACHON ISHLATMANG.
Buning o'rniga — fgets() ishlatish.
#include <stdio.h>
int main(void) {
char name[100];
printf("Ismingiz: ");
fgets(name, sizeof(name), stdin);
printf("Salom, %s", name);
return 0;
}15. scanf %s ham xavfli
char name[10];
scanf("%s", name); // foydalanuvchi 100 belgi yozsa — buffer overflowTo'g'ri:
scanf("%9s", name); // maksimum 9 belgiYoki fgets:
fgets(name, sizeof(name), stdin);16. printf return value
printf — necha belgi chiqarganini qaytaradi:
int n = printf("Salom\n"); // n = 6 (5 harf + \n)scanf — qancha o'zgaruvchi muvaffaqiyatli o'qildi:
int x;
int result = scanf("%d", &x);
if (result != 1) {
printf("Xato input!\n");
}17. Input validation — tekshirish
#include <stdio.h>
int main(void) {
int yosh;
printf("Yoshingiz (0-120): ");
if (scanf("%d", &yosh) != 1) {
printf("Xato: raqam emas\n");
return 1;
}
if (yosh < 0 || yosh > 120) {
printf("Xato: yosh 0-120 oralig'ida bo'lishi kerak\n");
return 1;
}
printf("Yoshingiz: %d\n", yosh);
return 0;
}18. Loop bilan input
#include <stdio.h>
int main(void) {
int total = 0;
int n;
printf("Raqamlar kiriting (0 — tugatish):\n");
while (1) {
printf("Raqam: ");
scanf("%d", &n);
if (n == 0) break;
total += n;
}
printf("Yig'indi: %d\n", total);
return 0;
}19. Number Guessing Game
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
srand(time(NULL));
int secret = rand() % 100 + 1;
int guess;
int attempts = 0;
printf("=== Raqam topish o'yini ===\n");
printf("1-100 oralig'idagi raqamni toping!\n\n");
do {
printf("Sizning taxminingiz: ");
scanf("%d", &guess);
attempts++;
if (guess > secret) {
printf("Pastroq!\n");
} else if (guess < secret) {
printf("Balandroq!\n");
} else {
printf("\n🎉 TOPDINGIZ!\n");
printf("Urinishlar: %d\n", attempts);
}
} while (guess != secret);
return 0;
}20. Misol: Talabalar reytingi
#include <stdio.h>
int main(void) {
int n;
printf("Talabalar soni: ");
scanf("%d", &n);
if (n <= 0 || n > 100) {
printf("Xato: 1-100 oralig'ida\n");
return 1;
}
int sum = 0;
int max = 0;
int min = 100;
int passed = 0;
for (int i = 1; i <= n; i++) {
int ball;
printf("Talaba %d bali: ", i);
scanf("%d", &ball);
sum += ball;
if (ball > max) max = ball;
if (ball < min) min = ball;
if (ball >= 60) passed++;
}
double avg = (double)sum / n;
double pass_rate = (double)passed / n * 100;
printf("\n=== Statistika ===\n");
printf("Talabalar: %d\n", n);
printf("Jami: %d\n", sum);
printf("O'rtacha: %.2f\n", avg);
printf("Eng yuqori: %d\n", max);
printf("Eng past: %d\n", min);
printf("O'tganlar: %d (%.1f%%)\n", passed, pass_rate);
return 0;
}Darsdagi topshiriqlar
Topshiriq 1 — Tanishuv
tanishuv.c:
#include <stdio.h>
int main(void) {
char ism[100];
int yosh;
char shahar[100];
printf("Ismingiz: ");
scanf("%s", ism);
printf("Yoshingiz: ");
scanf("%d", &yosh);
printf("Shahringiz: ");
scanf("%s", shahar);
printf("\nSalom, %s!\n", ism);
printf("Sen %d yoshda ekansan va %s'da yashaysan.\n", yosh, shahar);
return 0;
}Topshiriq 2 — Kalkulyator
Dars matni'da berilgan to'liq kalkulyatorni yozing.
Bonus: % operatori (qoldiq) ham qo'shing (faqat int uchun).
Saqlang: 2-calc.c
Topshiriq 3 — Yosh va kun
yosh.c:
#include <stdio.h>
int main(void) {
int hozirgi_yil, tugilgan_yil;
printf("Hozirgi yil: ");
scanf("%d", &hozirgi_yil);
printf("Tug'ilgan yil: ");
scanf("%d", &tugilgan_yil);
int yosh = hozirgi_yil - tugilgan_yil;
int kun = yosh * 365;
int soat = kun * 24;
long daqiqa = (long)soat * 60;
long sekund = daqiqa * 60;
printf("\nSiz haqida:\n");
printf("Yoshingiz: %d yil\n", yosh);
printf("Kunlar: %d\n", kun);
printf("Soatlar: %d\n", soat);
printf("Daqiqalar: %ld\n", daqiqa);
printf("Sekundlar: %ld\n", sekund);
return 0;
}Topshiriq 4 — Mahsulot narxi
narx.c — chegirma bilan:
#include <stdio.h>
int main(void) {
double narx;
int chegirma;
printf("Mahsulot narxi: ");
scanf("%lf", &narx);
printf("Chegirma foizi (0-100): ");
scanf("%d", &chegirma);
if (chegirma < 0 || chegirma > 100) {
printf("Noto'g'ri chegirma\n");
return 1;
}
double chegirma_summa = narx * chegirma / 100.0;
double yangi_narx = narx - chegirma_summa;
printf("\nAsl narx: %.2f\n", narx);
printf("Chegirma: %.2f (%d%%)\n", chegirma_summa, chegirma);
printf("Yangi narx: %.2f\n", yangi_narx);
return 0;
}Topshiriq 5 — Number guessing
Dars matnidagi raqam topish o'yinini yarating va sinab ko'ring.
Yaxshilang:
- Difficulty (oson — 1-50, qiyin — 1-1000)
- Maksimum urinish soni
- High score saqlash (oxirgi raund)
Saqlang: 5-game.c
Topshiriq 6 — Talabalar reytingi
Dars matnidagi to'liq reyting dasturini yarating.
Bonus:
- Foydalanuvchi har talaba ismini ham bersin
- Eng yuqori va eng past balli talabalar ismini ko'rsating
- Qaytadan ishga tushirsa bo'lsin (loop bilan)
Topshiriq 7 — Menyu interfeysi
menu.c:
#include <stdio.h>
int main(void) {
int tanlov;
do {
printf("\n=== MENU ===\n");
printf("1. Kalkulyator\n");
printf("2. Yoshini hisoblash\n");
printf("3. Raqam topish o'yini\n");
printf("4. Chegirma hisobi\n");
printf("5. Chiqish\n");
printf("Tanlov: ");
scanf("%d", &tanlov);
switch (tanlov) {
case 1:
printf("Kalkulyator ishlamoqda...\n");
// shu yerga kalkulyator kodi
break;
case 2:
printf("Yoshini hisoblash...\n");
break;
case 3:
printf("O'yin boshlanmoqda...\n");
break;
case 4:
printf("Chegirma hisobi...\n");
break;
case 5:
printf("Xayr!\n");
break;
default:
printf("Noma'lum tanlov\n");
}
} while (tanlov != 5);
return 0;
}Har case ichida real funksionallikni qo'shing.
Topshiriq 8 — printf formatlash
format-mashq.c:
#include <stdio.h>
int main(void) {
printf("|%10s|%10s|%10s|\n", "Mahsulot", "Soni", "Narx");
printf("|%10s|%10s|%10s|\n", "----------", "----------", "----------");
printf("|%10s|%10d|%10.2f|\n", "Non", 5, 25000.0);
printf("|%10s|%10d|%10.2f|\n", "Sut", 2, 24000.5);
printf("|%10s|%10d|%10.2f|\n", "Yog'", 1, 45000.0);
printf("|%10s|%10s|%10.2f|\n", "JAMI:", "", 94000.5);
return 0;
}Natija:
| Mahsulot| Soni| Narx|
|----------|----------|----------|
| Non| 5| 25000.00|
| Sut| 2| 24000.50|
| Yog'| 1| 45000.00|
| JAMI:| | 94000.50|Topshiriq 9 — getchar va putchar
echo.c — foydalanuvchi yozgan har belgini takrorlash:
#include <stdio.h>
int main(void) {
int c;
printf("Matn yozing (Ctrl+D yoki Ctrl+Z bilan tugating):\n");
while ((c = getchar()) != EOF) {
putchar(c);
}
return 0;
}Bonus — har harfni katta qiling:
if (c >= 'a' && c <= 'z') {
c = c - 'a' + 'A';
}
putchar(c);Topshiriq 10 — GitHub'ga
$ cd ~/c-darslari
$ mkdir 4-oy-dars-9
$ # fayllarni shu joyga
$ git add .
$ git commit -m "feat: dars 9 - input/output"
$ git pushAsosiy tushunchalar (lug'at)
| Termin | Qisqacha izoh |
|---|---|
| printf | Formatlangan chiqarish |
| scanf | Formatlangan kirish |
| &x | x ning manzili |
| getchar() | Bitta belgi olish |
| putchar() | Bitta belgi chiqarish |
| fgets() | Qator olish (xavfsiz) |
| gets() | Eski va xavfli — ishlatmang |
| EOF | End Of File |
| %d, %f, %c, %s | Format specifiers |
| %5d, %.2f | Width va precision |
| Input validation | Kirish tekshiruvi |
| Buffer overflow | Xotira oshib ketishi |