Informasiya fayla onun ekrana çıxarılması üçün istifadə olunan << - ardıcıl çıxarma operatoru vasitəsilə yazılır. Bu zaman yeganə fərq ondan ibarətdir ki, cout obyekti və ya fstream obyekti istifadə olunur.
Informasiyanı fayldan proqrama daxil etmək üçün onun klaviaturadan daxil edilməsi üçün istifadə olunan >> - ardıcıl daxil etmə operatoru istifadə olunur. Yeganə fərq ondan ibarətdir ki, cin obyekti əvəzinə ifstream və ya fstream obyekti istifadə olunur.
Misal 9.2. Aşağıdakı proqram informasiyanı telebe.dat faylına yazır, proqram onu fayldan oxuyur və onu ekrana çıxarır.
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
char data[50];
ofstream outfile;
outfile.open("telebe.dat");
cout<<"writing to the file"<<endl;
cout<<"enter class name:";
cin.getline(data,50);
outfile<<data<<endl;
cout<<"enter number of telebe";
cin>>data;
cin.ignore();
outfile<<data<<endl;
outfile.close();
ifstream infile;
cout<<"reading from file"<<endl;
infile.open("telebe.dat");
infile>>data;
cout<<data<<endl;
infile.close();
getchar();
return 0;
}
Strukturlar və siniflər
10.1. Strukturlar və onların elanı
Obyektyönlü proqramlaşdırmada struktur və sinif anlayışlarından çox tez-tez istifadə olunur.
Obyektləri bir dəyişənlə təsvir etmək üçün onlar çox mürəkkəbdirlər. Massiv çoxlu sayda dəyişən saxlaya bilər, lakin massivdə bütün dəyişənlər eyni tip verilən olmalıdır.
Obyektlərdə qiymətlər verilənlərin bir tipi ilə məhdudlanmır. Məsələn, tələbə dedikdə burada hər hansı ümumi xarakteristikalar olur - onların adları, topladığı ballar, boyları, oxuduqları fakültə və s. Onlardan hər birinin qiymətini dəyişəndə saxlamaq olar. Lakin bu dəyişənlərin müxtəlif tip verilənləri olur. Boy tam ədəd kimi saxlana bilər, ad isə C – sətir tip dəyişən və ya C++ sətir sinfi kimi saxlana bilər.
Ad və boy dəyişənləri bir –biri ilə onunla əlaqəlidirlər ki, onlar bir adamın müxtəlif xarakteristikalarını təsvir edirlər. Lakin onları
string name
int height;
kimi elan etsək, onlar bir-biri ilə əlaqəli olmayacaq və sadəcə olaraq, iki müxtəlif dəyişənlər olacaqlar.
C++ dili bir –biri ilə əlaqəli olan dəyişənləri bir strukturda birləşdirməyə imkan verir. Struktur – bir neçə müxtəlif tip verilənlərdən ibarət dəyişənlərə malik ola bilər.
Mahiyyət etibarilə struktur – verilənlər tipidir. Lakin bu C++ -dakı adi int və ya C–sətir tipləri deyil. Həqiqətdə bu proqramçı tərəfindən təyin edilən verilənlər tipidir. Ona görə onu elan etmək lazımdır ki, kompilyator onun nə olduğunu başa düşsün. Məsələn,
struct telebe{
string name;
int height;
};
kod fraqmentində adı və boyu ilə xarakterizə olunan struktur elan olunub. Burada struct – xidməti sözdür və elan onunla başlayır. Telebe – sttrukturun adıdır (ixtiyari seçilir). Açılan və bağlanan sistem mötərizələri strukturun gövdəsini təyin edir. Lakin burada funksiyadan fərqli olaraq bağlanan mötərizədən sonra “; “ işarəsi qoyulur.
Bir-biri ilə əlaqəli dəyişənlər stukturun gövdəsində elan olunurlar və hər bir belə dəyişən nümunə dəyişəni adlanır. Strukturda nümunənin çoxlu sayda dəyişənləri ola bilər. Həmçinin bir strukturun dəyişəni digər struktur nümunəsinin dəyişəni ola bilər.
Strukturu kodun istənilən yerində elan etmək olar. Lakin şərtləşməyə əsasən, o adətən preprosessorun direktivindən sonra aşagıdakı kimi elan olunur:
Misal 10.1.
# include <iostream>
#include <string>
using namespace std;
struct Telebe {
string name;
int height;
};
int main()
{
// kod
return 0;
}
Qeyd. Strukturu elan edərkən biz dəyişən elan etmirik, biz verilənin tipini elan edirik. Verilənin tipini qlobal elan edərək, biz bu tipi proqramın istənilən yerində istifadə edə bilərik. Dəyişənləri qlobal etməyə lazım olmayan səbəblər verilənlərin tipinin elan olunmasına uyğun gəlmir. Məsələn, Telebe strukturuna qiymət mənimsətmək olmaz, lakin int tipli dəyişənə qiymət mənimsətmək olar. Bunun əvəzinə strukturun dəyişənlərini elan etmək lazımdır.
10.2. Strukturun dəyişəninin elanı
“Adam” ümumiyyətlə - Person strukturudur. Hər bir ayrıca götürülmüş adam Person strukturunun nümunəsidir, ona görə də hər bir belə nümunə Person struktur tipinin dəyişəni kimi elan olunmalıdır.
Struktur tipinin dəyişəni standart tiplər kimi elan olunur. Məsələn, Person P1;
Hətta Person tip bir neçə dəyişəni də elan etmək olar;
Person P1, P2, P3;
Bunun üçün Person tip dəyişənlər massivi də elan etmək olar:
Person[50];
Struktur tip dəyişəni proqramın istənilən yerində elan etmək olar, onun görünmə oblastı və varlıq zamanı qaydası tamqiymətli və kəsr dəyişənlərə və ya başqa dəyişənlərə olan təsirlə eynidir.
Struktur tip dəyişənin elanı onun qiymətini nümunənin dəyişəninə mənimsətmir. Nümunənin dəyişəninə struktur dəyişəninin adına görə müraciət etmək olar.
Aşağıdakı kod “Akademiya” qiymətini P1 strukturunun name nümunəsinin dəyişəninə mənimsədir:
P1.name=”Akademiya”;
Bu qayda ilə nümunənin dəyişəninin qiymətini ekrana çıxarmaq olar:
cout<<”The name of P1 is”<<P1.name;
Strukturun dəyişəninin adının əvəzinə strukturun adının istifadə olunması yolverilməzdir:
Person.name=Akademiya;//bu işləməyəcək!
10.3. Strukturun inisiallaşdırılması
Strukturu iki üsulla inisiallaşdırmaq olar: 1) inisiallaşdırma siyahısından istifadə etməklə; 2) konstruktorla.
Aşağıdakı kod fraqmentində inisiallaşdırma siyahısından istifadə etməklə strukturun necə inisiallaşdırılması verilir:
Person P1={“Telebe”, 111};
Bu tamamilə massivin inisiallaşdırılmasına analojidir. Lakin burada mühüm fərq ondan ibarətdir ki, massivin bütün elementləri eyni tip olduqları halda, struktur nümunəsinin dəyişənləri müxtəlif tip ola bilərlər. Ona görə də inisiallaşdırmada ardıcıllıq mühüm rol oynayır. Məsələn,
Person P1={111, “Telebe”}
kodu səhvdir, çünki, struktur nümunəsinin birinci dəyişəni c – sətirdir, ona görə də ona tam qiymət mənimsətmək olmaz.
Konstruktor – obyektə istinad edərkən avtomatik çağrılan funksiyadır.
Konstruktorlar üç növ olurlar:
1) Susmaya görə konstruktorlar,
2) Parametrsiz konstruktorlar,
3) Parametrli konstruktorlar.
Aşağıdakı proqramda susmaya görə konstruktorun istifadə olunması göstərilir:
Misal 10.2.
#include <iostream>
#include <string>
using namespace std;
struct Person {
string name;
int height;
};
int main()
{
Person P1;
cout<<"The person's name is "<<P1.name<<" and height is "<<P1.height<<endl;
return 0;
}
Burada susmaya görə konstruktor Person nümunəsinin yaratdığı
Person P1;
operatoru vasitəsilə çağrılır. Nəticədə alınır ki, Person nümunəsi susmaya görə konstruktorla yaradılmışdır. Bununla belə, nümunənin dəyişənlərinə qiymət mənimsədilməyib. Ona görə də nümunənin name dəyişəninin adı boş sətir, nümunənin dəyişəninin qiyməti isə “zibil” qiymətdir.
Parametrsiz konstruktorlar – susmaya görə konstruktordan fərqli olaraq nümunənin dəyişənlərinə susmaya görə qiymət mənimsədirlər. Aşağıdakı kodda Person strukturunun gövdəsinə parametrsiz konstruktor əlavə olunması göstərilmişdir:
Misal 10.3.
struct Person {
string name;
int height;
Person ()
{
name=”no name assigned”; konstruktor
height= - 1;
}
};
Konstruktorun adı strukturun özünün adı kimi olur. Bundan başqa, konstruktorda qaytarılan qiymətlər yoxdur. Bu parametrsiz konstruktor da susmaya görə konstruktor kimi Person P1; operatoru ilə çağrılır. Parametrsiz konstruktor çağrılmasına baxmayaraq, P1 – dən sonra boş mötərizə yoxdur, ona görə ki, bu funksiyanın çağrılması deyil, yalnız dəyişənin elanıdır.
Parametrli konstruktorlar. Susmaya görə konstruktorlardan parametrsiz konstruktorların elanı daha yaxşıdır, ona görə ki, nümunənin dəyişənlərinə indi susmaya görə qiymət mənimsədilirlər. Lakin əgər proqramın işləməsi zamanı inisiallaşdırsaq vəziyyəti daha da yaxşılaşdırmaq olar. Bu isə o halda mümkün olur ki, konstruktora nümunənin dəyişənlərini inisiallaşdırmaq üçün istifadə olunan parametrlər əlavə olunsun. Məsələn,
Person(string s, int h)
{
name=s;
height=h;
}
Iki parametrli konstruktor aşağıdakı Person nümunəsinin elan olunması ilə çağrılır:
Person P1(strName, centimeters);
Burada mötərizələr lazımdır, çünki parametrlər var. Parametrlər konstruktorun onları gözlədiyi ardıcıllıqda dayanmalıdırlar. Məsələn, əgər konstruktor birinci parametrin sətir, ikincinin isə tam ədəd olduğunu gözləyirsə, onda birinci parametri tam ədəd, ikincisi isə sətir olan Person nümunəsi elan olunarsa nəticə səhv olacaq.