Скачиваний:
0
Добавлен:
26.01.2026
Размер:
269.25 Кб
Скачать

3-ámeliy jumıs. Programmalıq támiynat quramalılıǵın bahalaw algoritmleri.

Jumıstıń maqseti: Programmalıq támiynattıń quramalılıǵın (Complexity) ólshew usılların úyreniw. C++ kodlarınıń "Makkeyb Ciklomatikalıq Quramalılıǵın" (McCabe Cyclomatic Complexity) hám "Xolsted metrikaların" (Halstead Metrics) esaplaw algoritmlerin analizlew. Kodtıń sapasın hám testlew qıyınshılıǵın sanlı kórsetkishler (metrikalar) arqalı bahalaw kónlikpesin qáliplestiriw.

Teoriyalıq bólim: Metrologiya – bul kodtı ólshew ilimi.

1. Ciklomatikalıq quramalılıq (M): Kodtaǵı ǵárezsiz jollar sanı.

Formula: M = E - N + 2P

(E - tárep, N - túyinler, P - baylanısqan komponentler).

Ápiwayı formula (kod ushın): M = P + 1 (P - predikatlar/shártler sanı: if, while, for, case, &&, ||).

1-10: Ápiwayı, jaqsı kod.

11-20: Ortasha, testlew kerek.

21-50: Quramalı, qáwipli.

>50: Testlew múmkin emes, qayta jazıw kerek.

2.Xolsted metrikaları: Kodtaǵı operatorlar (n1) hám operandlar (n2) sanına tiykarlanǵan.

Programma uzınlıǵı (N) = N1 + N2 (Barlıq operatorlar + operandlar).

Sózlik kólemi (n) = n1 + n2 (Unikal operatorlar + operandlar).

Kólem (V) = N * log2(n).

ÁMELIY BÓLIM:

C++ kodınıń ciklomatikalıq quramalılıǵın qol menen esaplawdı úyrenemiz.

1-mısal: Ápiwayı kodtıń quramalılıǵı

Kod:

void test(int x) {

 

if (x > 0) {

// +1 (Predikat)

cout << "Oń";

 

} else {

 

 

cout << "Teris";

 

}

}

// +1 (Baza)

Esaplaw:

*Baza quramalılıq = 1.

*if (x > 0) = +1.

*Juwmaq: M = 1 + 1 = 2.

Analiz: Kodta 2 ǵárezsiz jol bar (Oń yamasa Teris).

2-mısal: Cikl hám Shárt

Kod:

void process(int n) {

 

 

 

int i = 0;

 

 

 

while (i < n) {

// +1

(while)

 

if (i % 2 == 0) { //

+1 (if)

 

cout << i;

 

 

 

}

 

 

 

i++;

 

 

 

}

// +1

(Baza)

}

 

 

 

Esaplaw:

 

 

*

Baza = 1.

 

 

*

while = +1.

 

 

*

if = +1.

 

 

* Juwmaq: M = 3.

Analiz: Úsh jol: 1) Ciklge kirmeyseń (n<=0). 2) Ciklge kireseń, if orınlanbaydı. 3) Ciklge kireseń, if orınlanadı.

3-mısal: Quramalı shártler (&&, ||)

Kod:

void check(int a, int b) {

if (a > 0 && b > 0) { // if (+1) hám && (+1) cout << "Ekewi de oń";

}

}

Esaplaw:

*Baza = 1.

*if = +1.

*&& (Jáne) = +1. (Sebebi bul jasırın ekinshi shárt: if a>0 then if b>0).

*Juwmaq: M = 3.

4-mısal: Switch-Case

Kod:

void menu(int choice) { switch (choice) {

case 1: // +1 func1(); break;

case 2: // +1 func2(); break;

case 3: // +1 func3(); break;

default: // switch ózi +0 (tek case-ler sanaladı) error(); break;

}

}

Esaplaw:

*Baza = 1.

*case 1 = +1.

*case 2 = +1.

*case 3 = +1.

*Juwmaq: M = 4.

5-mısal: Avtomatlastırılǵan esaplaw (Algoritm ideyası) Quramalılıqtı esaplawshı kishi parser jazıwǵa boladı.

Algoritm:

1. Kodtı oqıw (fayldan string retinde).

2."if", "while", "for", "case", "&&", "||", "?" (ternary) sózlerin sanaw.

3.Sanına 1 di qosıw.

Kod (C++ tegi ápiwayı sanawshı):

#include <iostream> #include <string> using namespace std;

int calculateComplexity(string code) { int complexity = 1; // Baza

string keywords[] = {"if", "while", "for", "case", "&&", "||", "?"};

for (string key : keywords) { size_t pos = code.find(key, 0); while (pos != string::npos) {

complexity++;

pos = code.find(key, pos + 1);

}

}

return complexity;

}

int main() {

string sourceCode = "if (a > 0) { while(b < 5) { b++; } }"; cout << "Quramalılıq: " << calculateComplexity(sourceCode) <<

endl;

// Nátiyje: 1 (Baza) + 1 (if) + 1 (while) = 3. return 0;

}

ÁMELIY TAPSÍRMALAR

1-tapsırma: Ciklomatikalıq quramalılıqtı esaplaw.

Tómendegi kodtıń quramalılıǵın (M) anıqlań:

void func(int x, int y) { if (x > 0) {

if (y > 0) { cout << "A";

} else {

cout << "B";

}

} else {

for (int i = 0; i < 5; i++) { cout << i;

}

}

}

2-tapsırma: Quramalılıqtı azaytıw.

1-tapsırmadaǵı kodtıń quramalılıǵın azaytıw ushın onı "Extract Method" (Funkciyanı bóliw) usılı menen qayta jazıń. Jańa funkciyalardıń hárqaysısınıń quramalılıǵın esaplań (Maqset: M <= 2 bolıwı kerek).

3-tapsırma: Xolsted metrikaları (Teoriyalıq esap).

Kod bólegi: a = b + c;

*Operatorlar: =, + (N1 = 2). Unikal (n1 = 2).

*Operandlar: a, b, c (N2 = 3). Unikal (n2 = 3).

Esaplań:

1.Sózlik (n) = n1 + n2.

2.Uzınlıq (N) = N1 + N2.

3.Kólem (V) = N * log2(n).

4-tapsırma: Avtomatlastırıw (Parser).

5-mısaldaǵı C++ kodın (calculateComplexity) keńeytiń. Ol "catch" (try-catch blogı) hám "else if" (birigip ketiwin esapqa alıw) jaǵdayların durıs sanasın. (Esletpe: else if eki ret sanalmawı kerek, tek if sanaladı).

5-tapsırma: Sapa analizi.

Eki kod variantı bar:

A)M = 15 (Uzın switch-case).

B)M = 5 (Polimorfizm qollanılǵan klasslar). Qaysı kodtı testlew ańsatıraq? Ne ushın?

M = 15 bolǵan kod ushın minimal neshe test (Test Case) kerek boladı? (Teoriya boyınsha M = Ǵárezsiz jollar sanı = Minimal testler sanı).

Соседние файлы в папке Programmalıq támiynat qurılması hám evolyuciyası