Update from 18

This commit is contained in:
Administrator 2024-12-16 03:33:39 +00:00
parent 1ed7e0d348
commit f83a3d63e6
7 changed files with 142 additions and 0 deletions

View file

@ -0,0 +1,18 @@
# STRUKTURALI DASTURLASH TAMOYILLARI
Strukturali dasturlashning shakllanishi va rivojlanishi Edsger Deykstra nomi bilan bogliq.
* 1-tamoyil: goto operatoridan foydalanishdan saqlaning.
* 2-tamoyil. Har qanday dastur uchta asosiy boshqaruv tuzilmasidan qurilgan: ketma-ketlik, tarmoqlash, davr.
* 3-tamoyil. Dasturda asosiy boshqaruv tuzilmalari bir-birining ichiga har qanday usulda joylashtirilishi mumkin. Operatsiyalar bajarilishining ketma-ketligini nazorat qilishning boshqa hech qanday vositalari yoq.
* 4-tamoyil. Takroriy dastur fragmentlari quyi dasturlar (protseduralar va funksiyalar) sifatida formatlanishi mumkin. Xuddi shu tarzda (subprogrammalar korinishida) dasturning mantiqiy integral bolaklarini hatto ular takrorlanmasa ham tartibga solish mumkin.
* 5-tamoyil. Har bir mantiqiy to'liq ko'rsatmalar guruhi blok sifatida ishlab chiqilishi kerak. Bloklar tuzilgan dasturlashning asosidir.
* 6-tamoyil. Barcha sanab otilgan tuzilmalar bitta kirish va bitta chiqishga ega bolishi kerak.
* 7-tamoyil. Dasturni ishlab chiqish bosqichma-bosqich, “yuqoridan pastga” usuli yordamida amalga oshiriladi.
Yuqoridagi printsiplarga xulosalar va qoshimchalar:
1. Global ozgaruvchilardan foydalanishni taqiqlash
2. Bittadan ortiq funktsiyadan chiqish mumkin emas. Istisno - bu funktsiya argumentlarini dastlabki tekshirish.
3. Davrdan bir martadan ortiq chiqish mumkin emas - bu shart yoki break kalit sozi bolishi mumkin
4. Har qanday bloklarning uyasi 4 dan oshmasligi kerak.
5. Funksiyalar hajmi satrlar bilan chegaralangan va 40-50 qatorni tashkil qiladi.

View file

@ -0,0 +1,72 @@
# Sinovlarni ishga tushirish boyicha korsatmalar
Togri chiqish malumotlarini sinovdan otkazishga qoshimcha ravishda, ushbu avtotest tizimi dasturing va uning manba kodini quyidagi bandlar boyicha tekshiradi:
* **Uslubiy testlar.** Kodingning gozalligi standartlarga naqadar mos kelishini tekshirish uchun sen clang-format utiliti yordamida dasturidan foydalanib kodingni sinab korishing mumkin. ```materials/linters``` papkasida uslub testi uchun kerakli sozlamalarni oz ichiga olgan ```.clang-format``` fayli mavjud. Ushbu konfiguratsiya fayli oz tasirini direktoriyada yoki pastroqdagi direktoriyalarda joylashgan barcha fayllarga qollaydi. Shuning uchun, ushbu sozlamalar asosiy koding bolgan fayllaringga qollanilishi uchun.
```clang-format``` ```src``` papkasiga nusxala. \
\
Uslubni tekshirish uchun quyidagi buyruqni bajar: \
```clang-format -n src/sourcefile_name.c```
_clang-format_ yuklab olish uchun terminalga quyidagi buyruqlardan birini kirit: \
```brew install clang-format``` \
yoki, agar senda root huquqlari bolsa (Ubuntu / Linux Mint / Debian uchun) \
```sudo apt install clang-format```
Kerakli clang-format versiyasi: \
**Mac** 18.1.6 \
**Linux** 18.1.3
Google Style: https://google.github.io/styleguide/cppguide.html
* **Xotiraning to'g'ri ishlashini sinash.** C dasturlarini yozishda xotiraning oqishiga e'tibor berish juda muhimdir. Buning uchun Unix-ga o'xshash operatsion tizimlarda ko'pincha _valgrind_ utilitasi qo'llaniladi. Biroq, OS X da _valgrind_ qollab-quvvatlashda muammolar mavjud, shuning uchun uning orniga _leaks_ utilitasidan foydalanish mumkin.
Hozir ushbu utilitalar ishlash mexanizmini korib chiqmaymiz - agar qiziq bolda, Googleda o'qishing mumkin.
**_LEAKS_**
Ushbu yordamchi dastur yordamida bajariladigan faylni ishga tushirish uchun terminalga kirit:
```leaks -atExit -- ./main.out | grep LEAK:```
```| grep LEAK:``` buyrugiga etibor ber. Biz uni qisqa chiqish uchun ishlatamiz, shunda biz agar mavjud bo'lsa faqat oqishlar bolgan chiziqlarni ko'rishimiz mumkin. Agar sen butun chiqarishni korishni istasang, shunchaki bu buyruqni ochirib tashla.
_leaks_ yordamida bajariladigan faylni ishga tushirishda, xatolik togrisidagi xabar paydo bolishi mumkin:
> dyld: could not load inserted library /usr/local/lib/libLeaksAtExit.dylib because image not found
_leaks_ kutubxonani topa olmaganligi sababli xatolik yuzaga keladi _libLeaksAtExit.dylib_. \
Bunday holda quyidagi buyruqlarni kiritish kerak:
```sh
cd /usr/local/lib
sudo ln -s /Applications/Xcode.app/Contents/Developer/usr/lib/libLeaksAtExit.dylib
```
_Qoshimcha:_ \
Xotirada oqish borligi maʼlum boʻlgan funksiyalardagi oqib chiqishlarni filtrlash uchun leaks utilitasining ```-exclude``` bayrogʻidan foydalan. Bu bayroq _leaks_ tomonidan berilayotgan malumotlarning oqishini kamaytirish imkonini beradi.
**_VALGRIND_**
_valgrind_ kompyuterga ornatish uchun quyidagi buyruqlardan birini kirit: \
```brew install valgrind``` \
yoki, agar sizda ildiz huquqlari bo'lsa (Ubuntu / Linux Mint / Debian uchun) \
```sudo apt install valgrind``` \
Ushbu utilita yordamida bajariladigan faylni ishga tushirish uchun terminalga kirit: \
```valgrind --tool=memcheck --leak-check=yes ./main.out```
OS X da _valgrind_ foydalanish tavsiya etilmaydi, buning orniga _leaks_ ishlatish yaxshiroqdir
* **Qoshimcha xotiraning togri ishlashini tekshirish.** Yana bir variant sifatida xotirani qayta ishlashning to'g'riligini tekshirish va xotira oqishini kuzatish - ```gcc``` ichiga o'rnatilgan AddressSanitizer utilitalaridan foydalanish. Shu orinda takidlab otamizki, uni leaks yoki ```valgrind``` alohida ishlatish kerak, chunki u kompilyatsiyadan keyin avtomatik ravishda binary faylga ornatiladi va ushbu utilitalar bilan mos kelmasligi mumkin.
Uni kompilyatsiyalash paytida ishlatish uchun ```-fsanitize=address``` bayrog'ini belgilaymiz.
**Masalan:**
```gcc -o main main.c -fsanitize=address ```
Va yigilgan dasturni odatdagi tarzda ishga tushiramiz. Bunday holda, xotira bilan bogliq xatolar mavjud bolsa, ular konsolda korsatiladi.
```-fsanitize=address``` bayrog'idan tashqari quyidagi bayroqlardan ham foydalanish mumkin:
* ```-fsanitize=leak``` - xotira oqishini kuzatish uchun. Shuningdek, qoshimcha ravishda leaks yoki valgrind yordamida oqishlarni tekshirishni ham unutma.
* ```-fsanitize=undefined``` - aniqlanmagan dastur harakati joylarini aniqlash uchun (masalan, massiv chegarasidan tashqariga chiqish yoki intni haddan tashqari tolishi).
* ```-fsanitize=unreachable``` - erishib bo'lmaydigan dastur nuqtalarini aniqlash uchun.
Yanada koproq bayroqlarni gcc va AddressSanitizer hujjatlarida topishing mumkin.

View file

@ -0,0 +1,40 @@
# BrickGame oyinlar toplamidan oyin kutubxonasi uchun spetsifikatsiya
Bu vazifa BrickGame seriyasidagi birinchi vazifadir. Hammasi bolib tortta loyiha boladi, ularning har biri oz oyini va oz texnologiyalariga ega. Ammo yangi loyihalarni ishlab chiqishdan tashqari, eski oyinlarni qollab-quvvatlash va eski loyihalarga yangi oyinlarni qollab-quvvatlash kerak boladi. Bu safar interfeys konsol boladi, keyingi safar desktop boladi va hokazo. Eski va yangi oyinlarni qollab-quvvatlash uchun kelajakda topshiriligan loyihalarni qayta yozishga togri kelmasligi uchun API interfeyslari va kutubxonalari qanday tuzilganligini oldindan hal qilish kerak.
Oyin maydoni onga yigirma hajmidagi matritsa sifatida ifodalanadi. Matritsaning har bir elementi oyin maydonining “pikseliga” togri keladi va ikkita holatdan birida bolishi mumkin: bosh va toldirilgan. Oyin maydoniga qoshimcha ravishda, har bir oyinda qoshimcha malumotlar mavjud bolib, ular oyin maydonining ong tomonidagi yon panelda korsatiladi. Oyin davomida ishlatilmaydigan qoshimcha malumotlar uchun joy egalari korsatilishi kerak.
Har bir oyin kutubxonasida foydalanuvchi malumotlarini qabul qiladigan funksiya bolishi kerak. Konsolda sakkizta jismoniy tugma mavjud: oyinni boshlash, toxtatib turish, oyinni tugatish, harakat va tortta strelka.
`userInput` funksiyasi kirish sifatida foydalanuvchi `action` harakatini va klavishni bosib ushlab turish uchun javob beradigan qoshimcha `hold` parametrni oladi.
`updateCurrentState` funksiyasi interfeysda korsatish uchun malumotlarni olish uchun moljallangan. U oyinning joriy holati haqida malumotni oz ichiga olgan tuzilmani qaytaradi. Masalan, tetris uchun taymerning tugashi shaklning bir qator pastga siljishiga olib keladi. Interfeysni yangilab turish uchun ushbu funktsiyani interfeysdan malum vaqt oraligida chaqirish kerak.
```c
typedef enum {
Start,
Pause,
Terminate,
Left,
Right,
Up,
Down,
Action
} UserAction_t;
typedef struct {
int **field;
int **next;
int score;
int high_score;
int level;
int speed;
int pause;
} GameInfo_t;
void userInput(UserAction_t action, bool hold);
GameInfo_t updateCurrentState();
```
Etibor bering, `GameInfo_t` oyinining joriy holati haqidagi malumot oyin kutubxonasi ichida statistik obyekt bilan ifodalanishi mumkin.