2-hafta topshiriq javoblari
Sinf aniqlanishi sinf implementatsiyasidan qanday ajratiladi?
Sinf aniqlanishidan sinf implementatsiyasini bir biridan ajratish sinfga qo’shimchalar qo’shishni osonlashtiradi.
C++ da sinf implementatsiyasini sinf aniqlanishidan ajratish imkoniyati mavjud. Sinf aniqlanishi sinf shartnomasi bo’lsa, implementatsiyasi esa shu shartnoma shartlarini bajarishdir. Sinf aniqlanishida barcha ma’lumot maydonlari, konstruktor prototiplari va funksiyalar prototiplari ro’yxati bo’ladi. Sinf implementatsiyasida esa konstruktorlar va funksiyalar implementatsiya qilinadi. Sinf aniqlanishi va sinf implementatsiyasi ikkita alohida faylda yozilsishi mumkin. Ikki fayl ham bir xil nomda bo’lishi kerak, lekin kengaytmalari farqlanishi lozim. Sinf aniqlanishini o’zida saqlovchi fayl .h(h header fayl eknligini anglatadi) kengaytmada, implementatsiya saqlanuvchi fayl esa .cpp kengaytmali bo’ladi.
Quyidagi dastur kodidan qanday natija chiqadi? Javoblaringizni batafsil, sharhlar bilan tushuntiring.
Ushbu blokda Circle sinfida c1 va c2 obyekti yaratilib c2 obyektiga 6 qiymat ta’minlanmoqda. Keyin c1 obyektiga c2 obyekti ta’minlanmoqda. Bu holatda c1.getArea() funksiyasi radiusi 6 ga teng bo’lgan aylana yuzasini hisoblaydi.
Bu blokda Circle sinfiga 8 qiymat ta’minlanib, yuzasi to’g’ridan-to’g’ri hisoblanmoqda
Ma’lumot maydoni inkapsulyatsiyasining foydali jihatlarini tushuntiring.
Yopiq ma’lumot maydoniga sinfdan tashqarida ob’yektlar orqali murojaat qilishniing imkoni yo’q. Ammo tez-tez mijoz uchun ma’lumot maydonini o’zgartirib turishga to’g’ri keladi. Yopiq ma’lumot maydoniga murojaat qilish uchun get funksiyadan foydalanish maqsadga muvofiq. get funksiya maydon qiymatini qaytaradi. Maydonning qiymatini o’zgartirish uchun esa set funksiyadan foydalanish lozim. set funksiya maydonga yangi qiymat o’rnatib beradi.
Get funksiya aksessor(accessor), set funksiya esa mutetor(mutator) deyiladi.
(Algebra:kvadrat tenglama) ax2+bx+x=0 kvadrat tenglamasi uchun KvTenglama nomli sinf yarating. Sinf quyidagilardan iborat bo’lsin:
Uchta koeffitsientni namoyon qiluvchi a, b va c maydonlari.
a, b va c argumentli konstruktor.
a, b va c uchun uchta get funksiya.
b2-4ac ni, ya’ni diskriminantni qaytaruvchi getDiskriminant funksiyasi.
getIldiz1() va getIldiz2() funksiyalari. Ular quyidagi ifodalarni hisoblab qaytaradi:
Agar discriminant manfiy bo’lmaydigan bo’lsa, u holda bu funksiyalar foydali hisoblanadi. Agar diskiriminant 0 dan kichik bo’lsa, bu funksiyalar 0 qiymat qaytarsin.
Sinfni implementatsiya qiling. Foydalanuvchidan a, b va c larga qiymat kiritish so’rovi va diskriminantga bog’liq holda, mos natijani ekranga chiqaruvchi test dastur yozing. Agar disikriminant musbat bo’lsa ikkita ildiz chiqsin. Agar discriminant 0 ga teng bo’lsa, bitta ildiz, aks holda “Haqiqiy ildizlari yo’q” xabari chiqsin.
Dastur kodi:
#include
using namespace std;
class KvTenglama
{
public:
float a, b, c;
KvTenglama()
{
a = 1, b = 1, c = 1;
}
KvTenglama(float newA, float newB, float newC)
{
a = newA;
b = newB;
c = newC;
}
float getDiskreminant()
{
return (b * b) - (4 * a * c);
}
float getIldiz1()
{
return (- b + sqrt(b * b - 4 * a * c))/2 * a;
}
float getIldiz2()
{
return (- b - sqrt(b * b - 4 * a * c))/2 * a;
}
};
int main()
{
float a, b, c;
cout << "Kvadrat tenglama hadlari kiritilsin : \n";
cout << "a = "; cin >> a;
cout << "b = "; cin >> b;
cout << "c = "; cin >> c;
KvTenglama had1(a, b, c);
if (had1.getDiskreminant() < 0)
{
cout << "Haqiqiy ildizlari yo'q" << endl;
}
else if (had1.getDiskreminant() == 0)
{
cout << "Tenglama bitta ildizga ega\n";
cout << "x = " << fabs(had1.getIldiz1()) << endl;
}
else
{
cout << "1 - ildiz = " << had1.getIldiz1() << endl;
cout << "2 - ildiz = " << had1.getIldiz2() << endl;
}
return 0;
}
Natija:
Do'stlaringiz bilan baham: |