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

Joqari darejeli programmalastiriwda C++ Last

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

union Birlespe

{

int n;

unsigned long N; char Qatar[10];

}

birlespe = {25};

Bul mısalda Birlespe birlespesiniń n maydanı baslanǵısh mánis alǵan esaplanadı.

Birlespe elementi sıpatında strukturalar keliwi múmkin hám olar ádette berilgendi «bóleklerge» ajıratıw yaki «bóleklerden» bir pútin berilgendi payda etiw ushın xızmet etedi. Mısal ushın sózdi baytlarǵa, baytlardı tetradalarǵa (4 bitke) ajıratıw hám qaytadan birlestiriw múmkin.

Tómende bayttı úlken hám kishi yarım baytlarǵa ajıratıwda birlespe hám strukturadan paydalanılǵan programma teksti keltirilgen.

#include <iostream.h> union BCD

{

unsigned char bayt; struct

{

unsigned char lo:4; unsigned char hi:4;

}bin;

}bcd;

int main()

{

bcd.bayt = 127;

cout << “\n Úlken yarım bayt: ” << (int)bcd.bin.hi; cout << “\n Kishi yarım bayt: ” << (int)bcd.bin.lo; return 0;

}

181

Programma bas funkciyasında bcd birlespesiniń bayt ólsheminde bayt maydanına 127 mánisi beriledi hám onıń úlken hám kishi yarım baytları shıǵarıladı.

Programma islewi nátiyjesinde ekranǵa tómendegi nátiyjeler shıǵadı:

Úlken yarım bayt: 7

Kishi yarım bayt: 15

Másele. Haqıyqıy tiptegi sannıń kompyuter yadındaǵı ishki kórinisin shıǵarıw. Haqıyqıy san float tipinde dep esaplanadı hám ol yadta 4 bayt orın iyeleydi (1-qosımshaǵa qarań). Qoyılǵan máseleni sheshiw ushın birlespe qásiyetlerinen paydalanıladı, yaǵnıy yadtıń bir adresine haqıyqıy san hám belgiler massivi jaylastırıladı. Haqıyqıy san yadta oqılıp, belgiler massiviniń hár bir elementiniń (baytınıń) ekilik kórinisi shıǵarıladı.

Programma teksti:

#include <iostream.h>

const unsigned char bitler_sanı = 7;

const unsigned char format = sizeof(float); void Belgi_2kodı(unsigned char blg);

union San_hám_Belgi

{

float san;

unsigned char belgi[format];

};

int main()

{

San_hám_Belgi san_hám_belgi; cin >> san_hám_belgi.san;

for(int b = format - 1; b >= 0; b--) Belgi_2kodı(san_hám_belgi.belgi[b]);

return 0;

}

void Belgi_2kodı(unsigned char blg)

{

unsigned char l0000000 = 128; for(int i = 0; i <= bitler_sanı; i++)

182

{

if(blg & l0000000) cout << '1';

else

cout << '0'; blg = blg << 1;

}

cout<<' ';

}

Programmada San_hám_Belgi birlespesin járiayalw arqalı float tipindegi x ózgeriwshisin hám float tipi formatınıń baytlardaǵı uzınlıǵındaǵı belgilerden ibarat belgi massivin yadtıń bir orınına jaylasıwına erisiledi. Bas funkciyada birlespe tipindegi san_hám_belgi ózgeriwshisi járiyalanadı hám onıń x maydanına klaviaturadan haqıyqıy san oqıladı. Keyin belgiler massivindegi hár bir elementtiń ekilik kodi shıǵarıladı. Ekilik kodtı shıǵarıwda 8 márte bayttı 7-razryadındaǵı sandı shıǵarıw hám bayt razryadların bir márte shepke jıljıtıw arqalı ámelge asırıladı. Soǵan itibar beriw kerek boladı, belgiler massivindegi elementlerdiń ekilik kodların shıǵarıw ońnan shep tárepke orınlanǵan. Buǵan sebep, san ishki formatındaǵı baytlardıń yadta «kishi bayt – kishi adreste» qaǵıydasına baylanıslı jaylasıwı esaplanadı.

Programmaǵa -8.5 sanı kiritilse, ekranda

11000001 00001000 00000000 00000000

kórinisindegi ekilik sanlar izbe-izligi payda boladı.

10.7. Paydalanıwı tárepinen anıqlanǵan berilgenler tipi

C++ tilinde paydalanıwshı tárepinen tek ǵana struktura yaki birlespe tipleri emes, bálki sol waqıtta bar (anıqlanǵan) tipler tiykarında jańa tiplerdi jaratıw múmkin.

Paydalanıwshı tárepinen anıqlanatuǵın tip typedef gilt sózi menen baslanadı, onnan keyin bar tip kórsetiledi hám identifikator jazıladı. Aqırında jazılǵan identifikator – jańadan jaratılǵan tiptiń atı esaplanadı. Máselen,

183

typedef unsigned char byte;

ańlatpası byte dep atalıwshı jańa tipti jaratadı hám óz mazmunına baylanıslı unsigned char tipi menen ekvivalent boladı. Keyinala, programmada yadtan bir bayt orın iyeleytuǵın hám [0..255] aralıqtaǵı mánislerdi qabıl etetuǵın byte tipindegi ózgeriwshi (turaqlılardı) járiayalaw múmkin:

byte c = 65;

byte Byte = 0xFF;

Massiv kórinisindegi paydalanıwshı tárepinen anıqlanıwshı tip járiyalanıwı tómendegishe boladı:

typedef char Atı[30];

Atı atı;

Atı tipindegi atı ózgeriwshisi járiyalanıwı - bul 30 belgiden ibarat massiv

(qatar) járiyalanıwı esaplanadı.

Ádette sheshilip atırǵan máseleniń predmet tarawı terminlerinde islesiw ushın strukturalar qayta ataladı. Nátiyjede quramalı dúziliske iye bolǵan hám zárúr qásiyetlerdi ózine jámlegen jańa tiplerdi jaratıwǵa muwapıq boladı.

Máselen, kompleks san haqqındaǵı maǵlıwmatlardı óz ishine alıwshı

Complex tipi tómendegishe anıqlanadı:

typedef struct

{

double re; double im;

} Complex;

Endi kompleks san járiyalanıwın

Complex KSan;

kórinisinde jazıw múmkin hám onıń maydanlarına múráját etiw múmkin:

KSan.re = 5.64;

KSan.im = 2.3;

184

XI Bap. Makroslar

11.1. Makroslardı anıqlaw hám jaylastırıw

Makros – bul programma (kod) bólegi bólıp, kóriniwi hám islewi dál funkciya sıyaqlı. Bıraq ol funkciya emes. Funkciyalar hám makroslar ortasında bir neshe parıqlar bar:

programma tekstinde ushıraǵan makros ańlatpası óz anıqlanıwı (denesi menen) menen preprocessor islewi waqtında, yaǵnıy programma kompilyaciyasınan aldın almastırıladı. Sol sebepli, makros funkciyanı shaqırıw menen baylanıslı qosımsha waqıt ketiwin talap etpeydi;

makroslardan paydalanıw programmanıń baslanǵısh kodınıń úlkeyiwine alıp keledi. Buǵan qarama-qarsı jaǵdayda funkciya kodı jalǵız nusqada boladı hám ol programma kodınıń qısqarıwına alıp keledi. Bıraq funkciyanı shaqırıw ushın qosımsha resurslar isletiledi;

kompilyator makrostaǵı tipler sáykesligini teksermeydi. Sol sebepli, makrosqa argument jiberiwde tipler sáykesligi yamasa argumentler sanınıń tuwrı

keliwi yamasa kelmewi haqqındaǵı qátelik xabarları berilmeydi;

makros baslanǵısh kodqa programma bólegin qoyıw quralı bolǵanlıǵı hám bunday bólekler teksttıń túrli orınlarına qoyıw múmkinligi sebepli makroslar menen baylanıslı fiksirlengen, jalǵız adresler bolmaydı. Sol sebepli makroslarda kórsetkishler járiyalaw yamasa makros adreslerin isletiw múmkinshiligi joq.

Makroslardı anıqlaw ushın #define direktivasınan paydalanıladı. Funkciyaǵa uqsap makroslar da parametrlerge iye bolıwı mumkin. Mısal ushın eki sannıń kobeymesin esaplawshı makros tómendegishe anıqlanadı:

#include <iostream.h>

#define KÓBEYME(x, y) (x) * (y) int main()

{

int a = 2, b = 3; c = KÓBEYME(a, b);

185

cout << c;

return 0;

}

Mısaldan kórinip turıptı, sırtqı kórinisi boyınsha makroslardan paydalanıw funkciyalardan paydalanıwǵa uqsas. Sonıń ushın, ayrım jaǵdaylarda olardı psevdofunkciyalar dep ataydı. Makroslar anıqlanıwınıń jáne bir ózine tán tárepi sonnan ibarat, C++ tilinde olardıń atların úlken háripler menen jazıwǵa kelisilgen.

Joqarıdaǵı mısaldıń ózine tán korinislerinen biri bul makros parametrleriniń qawıs ishinde jazılıwı esaplanadı. Al keri jaǵdayda makros anıqlanıwın tekstke qoyıwda mazmun tárepten qátelik júzege keliwi múmkin. Máselen:

#define KVADRAT(x) x * x

Aytayıq programma tekstinde joqarıdaǵı makros isletilgen qatar bar bolsın:

int y = KVADRAT(2);

bul jaǵdayda, makros anıqlanıwın tekstke qoyıw nátiyjesinde programma tekstinde joqarıdaǵı qatar tómendegishe koriniske keledi:

int y = 2 * 2;

Bıraq, programmada makrostı isletiw

int y = KVADRAT(x + 1);

korinisinde bólsa, makros anıqlanıwın tekstke qoyıw nátiyjesinde usı qatar

int y = x + 1 * x + 1;

kórsetpesi menen almastırıladı, bul álbette kútilgen almastırıw emes. Sol sebepli, makros anıqlanıwında ulıwma qaǵıyda sıpatında parametrlerdi qawısqa alıw usınıs etiledi:

#define KVADRAT(x)(x) * (x)

Eger makros shaqırılıwında tipke keltiriw operatorınan paydalanǵan jaǵday bolsa, makros denesin tolıǵı menen qawısqa alıw talap etiledi. Mısal ushın, programma tekstinde makrosqa múráját tómendegishe bolsın:

double x = (double) KVADRAT(x + 1);

Bul jaǵdayda makros anıqlanıwı

#define KVADRAT(x)((x)*(x))

kórinisi tuwrı esaplanadı.

186

Makros anıqlanıwında aqırǵı esletpe sıpatında sonı aytıp ótıw tiyis, artıqsha probeller makrosdan paydalanıwda qáteliklerge alıp keliwi múmkin. Mısal ushın

#define SHÍǴARÍW (x)cout<<x

makros anıqlanıwında makros atı SHÍǴARÍW hám parametrler dizimi (x) ortasında artıqsha probel qoyılǵan. Preprocessor bul makrosdı parametrsiz makros dep qabıl etedi, hámde "(x)cout<<x" qatar astın makros denesi dep esaplaydı hám makros almastırıwlarda sol qatardı programma tekstine qoyadı. Nátiyjede kompilyaciya qátesi júz beredi. Qáteni dúzetiw ushın makros atı hám parametrler dizimi ortasındaǵı probeldı alıp taslaw jeterli:

#define SHÍǴARÍW(x)cout<<x

Eger makros anıqlanıwı bir qatarǵa sıymasa, sol qatar aqırına '\' belgisın qoyıw arqalı keyingi qatarda dawam ettiriw múmkin:

#define MÚYESH3(a,b,c) (unsigned int)a + (unsigned int)b\ > (unsigned int)c && (unsigned int)a+(unsigned int)c > \ (unsigned int)b && (unsigned int)b+(unsigned int)c > \ (unsigned int)a

Makros anıqlanıwında basqa makroslar qatnasıwı múmkin. Tómendegi mısalda ishpe-ish jaylasqan makros anıqlanıwı kórsetilgen.

#define PI 3.14159

#define KVADRAT(x) ((x)*(x))

#define SHEŃBER_MAYDANÍ(r) (PI * KVADRAT(r))

Paydalanıwǵa zárúrligi qalmaǵan makrostı programma tekstiniń qálegen jerinde #undef direktivası menen biykar etiw múmkin, yaǵnıy sol qatardan keyin makros preprocessor ushın qáte esaplanadı. Tómende sheńber maydanın esaplaytuǵın programma tekstı keltirilgen.

#include <iostream.h> #define PI 3.14159

#define KVADRAT(x) ((x)*(x))

#define SHEŃBER_MAYDANÍ(r)(PI * KAVDRAT(r)) int main()

{

double r1 = 5, r2 = 10;

187

double c1, c2;

c1 = SHEŃBER_MAYDANÍ(r1); #undef SHEŃBER_MAYDANÍ

c2 = SHEŃBER_MAYDANÍ(r2); cout << c1 << endl;

cout << c2 << endl; return 0;

}

Programma kompilyaciyasında "c1 = SHEŃBER_MAYDANÍ(r1);" qatar

normal qayta islengen halda "c2 = SHEŃBER_MAYDANÍ(r2);" qatarı ushın

SHEŃBER_MAYDANÍ funkciyası anıqlanbaǵanlıǵı haqqında qátelik xabarı shıǵarıladı.

11.2. Makroslarda isletiletuǵın ámeller

Makroslarda isletiliwi múmkin bolǵan eki ámel bar: '#' - qatardı jaylastırıw hám "##" - qatardı jalǵaw ámelleri.

Eger makros parametri aldına '#' - qatardı jaylastrıw ámeli qoyılǵan bolsa, makros anıqlanıwın tekstke qoyıw waqtında sol orınǵa sáykes argumenttiń atı qoyıladı. Bunı tómendegi mısalda kórıw múmkin:

#include <iostream.h>

#define ÓZG_ATÍ(ózg) cout << #ózg << '=' << ózg; int main()

{

int x = 10;

ÓZG_ATÍ(x); return 0;

}

Programma islewi nátiyjesinde monitorda

x = 10

qatarı payda boladı.

Qatar jalǵaw ámeli eki qatardı birewge birlestiriw ushın xızmet etedi. Qatarlardı birlestiriwden aldın olardı ajıratıp turǵan probeller óshiriledi. Eger payda

188

bolǵan qatar atındaǵı makros bar bolsa, prepocessor usı makros denesin shaqırıw bolǵan orınǵa jaylastıradı. Mısal ushın:

#include<iostream.h>

#define MACRO_BIR cout << "MACRO_1"; #define MACRO_EKI cout << "MACRO_2"; #define MACRO_BIRLESPE(n) MACRO_##n int main(int argc, char*argv[])

{

int x = 10; MACRO_BIRLESPE(BIR); cin >> x;

return 0;

}

programması preprocessor tárepinen qayta islengennen keyin onıń aralıq teksti tómendegi kóriniste boladı:

int main(int argc, char*argv[])

{

int x = 10;

cout << "MACRO_1"; cin >> x;

return 0;

}

Qatarlardı jalǵaw ámelinen jańa ozgeriwshilerdi jaratıw ushın paydalanıw múmkin.

#define ÓZG_JÁRIYALANÍWÍ(i) int var ## i

...

ÓZG_JÁRIYALANÍWÍ(1);

...

Joqarıdaǵı mısalda makros óz anıqlanıwı menen almastırıw nátiyjesinde

"ÓZG_JÁRIYALANÍWÍ(1);" qatarı ornına int var1;

kórsetpesı payda boladı.

189

XII Bap. Oqıw-jazıw funkciyaları

12.1. Fayl túsinigi

C++ tilindegi standart hám paydalanıwshı tárepinen anıqlanǵan tiplerdiń áhmiyetli qásiyeti sonnan ibarat, olardıń aldınnan anıqlanǵan muǵdardaǵı shekli elementlerinen ibarat ekenliginde. Hátte berilgenler dinamikalıqalıq anıqlanǵanda da, operativ yadtıń ámelde sheklengenligi sebepli, bul berilgenler muǵdarı joqarıdan shegaralanǵan elementlerden ibarat boladı. Ayrım bir quramalı máseleler ushın aldınnan berilgenniń komponentaları sanın anıqlaw imkanı joq. Olar máseleni sheshiw processinde anıqlanadı hám jeterli dárejede úlken kólemde bolıwı múmkin. Ekinshi tárepten, programmada járiyalanǵan ózgeriwshilerdiń mánisleri sıpatında anıqlanǵan berilgenler tek ǵana programma islew waqtında bar boladı hám programma óz jumısın tamamlaǵannan keyin joǵalıp ketedi. Eger programma jańadan iske túsirilse, bul berilgenlerdi jańadan payda etiw zárúr boladı. Kópshilik qollanılǵan máseleler bolsa, berilgenlerdi turaqlı túrde saqlap turıwdı talap etedi. Máselen, kárxana xızmetkerleriniń aylıq is haqısın esaplawshı programmada xızmetkerler dizimin, shtat stavkaları hám xızmetkerler tárepinen alınǵan is haqılar haqqındaǵı maǵlıwmatlardı turaqlı túrde saqlap turıw zárúr. Bul talaplarǵa fayl tipindegi obyektler (ózgeriwshiler) juwap beredi.

Fayl - bul birdey tiptegi mánisler jaylasqan sırtqı yadtaǵı at qoyılǵan oblast esaplanadı.

Fayldı, basında izbe-iz túrde jaylasqan jazıwlar (máselen, muzıka) menen toltırılǵan hám aqırı bos bolǵan jeterli dárejede uzın magnit lentasına uqsatıw múmkin.

F

F1

F2

F3

 

 

 

 

 

12.1-súwret. Fayl súwretleniwi.

190