|
4- amaliy ish. Dasturni boshqarish oqimining murakkablik o‘lchovlari
|
bet | 7/7 | Sana | 13.12.2023 | Hajmi | 321,82 Kb. | | #117994 |
Bog'liq topshiriqq 4Boshqaruv oqimini tahlil qilish
Boshqarish oqimini tahlil qilish - bu dasturning bajarilish tartibini aniqlash uchun statistik kod tahlilidir. Bajarilish tartibi boshqaruv oqimi grafi sifatida ifodalanadi. Ko'pgina dasturiy tillar uchun boshqaruv oqimi grafi dasturning manba kodida aniq ko'rinadi. Natijada, boshqaruv oqimini tahlil qilish odatda kodning statistik tahliliga taaluqlidir.
Tahlil davomida yuqori darajadagi tillarda yozilgan dasturlar tomonidan chaqiriladigan funktsiyalar va usullarni qabul qiluvchilar aniqlanadi. Funktsional dasturlash tillari va ob'ektga yo'naltirilgan dasturlash tillari uchun "Boshqaruv oqimi tahlili" atamasi boshqaruv oqimi grafini shakllantiruvchi algoritmni anglatadi. Boshqaruv oqimi tahlili (control flow analysis) atamasi birinchi marta Neil D. Jones va Olin Shivers tomonidan kiritilgan. Boshqaruv oqimini tahlil qilish uchun quyidagilar qo'llanilishi mumkin: Abstrakt talqin qilish, cheklovni qondirish, ma'lumotlarni turlarga bo‘lish.
Oddiy boshqaruv oqimi graflari
Boshqaruv oqimi grafi (control flow graph - CFG) - kompilyatsiya nazariyasida - graf sifatida taqdim etilgan dasturni bajarishning barcha mumkin bo'lgan yo‘nalishlari to'plami. CFG tuzilishi ko'plab kompilyatorlarni optimallashtirish va statistik kod tahlilining yordamchi dasturlari uchun juda muhimdir. Yetishish imkoniyati - optimallashtirishda ishlatiladigan graf xususiyatlaridan biridir. Agar blok yoki grafning bo‘lagiga kirish blokidan yo'llar bo'lmasa, u holda grafning bu qismi bajarilishning har qanday variantida yetishib bo‘lmaydigan hisoblanadi (o'lik kod) va shu sababli uni dasturdan olib tashlash mumkin. Agar grafning berilgan bo‘lagidan chiqish blokiga yo'llar bo'lmasa, u holda grafning bu bo‘lagi cheksiz takrorlanishni (tsiklni) o'z ichiga oladi.
{
1. if (a2. f1 () ;
else
{
3. if (a4. f2 () ;
else
5. f3 () ;
}
6. }
INDIVIDUAL TOPSHIRIQLAR
Nazariy material bilan tanishish.
berilgan masala uchun dastur yozish.
dasturning blok-sxemasi va boshqaruv grafini chizish.
Makkeybning murakkablik o‘lchovlari asosida dasturni boshqarish oqimining murakkabligini hisoblash.
Amaliy ish bo‘yicha hisobot tayyorlash.
Variant № 4
N o'lchamdagi massiv berilgan. Massiv elementlarining avval tublarini, keyin murrakab elementlarini qayta joylashtirish funktsiyasini tuzing
Dastur kodi :
#include
#include
bool isTub(int n) {
if (n < 2) {
return false;
}
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
std::vector avvalTublarKeyinMurrakablar(std::vector &massiv) {
std::vector tublar;
std::vector murrakablar;
for (int element : massiv) {
if (isTub(element)) {
tublar.push_back(element);
} else {
murrakablar.push_back(element);
}
}
// Tublar va murrakablar ro'yxatlarini birlashtirish
tublar.insert(tublar.end(), murrakablar.begin(), murrakablar.end());
return tublar;
}
int main() {
// Massivni yaratish
std::vector massiv = {3, 8, 5, 12, 7, 9, 4, 11, 6, 15};
// Funktsiyani chaqirib, natijani olish
std::vector natija = avvalTublarKeyinMurrakablar(massiv);
// Natijani chiqarish
for (int element : natija) {
std::cout << element << " ";
}
return 0;
}
Natija :
Xulosa:
Xulosa qilib aytganda, Men C++ dasturlash tilida Massiv elementlarining avval tublarini, keyin murrakab elementlarini qayta joylashtirish funktsiyasini tuzishni organdim. Bu kod avval tub sonlarni, keyin esa murrakab sonlarni ajratib oladi va ularni yangi massivda o'zlashtiradi. isTub funksiyasi bir sonning tub bo'lib bo'lmaganligini tekshiradi. avvalTublarKeyinMurrakablar funksiyasi esa avval tublar, keyin murrakab sonlarni ajratib oladi va ularni birma-bir qo'shib, yangi bir massiv qaytaradi.
|
| |