Kirish Roʻyxatdan oʻtish

Docx

  • Referatlar
  • Diplom ishlar
  • Boshqa
    • Slaydlar
    • Referatlar
    • Kurs ishlari
    • Diplom ishlar
    • Dissertatsiyalar
    • Dars ishlanmalar
    • Infografika
    • Kitoblar
    • Testlar

Dokument ma'lumotlari

Narxi 15000UZS
Hajmi 61.3KB
Xaridlar 0
Yuklab olingan sana 02 Aprel 2024
Kengaytma docx
Bo'lim Referatlar
Fan Informatika va AT

Sotuvchi

Shodlikbek Zaripboyev

Ro'yxatga olish sanasi 02 Aprel 2024

2 Sotish

Tiplarni dinamik ta’rifi

Sotib olish
MUXAMMAD AL-XORAZMIY NOMIDAGI TOSHKENT AXBOROT
TEXNOLOGIYALARI UNIVERSITETI URGANCH FILIALI “POCHTA
ALOQALAR TEXNOLOGIYASI” FAKULTETI  961-22 GURUH
TALABASI XUDAYBERGANOV QUDRATBEKNING 
DASTURLASH FANIDAN
                       
MUSTAQIL
ISHI
TOPSHIRDI: __________________________________________________
QABUL QILDI : ________________________________________________         Mavzu: Tiplarni dinamik ta’rifi.
Reja:
1. Tipni aniqlash ,  tipni almashtrish
2. nomlar fazosi ,  buferlashtirilgan kirish va chiqish
3. namespace, i ostearm
4. formatlash identifikatori, monupulyatorli formatlash
Noma lumʻ   tiplar   va   noma lum	ʻ   fazolar   uchun   dinamik   tipni   aniqlash   va   tipini
almashtirish   operatorlari   zamonaviy   ob yektga   yo‘naltirilgan   dasturlashni   qo‘llab-	
ʻ
quvvatlovchi C++ dasturlash tilining ikkita vositalari: dinamik tipni aniqlash (runtime
type   identification   -   RTTI)   va   qo‘shimcha   tip   quyish   operatorlari   bilan   bog‘liq.   Bu
vositalarning   biri   C++   spesifikatsiyasi   qismi   emasdi,   lekin   har   ikki   runtime
polimorfizm   uchun   qo‘llab-quvvatlash   oshirish   uchun   qo‘shilgan.   RTTI   dastur
bajarish   davomida   ob yekt   turini   aniqlash   imkoniyati   muvjudligini   bildiradi.   Bunda	
ʻ
muhokama   qilinayotgan   tip   turi   tashlash   operatorlari   -   bu   amalni   bajarish   uchun
dasturchiga xavfsiz yo‘llarini taklif qiladi. Ulardan biri, dynamic_cast, bevosita RTTI
aniqlash bilan bog‘liq.
Tiplarni   dinamik   tarzda   aniqlash.   Ushbu   vosita   polimorf   bo‘lmagan   tillarda
(masalan, C ) mavjud emasligi sababli dinamik turdagi identifikatsiyalash bilan tanish
bo‘lmasligigiz mumkin, chunki har bir ob yektning tipi kompilyatsiya vaqtida (ya ni,	
ʻ ʻ
dasturni   bajarishda)   ma lum   bo‘lgani   uchun   dastur   bajarilishida   ma lumot   olishning	
ʻ ʻ
hojati   yo‘q.   Biroq,   C++   kabi   polimorf   tillarda   ob yekt   tipi   kompilyatsiya   vaqtida	
ʻ
noma lum bo‘lgan holatlar bo‘lishi mumkin, chunki dastur bajarila boshlagunga qadar	
ʻ
bu   ob yektning   aniq   tipi   (tiplari)   aniqlanmaydi.   Ma lumki,   C++   sinf   ierarxiyasi,
ʻ ʻ
virtual  funksiyalar   va  ko‘rsatkichlarni   (pointer)   asos  sinflarga  ishlatib  polimorfizmni
amalga oshiradi. Tayanch sinfga ko‘rsatkich bu   tayanch   sinf   a zolariga	
ʻ   yoki   undan
olingan   har   qanday   ob yekt	
ʻ   a zolariga	ʻ
murojaat   qilish   uchun   foydalanish   mumkin.   Shuning   uchun   asos   sinfga
ko‘rsatgichning  istalgan  vaqtda  qanday  turdagi   ob yektga  murojaat  qilishi   har	
ʻ   doim
ham   oldindan   ma lum   emas.   Bu   faqat   dastur   ishlayotganida   —   dinamik   turdagi	
ʻ
identifikatsiya vositalaridan biri yordamida aniqlanadi. Dastur   bajarilishi   davomida   ob yekt   turini   olish   uchun  ʻ typeid   operatoridan
foydalaniladi.
Dastur   bajarilayotgan   vaqtda   ob yekt   tipini   olish   uchun   <typeinfo>   kutubxonasini
ʻ
kiritish   va   typeid   operatoridan   foydalanish   mumkin.   Typeid   operatoridan
foydalanishning eng keng tarqalgan yozilish sintaktisi quyidagicha:
typeid(object)
Bunda,   object   element   tipini   olish   uchun   ob yekt   anglatadi.   Shuningdek,	
ʻ   nafaqat
ichki   tipini,   balki   dasturchi   tomonidan   yaratilgan   sinf   tipini   ham   aniqlash   mumkin.
Buning   uchun   typeid   operatori   ob yekt   tipini   tasvirlaydigan   type_info   ob yektiga	
ʻ ʻ
murojaat qiladi.
type_info   sinfda   public   modifikatori   bilan   quyidagi   statik   operatorlar   aniqlangan
bo‘ldi.
bool   operator   ==   (const   type_info   &ob); bool operator !=(const type_info &ob);
bool   before(const   type_info   &ob); const char *name();
Bunda   qayta   aniqlangan   (overloaded)   operatorlari   [==]   va   [!=]   tiplarini   taqqoslash
uchun   ishlatiladi.   Chaqiruvchi   ob yekt   parametr   sifatida   ishlatiladigan   ob yekt
ʻ ʻ
(element ob) oldida ketma-ketlik tartibida bo‘lsa before() funksiyasi true qaytaradi. Bu
funksiya   asosan   ichki   foydalanish   uchun   mo‘ljallangan.   Uning   natija   qiymati
merosxo‘r   yoki  sinf   iyerarxik   bilan   hech   qanday   aloqasi   yo‘q.   name()   funksiyasi   tip
nomiga ko‘rsatkich qaytadi.
typeid   operatoridan   foydalanishga   bir   misol   keltiramiz.
1-dastur.   Tiplarni   taqqoslash
#include  "stdafx.h"  #include  <iostream>  #include  <typeinfo>  using   namespace   std; 
class  myclass  {
//   .   .   .
};
int   main(){  int  i, j;  float  f;  myclass   ob;
cout   <<   "i   o zgaruvchi	
ʻ   tipi:   "   <<   typeid (i).name()<<endl; cout   <<   "f   o zgaruvchi	ʻ   tipi:  
"  <<   typeid (f).name()<<endl;
cout   <<   "ob   o zgaruvchi	
ʻ   tipi:   "   <<   typeid (ob).name()<<endl<<endl;  if ( typeid (i) == 
typeid (j))
cout   <<   "   i   va   j   tiplar   bir   xil.\n" ;  if ( typeid (i) !=  typeid (f))
cout   <<   "   i   va   f   tiplar   bir   xil   emas.\n" ;  system( "PAUSE" );
return   0; }
1   –   dastur   natijasi.   Output
i   o zgaruvchi	
ʻ   tipi:   int f   o zgaruvchi	ʻ   tipi:   float
ob   o zgaruvchi	
ʻ   tipi:   class   myclass i va j tiplar bir xil.i   va   f   tiplar   bir   xil   emas 1-dastur tahlili.   Dasturda   int tipiga   oid   i va j,   float tipida f,   myclass   tipida ob
o‘zgaruvchilari   aniqlangan.   typeinfo   kutubxonasining   typeid ().name()   metodi   bilan
ularning tiplari aniqlangan. Taqqsolash operatorlari bilan o‘zraguvchilarning
Дастур   Visual   C++   муҳитида   тузилган .
tiplari   tekshirilgan   va   natijalar   ekranga   chiqarilgan.   Bu   esa   tiplar   bo‘yicha   dastlabki 
ishlov berish uchun lozim.
1-jadval.   Type_info   sinf   a zolariʻ   va   vazifalari
№ Funksiya
nomi vazifasi
1 (constructor) Sinfda   standart   va   nusxa   konstruktori   mavjud   emas.
2 (destructor)
[virtual] xavfsiz   tayanch   sinf   uchun   pointer   orqali   ob yektni
ʻ   o‘chirish
mumkin   (virtual   funksiyasi)
3 operator= O‘zlashtirish   amalidan   foydalanib   ko‘chirib   bo‘lmaydi
4 operator==
operator!= Ob yektlar	
ʻ   bir   xil   tipgaligini   taqqoslashydi
(public   funksiya)
5 before    Joriy   tipdagi   boshqa   type_index   ob yekt   tomonidan   nusxasi   tipini   bor	
ʻ
yoki   yo‘qligini   tekshiradi.   Ob yektlar,   aniqrog‘i   tiplari,   amalga	
ʻ
oshirilishi belgilangan tartibda tashkil etiladi.
(public   funksiya)
6 hash_code    Joriy   tipga   mos   keladigan   tiplarni   qaytaradi
(public   funksiya)
7 name    Joriy   tipning   aniqlangan   nomini   qaytaradi.
(public   funksiya)
Typeid   operatori   polimorf   tayanch   sinf   uchun   ko‘rsatkich   sifatida   qo‘llaniladigan
bo‘lsa (eslabtib o‘tamiz, polimorf sinf kamida bitta virtual funksiyani o‘z ichiga olgan
sinfga   aytiladi),   u   avtomatik   ravishda   real   ob yekt	
ʻ   tipini   qaytaradi   va   u   asossidan
olingan sinf tayanch sinf ob yekt yoki ob yekt emasligini ham ko‘rsatadi.	
ʻ ʻ
Shuning   uchun   typeid   operatoridan   asos   sinfga   ko‘rsatgich   bilan   murojaat
qilingan   ob yekt   tipini   dinamik   ravishda   aniqlash   uchun   foydalanish   mumkin.   Bu	
ʻ
xususiyat quyidagi dasturda ko‘rsatilgan. 2-dastur.   Typeid   operatorini   polimorf   sinflar   ierarxiyasiga   qo‘llanilishi.
#include  "stdafx.h" 
#include  <iostream> 
#include  <typeinfo> 
using   namespace   std;  class  Base  {
virtual   void   f()   {};   //   Asos   sinf   uchun   polimorf
//   .   .   .
};
class   myClass_one :   public   Base   {
//   .   .   .
};
class   myClass_two :   public   Base   {
//   ...
};
int   main(){
Base   *p,   baseob;  myClass_one   ob1;  myClass_two   ob2; p = &baseob;
cout   <<   "   O'zgaruvchi   p   tipdagi   obyektga   ishora:   " ; cout <<  typeid (*p).name() << 
endl;
p   =  &ob1;
cout   <<   "   O'zgaruvchi   p   tipdagi   obyektga   ishora:   " ; cout <<  typeid (*p).name() << 
endl;
p   =  &ob2;
cout   <<   "   O'zgaruvchi   p   tipdagi   obyektga   ishora:   " ; cout <<  typeid (*p).name() << 
endl;
system( "pause" );   return   0;}
2   –   dastur   natijasi.   Output
O'zgaruvchi p tipdagi obyektga ishora: class Base O'zgaruvchi   p   tipdagi   obyektga  
ishora:   class   myClass_one
O'zgaruvchi   p   tipdagi   obyektga   ishora:   class   myClass_two
2-dastur   tahlili.   Dasturda   dinamik   ko‘rsatkichli   Base   tipli   p   o‘zgaruvchisi
yaratilgan   va   3   ta,   base   tipiga   baseob,   myClass_one   tipiga   ob1,   myClass_two   tipiga
ob2   mos   o‘zgaruvchilar   yaratilgan.   Dastur   davomida   dinamik   o‘zgaruvchiga
oddatiy   o‘zgaruvchilar   qiymat   qilib   berilgan.   Natija   shu   ma lum   bo‘ldiki   dinamikʻ
o‘zgaruvchining tipi danamik ko‘rinishda o‘zgardi.
Typeid   operatori   polimorf   turdagi   tayanch   sinfga   ko‘rsatgich   sifatida
qo‘llanilsa,   haqiqiy   manzillangan   ob yektning   tipini   dastur   bajarilayotgan   vaqtda	
ʻ
aniqlaydi.
Typeid   operatori   polimorf   bo‘lmagan   iyerarxik   sinflar   uchun   ko‘rsatkich
qo‘llaniladigan   barcha   hollarda,   tayanch   tipi   uchun   ko‘rsatikich   bo‘ladi.   Boshqa so‘zlar   bilan   aytganda,   bu   ko‘rsatkich   aslida   tipni   aniqlash   mumkin   emas.   Tajriba
sifatida   2-dasturdagi   asos   sinfdagi   f()   virtual   funksiyani   izohga   oling   va   natijani
tekshirib ko‘ring. Dasturda bu o‘zgarishni amalga oshirgandan so‘ng har bir turli tipli
ob yektning   tipi   base   deb   aniqlanishini   ko‘rasiz,   chunki   bu   p   ko‘rsatgichgaʻ   ega
bo‘lgan tipdir.
Typeid   operatori   odatda   kengqirrali   ko‘rsatkich   (dereferenced   pointer   ya ni,	
ʻ
[*]   operatoriga   ega   bo‘lgan   ko‘rsatkich)   uchun   qo‘llanilganligi   sababli,   bu   bu
ko‘rsatkich   null   bo‘lib   chiqqanda   vaziyatni   boshqarish   uchun   maxsus   istisno
yaratiladi. Bu holda, typeid operatori bad_typeid istisnoga o‘tadi.
Polimorf   sinflar   ierarxiyasidagi   ob yektlarga   havolalar   ko‘rsatgichlar   kabi	
ʻ
ishlaydi.   Typeid   operatori   polimorf   sinfning   mos   yozuvlar   uchun   qo‘llaniladigan
bo‘lsa, u aslida ob yekt tipini qaytaradi va u asosiy tipi o‘rniga olingan tipdagi ob yekt	
ʻ ʻ
bo‘lishi mumkin. Bu usul o‘zgaruvchilarni  funksiyalarga  murojaat  qilib o‘tishda eng
ko‘p   qo‘llaniladi.   Masalan,   quyidagi   (3-dastur)   dasturda   WhatType()   funksiyasi
asosiy   tipdagi   ob yektlarga   mos   yozuvlar   parametrini   e lon   qiladi.   Demak,
ʻ ʻ
WhatType()  funksiyasi  bazaviy   turdagi  ob yektlarga   murojaatlarni  yoki   asos  sinfdan	
ʻ
olingan   har   qanday   sinf   ob yektlariga   murojaatlarni   keltirib   chiqaradi.   Bunday	
ʻ
parametrlarga qo‘llaniladigan typeid operatori funksiyaga   o‘tgan ob yektning haqiqiy	
ʻ
turini qaytaradi.
3-dastur.   Typeid   operatorini   havolali   parametriga   qo‘llash.
#include   "stdafx.h"  #include   <iostream>  #include   <typeinfo>
using   namespace   std;
class   Base   {
virtual   void   f()   {};   //   Asos   sinf   uchun   polimorf
//   .   .   .
};
class   myClass_one :   public   Base   {
//   .   .   .
};
class   myClass_two :   public   Base   {
//   ...
};
void   WhatType( Base   & ob ){
cout   <<   "   ob   parametri   ob'ekt   tipiga   havolasi:   " ; cout <<  typeid ( ob ).name() << endl;}
int  main(){  Base   baseob;
myClass_one  ob1;  myClass_two  ob2;  WhatType(baseob); 
WhatType(ob1); WhatType(ob2); system( "pause" );  return  0;
}
3   –   dastur   natijasi.   Output
ob   parametri   ob'ekt   tipiga   havolasi:   class   Base
ob   parametri   ob'ekt   tipiga   havolasi:   class   myClass_one ob   parametri  
ob'ekt   tipiga   havolasi:   class   myClass_two
3-dastur   tahlili.   Dasturda   WhatType   funksiyasi   yaratilib,   unga   asos   sinf   tipidpgi
havolali parametr belgilandi. Asosiy funksiyada 3 ta, base tipiga baseob, myClass_one
tipiga  ob1, myClass_two tipiga  ob2 mos o‘zgaruvchilar  yaratilgan.  Dastur davomida
WhatType   funksiyasining   havolali   parametrga   oddatiy   o‘zgaruvchilar   qiymat   qilib
berilgan.   Natija   shu   ma lum   bo‘ldiki,   dinamik   o‘zgaruvchining   tipi   danamik	
ʻ
ko‘rinishda o‘zgardi.
Dasturlash   jarayonlarida   o‘zgaruvchilarni   tiplarini   real   tip   bilan   taqqoslashga
to‘g‘ri   keladi.   Buning   uchun   typeid   operatori   agrgument   sifatida   tipi   nomini   olish
yordamida amalga oshiriladi.  Uning yozilishi quyidagicha:
tyreid(tip   nomi)
Masalan,   quyidagi   listing   amal   qiladi.
Cout<<typeid(int).name();
Typeid   operatorini   ushbu   variantda   ishlatilishining   maqsadi   tipni   taqqoslash
uchun   foydalanishdir,   (belgilangan   ma lumotlar   tipini   ta riflaydi)   ammo,   type_info	
ʻ ʻ
ob yektini olish uchun emas.	
ʻ
Dinamik   tipni   aniqlashni   (RTTI)   qo‘llash.   Dasturda   dinamik   tipni   aniqlash
(identifikatsiya)   vositasi   (RTTI)   imkoniyati   va   foydali   bo‘lishi   mumkinlingini
ko‘rsatib  o‘tamiz.  Masalan,  geometrik  shakllar  uchun iyerarxik  sinf berilgan  bo‘lsin,
unda   doira,   uchburchak   va   to‘rtburchak   maydoni   hisoblash   usullari   mavjud.   Ushbu
dasturda   doira,   uchburchak   yoki   to‘rtburchakni   yaratish   uchun   mo‘ljallangan
funksiyasi   factory()   bo‘lsin.   Ushbu   funksiya yaratilgan   ob yektga	
ʻ   bir nusxani qaytadi.
Ob yektlarni   hosil   qiluvchi   funksiya   ba zan   ob yekt   fabrikasi   deb   ataladi.	
ʻ ʻ ʻ
Yaratilayotgan ob yektning o‘ziga xos tipi C++ tasodifiy sonlar generatorining Rand()	
ʻ
funksiyasiga kirish orqali aniqlanadi. Demak, qanday   turdagi ob yekt hosil bo‘lishini	
ʻ oldindan bilolmaymiz. 4-dasturda o‘nta ob yekt yaratadi va har bir turdagi yaratilganʻ
ob yektlar sonini hisoblaydi. factory() funksiyasini chaqirishda har qanday shakl turini	
ʻ
hosil qilish mumkinligi sababli, dastur aslida yaratilgan ob yekt tipini aniqlash uchun	
ʻ
typeid operatoridan  foydalanadi.
4-dastur.   Dinamik   tipdagi   identifikatsiya   vositasidan   foydalanish.
#include  "stdafx.h" 
#include  <iostream> 
#include  <typeinfo> 
#include  <cstdlib> 
using   namespace   std; 
class  figure  {
protected :
double   x,   y;  public :
figure( double   i ,   double   j )   { x =  i ;
y   =   j ;	
}
virtual   double   area()   =   0;
};
class   triangle   :   public   figure   {  public :
triangle( double   i ,   double   j )   :   figure ( i ,   j )   {}  double  area() {
return   x   *   0.5   *   y;
}
};
class   rectangle   :   public   figure   {  public :
rectangle( double   i ,   double   j )   :   figure   ( i ,   j )   {}  double  area() {  return  x * y;}
};
class   circle   :   public   figure   {  public :
circle( double   i ,   double   j =0)   :   figure ( i ,   j )   {}  double  area() { return  3.14 * x * 
x;}
};
//   figure   sinf   ob yektlarini	
ʻ   yaratish.  figure  *factory(){
switch (rand()   %   3   )   {
case   0:   return   new   circle   (rand()%15);
case  1:  return new  triangle  (rand()%15,rand()%15);  case   2:   return   new  
rectangle   (rand()%15,   rand()%15);	
} return   0;
};
int   main(){
figure   *p;   //   asos   sinfga   ko rsatkich ʻ int  i;
int   t=0,   r=0,   c=0;
//   5   ta   ob yektlarni	
ʻ   hosil   qilsh   va   sanash  for (i=0; i<15; i++) {
p   =   factory();   //   ob yektni	
ʻ   hosil   qilish
cout   <<   "Ob yektning	
ʻ   tipi:   "   <<   typeid (*p).name(); cout <<  ". " ;
// ob yektni tekshirish orqali sanasj 	
ʻ if ( typeid (*p) ==  typeid ( triangle )) 
t++;  if ( typeid (*p)   ==   typeid ( rectangle ))   r++;  if ( typeid (*p) == 
typeid ( circle )) c++;
//   Yuzasini   hisoblash
cout   <<   "   S=   "   <<   p->area()   <<   endl;	
}
cout   <<   endl;
cout   <<   "Quyidagi   ob yektlar	
ʻ   hosil   qilindi:\n" ; cout <<  " Uchburchaklar: "  << t << 
endl;
cout   <<   "   To rtburchaklar:	
ʻ   "   <<   r   <<   endl; cout <<  " Doiralar: "  << c << endl; 
system( "pause" );
return   0;	
}
4   –   dastur   natijasi.   Output
Ob yektning   tipi:   class   rectangle.	
ʻ   S=   8   Ob yektning   tipi:   class   triangle.	ʻ   S=   28
Ob yektning   tipi:   class   circle.	
ʻ   S=   28.26   Ob yektning   tipi:   class   triangle.	ʻ   S=   35
Ob yektning   tipi:   class   rectangle.	
ʻ   S=   12   Ob yektning   tipi:   class   triangle.	ʻ   S=   55
Ob yektning   tipi:   class   rectangle.	
ʻ   S=   72  Ob yektning	ʻ   tipi:   class   circle.   S=   254.34
Ob yektning   tipi:   class   rectangle.	
ʻ   S=   21   Ob yektning   tipi:   class   triangle.	ʻ   S=   33
Ob yektning   tipi:   class   rectangle.	
ʻ   S=   10  Ob yektning	ʻ   tipi:   class   circle.   S=   379.94
Ob yektning	
ʻ   tipi:   class   circle.   S=   254.34   Ob yektning   tipi:   class   triangle.	ʻ   S=   4
Ob yektning tipi: class triangle.	
ʻ   S= 36
Quyidagi   ob yektlar	
ʻ   hosil   qilindi: Uchburchaklar: 6
To rtburchaklar:	
ʻ   5
Doiralar:   4
Tipeid   operatorini   shablon   sinflariga   qo‘llash.   Typeid   operatorini   shablon
sinflariga  ham  qo‘llash mumkin  albatta.  Shablon sinfi  asosida  hosil  bo‘lgan   ob yekt	
ʻ
tipi   ob yektni   amalga   oshirishda   uning   umumlashgan   ma lumotlari   uchun   qanday	
ʻ ʻ ma lumotlardan   foydalanilganligi   asosida   qisman   aniqlanadi.   Shuning   uchun,   turliʻ
ma lumotlar   yordamida   yaratilgan   bir   xil   shablon   sinfga   tegishli   bo‘lgan   ikki
ʻ
ob yektlar tip xil bo‘ladi.
ʻ
1.5-dastur.   shablon   sinflari   bilan   typeid   operatoridan   foydalanish.
#include  "stdafx.h" 
#include  <iostream>
  #include  <typeinfo> 
using   namespace   std; 
template  < class  T >  class  myclass  {
T  a;  public :
myclass( T   i )   {   a   =   i ;   }
//   .   .   .
};
int   main(){
myclass < int > o1(28), o2(1);  myclass < double > o3(19.80); cout   <<   "   o1  
ob yekt	
ʻ   tipi:   " ;
cout   <<   typeid (o1).name()   <<   endl; cout <<  " o2 ob yekt tipi: "	
ʻ ;
cout   <<   typeid (o2).name()   <<   endl; cout <<  " o3 ob yekt tipi: "
ʻ ;
cout   <<   typeid (o3).name()   <<   endl; cout << endl;
if ( typeid (o1)   ==   typeid (o2))
cout   <<   "   o1   va   o2   ob yektlar	
ʻ   bir   xil   tip.\n" ;  if ( typeid (o1) == 
typeid (o3)) cout <<  "Xatolik\n" ;
else   cout   <<   "o1   va   o3   ob yektlar	
ʻ   bir   xil   tip   emas.\n" ;  system( "pause" );
return   0;	
}
5   –   dastur   natijasi.   Output
o1   ob yekt	
ʻ   tipi:   class   myclass<int>
o2   ob yekt	
ʻ   tipi:   class   myclass<int>
o3   ob yekt
ʻ   tipi:   class   myclass<double>
o1   va   o2   ob yektlar	
ʻ   bir   xil   tip.
 o1   va   o3   ob yektlar
ʻ   bir   xil   tip   emas.
5-dasturdan ko‘rinib turibdiki, ikki ob yektlar bir xil shablon sinf ob yektlarida	
ʻ ʻ
bo‘lsa-da,   ularning   parametrli   ma lumotlar   mos   bo‘lmasa,   ular   turi   teng   emas.   Bu	
ʻ
dasturda o1 ob yekti myclass <int > tipida, o3 ob yekti esa myclass	
ʻ ʻ <double>tipida   bo‘ladi.   Shunday   qilib,   bu   ob yektlarʻ   turli   xilligini   ko‘rsatadi.
Tipeid operatorini shablon sinflariga qo‘llashning yana bir misolini, ya ni 	
ʻ
4-dastur   geometrik   shaklni   aniqlash   dasturining   o‘zgartirilgan   variantini   ko‘rib
chiqamiz. Bu safar figure sinfini shablon sinfiga aylantiriladi.
6-dastur.   Figure   ierarxiyasining   shablon   varianti.
#include  "stdafx.h"
  #include  <iostream> 
#include  <typeinfo> 
#include  <cstdlib>
  using   namespace   std; 
template  < class  T >  class  figure {
protected :
T   x,   y;  public :
figure( T   i ,   T   j )   { x =  i ;
y   =   j ;      	
}
virtual   T   area()   =   0;
};
template   < class   T >
class   triangle   :   public   figure < T >{  public :
triangle( T   i ,   T   j )   :   figure < T >( i ,   j )   {}  T  area() {
return   x   *   0.5   *   y;     	
}
};
template   < class   T >
class   rectangle   :   public   figure < T >{  public :
rectangle( T   i ,   T   j )   :   figure < T >( i ,   j )   {}  T  area() {
return   x   *  y;       	
}
};
template   < class   T >
class   circle   :   public   figure < T >{  public :
circle( T   i ,   T   j =0)   :   figure < T >( i ,   j )   {}  T  area() {
return   3.14   *   x   *   x;     	
}
};
figure < double >   *generator(){  switch (rand()   %   3   )   {
case   0:   return   new   circle < double >   (rand()   %   28);
case  1:  return new  triangle < double >(rand() % 28, rand() % 28);  case  
2:   return   new   rectangle < double >   (rand()   %   28,   rand()   %   28);	
}
return   0;         	
} int   main(){
figure < double >   *p;  int  i;
int  t=0, c=0, r=0;  for (i=0;   i<15;   i++)   {
p   =  generator();
cout   <<   "Ob yektʻ   tipi:   "   <<   typeid (*p).name(); cout <<  ". " ;
if ( typeid (*p) ==  typeid ( triangle < double >)) t++;  if ( typeid (*p)   ==  
typeid ( rectangle < double >))   r++;  if ( typeid (*p) == 
typeid ( circle < double >)) c++; cout <<  " S= "  << p->area() << endl;	
}
cout   <<   endl;
cout   <<   "Ob yektlarni	
ʻ   sanash:\n" ;
cout <<  " uchburshaklar: "  << t << endl; cout   <<   "   o rtburchaklar:	
ʻ   "   <<   r   <<  
endl; cout <<  " doiralar: "  << c << endl;
system( "pause" );
return   0;	
}
1.6   –   dastur   natijasi.   Output
Ob yekt tipi: class rectangle<double>.	
ʻ   S= 90 Ob yekt tipi: class triangle<double>.	ʻ   S= 136 Ob yekt 	ʻ
tipi: class circle<double>.   S= 615.44 Ob yekt tipi: class triangle<double>.	
ʻ   S= 210 Ob yekt tipi: class 	ʻ
rectangle<double>.   S= 351 Ob yekt	
ʻ   tipi:   class   triangle<double>.   S=   202.5 Ob yekt tipi: class 	ʻ
rectangle<double>.   S= 44 Ob yekt tipi: class circle<double>.	
ʻ   S= 803.84 Ob yekt tipi: class 	ʻ
rectangle<double>.   S= 156 Ob yekt tipi: class triangle<double>.	
ʻ   S= 30 Ob yekt tipi: class 	ʻ
rectangle<double>.   S= 225 Ob yekt tipi: class circle<double>.	
ʻ   S= 706.5 Ob yekt	ʻ   tipi:   class  
circle<double>.   S=   1384.74 Ob yekt tipi: class triangle<double>.	
ʻ   S= 66.5 Ob yekt tipi: class 	ʻ
triangle<double>.   S= 15
Ob yektlarni	
ʻ   sanash: uchburshaklar: 6
o rtburchaklar:
ʻ   5
doiralar:   4
Dinamik   tipni   aniqlash   har   bir   dasturda   ishlatilmaydi.   Ammo,   dastur   bajarilish
vaqtida,   polimorf   turlari   bilan   ishlashda,   undagi   ob yektlarning   har   qanday   tipini	
ʻ
aniqlashga imkonini beradi.

Tiplarni dinamik ta’rifi ( Dasturlash )

Sotib olish
  • O'xshash dokumentlar

  • Access dasturi yordamida “dorixona” ma‘lumotlar bazasini yaratish
  • Agile va Scrum metodologiyalari dasturiy ta'minot ishlab chiqish
  • Tashkilot miqyosida masofadan muloqot qilish.
  • Talabalar haqida ma'lumot saqlovchi tizim
  • HTML tili, uning asosiy elementlari. Jadval va rasm hosil qilish. Gipermatn va freymlar joylashtirish

Xaridni tasdiqlang

Ha Yo'q

© Copyright 2019-2025. Created by Foreach.Soft

  • Balansdan chiqarish bo'yicha ko'rsatmalar
  • Biz bilan aloqa
  • Saytdan foydalanish yuriqnomasi
  • Fayl yuklash yuriqnomasi
  • Русский