#include
#include
using namespace System;
using namespace std;
int main( )
{
using namespace std;
double pi = 3.14159265359;
complex c1 ( polar ( 5.0 ) ); // Default argument = 0
complex c2 ( polar ( 5.0 , pi / 6 ) );
complex c3 ( polar ( 5.0 , 13 * pi / 6 ) );
cout << "c1 = polar ( 5.0 ) = " << c1 << endl;
cout<< "c2 = polar ( 5.0 , pi / 6 ) = " << c2 << endl;
cout<<"c3 = polar (5.0, 13*pi / 6 ) = " << c3 << endl;
double absc1 = abs ( c1 );
double argc1 = arg ( c1 );
cout << "C1 moduli c1 dan quyidagilar yordamida tiklanadi: abs ( c1 ) = "
<< absc1 << endl;
cout << "C1 argumenti c1 dan quyidagilar yordamida tiklanadi:\n arg ( c1 ) = "
<< argc1 << " radians, qaysiki " << argc1 * 180 / pi
<< " darajasi." << endl;
double absc2 = abs ( c2 );
double argc2 = arg ( c2 );
cout << "C2 moduli c2 dan s2 yordamida tiklanadi: abs ( c2 ) = "
<< absc2 << endl;
cout << "C2 argumenti c2 dan quyidagilar yordamida tiklanadi:\n arg ( c2 ) = "
<< argc2 << " radianda, qaysiki " << argc2 * 180 / pi
<< " darajalar." << endl;
if ( (arg ( c2 ) <= ( arg ( c3 ) + .00000001) ) ||
(arg ( c2 ) >= ( arg ( c3 ) - .00000001) ) )
cout << " c2 & c3 komplex sonlar bir xil argumentlardan "
<< "tashkil topgan."<< endl;
else
cout << " c2 & c3 komplex sonlar bir xil argumentlardan "
<< "tashkil topmagan."<< endl;
getchar();
}
Dastur natijasi:
c1 = polar ( 5.0 ) = (5,0)
c2 = polar ( 5.0 , pi / 6 ) = (4.33013,2.5)
c3 = polar ( 5.0 , 13 * pi / 6 ) = (4.33013,2.5)
C1 moduli c1 dan quyidagilar yordamida tiklanadi: abs ( c1 ) = 5
C1 argumenti c1 dan quyidagilar yordamida tiklanadi:
arg ( c1 ) = 0 radians, qaysiki 0 darajasi.
C2 moduli c2 dan s2 yordamida tiklanadi: abs ( c2 ) = 5
C2 argumenti c2 dan quyidagilar yordamida tiklanadi:
arg ( c2 ) = 0.523599 radians, qaysiki 30 darajalar.
c2 & c3 komplex sonlar bir xil argumentlardan tashkil topgan.
comj() complex funksiyasiga misol:
Funksiya shabloni:
template
complex conj(const complex& complexNum);
Dastur matni:
#include "stdafx.h"
#include
#include
int main( )
{
using namespace std;
complex c1 ( 4.0 , 3.0 );
cout << "Komplex raqam c1 = " << c1 << endl;
double dr1 = real ( c1 );
cout << " c1 ning haqiqiy qismi bu haqiqiy ( c1 ) = "
<< dr1 << "." << endl;
double di1 = imag ( c1 );
cout << " c1 ning no'malum qismi bu imag ( c1 ) = "
<< di1 << "." << endl;
complex c2 = conj ( c1 );
cout<<"c1 ning komplex kasr qismi bu c2 = conj(c1)= "
<< c2 << endl;
double dr2 = real ( c2 );
cout << " c2 ning haqiqiy qismi bu real ( c2 ) = "
<< dr2 << "." << endl;
double di2 = imag ( c2 );
cout << " c2 ning no'malum qismi bu imag ( c2 ) = "
<< di2 << "." << endl;
complex c3 = c1 * c2;
cout<<"(c1 * conj (c1) ) ning haqiqiysi bu c1 * c2 = "
<< real( c3 ) << endl;
getwchar();
}
Dastur natijasi:
Komplex raqam c1 = (4,3)
c1 ning haqiqiy qismi bu haqiqiy ( c1 ) = 4.
c1 ning no'malum qismi bu imag ( c1 ) = 3.
c1 ning komplex kasr qismi bu c2 = conj ( c1 )= (4,-3)
c2 ning haqiqiy qismi bu real ( c2 ) = 4.
c2 ning no'malum qismi bu imag ( c2 ) = -3.
(c1 * conj (c1) ) ning haqiqiysi bu c1 * c2 = 25
imag() complex funksiyasiga misol:
Funksiya shabloni:
template
Type imag(const complex& complexNum);
Dastur matni:
#include "stdafx.h"
#include
#include
int main( )
{
using namespace std;
complex c1 ( 4.0 , 3.0 );
cout << " c1 komplex son = " << c1 << endl;
double dr1 = real ( c1 );
cout << " c1 ning haqiqiy qismi bu real ( c1 ) = "
<< dr1 << "." << endl;
double di1 = imag ( c1 );
cout << " c1 ning noma'lum qismi bu imag ( c1 ) = "
<< di1 << "." << endl;
getchar();
}
Dastur natijasi:
c1 komplex son = (4,3)
c1 ning haqiqiy qismi bu real ( c1 ) = 4.
c1 ning noma'lum qismi bu imagine ( c1 ) = 3.
polar() complex funksiyasiga misol:
Funksiya shabloni:
template
complex polar(const Type& _Modulus, const Type& _Argument = 0);
Dastur matni:
#include "stdafx.h"
#include
#include
int main( )
{
using namespace std;
double pi = 3.14159265359;
complex c1 ( polar ( 5.0 ) );
// Default argument = 0
complex c2 ( polar ( 5.0 , pi / 6 ) );
complex c3 ( polar ( 5.0 , 13 * pi / 6 ) );
cout << "c1 = polar ( 5.0 ) = " << c1 << endl;
cout << "c2= polar ( 5.0 , pi / 6 ) = " << c2 << endl;
cout << "c3= polar(5.0, 13*pi / 6 ) = " << c3 << endl;
if ( (arg ( c2 ) <= ( arg ( c3 ) + .00000001) ) ||
(arg ( c2 ) >= ( arg ( c3 ) - .00000001) ) )
cout << " c2 & c3 komplex sonlar bir xil argumentlardan "<< "tashkil topgan."<< endl;
else
cout << " c2 & c3 komplex sonlar bir xil argumentlardan "<< "tashkil topmagan." << endl;
double absc2 = abs ( c2 );
double argc2 = arg ( c2 );
cout << " c2 ning moduli bu : abs ( c2 ) = "
<< absc2 << endl;
cout << " c2 argumenti bu :\n arg ( c2 ) = "
<< argc2 << " radianda, qaysiki " << argc2 * 180 / pi
<< " daraja." << endl;
getchar();
}
Dastur natijasi:
c1 = polar ( 5.0 ) = (5,0)
c2 = polar ( 5.0 , pi / 6 ) = (4.33013,2.5)
c3 = polar ( 5.0 , 13 * pi / 6 ) = (4.33013,2.5)
c2 & c3 komplex sonlar bir xil argumentlardan tashkil topgan.
c2 ning moduli bu : abs ( c2 ) = 5
c2 argumenti bu :
arg ( c2 ) = 0.523599 radianda, qaysiki 30 daraja.
Sintaktis tahlil
Masala:
Matinli faylda “ ; ” (nuqta-vergul) belgisi bilan ajratilgan arifmetik iboralar mavjud. Arifmetik ifodalar: identifikatorlardan, o'nlik suzuvchi nuqta raqamlaridan, o’zlashtirish belgisi ( = ), ishoralar +, -, *, / va figurali qavs({}) lardan iborat.
1) Topshiriqqa muvofiq kirish matnini leksik tahlilini bajaradigan va ularning turlarini ko'rsatgan holda tokenlar jadvalini tuzadigan dastur yozing. Dastur kirish matnida leksik tahlil bosqichida aniqlanishi mumkin bo'lgan xatolar (sintaksis tahlil) mavjudligi to'g'risida xabarlarni chiqarishi kerak;
2) leksik va sintaksis tahlil analizator kodini yaratishda Visual C++ dan kompilyator sifatida foydalaning.
Masalani yechish g‘oyasi:
Oqimlar sinfi (fstream.h) dan foydalanib, matnli fayl ma’lumotlari o’zlashtiriladi. Tokenlar jadvali yaratish uchun birinchi: faylning nechta satr borligi getline(oqi, line ) funksiyasidan foydalanilanib aniqlanadi. Xar bir sat sikl qadamlar bilan sanaladi (i++). O’zlashtirib olingan satr o’zgaruvchi (line) ning xar bir elementi vazifada belgilangan belgilarga tekshiriladi.
Ko‘pincha kompilyator va translyator tushunchalari bir ma’noda ishlatiladi.
Shuning uchun ham C, C++, Paskal kompilyatorlari degan tushunchalari ishlatiladi.
Ixtiyoriy kompilyator tarkibi quyidagi 3ta qismdan iborat:
1. Leksik tahlil.
2. Sintaksis tahlil.
3. Mashina kodini generatsiya qilish.
Kompilyatorlarning o’zaro bog’lanish tartibi quyidagicha:
C++ tilida programma yaratish bir nechta bosqichlardan iborat bo‘ladi. Dastlab, matn tahririda (odatda programmalash muhitining tahririda) programma matni teriladi, bu faylning kengaytmasi «.cpp» bo‘ladi. Keyingi bosqichda programma matni yozilgan fayl kompilyatorga uzatiladi, agarda programmada xatoliklar bo‘lmasa, kompilyator «.obj» kengaytmali obyekt modul faylini hosil qiladi. Oxirgi qadamda komponovka (yig‘uvchi) yordamida «.exe» kengaytmali bajariluvchi fayl programma hosil bo‘ladi. Bosqichlarda yuzaga keluvchi fayllarning nomlari boshlang‘ich matn faylining nomi bilan bir xil bo‘ladi.
Kompilyatsiya jarayonining o‘zi ham ikkita bosqichdan tashkil topadi. Boshida preprotsessor ishlaydi, u matndagi kompilyatsiya direktivalarini bajaradi, xususan #include direktivasi bo‘yicha ko‘rsatilgan kutubxonalardan C++ tilida yozilgan modullarni programma tarkibiga kiritadi. Shundan so‘ng kengaytirilgan programma matni kompilyatorga uzatiladi. Kompilyator o‘zi ham programma bo‘lib, uning uchun kiruvchi ma’lumot bo‘lib, C++ tilida yozilgan programma matni hisoblanadi. Kompilyator programma matnini leksema (atomar) elementlarga ajratadi va uni leksik, keyinchalik sintaktik tahlil qiladi. Leksik tahlil jarayonida u matnni leksemalarga ajratish uchun «probel ajratuvchisini» ishlatadi. Probel ajratuvchisiga - probel belgisi ('─'), '\t' - tabulyatsiya belgisi, '\n'- keyingi qatorga o‘tish belgisi, boshqa ajratuvchilar va izohlar (kommentariylar) kiradi.
Programma matni tushunarli bo‘lishi uchun izohlar ishlatiladi. Izohlar kompilyator tomonidan «o‘tkazib» yuboriladi va ular programma amal qilishiga hech qanday ta’sir qilmaydi.
C++ tilida izohlar ikki ko‘rinishda yozilishi mumkin.
Birinchisida "/*" dan boshlanib, "*/" belgalari bilan tugagan barcha belgilar ketma-ketligi izoh hisoblanadi, ikkinchisi «satriy izoh» deb nomlanadi va u "//" belgilardan boshlangan va satr oxirigacha yozilgan belgilar ketma-ketligi bo‘ladi. Izohning birinchi ko‘rinishida yozilgan izohlar bir necha satr bo‘lishi va ulardan keyin C++ operatorlari davom etishi mumkin.
Misol.
int main(){
// bu qator izoh hisoblanadi
int a=0; //int d;
int c;
/* int b=15 */
/*- izoh boshlanishi
a=c;
izoh tugashi */
return 0;
Do'stlaringiz bilan baham: |