Informatika asoslari kafedrasi katta o’qituvchisi Odil Olimovich Ishniyazov Ma’ruza №6. Raqamli sinflar bilan ishlash


Download 380.78 Kb.
Sana22.04.2020
Hajmi380.78 Kb.
#100704
Bog'liq
Maruza №6 (II-семестр)

Informatika asoslari kafedrasi katta o’qituvchisi Odil Olimovich Ishniyazov

Ma’ruza №6.

Raqamli sinflar bilan ishlash


Muhammad al-Xorazmiy nomidagi Toshkent Axborot Texnologiyalari Universiteti

Complex sinflar

  • C ++ raqamlar kutubxonasi umumiy matematik funksiyalar va turlarni, shuningdek raqamli massivlarni optimallashtirish va tasodifiy sonlarni generatsiyasini qo’llab quvvatlashni o'z ichiga oladi.

Complex sinf

  • std :: complex , std :: complex va std :: complex ixtisoslashuvlari murakkab sonlarni ifodalash va boshqarish uchun verbatim turlari hisoblanadi. Har qanday boshqa tip uchun complex shablon nusxasi ta'siri aniqlanmagan.

  Sarlavha faylida aniqlanadi

template< class T >class complex; //not defined

(1)

template<> class complex;

(2)

template<> class complex;

(3)

template<> class complex;

(4)

Funksiya a’zosi


(конструктор)

kompleks sonlarni yaratadi

(public funksiya a’zosi)



operator=

Tarkibni belgilaydi 

(public funksiya a’zosi)



real

Kompleks sonning haqiqiy qismi

(public funksiya a’zosi)



imag

Kompleks sonning mavhum qismi (public funksiya a’zosi)

operator+=operator-=operator/=operator*=

Ikki kompleks sonni yoki murakkab va skalyarni belgilash

(public funksiya a’zosi)


A’zo hisoblanmaydigan funksiyalar

Complex sinflar

C++da kompleks sonlar uchun std::complex shablon sinfini taqdim etadi. Shablon parametrlari complex sonning haqiqiy va mavhum qismiga mos keladigan koeffisentlar turini belgilaydi. Ko’p hollarda parameter sifatida double tipidan foydalanishingiz mumkin. Oddiy kompleks sonni e’lon qilamiz 1+2i:

Masalan

#include

#include

int main() {

std::complex< double > z( 1.0, 2.0 ); // z = 1 + 2i

std::cout << z << std::endl; // Kompleks sonni vector ko’rinishida chiqarish: (1, 2)

std::cout << std::conj( z ) << std::endl; // Kompleks bog’lanish: (1, -2)

std::cout << z.real() << std::endl; // Kompleks sonning haqiqiy qismi: 1

std::cout << z.imag() << std::endl; // Kompleks sonning mavhum qismi : 2 return 0; }

C++ da kompleks sonlar bilan matematik operatsiyalar

  • C++ da komleks sonlar bilan ishlagan kabi, boshqa sonli ma’lumot tiplari bilan ham ishlashingiz mumkin:
  • #include
  • #include using namespace std;
  • int main() { complex< double > z1( 1.0, 2.0 );
  • complex< double > z2( 2.0, 1.0 );
  • cout << z1 + z2 << endl; // kompleks sonlarni qo’shish: (3, 3)
  • cout << z1 - z2 << endl; // kompleks sonlarni ayirish: (-1, 1)
  • cout << z1 * z2 << endl; // kompleks sonlarni ko’paytirish: (0, 5)
  • cout << z1 / z2 << endl; // kompleks sonlarni bo’lish : (0.8, 0.6)
  • cout << pow( z1, 2 ) << endl; // kompleks sonlarni darajaga oshirish: (-3, 4)
  • return 0; }

C++da kompleks sonlarni ko’rsatkichli va triginometrik ko’rinishi

  • C++ standart kutuxonasida kompleks sonlarning turli shakllari bilan ishlash uchun funksiyalar mavjud:
  • #include
  • #include using namespace std;
  • int main() {complex< double > z( 3.0, 4.0 );
  • double rho = abs( z ); // kompleks sonlar moduli: 5
  • double phi = arg( z ); // kompleks sonlar argumenti: 0.927295
  • // kompleks sonlarning trigonometric ko’rinishi: 5*(cos(0.927295) + i*sin(0.927295))
  • cout << rho << "*(cos(" << phi << ") + i*sin(" << phi << "))" << endl;
  • // kompleks sonlarning ko’rsatkichli ko’rinishi: 5*exp(i*0.927295)
  • cout << rho << "*exp(i*" << phi << ")" << endl; // Kompleks sonlarning moduli va argumentini natijaviy qiymatini olish: (3, 4)
  • cout << polar( rho, phi ) << endl; return 0; }

Valarray Sinfi

  • Sinf shabloni Type tipidagi elementlarning ketma-ketligini boshqaruvchi ob’yektni tavsiflaydi. Ular matematik amallarni yuqori tezlikda bajarish uchun mo’ljallangan massivda saqlanadi va hisoblashlarni optimallashtiradi

Valarray Sinfi

Sinf - bu tartiblangan qiymatlar to’plamining matematik ifodasi va noldan boshlab ketma-ket raqamlash elementlarga qo'llaniladi.

Sinf huddi konteyner kabi tasvirlangan bo’lsada, vector kabi birinchi darajali ketma-ketlikdagi konteynerlar tomonidan qo'llab-quvvatlanadigan ba’zi bir hususiyatlarni qo'llab-quvvatlamaydi. Bu sinf shablon vektoridan ikki muhim jihatdan farq qiladi:

  • Bu mos keladigan valarray bir xil turdagi va uzunlikdagi ob'ektlarning elementlari o'rtasida juda ko'p arifmetik operatsiyalarni belgilaydi, masalan, ксарр = cos ( ярр) + sin ( Зарр).
  •  Valarray ob’yektni yaratish uchun оператора[ qayta yuklash orqali qiziqarli yo’llarni aniqlaydi.

Valarray Sinfi

Type Klass ob’yekti:

  • Odatiy tarzda ishlaydigan ochiq konstruktor, destructor, konstruktor nusxasi va tayinlash operatorlaridan iborat bo’ladi.
  • Agar kerak bo'lsa, u suzuvchi nuqta turlari uchun aniqlangan va odatdagi usulda ishlaydigan arifmetik operatorlar va matematik funktsiyalarni aniqlaydi.
  • Xususan, nusxa ko'chirish konstruktsiyasi bilan standart konstruktsiya o'rtasida hatto kichik farq ham bo'lmaydi. Type klassi ob'ektlari bilan hech qanday operatsiya istisnolarni keltirib chiqara olmaydi.

Valarray Sinf konstruktori


valarray

Valarray ma'lum bir o'lchamda yoki belgilangan qiymatga ega bo'lgan elementlar bilan yoki boshqa valarrayning nusxasi yoki boshqa Valarrayning to’plam ostisi sifatida yaratadi.

value_type

Turi, valarrayda saqlangan element turini ifodalaydi.

Funksiyalar

Operatorlar

Operatorlar

Masalan

  • #include
  • #include using namespace std;
  • int __cdecl MyApplyFunc( int n ) { return n*2; }
  • int main( int argc, char* argv[] ) {
  • valarray vaR(10), vaApplied(10);
  • int i; for ( i = 0; i < 10; i += 3 ) vaR[i] = i;
  • for ( i = 1; i < 10; i += 3 ) vaR[i] = 0;
  • for ( i = 2; i < 10; i += 3 ) vaR[i] = -i;
  • cout << "The initial Right valarray is: (";
  • for ( i=0; i < 10; ++i ) cout << " " << vaR[i]; cout << " )" << endl; vaApplied = vaR.apply( MyApplyFunc );
  • cout << "The element-by-element result of " << "applying MyApplyFunc to vaR is the\nvalarray: ( ";
  • for ( i = 0; i < 10; ++i )
  • cout << " " << vaApplied[i]; cout << " )" << endl; }

Slice sinfi

  • std::slice  bu BLAS muhitiga o'xshash std::valarray to'plamini belgilaydigan sinf selektoridir. Std :: slice turining ob'ekti uchta qiymatni o'z ichiga oladi: boshlang'ich indeks, qadamlar va to'plam ostidagi qiymatlarning umumiy soni. std::slice tipidagi ob’yektlardan indeks sifatida operator[] valarray dan foydalanish mumkin. (Объекты типа std::slice можно использовать в качестве индексов с operator[] valarray автора.)

Funksiya a’zolari


(конструктор)

Bo’lak, qism yaratish

(public funksiya a’zosi)



start

Boshlang’ich qismga murojaat

(public funksiya a’zosi)



size

Qism o’lchamiga ruxsat berish

(public funksiya a’zosi)



stride

Qism qadamiga ruxsat berish

(public funksiya a’zosi)


Misol

  • #include
  • #include
  • class Matrix {
  • std::valarray data;
  • int dim;
  • public: Matrix(int r, int c) : data(r*c), dim(c) {} int& operator()(int r, int c) {return data[r*dim + c];}
  • int trace() const { return data[std::slice(0, dim, dim+1)].sum(); }
  • };
  • int main() {
  • Matrix m(3,3); int n = 0;
  • for(int r=0; r<3; ++r)
  • for(int c=0; c<3; ++c)
  • m(r, c) = ++n;
  • std::cout << "Trace of the matrix (1,2,3) (4,5,6) (7,8,9) is " << m.trace() << '\n'; }

Gslice sinfi

std :: gslice bu std::valarray indekslari ko'p bosqichli qadamlar va o'lchovlar to'plami bilan belgilanadigan sinf selektoridir. Std :: gslice tipidagi ob'ektlardan Operator [] valarray yordamida indekslar sifatida foydalanish mumkin, masalan, Valarray sifatida ko'rsatilgan ko'p o'lchovli qator ustunlarini tanlash. S ning boshlang'ich qiymatini hisobga olgan holda, i j muvaffaqiyatlari ro'yxati va Dj o'lchamlari ro'yxati, std:: gslice ushbu qiymatlardan qurilgan k indekslarini tanlaydi.

j=s+Σj(ijdj).

Masalan, dastlabki indeks 3, muvaffaqiyatlar {19,4,1} va {2,4,3} uzunlikdagi GSlice quyidagi ko'rsatkichlar to'plamini yaratadi:

Gslice sinfi

3 + 0*19 + 0*4 + 0*1 = 3, 3 + 0*19 + 0*4 + 1*1 = 4, 3 + 0*19 + 0*4 + 2*1 = 5, 3 + 0*19 + 1*4 + 0*1 = 7, 3 + 0*19 + 1*4 + 1*1 = 8, ... 3 + 1*19 + 3*4 + 2*1 = 36

Std :: gslice ob'ektlarini qurish, bir yoki bir nechta indekslarni bir necha marotaba tanlash mumkin: agar yuqoridagi misolda {1,1,1} yutuqlari ishlatilsa, ko'rsatkichlar {3, 4, 5, 4, 5, 6, ...}. Bunday gslices lardan faqat std :: valarray :: operator [] ning doimiy versiyasi uchun argument sifatida foydalanish mumkin, aks holda xatti-harakatlar aniqlanmaydi.

Funksiya a’zolari


(конструктор)

Gslice ni qurish

(public funksiya-a’zosi)



start

GSlice ning dastlabki holati

(public funksiya-a’zosi)



stride

GSlice ning qadam-baqadam massivga ruxsat berish

(public funksiya-a’zosi)



size

GSlice dan massiv o’lchamlariga ruxsat berish

(public funksiya-a’zosi)


Misol

  • #include
  • #include
  • void test_print(std::valarray& v, int rows, int cols, int planes)
  • { for(int r=0; r
  • { for(int c=0; c
  • { for(int z=0; z
  • std::cout << v[r*cols*planes + c*planes + z] << ' '; std::cout << '\n';
  • }
  • std::cout << '\n';
  • }
  • }
  • int main() { std::valarray v = { 111,112,113 , 121,122,123 , 131,132,133 , 141,142,143, 211,212,213 , 221,222,223 , 231,232,233 , 241,242,243};
  • std::cout << "Initial 2x4x3 array:\n"; test_print(v, 2, 4, 3);  
  • v[std::gslice(0, {2, 4}, {4*3, 3})] = 1;
  • v[std::gslice(1, {1, 4}, {4*3, 3})] -= v[std::gslice(2, {1, 4}, {4*3, 3})];  
  • std::cout << "After column operations: \n"; test_print(v, 2, 4, 3); }

E’tiboringiz uchun raxmat


Download 380.78 Kb.

Do'stlaringiz bilan baham:




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