Programmalıq támiynat qurılması hám evolyuciyası / 3-ameliy_PTQE
.pdf3-á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ı).
