1-ma’ruza C++ da Sinflar va obyektlar. Konstruktor va destruktor. Sinf usullari reja


Download 86.61 Kb.
bet14/23
Sana09.06.2023
Hajmi86.61 Kb.
#1472539
1   ...   10   11   12   13   14   15   16   17   ...   23
Bog'liq
Algoritmlashga kirish fanidan majmua

Sinf usullarining aniqlanishi
Sinf usulini aniqlash uchun sinf nomidan so’ng ikkita ikki nuqta (::) belgisi, funksiya nomi va uning parametrlari ko’rsatiladi.
Masalan: non sinfining patir ob’yektidagi usullarni aniqlash dasturi:
# include < iostream.h > class non
{ public :
int baho;
int og`irlik;
void yasash ( ); }; void non :: yasash ( );
{ cout << “hamir qoriladi, zuvala tutiladi, doira holiga keltiriladi”<< endl; }
void main ( )
{ non patir;
patir.baho = 1200; patir.og`irlik = 500; cout <<”men olgan patir “<
<<”
so’m”<cout <<” uning og’irligi =”<
cout <<” u quyidagich yasaladi:”;
patir . yasash ( ); }
Misollar:
#include #pragma hdrstop #include
#include #include #pragma argsused int i;
struct waw
{
char fam[15]; char ism[15]; int tel;
int date[3];
};
class note
{
waw A[3],t;
public: void kiritish(); void saralash(); void taqqoslash(); void chiqarish();
};
void note::kiritish()
{
for( i=0; i<3; i++)
{
cout<>A[i].fam; cin>>A[i].ism; cin>>A[i].tel;
cin>>A[i].date[0]>>A[i].date[1]>>A[i].date[2];
}
}
// saralash tel. raqamining 1-chi 3 ta raqami bo’yicha
void note::saralash()
{
int x,y;
for( i = 0; i < 2; i++)
{
x = A[i].tel / 10000; for(int j = i; j < 3; j++)
{
y = A[j].tel / 10000; if(x > y)
{
t = A[i];
A[i] =A[j];
A[j] = t;
}
}
}
}
void note::taqqoslash()
{ char f[15]; int w=0;

cout<<”\n\nfamilyani kiriting = “; cin>>f;


for(i=0; i<3; i++)
if( strcmp(A[i].fam, f)==0)
{
cout<<«\n\nfamiliya ismi ---
>”<cout<<«telifon nomeri---> “<
“<w++; break;
}
if(w==0)
cout<<”bunday familiya haqida ma'lumot yo'q”;
}
void note::chiqarish()
{
for(i = 0; i < 3; i++)
{
cout<<”\n\nfamiliya ismi ---
>”<cout<<”telifon nomeri--->“ <
“<}
}
void main()
{
note B; //ob’yekt tavsifi cout<<”ma'lumotlarni kiriting: (familiya, ism,
tel.nomer, tug'ilgan sana):\n”; B.kiritish();
cout<<”\n tartiblangan holatda : \n\n”;
B.saralash(); B.chiqarish();
cout<<”\n\n kiritilgan familiya haqida malumot chiqarish:\n\n”;
B.taqqoslash(); getch();
}

y = Ax+B chiziqli tenglama. A koeffisient sifatida first maydoni – kasr son; B koeffisient sifatida kasr son bo’lgan second maydoni olinmoqda. Chiziqli tenglama ildizini aniqlovchi root () usuli tatbiq qilinsin. Usul B koeffisientning nolga teng emasligini tekshirmog’i lozim.


#include #pragma hdrstop #include #include #include #include #pragma argsused struct kasr
{
float surat;
unsigned int maxraj;
};
class tenglama
{
public:
kasr A, B;
float y, x;
void vvod (void);
void root(void);
};
void tenglama::vvod(void)
{
cout << «\n x = « ; cin >> x;
cout << «\nA kasr surati = « ; cin >> A.surat;
cout << «\nA kasr maxraji = « ; cin >> A.maxraj;
cout << «\nB kasr surati = « ; cin >> B.surat;
cout << «\nB kasr maxraji = « ; cin >> B.maxraj;
}
void tenglama::root(void)
{
y = x * (float)(A.surat / A.maxraj) + (float)(B.surat / B.maxraj);
}
int main(int argc, char* argv[])
{
tenglama C;
C.vvod();
C.root();
cout << “\n\nnatija :\n y =”<< C.y ; getch();
return 0;
}
Qiymatlari gradus va minutlarda berilgan tekislikdagi burchaklar bilan ishlovchi Angle sinfi tuzilsin.
Bunda radianlarga o’tkazish, 0-360 diapazonga keltirish, burchakni berilgan qiymatga ko’paytirish yoki kamaytirish, sinusni tashkil etish, burchaklarni taqqoslashni tatbiq etilsin.
#include #pragma hdrstop #include #include #include #include #include #pragma argsused class angle
{
float gradus; float minut; float radian; float sinus;
public :
void read(void);//float *gradus, float *minut, float *sinus);
void converter(void); void write(void);
};
void angle :: converter(void)
{
radian = (gradus + minut / 60) / 180 * 3.14;
}
void angle :: read(void)//float *gradus_value, float
*minut_value, float *sinus_value)
{
cout << «\ngradus = « ; cin >> gradus ; if(gradus > 360)
{
int qoldiq = gradus; qoldiq = qoldiq % 360; gradus = qoldiq;
}
cout <<”minut =”; cin >> minut ;
radian = (gradus + minut / 60) / 180 * 3.14; sinus = sin(radian * 180 / 3.14);
}
void angle :: write(void)
{
cout <<”\ngradus = ” << gradus; cout <<”\nminut = ” << minut; cout << ”\nradian = ” << radian;
cout <<”\nburchak sinusi = ” << sinus;
}
int main(int argc, char* argv[])
{
angle info[10]; int n, i, min, max;
cout << ”elementlar soni =” ; cin >> n ;
for(i = 0; i < n; i++)
{
cout << i + 1 <<”- inchi ma’lumotni kiriting” ;
info[i].read();
}
cout << ”\nnatija : \n” ; for(i = 0; i < n; i++)
{
cout <<”\n\n”<< i <<” - inchi ma’lumotni : “ ;
info[i].write();
}
getch(); return 0;
}
Student sinfi tashkil etilib, guruh talabalari orasidan 4 va 5 baho olgan talabalarni familiyasi, guruhi chiqadigan dastur tuzilsin.
#include #include #include #include #include #include class student
{ public :
char fam[20]; int baho;
int guruh;
int bilimdon (int ); };
int student :: bilimdon (int x)
{ if(x>=4) return x; else return 0; }
int main ( )
{student alo[10]; int i,a=0; for (i=0;i<5;i++){
cout<>alo[i]. fam;
cout<< ”guruhi: ”; cin>>alo[i].guruh; cout<< ”bahosi: ”;
cin>>alo[i].baho;} cout<<”4 va 5 olgan talabalar: ”<for(i=0;i<5;i++){
int y=alo[i] . bilimdon (alo[i].baho ); if(y!=0){a++;
cout<< familiya: ”<if(a==0) cout<<”talabalarning hammasi ikkichi”; getch();
return 0;
}
Uchburchakni aniqlashtiruvchi Triangle sinfi tashkil etilsin. Ma’lumotlar maydoni tarkibiga burchaklar va tomomnlari kiritilsin. Berilganlar maydonlarini olish va o’zgartirish, yuzasini hisoblash, perimetrni hisoblash, balandliklarni hisoblash hamda uchburchak turini aniqlash amallarini joriy etish talab etiladi.
#include
#pragma hdrstop
#include
#include
#include
#pragma argsused
class triangle
{
float x[3]; float y[3]; float tomon[3]; float h[3]; float s;
float p;
char stil_treugolnik[101]; public :
void vvod(void); void schitat(void);
};
void triangle :: vvod(void)
{
cout << “\nA uchni \nX =” ; cin >> x[0];
cout << “Y =” ; cin >> y[0];
cout <<“\nB uchni \nX = ” ; cin >> x[1];
cout <<“Y = ” ; cin >> y[1];
cout <<“\nC uchni \nX = ” ; cin >> x[2];
cout << “Y = ” ; cin >> y[2];
}
void triangle :: schitat(void)
{

y[1]),


tomon[0] = pow(
2) ), 1/2);

(pow((x[0]-x[1]),

2)

+

pow((y[0]-




tomon[1] = pow(

(pow((x[1]-x[2]),

2)

+

pow((y[1]-

y[2]),

2) ), 1/2);
















tomon[2] = pow(

(pow((x[2]-x[0]),

2)

+

pow((y[2]-

y[0]),

2) ), 1/2);













cout <<”\n ucburchak tomonlari : “<p = tomon[0] + tomon[1] + tomon[2]; cout <<”\nperimetr =”<
float p2 = p;
s = sqrt(p2 * (p2-tomon[0])*(p2-tomon[1])*(p2- tomon[2]) );
cout << “\nyuza =”<< s;


h[0]

=

s

/

tomon[0];

h[1]

=

s

/

tomon[1];

h[2]

=

s

/

tomon[2];

cout <<”\n balandliklar :”<<<”,”<if(tomon[0] == tomon[1] && tomon[1] == tomon[2]) strcpy(stil_treugolnik, «teng tomonli»); else if(tomon[0] == tomon[1] || tomon[1] ==
tomon[2] || tomon[0] == tomon[2]) strcpy(stil_treugolnik, “teng yonli”);
else strcpy(stil_treugolnik, “turli tomonli”); cout <<”\n uchburchak turi :”<}
int main(int argc, char* argv[])
{
triangle info;
info.vvod(); info.schitat(); getch();
return 0;
}


Sinf qoliplar
Keling, bunday muammoning misolini ko'rib chiqaylik va qoliplar uni hal qilishda bizga qanday yordam berishi mumkin.
Konteyner sinflari haqidagi darsda biz ma'lum bir turdagi ma'lumotlarning bir nechta ob'ektlarini o'z ichiga olgan sinflarni amalga oshirish uchun kompozitsiyadan qanday foydalanishni bilib oldik . Misol sifatida biz ArrayInt sinfidan foydalandik:
#ifndef ARRAYINT_H
#define ARRAYINT_H
#include // для assert()
class ArrayInt
{
private:
int m_length;
int *m_data;
public:
ArrayInt()
{
m_length = 0;
m_data = nullptr;
}
ArrayInt(int length)
{
assert(length > 0);
m_data = new int[length];
m_length = length;
}
~ArrayInt()
{
delete[] m_data;
}
void Erase()
{
delete[] m_data;
// Osilib turgan ko'rsatkichni oldini olish uchun m_data ni nullptr ga o'rnating! m_data = nullptr;
m_length = 0;
}
int& operator[](int index)
{
assert(index >= 0 && index < m_length);
return m_data[index];
}
int getLength() { return m_length; }
};
#endif
Bu sinf butun sonlar qatorini yaratishning oson yo'lini ta'minlasa-da, agar biz ikki tomonlama qiymatlar bilan ishlashimiz kerak bo'lsa-chi? An'anaviy dasturlash usullaridan foydalanib, biz dublonlar bilan ishlash uchun yangi ArrayDouble
sinfini yaratamiz:
#ifndef ARRAYDOUBLE_H
#define ARRAYDOUBLE_H
#include // для assert()
class ArrayDouble
{
private:
int m_length;
double *m_data;
public:
ArrayDouble()
{
m_length = 0;
m_data = nullptr;
}
ArrayDouble(int length)
{
assert(length > 0);
m_data = new double[length];
m_length = length;
}
~ArrayDouble()
{
delete[] m_data;
}
void Erase()
{
delete[] m_data;
// Osilib turgan ko'rsatkichni oldini olish uchun m_data ni nullptr ga o'rnating!
m_data = nullptr;
m_length = 0; }
double & operator[](int index)
{
assert(index >= 0 && index < m_length);
return m_data[index];
}
int getLength() { return m_length; }
};
#endif
Kod juda ko'p bo'lsa-da, sinflar deyarli bir xil, faqat ma'lumotlar turi o'zgaradi! Siz taxmin qilganingizdek, bu qoliplardan foydalanish uchun ideal holat. Sinf qolipini yaratish funksiya qolipini yaratishga o'xshaydi . Masalan, Array sinf qolipini yaratamiz:
Array.h
#ifndef ARRAY_H
#define ARRAY_H
#include // для assert()
template // bu haqiqiy (o'tgan) ma'lumotlar turi o'rniga T ga ega bo'lgan sinf qolipidir
class Array
{
private:
int m_length;
T *m_data;
public:
Array()
{
m_length = 0;
m_data = nullptr;
}
Array(int length)
{
m_data = new T[length];
m_length = length;
}
~Array()
{
delete[] m_data;
}
void Erase()
{
delete[] m_data;
// Osilib turgan ko'rsatkichni oldini olish uchun m_data ni nullptr ga o'rnating!
m_data = nullptr;
m_length = 0;
}
T& operator[](int index)
{
assert(index >= 0 && index < m_length);
return m_data[index];
}
// Massiv uzunligi har doim butun son bo'lib, massiv elementlarining turiga bog'liq emas. 
int getLength(); // определяем метод и шаблон метода getLength() ниже
};
template // sinf tanasidan tashqarida aniqlangan usul o'zining uslub qolipini ta'rifiga muhtoj
int Array::getLength() { return m_length; } // sinf nomi faqat Array emas, balki Array ekanligini unutmang
#endif
Ko'rib turganingizdek, bu versiya ArrayInt versiyasi bilan deyarli bir xil, faqat biz sinf qolipining parametr deklaratsiyasini qo'shdik va ma'lumotlar turini int dan ga o'zgartirdik T.
E'tibor bering, biz getLength() funksiyasini sinf tanasidan tashqarida belgilaganmiz. Bu ixtiyoriy, lekin yangi boshlanuvchilar odatda sintaksis tufayli qoqilib ketishadi. Sinf tanasidan tashqarida e'lon qilingan har bir sinf qolip usuli o'zining qolip deklaratsiyasiga muhtoj. Shuni ham yodda tutingki, sinf qolipining nomi ArrayArray emas, balki dir (Masiv Array sinfining qolipsiz versiyasiga ishora qiladi).
Array sinf qolipini ishlatadigan misol:
#include
#include "Array.h"
int main()
{
Array intArray(10);
Array doubleArray(10);
for (int count = 0; count < intArray.getLength(); ++count)
{
intArray[count] = count;
doubleArray[count] = count + 0.5;
}
for (int count = intArray.getLength()-1; count >= 0; --count)
std::cout << intArray[count] << "\t" << doubleArray[count] << '\n';
return 0;
}
Natija:

9 9.5
8 8.5


7 7.5
6 6.5
5 5.5
4 4.5
3 3.5
2 2.5
1 1.5

  1. 0.5

Sinf qoliplari xuddi funksiya qoliplari kabi ishlaydi: kompilyator sinf qolipini nusxalaydi, sinf qoliplari parametrlari turlarini haqiqiy (o'tgan) ma'lumotlar turlari bilan almashtiradi va keyin nusxani kompilyatsiya qiladi. Agar sizda sinf qolipiga ega bo'lsangiz, lekin undan foydalanmasangiz, kompilyator hatto uni kompilyatsiya qilmaydi.
Sinf qoliplari konteyner sinflarini amalga oshirish uchun juda mos keladi, chunki ko'pincha bunday sinflar turli xil ma'lumotlar turlari bilan ishlashlari kerak va qoliplar buni minimal kod miqdorida tartibga solishga imkon beradi. Sintaksis biroz xunuk va xato xabarlari ba'zan "katta" bo'lishi mumkin bo'lsa-da, sinf qoliplari haqiqatan ham C++ tilining eng yaxshi va foydali xususiyatlaridan biridir.

Download 86.61 Kb.

Do'stlaringiz bilan baham:
1   ...   10   11   12   13   14   15   16   17   ...   23




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling