Fayla yazmaq və fayldan oxumaq

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 kla­viaturadan daxil edilməsi üçün istifadə olunan >> - ardıcıl da­xil etmə operatoru istifadə olunur. Yeganə fərq ondan iba­rət­dir ki, cin obyekti əvəzinə ifstream və ya fstream obyekti istifadə olunur.

 

Misal 9.2. Aşağıdakı proqram informasiyanı telebe.dat fay­­­lı­na yazır, proqram onu fayldan oxuyur və onu ekrana çı­xa­­­rı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 anla­yı­ş­la­rın­­dan çox tez-tez istifadə olunur.

Obyektləri bir dəyişənlə təsvir etmək üçün onlar çox mü­rək­kəb­dirlər. Massiv çoxlu sayda dəyişən saxlaya bilər, la­kin 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əhdud­lan­mır. Məsələn, tələbə dedikdə burada hər hansı ümumi xarak­te­­ri­sti­kalar olur - onların adları, topladığı ballar, boyları, oxu­duqları fakültə və s. Onlardan hər birinin qiymətini dəyişəndə sax­la­maq 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ə ola­raq, 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++ -­da­kı adi int və ya C–sətir tipləri deyil. Həqiqətdə bu proq­ramçı 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 olu­nur­lar və hər bir belə dəyişən nümunə dəyişəni adlanır. Struk­tur­da nümunənin çoxlu sayda dəyişənləri ola bilər. Həmçinin bir struk­turun dəyişəni digər struktur nümunəsinin dəyişəni ola bi­lər.

Strukturu kodun istənilən yerində elan etmək olar. Lakin şərt­­ləş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 veri­lə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 veri­lən­lə­rin ti­pi­nin elan olunmasına uyğun gəlmir. Məsələn, Telebe struk­­tu­ru­na qiymət mənimsətmək olmaz, lakin int tipli dəyi­şə­nə qiy­mət mənimsətmək olar. Bunun əvəzinə strukturun də­yi­şə­n­lə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 ki­mi 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 et­mək olar, onun görünmə oblastı və varlıq zamanı qaydası tam­­­qiy­mətli və kəsr dəyişənlərə və ya başqa dəyişənlərə olan tə­sir­lə eyni­dir.

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­şə­ni­nin 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 çıxar­maq 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) inisi­al­laş­dır­ma si­ya­hı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. La­kin burada mühüm fərq ondan ibarətdir ki, massivin bütün ele­mentləri eyni tip olduqları halda, struktur nümunəsinin də­yi­şən­lə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ə olun­ması 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 ya­rat­­dığı

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 qiy­mə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öv­də­si­nə parametrsiz konstruktor əlavə olunması gös­tə­ril­miş­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 para­metr­siz konstruktor da susmaya görə konstruktor kimi Person P1; operatoru ilə çağrılır. Parametrsiz kon­struk­tor ç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ə konstruk­tor­lar­dan 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ə­nim­sə­di­lir­lər. Lakin əgər proqramın işləməsi zamanı inisial­laş­dır­saq vəziyyəti daha da yaxşılaşdırmaq olar. Bu isə o halda müm­­kün olur ki, konstruktora nümunənin dəyişənlərini inisial­laşdırmaq üçün istifadə olunan parametrlər əlavə olun­sun. 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. Para­metr­lər konstruktorun onları gözlədiyi ardıcıllıqda dayan­ma­lı­dır­lar. Məsələn, əgər konstruktor birinci parametrin sətir, ikin­ci­nin 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 olu­nar­sa nə­ti­cə səhv olacaq.