4-hafta · Foundation

Massivlar va satrlar

O'tgan haftada bitta o'zgaruvchi bitta qiymatni saqlardi. Endi bir nechta qiymatni bitta nom ostida saqlashni o'rganamiz, ya'ni massivlarni. So'ng satrlarni ko'ramiz: C da satr aslida harflarning massivi. Har bir g'oyani jonli massiv vizualizatori va IDE uslubidagi kod izlagichda bosqichma-bosqich ko'rib chiqamiz.

Bu darsda nimani o'rganasiz

Massiv yaratib, ko'p qiymatni bitta nom ostida saqlaysiz
Indeks orqali har bir elementga murojaat qilasiz, 0 dan boshlab
Sikl bilan butun massiv bo'ylab yurib, yig'indi va o'rtachani hisoblaysiz
Satr aslida char massivi ekanini va null terminator (\0) ni tushunasiz
strlen bilan satr uzunligini hisoblaysiz
Satr belgilarini birma-bir aylanib, ularni o'zgartirasiz

4.1 Massiv nima?

Tasavvur qiling, bir sinfdagi 5 o'quvchining bahosini saqlashingiz kerak. O'tgan haftadagi bilim bilan beshta alohida o'zgaruvchi yozgan bo'lardingiz: ball1, ball2, ball3 va hokazo. 5 ta uchun chidasa bo'ladi, lekin 30 yoki 100 o'quvchi bo'lsa-chi?

Aynan shu muammoni massiv (array) hal qiladi. Massiv deganda bir xil turdagi bir nechta qiymatni bitta nom ostida saqlash tushuniladi. Beshta baho endi bitta ballar nomi ostida, yonma-yon turadi:

ballar.c
1// 5 ta alohida o'zgaruvchi o'rniga
2int ballar[5] = {90, 85, 70, 88, 95};

Bitta qatorda beshta baho saqlandi. Ularning hammasi bir joyda, tartib bilan turadi va biz ularni sikl bilan oson aylanib chiqishimiz mumkin. Massivning ikkita asosiy xususiyati bor:

  • Hamma elementlar bir xil turda bo'ladi, masalan hammasi int
  • Element soni oldindan belgilanadi va keyin o'zgarmaydi, bu yerda 5 ta
Massivni xotiradagi quticha qatori deb tasavvur qiling: yonma-yon turgan teng kataklar, har birida bitta qiymat. Bu qator Scratchdagi ro'yxat (list) bilan deyarli bir xil g'oya.

4.2 Yaratish va indeks

Massivni yaratganda kvadrat qavs ichida nechta element borligini, jingalak qavs ichida esa qiymatlarni yozamiz. Endi eng muhim g'oya: har bir elementning o'z indeksi (raqami) bor, va sanoq 1 dan emas, 0 dan boshlanadi.

Demak 5 elementli massivda indekslar 0, 1, 2, 3, 4 bo'ladi. Birinchi element ballar[0], oxirgisi esa ballar[4]. Pastdagi katakni bosib ko'ring:

Massiv vizualizatori katakni bosing
Yuqoridagi kataklardan birini bosing: uning indeksi va qiymatini ko'rasiz.
Indeks 0 dan boshlangani uchun oxirgi indeks doim uzunlik minus bir ga teng. 5 elementli massivda oxirgi indeks 4. Agar ballar[5] deb yozsangiz, massiv chegarasidan chiqib ketasiz, bu jiddiy xato hisoblanadi.

4.3 O'qish va o'zgartirish

Indeks yordamida har bir katakni alohida o'qishimiz yoki o'zgartirishimiz mumkin. O'qish uchun shunchaki indeksni yozamiz, o'zgartirish uchun esa unga yangi qiymat beramiz:

main.c
1int x = ballar[1]; // o'qish: x endi 85
2ballar[1] = 100; // o'zgartirish: 85 o'rniga 100

Pastda indeksni tanlang, yangi qiymat kiriting va O'rnat tugmasini bosing. Faqat tanlangan katak o'zgaradi:

Element o'zgartirgich indeks tanlang
ballar[
] =
amal.c
1ballar[0] = 100;
Indeksni tanlang, qiymat kiriting va «O'rnat» tugmasini bosing.

4.4 Massiv bo'ylab sikl

Massivning asl kuchi sikl bilan birga ochiladi. Har bir elementni qo'lda yozish o'rniga, for sikli bilan indeksni 0 dan oxirigacha o'tkazamiz va har bir katakka navbatma-navbat murojaat qilamiz. Quyidagi dastur barcha bahalarni qo'shib, yig'indini chiqaradi.

Uni qadamlab yuriting: sariq chiziq joriy qatorni, yashil katak esa shu qadamda o'qilayotgan elementni ko'rsatadi.

Kod izlagich (debugger) qadamlab yuriting
ballar.c
terminal

Yig'indi 428 chiqdi. O'rtachani topish uchun shuni element soniga bo'lamiz: 428 / 5. Xuddi shu naqsh bilan eng katta, eng kichik yoki nechtasi o'tganini ham sanay olamiz.

Bashorat qiling

Bu dastur terminalga nima chiqaradi?

main.c
1int a[4] = {2, 4, 6, 8};
2printf("%d", a[1] + a[3]);
10
12
6

4.5 Satrlar (string)

Endi harflarga o'tamiz. O'tgan haftada char turi bitta harfni saqlashini ko'rgandik. Lekin so'z, ism yoki gap ko'p harfdan iborat. Bularni saqlash uchun satr (string) ishlatamiz.

Eng muhim g'oya shu: C da satr aslida char larning massivi. Ya'ni satr ham xuddi massiv kabi, faqat ichida sonlar emas, harflar turadi. Har bir harfning o'z indeksi bor, va sanoq yana 0 dan boshlanadi:

ism.c
1char ism[] = "Ali";
2printf("%s\n", ism); // %s satr uchun

So'z yozing va uning har bir harfi qaysi indeksda turishini ko'ring:

Satr vizualizatori so'z yozing
char so'z[] =

4.6 Null terminator (\0)

Bu yerda C ning bir nozik, lekin juda muhim qoidasi bor. Kompyuter satr xotirada qayerda tugashini qanday biladi? Buning uchun C har bir satr oxiriga ko'rinmas maxsus belgi qo'yadi: null terminator, ya'ni \0. U «satr shu yerda tugadi» degan ma'noni bildiradi.

Demak "Ali" uchta harf bo'lsa ham, xotirada to'rtta katak egallaydi: A, l, i va oxirida \0. Pastda so'z yozing, oxiridagi \0 katagiga e'tibor bering:

Null terminator vizualizatori so'z yozing
char ism[] =
Shuning uchun n harfli so'z uchun kamida n plus 1 ta katak kerak. Agar massivni o'zingiz o'lchab yaratsangiz, \0 uchun joy qoldirishni unutmang. Tirnoq orasiga "Ali" deb yozsangiz, C buni avtomatik bajaradi.

4.7 strlen: satr uzunligi

Ko'pincha satr nechta harfdan iboratligini bilishimiz kerak. Buni qo'lda sanab o'tirmaymiz, tayyor funksiya bor: strlen (string length, ya'ni satr uzunligi). U satr boshidan yurib, harflarni sanaydi va \0 ga yetganda to'xtaydi.

Bu funksiya string.h kutubxonasida turadi, shuning uchun dastur boshida #include <string.h> yozish kerak. Pastda so'z yozing va Hisobla tugmasini bosing, strlen qanday sanashini kuzating:

strlen sanagich Hisobla
uzunlik: 0
Diqqat: strlen faqat haqiqiy harflarni sanaydi, \0 ni hisobga olmaydi. Shuning uchun strlen("Ali") natijasi 3, garchi xotirada 4 ta katak bo'lsa ham.

4.8 Belgilarni aylanish

Satr massiv bo'lgani uchun, uni ham sikl bilan aylanib chiqishimiz mumkin. Lekin bu yerda chiroyli usul bor: uzunlikni oldindan bilishimiz shart emas, shunchaki \0 ga yetguncha yuramiz. Sikl sharti aynan shuni tekshiradi: ism[i] != '\0'.

Misol uchun, har bir kichik harfni katta harfga aylantiramiz. ASCII jadvalida kichik 'a' raqami 97, katta 'A' esa 65, ya'ni orasidagi farq 32. Demak kichik harfdan 32 ni ayirsak, katta harf chiqadi. Bajar tugmasini bosing:

Katta harfga aylantirish Bajar
terminal

4.9 Amaliy: eng katta elementni topish

Bu massivlar bilan eng tez-tez uchraydigan vazifalardan biri, va u keyingi hafta o'rganadigan algoritmlarga ko'prik bo'ladi. G'oya oddiy: birinchi elementni vaqtincha «eng katta» deb olamiz, so'ng qolganlarini birma-bir ko'rib, kattaroq topsak, «eng katta»ni yangilaymiz.

Pastda yashil katak hozirgi eng kattani, ko'k katak esa tekshirilayotgan elementni bildiradi. Keyingi qadam tugmasi bilan yuring:

Eng katta element izlagichi qadamlang
eng_katta.c
1int max = ballar[0];
2for (int i = 1; i < 5; i++)
3 if (ballar[i] > max)
4 max = ballar[i];

4.10 Chuqurroq advanced

Massiv va satr asoslarini egalladingiz. Endi yana ikkita kengaytmaga qisqacha qaraymiz: bularni hozir to'liq o'rganish shart emas, faqat tasavvur bo'lsa kifoya.

Ikki o'lchamli massiv (matritsa)

Massivni qator deb tasavvur qilgan edik. Agar kataklar nafaqat qator, balki ustun bo'ylab ham joylashsa, ikki o'lchamli massiv hosil bo'ladi: bu jadval yoki matritsa. Masalan shaxmat taxtasi yoki Excel varag'i shunday.

jadval.c
1int jadval[2][3] = {
2 {1, 2, 3}, // 0-qator
3 {4, 5, 6} // 1-qator
4};
5printf("%d\n", jadval[1][2]); // 6

Endi element ikkita indeks bilan olinadi: jadval[qator][ustun]. Yuqorida jadval[1][2] 1-qator, 2-ustundagi qiymatni, ya'ni 6 ni beradi.

Satrlar massivi

Satr char massivi bo'lgani kabi, bir nechta satrni ham bitta massivga yig'ish mumkin. Bu, masalan, hafta kunlari yoki ismlar ro'yxatini saqlash uchun qulay:

kunlar.c
1char *kunlar[] = {"Du", "Se", "Cho"};
2printf("%s\n", kunlar[0]); // Du
Yuqoridagi * belgisi pointer, ya'ni ko'rsatkichni bildiradi. U xotiradagi manzil bilan ishlaydi va biz uni keyingi haftalarda alohida chuqur o'rganamiz. Hozircha buni «har bir katakda bitta satr turibdi» deb tushunsangiz yetarli.

Atamalar lug'ati

massivbir xil turdagi qiymatlar to'plami, bitta nom ostida.
indekselement raqami, 0 dan boshlanadi.
elementmassivdagi bitta katak va undagi qiymat.
satrharflar ketma-ketligi, aslida char massivi.
\0null terminator, satr oxirini bildiruvchi maxsus belgi.
strlensatr uzunligini (harf sonini) hisoblovchi funksiya.

4.11 Bilim testi

16 ta savol. Haftani yakunlash uchun kamida 11 tasiga to'g'ri javob bering.

Tabriklaymiz! 4-hafta yakunlandi

Endi siz massiv va satrlar bilan ishlay olasiz: ko'p qiymatni saqlash, indeks bilan murojaat, sikl bilan aylanish, null terminator va strlen. Bular ma'lumot ustida ishlaydigan deyarli har bir dasturning asosi.

Keyingi hafta: Algoritmlar (chiziqli va ikkilik qidiruv, saralash, Big-O samaradorlik).

Keyingi modulga o'tish