Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Joqari darejeli programmalastiriwda C++ Last

.pdf
Скачиваний:
8
Добавлен:
03.12.2023
Размер:
2.03 Mб
Скачать

X Bap. Strukturalar hám birlespeler

10.1. Strukturalar

Bizge belgili, qandayda bir tarawdaǵı máseleni sheshiwde ondaǵı obyektler bir neshe, hár qıylı tiptegi parametrler menen anıqlanıwı múmkin. Máselen, tegisliktegi noqat haqıyqıy tiptegi x-abcissa hám y-ordinata juplıǵı -(x,y) kórinisinde beriledi. Student haqqındaǵı maǵlıwmatlar: qatar tipindegi student familiyası, atı hám ákesiniń atı, qánigelik baǵdarı, student jasaw adresi, pútin tiptegi tuwılǵan jılı, oqıw basqıshı, haqıyqıy tiptegi reyting balı, logikalıq tiptegi student jınısı haqqındaǵı maǵlıwmat hám basqalardan qáliplesedi.

Programmada jaǵday yaki túsinikti súwretlewshi hár bir berilgenler ushın óz aldına ózgeriwshi anıqlap máseleni sheshiw múmkin. Biraq bul jaǵdayda obyekt haqqındaǵı maǵlıwmatlar «tarqalǵan» boladı, olardı qayta islew qıyınlasadı, obyekt haqqındaǵı berilgenlerdi bir pútin jaǵdayda kóriw qıyınlasadı.

C++ tilinde bir yaki hár qıylı tiptegi berilgenlerdiń jıynaǵı struktura dep ataladı. Struktura paydalanıwshı tárepinen anıqlanǵan berilgenlerdiń jańa tipi esaplanadı. Struktura tómendegishe anıqlanadı:

struct <struktura atı>

{

<tip1 > <atı1>; <tip2 > <atı2>;

<tipn> <atın>;

};

Bul jerde <struktura atı> - struktura kórinisinde jaratılıp atırǵan jańa tiptiń atı, “<tipi> <atıi>;” - strukturanıń i-maydanınıń (atıi) járiyalanıwı.

Basqasha aytqanda, struktura járiyalanǵan ózgeriwshilerden (maydanlardan) quraladı. Oǵan hár qıylı tiptegi berilgenlerdi óz ishine alıwshı qabıq dep qaraw

161

múmkin. Qabıqtaǵı berilgenlerdi bir pútin halda kóshiriw, sırtqı qurılmalarǵa (binar fayllarǵa) jazıw, oqıw múmkin boladı.

Student haqqındaǵı berilgenlerdi óz ishine alıwshı struktura tipiniń járiyalanıwın qarayıq.

struct Student

{

char FAÁ[30];

unsigned int Tuwılǵan_jıl; unsigned int Kurs;

char Baǵdar[50]; float Reyting;

unsigned char Jınısı[5]; char Mánzil[50];

bool status;

};

Programmada strukturalardan paydalanıw, sol tiptegi ózgeriwshilerdi járiyalaw hám olardı qayta islew arqalı ámelge asırıladı:

Student student;

Struktura tipiniń járiyalanıwında tiptiń atı bolmawı múmkin, biraq bul jaǵdayda struktura anıqlanıwınan keyin álbette ózgeriwshiler atları jazılıwı kerek:

struct

{

unsigned int x, y; unsigned char Reń;

} Noqat1, Noqat2;

Keltirilgen mısalda struktura tipindegi Noqat1, Noqat2 ózgeriwshileri járiyalanǵan.

Struktura tipindegi ózgeriwshiler menen islew, onıń maydanları menen islewdi ańlatadı. Struktura maydanına múráját ‘.’ (noqat) arqalı ámelge asırıladı. Bunda struktura tipindegi ózgeriwshi atı, onnan keyin noqat qoyıladı hám maydan ózgeriwshisiniń atı jazıladı. Máselen, student haqqındaǵı struktura maydanlarına múráját tómendegishe boladı:

162

student.Kurs = 2; student.Tuwilgan_jil = 1998; strcpy(student.FAÁ, “Abdullaev A.A.”);

strcpy(student.Baǵdar, “Programmalıq injiniring”); strcpy(student.Jınısı, “Erkek”);

strcpy(student.Mánzil, ”Nokis qalası, tel: 296-45-78”); student.Reyting = 123.52;

Keltirilgen mısalda student strukturasınıń san tipindegi maydanlarına ápiwayı kóriniste mánisler berilgen, qatar tipindegi maydanlar ushın strcpy funkciyası arqalı mánis beriw ámelge asırılǵan.

Struktura tipindegi obyekttiń yadtan qansha orın iyelegenligin sizeof funkciyası arqalı anıqlaw múmkin:

int i = sizeof(Student);

Ayrım hallarda struktura maydanları ólshemin bitlerde anıqlaw arqalı iyelenetuǵın yadtı kemeytiw múmkin. Bunıń ushın struktura maydanı tómendegishe járiyalanadı:

<maydan atı> : <turaqlı ańlatpa>

Bul jerde <maydan atı> - maydan tipi hám atı, <turaqlı ańlatpa>- maydannıń bitlerdegi uzınlıǵı. Maydan tipi pútin tipler bolıwı kerek (int, long, unsigned, char).

Eger paydalanıwshı strukturanıń maydanı tek 0 hám 1 mánisin qabıl etiwin bilse, bul maydan ushın bir bit orın ajıratıw múmkin (bir bayt yaki eki bayt ornına). Yadtı tejew esabına maydan ústinde ámel orınlawda razryadlı arifmetikanı qollaw zárúr boladı.

Mısal ushın, sáne-waqıt penen baylanıslı strukturanı jaratıwdıń eki variantın kórip shıǵayıq. Struktura jıl, ay, kún, saat, minut hám sekund maydanlarınan ibarat bolsın hám onı tómendegishe anıqlaw múmkin:

struct Sáne_waqıt

{

unsigned short Jıl; unsigned short Ay; unsigned short Kún; unsigned short Saat;

163

unsigned short Minut;

unsigned short Sekund;

};

Bunday anıqlawda Sáne_waqıt strukturası yadta 6 maydan*2 bayt=12 bayt orın iyeleydi. Eger itibar berilse strukturada artıqsha orın iyelegen jaǵdaylarda bar.

Máselen, jıl ushın mánisi 0 sanınan 99 sanına shekem mánis penen anıqlanıw jetkilikli (máselen, 2008 jıldı 8 mánisi menen ańlatıw múmkin). Sonıń ushın oǵan

2 bayt emes, bálki 7 bit ajıratıw jetkilikli. Dál sonday ay ushın 1..12 mánislerdi ańlatıwǵa 4 bit orın jetkilikli hám basqalar.

Joqarıda keltirilgen sheklewlerden keyin Sáne_waqıt strukturasınıń únemli variantın anıqlaw múmkin:

struct Sáne_waqıt2

{

unsigned Jıl:7; unsigned Ay:4; unsigned Kún:5; unsigned Saat:6; unsigned Minut:6; unsigned Sekund:6;

};

Bul struktura yadtan 5 bayt orın iyeleydi.

10.2. Struktura funkciya argumenti sıpatında

Strukturalar funkciya argumenti sıpatında qollanılıwı múmkin. Bunıń ushın funkciya prototipinde struktura tipi kórsetiliwi kerek boladı. Máselen, student haqqındaǵı berilgenlerdi óz ishine alıwshı Student strukturası tipindegi berilgenlerdi

Student_Mánzili() funkciyasına parametr sıpatında beriw ushın funkciya prototipi tómendegi kóriniste bolıwı kerek:

void Student_Mánzili(Student);

Funkciyaǵa strukturanı argument sıpatında uzatıwǵa mısal sıpatındaǵı programmanıń teksti:

#include <iostream.h>

164

#include <string.h> struct Student

{

char FAÁ[30]; unsigned int Tuw_jıl; unsigned int Kurs; char Baǵdar[50]; float Reyting;

unsigned char Jınısı[5]; char Mánzil[50];

bool status;

};

void Student_Mánzili(Student); int main(int argc,char* argv[])

{

Student student; student.Kurs = 2; student.Tuw_jıl = 1998;

strcpy(student.FAÁ,"Abdullaev A.A."); strcpy(student.Baǵdar, "Programmalıq injiniring"); strcpy(student.Jınısı,"Erkek");

strcpy(student.Mánzil, "Nokis qalası, tel: 296-45-78"); student.Reyting = 123.52;

Student_Mánzili(student); return 0;

}

void Student_Mánzili(Student t)

{

cout << "Student FAÁ: " << t.FAÁ << endl; cout << "Mánzili: " << t.Mánzil << endl;

}

Programma bas funkciyasında student strukturası anıqlanıp, onıń maydanlarına mánisler beriledi. Keyin student stukturası Student_Mánzili() funkciyasına argument sıpatında uzatıladı. Programma islewi nátiyjesinde ekranǵa

tómendegi maǵlıwmatlar shıǵarıladı.

165

Student FAÁ: Abdullaev A.A.

Mánzili: Nokis qalası, tel: 296-45-78

10.3. Strukturalar massivi

Óz-ózinen belgili, struktura tipindegi jalǵız berilgen menen sheshiw múmkin bolǵan máseleler sheńberi júdá tar hám kópshilik jaǵdaylarda, qoyılǵan másele strukturalar kompleksin qollanılıwdı talab etedi. Bul tiptegi máselelerge berilgenler bazasın qayta islew máseleleri dep qaraw múmkin.

Strukturalar massivin járiyalaw dál standart massivlerdi járiyalaw kibi boladı, parıqı massiv tipi ornında paydalnıwshı tárepinen anıqlanǵan struktura tipiniń atı jazıladı. Máselen, studentler haqqındaǵı berilgenlerdi óz ishine alǵan massiv jaratıw járiyalanıwı tómendegishe boladı:

const int n = 25;

Student studentler[n];

Strukturalar massiviniń elementlerine múráját ádettegi massiv elementlerine múráját usulları arqalı, hár bir elementtiń maydanlarına múráját bolsa‘.’ arqalı ámelge asırıladı.

Tómendegi programmada topardaǵı hár bir student haqqındaǵı berilgenlerdi klaviaturadan kiritiw hám topar studentleriniń familiyası, atı hám ákesiniń atı shıǵarıladı.

#include <iostream.h> #include <conio.h> const int n = 3; struct Student

{

char FAÁ[30]; unsigned int Tuw_jıl; unsigned int Kurs; char Baǵdar[50]; float Reyting;

char Jınısı[6]; char Mánzil[50];

166

bool status;

};

void Student_Kiritiw(Student t[]); void Studentler_FAÁ(Student t[]); int main(int argc, char* argv[])

{

Student studentler[n]; Student_Kiritiw(studentler); Studentlar_FAÁ(studentler); return 0;

}

void Studentler_FAÁ(Student t[])

{

for(int i = 0; i < n; i++) cout << t[i].FAÁ << endl;

}

void Student_Kiritiw(Student t[])

{

for(int i = 0; i < n; i++)

{

cout << i + 1 << "-student maǵlıwmatların kiritiń:" << endl;

cout << "Student FAÁ: "; cin.getline(t[i].FAÁ, 30); cout << "Kurs: ";

cin >> t[i].Kurs; cout<<"Reyting balı: "; cin >> t[i].Reyting;

cout << "Tuwılǵan jılı: "; cin >> t[i].Tuw_jıl;

cout << "Qánigelik baǵdarı: "; cin.getline(t[i].Baǵdar, 50); cout << "Jınısı(erkek, hayal): "; cin.getline(t[i].Jinisi, 6); cout << "Jasaw mánzili: ";

167

cin.getline(t[i].Mánzil, 50);

}

}

10.4. Strukturalarǵa kórsetkish

Struktura elementlerine kórsetkishler arqalı múráját etiw múmkin. Bunıń ushın strukturaǵa kórsetkish ózgeriwshisi járiyalanıwı kerek. Máselen, joqarıda keltirilgen mısalda Student strukturasına kórsetkish tómendegishe járiyalanadı:

Student *k_student;

Korsetkish arqalı anıqlanǵan struktura elementlerine múráját «.» menen emes, balki «->» quralı járdeminde ámelge asırıladı:

cout << k_student ->FAÁ;

Strukturalardı kórsetkish hám adresti alıw (&) járdeminde funkciya argumenti sıpatında uzatıw múmkin. Tómende keltirilgen programma bóleginde strukturanı

Student_Kiritiw() funkciyasına kórsetkish arqalı, Studentlar_FAÁ() funkciyasına bolsa adresti alıw járdeminde uzatıwǵa mısal keltirilgen.

...

void Student_Kiritiw(Student *t); void Studentlar_FAÁ(Student &t); int main()

{

Student *k_student;

k_student = (Student *) malloc(n * sizeof(Student)); Student_Kiritiw(k_student); Studentler_FAÁ(*k_student);

return 0;

}

void Studentler_FAÁ(Student &t)

{

for(int i = 0; i < n; i++)

{

cout << (&t + i) -> FAÁ << endl;

}

168

}

void Student_Kiritiw(Student *t)

{

for(int i = 0; i < n; i++)

{

cout << i + 1 << "-student maǵlıwmatların kiritiń: " << endl;

cout << "Student FAÁ: "; cin.getline((t + i) -> FAÁ, 30); cout << "Kurs: ";

cin >> (t + i) -> Kurs;

...

}

}

Soǵan itibar beriw kerek boladı, dinamikalıqalıq túrde payda etilgen strukturalar massivi elementi bolǵan strukturanıń maydanına múrájátte «*» belgisi qollanılmaydı.

Másele. Futbol komandaları haqqındaǵı maǵlıwmatlar – komanda atı, házirgi waqıttaǵı utısları, teń hám jeńilisler sanları, hámde qarsılaslar dárwazasına kiritilgen hám óz dárwazasınan ótkerilip jiberilgen toplar sanları menen berilgen. Futbol komandalarınıń turnir kestesi shıǵarılsın. Komandalardı kestede tártiplestiriwde tómendegi qaǵıydalarǵá ámel qılınsın:

1)komandalar toplaǵan ochkolarınıń kemeyiwi boyınsha tártipleniwi kerek;

2)eger komandalar toplaǵan ochkoları teń bolsa, olardan salıstırmalı kóp utısqa erisken komanda kestede joqarı orındı iyeleydi;

3)eger eki komandanıń toplaǵan ochkoları hám utıslar sanı teń bolsa, olardan salıstırmalı kóp top kiritken komanda kestede joqarı orındı iyeleydi.

Komanda haqqındaǵı berilgenler struktura kórinisinde, keste bolsa struktura massivi sıpatında anıqlanadı:

struct Komanda

{

string Atı;

169

int Utıs, Teńlik, Utılıs, Urǵan_top, Ótkergen_top;

int Oyın, Ochko;

};

Bul jerde Oyın maydanı Utıs, Teńlik hám Utılıs maydanlar qosındısı, komanda toplaǵan ochkolar – Ochko = 3 * Utıs + 1 * Teńlik kórinisinde anıqlanadı. Komandalar massivi Ochko, Utıs hám Urǵan_top maydanları boyınsha tártiplenedi.

Programma teksti:

struct Komanda

{

string Atı;

int Utıs, Teńlik, Utılıs, Urǵan_top, Ótkergen_top; int Oyın, Ochko;

};

const at_uzınlıǵı = 10; int komandalar_sanı;

Komanda *Komandalar_Tablicası()

{

char *km_atı = (char*) malloc(at_uzınlıǵı + 1); cout << "Komandalar sanı: ";

cin >> komandalar_sanı;

Komanda *km = new Komanda[komandalar_sanı]; for(int i = 0; i < komandalar_sanı; i++)

{

cin.ignore();

cout << i + 1 << "-komanda maǵlıwmatları:\n"; cout << "Atı: ";

cin.getline(km_atı, at_uzınlıǵı); while(strlen(km_atı) < at_uzınlıǵı)

strcat(km_atı, " "); km[i].Atı.assign(atı); cout << "Utıslar sanı: "; cin >> km[i].Utıs;

cout << "Teılikler sanı: "; cin >> km[i].Teńlik;

cout << "Utılıslar sanı: ";

170