#include
/* математикалық функциялар директивасы */
main()
/* басты функцияны қолдану */
{ int a,b,c;
/*
бүтін айнымалыларды сипаттау */
float p,s;
/*
нақты айнымалыларды сипаттау */
С-программа
# тақырып
main( )
f1
f2
Операторлар
Операторлар
Операторлар
3.1-
сурет. С программасының құрылымы
30
printf("\
n‚ үшбұрыш қабырғаларын енгіз :
\n");
scanf("%d%d%d",&a,&b,&c);
p=(a+b+c)/2.0;
s=sqrt(p*(p-a)*(p-b)*(p-c));
printf("s=%f",s);
}
Программада түсініктемелер беру үшін /* және */ таңбалары қолданылады, олар-
дың ішіне қазақша, орысша, ағылшынша сөз тіркестерін жазуға болады.
Препроцессор директивалары
#include
сөзінен кейін жазылады,
stdio.h
тіркесі
енгізу/шығару операциялары орындалатынын білдіреді. Ал
math.h
сөз тіркесі прог-
раммада математикалық функциялар пайдаланылатынын көрсетеді.
Басты функция
main()
аргументсіз жазылған, сол себепті жақша ішінде ешнәрсе
көрсетілмеген. Ал функция тұлғасы операторлардан (немесе басқа функциялардан)
тұруы тиіс.
Int
түйінді сөзі
a,b,c
айнымалыларының бүтін мән қабылдайтынын,
float
түйінді сөзі
p,s
айнымалыларының нақты мән қабылдайтынын сипаттап тұр.
Келесі жол үшбұрыш қабырғаларын енгізуді талап ететін сөз тіркестерін экранға
шығарады, мұндағы
\n
таңбалары сөз тіркесі алдында және одан кейін курсор бір
жол төмен түсетінін көрсетеді.
Scanf
сөзінен басталатын жол
a,b,c
мәндерін
пернелерден қабылдайды, сонан кейін жарты периметр есептеліп, аудан мәні
анықталады да, соңғы нәтиже экранға шығарылады.
3.1
Тілдің құрамы
Кез келген табиғи тілдің мәтініндегі төрт негізгі элементті көрсетуге болады:
символдар, сөздер, сөз тіркестері және сөйлемдер. Осындай элементтер алгоритмдік
тілдерде де болады, мұнда бірақ сөздер – лексемдер (қарапайым конструкциялар) деп,
сөз тіркестері – өрнектер деп, ал сөйлемдер – операторлар деп аталады. Лексемдер
симолдардан тұрады, өрнектер – лексемдер мен символдардан, ал операторлар –
символдардан, өрнектерден және лексемдерден тұрады (3.3 сурет):
□
Тілдің алфавиті немесе оның символдары – бұл бөлінбейтін негізгі белгілер,
солардан тілдің барлық мәтіндері құрастырылады.
□
Лексем – қарапайым конструкция, ол өзіндік мағынасы бар тілдің ең кіші бірлігі.
□
Өрнектер белгілі бір мәнді есептеу ережесін береді.
□
Оператор белгілі бір әрекеттің аяқталған сипаттамасынан тұрады.
Күрделі есепті шығару үшін операторлар тізбегін жазу керек. Кейде операторлар
жүйелі жақшамен қоршалған құрама операторға немесе блокқа біріктіріледі.
Мұндайда олар бір оператор тәрізді орындалады.
Біртұтас алгоритм бойынша біріктірілген сипаттамалар мен операторлар жиыны
программа құрайды. Оны орындау үшін оны процессорға түсінікті тіл – машиналық
кодқа айналдыру керек. Бұл процесс бірнеше кезеңдерден тұрады. C++ тілі үшін
қажетті кезеңдер мен іс-әрекеттер оқулықтарда [1-3] көрсетілген.
Алдымен программа препроцессорге беріледі де, ол оның мәтініндегі директиваларды
орындайды (мысалы, мәтінге тақырыптық файлдарды – программа элементтерінде
пайдаланылатын сипаттамалар жазылған мәтіндік файлдарды қосады).
Солармен толықтырылған программа мәтіні компилятордың кіріс нүктесіне
беріледі, ол программаның қарапайым элементтерін – лексемдерді айқындайды,
сонан кейін тілдің грамматикасын негізге ала отырып, сол лексемдерден құралған
өрнектер мен операторларды анықтайды. Осыларды талдау барысында компилятор
синтаксистік қателерді тауып, олар жөнделген соң, объектілік модульді құрайды.
31
Идентификатор – латын әрпінен басталып, әріптер мен цифрлардан тұратын
тізбек. Мысалы,
a, beta, b_5, baga
, т.с.с. Айнымалыны сипаттау мынадай
нұсқада орындалады:
char f;
long z, t;
int a, beta, baga;
float b5, k, n;
int y = 10;
Идентификаторлар латын алфавитінің бас және кіші әріптерінен және цифрлардан
құралады. Әріп ретінде астын сызу символын (
_
) қолдануға рұқсат етілген. Бас әріп
пен кіші әріп бірдей болғанымен әр түрлі идентификаторлар болып саналады,
мысалы,
abc, ABC, A128B, a128b
төрт түрлі идентификатор болып есептеледі.
Идентификатордағы символдар арасында бос орын таңбасын қолдануға болмайды.
Түйінді сөздер – мағынасы компиляторға белгілі, алдын ала анықталған идентифи-
каторлар, олардың саны шектеулі. Программалаушы айнымалы, константа, өз
функциялары аттарында тілдің түйінді сөздерін пайдаланбауы тиіс, олар тек өз
мағынасында ғана қолданылады.
Бұған қоса операторлар мен стандартты функциялар аттары да (қордағы сөздер)
түйінді сөздер тізімі секілді басқа мағынада қолданылмайды.
Константалар. Тұрақты (константа) деп программаның орындалу барысында
мәндері өзгеріссіз қалатын шамаларды айтады. Тіл ережесі бойынша бірнеше
константалар типтері болады, мысалы, символдық, бүтін, нақты, тіркестік
константалар.
4
дәріс. C++ тіліндегі мәліметтер типтері
Мәліметтер типі концепциясы. Әр түрлі типтегі мәліметтер компьютер жадын-
да басқаша сақталып, олардың өңделуінде де айырмашылықтар болады. Кез келген
алгоритмдік тілде әрбір константа, айнымалы, өрнекті немесе функцияны есептеу
нәтижесі белгілі бір типте болуы тиіс.
Мәліметтер типі мыналарды:
□
компьютер жадындағы мәліметтің ішкі бейнелену түрін (көлемін);
□
белгілі бір типтегі шамалардың қабылдай алатын мәндер жиынын;
□
осы типтегі шамаларға қолданылатын операциялар мен функцияларды анықтайды.
Осыларға байланысты программада пайдаланылатын нақты объектілерді бейнелеу
үшін программалаушы әрбір шамалардың типін алдын ала таңдап алады.
C++ тілінің барлық типтері негізгі және құрама болып екіге бөлінеді . Мұнда бүтін,
нақты, символдық және логигалық шамаларды бейнелеу үшін алты негізгі тип
қолданылады. Программалаушы осы типтерді негізге ала отырып, құрама типтерді
сипаттай алады. Құрама типтерге жиымдар (массивтер), тізбелер (перечисления),
функциялар, құрылымдар (структуралар), сілтемелер (ссылки), нұсқауыштар
(указатели), біріктірмелер (объединения) және кластар жатады.
Негізгі мәліметтер типтері. Мәліметтердің негізгі (стандартты) типтерін көбінесе
арифметикалық типтер деп атайды, өйткені олар арифметикалық операцияларда
пайдаланылады. Негізгі типтерді сипаттауда келесі түйінді сөздер қолданылады:
□
int
(бүтін);
char
(символдық);
wchar_t
(кеңейтілген символдық);
bool
(логикалық);
float
(нақты);
double
(екі еселенген нақты).
32
Алғашқы төрт тип бүтін сандық (бүтін) типтер деп, соңғы екеуі – жылжымалы
нүктелі типтер деп аталады. Компилятордың бүтін шамаларды өңдеу үшін жасайтын
кодтары жылжымалы нүктелі сандарды өңдеу кодтарынан басқаша болады.
Стандартты типтердің мәндерін бейнелеу диапазонын анықтау үшін төрт тип
спецификаторы қолданылады, олар:
short
(қысқартылған);
long
(ұзартылған);
signed
(
таңбалы);
unsigned
(таңбасыз).
Бүтін тип (int)
int
типінің көлемі стандартпен анықталмайды, ол компьютерге және компи-
ляторға тәуелді болады. 16-разрядтық процессор үшін оған 2 байт берілсе, 32-
разрядты процессорда – 4 байт бөлінеді.
Тип алдындағы short спецификаторы компиляторға процессор разрядтылығына
қарамай-ақ, бүтін санға 2 байт бөлінетінін білдіреді. long спецификаторы бүтін сан
үшін компьютер жадынан 4 байт орын бөлінетінін хабарлайды. Сонымен, 16-
разрядты компьютер үшін
int
және
short int
типтері бірдей болса, ал 32-
разрядты компьютерлерде –
int
және
long int
типтері бірдей болып табылады.
Бүтін типті шаманың компьютер жадында ішкі бейнеленуі – екілік жүйедегі код
түріндегі бүтін сан.
Signed
спецификаторын пайдаланғанда, санның ең жоғарғы биті
санның таңбасын (0 – оң сан, 1 – теріс сан) көрсетеді.
Unsigned
спецификаторы тек
оң сандарды бейнелейді, өйткені оның жоғарғы разряды да санның коды болып
қарастырылады. Сонымен,
int
типті мәндердің диапазоны спецификаторға
байланысты өзгеріп отырады екен. IBM PC тәрізді компьютерлер үшін әр түрлі
спецификаторы бар бүтін типті шамалардың өзгеру диапазоны 1.4 кестеде
келтірліген.
Символдық тип (char)
Символдық типке компьютердегі кез келген символды бейнелей алатын бір байт
көлемі алынады,
char
типі басқа бүтін сандық типтер секілді таңбалы немесе
таңбасыз түрде болады. Таңбалы шамаларда мәндері -128 бен 127 аралағындағы
диапазон сақталады. Ал
unsigned
спецификаторы 0 мен 255 аралығындағы
мәндерді сақтай алады. Бұл 256-символдық ASCII кодтар жиынының кез келген
символын бейнелеуге толық жарайды.
char
типі осы сандар диапазонынан аспайтын
бүтін сандарды сақтау үшін де пайдаланылады.
Жылжымалы нүктелі константалар, келісім бойынша,
double
типінде болады.
Олардың типін
F
,
f
(float) және
L
,
l
(long) әріптері арқылы нақты түрде көрсету
мүмкіндігі бар. Мысалы, 2E+6L константасы
long
double
типінде, ал 1.82f
константасы
float
типінде көрсетілген.
Нақты сандар типтері үшін кестеде солардың абсолюттік шамаларының ең кіші
(минимал) және ең үлкен (максимал) мәндері көрсетілген.
Әртүрлі платформаларға ауысатын программалар үшін
int
типінің ені жайлы
алдын ала болжам жасауға болмайды. Оны анықтау үшін
sizeof
операциясын пай-
далану керек, оның нәтижесі сол типтің байтпен берілген еніне тең болады. Мысалы,
MS-
DOS операциялық жүйесі ортасында
sizeof
(
int
) нәтижесі – 2 болса, ал
Windows 9X немесе OS/2 жүйесіндегі нәтижесі – 4 болады.
ANSI стандартында негізгі типтер мәндерінің диапазоны берілмейді, тек солардың
көлемдерінің ара қатынасы ғана анықталады, мысалы:
sizeof(float) ≤
sizeof(double)
≤ sizeof(long double)
sizeof(char) ≤ sizeof(short) ≤ sizeof(int) ≤ sizeof(long)
33
Бүтін типтердің мүмкін болатын ең кіші және ең үлкен мәндері компиляторға
байланысты болып келеді де, () тақырыптық файлында көрсеті-
леді, нақты типтердің сипаттамалары – () файлында және де
numeric_limit
s класының үлгілерінде беріледі.
void типі
Негізгі типке жоғарыда көрсетілгендерден басқа
void
типі де жатады, бірақ бұл
типтің мәндер жиыны бос болып келеді. Олар мән қайтармайтын функцияларды
анықтау үшін қолданылады, функцияның аргументтерінің жоқ екенін білдіреді,
нұсқауыштардың негізгі типі ретінде және типтерді келтіру операцияларында да
пайдаланылады.
5
дәріс. C++ тілінде операцияларды орындау
Арттыру немесе кеміту (инкремент және декремент) операциялары
++
және
--
түрінде жазылады да, инкремент және декремент деп аталады. Бұлар кез келген
операндтың мәндерін бірге арттыруға немесе кемітуге мүмкіндік береді, олардың
жазылуы екі түрде – операция таңбасы операнд алдында жазылатын префикстік және
соңынан жазылатын постфикстік түрде кездеседі.
Префикстік түрде (
++х немесе
--
х) алдымен операнд өзгертіліп, сонан соң
оның мәні өрнектің нәтижелік мәніне айналады, ал постфикстік түрде (
х++ немесе
х
--
)
өрнек мәні операндтың бастапқы мәнін қабылдайды да, операнд сонан кейін
өзгереді. Бұлар жасырын түрдегі меншіктеу амалы болып табылады. Кейде олар жеке
оператор түрінде де жазылады:
i++;
немесе
++i;
Бұл екеуі де мынадай амалмен бірдей болып саналады
i = i + 1;
Мысалы:
K
=10;
X
=
K
++;
//
X
=10
K
=11
X
=++
K
;
//
X
=12
K
=12
Арттыру/кеміту операцияларын өрнек ішінде де орындау мүмкіндігі бар:
sum=a+b++;
//алдымен a, b қосылады, сонан соң b 1
-
ге артады
sum=a+ ++b;
//алдымен b 1
-
ге артады, сосын a, b қосылады
Арттыру/кеміту операцияларының приоритеттері өте жоғары, тек жақша ішіндегі
операциялардың приоритеті олардан жоғары болады.
Жалпы инкремент операциясының операнды L-мәні (L-value) болды деп
айтылады. Мұндай түрде мән енгізуге болатын белгілі бір жады аймағын нөмірлеуді
(адрестеуді) жүзеге асыратын кез келген өрнек белгіленеді. Бұлай атау меншіктеу
операциясына байланысты туындаған, өйткені оның сол жақ бөлігі (Left) операция
нәтижесінің жады аймағының қай жеріне орналасатынын анықтайды. Айнымалы L-
мәнінің бір түрі болып табылады.
Компьютер жадындағы мәлімет көлемін (мөлшерін, енін) анықтау операциясы
sizeof
объектінің немесе типтің алатын орнын байтпен анықтап береді, оның екі түрі
бар:
sizeof өрнек
sizeof (
тип
)
Мысалы
:
#include
int main()
34
{
float x = 1:
cout << "sizeof (float) :"
<< sizeof (float):
cout << "\nsizeof x :" << sizeof x;
cout << "\nsizeof (x + 1.0) :"
<< sizeof (x + 1.0);
return 0;
}
Бөлу ( /) және қалдық табу (%). Бөлу операциясы арифметикалық типтегі
операндтарға қолданылады. Егер екі операнд та бүтін сан болса, бөлінді бүтін санға
дейін дөңгелектенеді, әйтпесе бөлінді типі типтерді түрлендіру ережесіне сәйкес
тағайындалады. Қалдық табу операциясы тек бүтін типтегі операндтарға қолданы-
лады. Мысалы:
#include
int main(){
int x = 11,
у
= 4;
float z = 4;
printf("
Бөлу нәтижесі
: %d %f\n", x/y, x/z);
printf("
Қалдық
: %d\n", x%y):
return 0;
}
Программа жұмысы нәтижесі:
Бөлу нәтижесі
: 2 2.750000
Қалдық
: 3
Меншіктеу операциялары символдар (
=
,
+=
,
-=
,
*=
,
т.с.с.) арқылы жазылады.
Меншіктеу операциясы программада аяқталған оператор ретінде пайдаланылады. Кез
келген ; таңбасымен аяқталатын өрнек меншіктеу операторы болып табылады.
Өрнектің бір түріне бос оператор жатады, ол жай ; операторы.
Қарапайым меншіктеу операциясының жазылуы:
1_операнд = 2_операнд;
Бірінші операнд – L_мән, ал екіншісі – өрнек болуы тиіс. Алдымен оң жақта
тұрған өрнек есептеледі, сонан соң оның нәтижесі сол жақта көрсетілген жады ай-
мағына жазылады да (мұның мнемоникалық ережесі: «меншіктеу – мәліметтерді
сол жаққа “беру”» ), онда бұрынғы сақталған мәлімет жойылады. Мысалы:
#include
int main(){
int a = 3, b = 5,
с
= 7;
a = b; b =
а
;
с
=
с
+ 1;
cout << "a = " << a;
cout << "\t b = " << b;
cout << "\t
с
= " <<
с
;
return 0;
}
Шартты операция (? :) шартты өрнек жазуға мүмкіндік береді, яғни берілген
шартқа байланысты әр түрлі мән қабылдайтын шартты өрнектер құрады. Бұл
операция үшорынды болып табылады. Бірінші операнд арифметикалық типте немесе
нұсқауыш боуы мүмкін. Ол нөлге эквиваленттілік тұрғысынан тексеріледі (нөлге тең
35
операнд
false
, ал нөлге тең емесі –
true
болып табылады). Егер оның шарты
(бірінші операнд) ақиқат болса, өрнек мәні екінші операндқа тең; егер жалған болса,
онда – үшіншіге тең. Жазылуы:
1_операнд ? 2_операнд : 3_операнд;
6
дәріс.
Құрылымдық программалаудың базалық конструкциялары
Программаларды адамның түсіну мен қабылдауын ыңғайлы түрде жүргізуге
бағытталған тәсілдер жиынын құрылымды программалау деп атайды. Әрбір
жасалған программа бөліктері бір-бірімен тығыз логикалық байланыста болып, оның
бір жерінен екінші бір жеріне “секірулер” болмауы тиіс.
Құрылымды программалау – “
go
to
операторысыз программалау” болып санала-
ды, яғни шартсыз көшу операторын мүмкіндігінше пайдаланбауға тырысу керек, өйт-
кені ол программа логикасын түсінуді қиындатады. Бірақ кейде
goto
операторын
қолдану қажет болатын кездер болады.
Кез келген программа саны шектелген стандартты логикалық құрылымдардан
тұрады. Негізгі логикалық құрылымдар туралы бұдан бұрын айтылған болатын, олар:
сызықтық, тармақталу және қайталау құрылымдары. Осы үш құрылым програм-
малаудың базалық негізгі конструкциялары болып саналады, олар күрделі програм-
маларды жіктеп қарастыру мүмкіндігін береді.
Бұлар құрылымдардың ең көрнекті ерекшелігі – олардың орындалу алгоритм-
дерінің бір кіріс және тек бір шығыс сызығы болады. Мұндағы әрбір құрылымдық
бірлік бір оператордан, біріктірілген операторлар тобынан немесе қабаттастырылған
құрылымдардан да тұруы мүмкін. Осындай программалар оңай оқылады, түзетіледі
және керек болса, оңай өзгертіледі.
С/С++ тілдерінде циклдің үш түрі, тармақталудың екі түрі бар. Олар программалауды
жеңілдету мақсатында жасалған, сондықтан әрбір жағдайда өзімізге ыңғайлысын таңдап
алуымыз керек. Ең бастысы – кез келген программа айқын, әрі нақты түрде
құрастырылған жеке блоктардан тұруы тиіс.
Программа жұмысын басқару операторларын программаның басқарушы
конструкциясы деп атайды. Олар:
•
құрама операторлар;
•
таңдау операторлары;
•
цикл операторлары;
•
көшу операторы.
Тармақталу операторы
Тармақталу процестері бар алгоритмдерді ұйымдастыру үшін шартты операторлар
пайдаланылады. Тармақталу белгілі бір шарттың орындалуы немесе орындалмауына
тәуелді атқарылады. Кейде бір тармақ ішінде ешбір амал орындалмай да қала береді.
Шарт ретінде логикалық өрнектің мәні пайдаланылады. С++ тілінде екі шартты
оператор бар, олар: іf және switch.
Шартты оператор. І
f
шартты операторы – программадағы іс-әрекеттердің
табиғи орындалу реттілігін өзгертетін мүмкіндіктің ең кең тараған тәсілі. Оның
құрылымдық схемасы 6.1 суреттегідей болып өрнектеледі де, орындалуы кезінде
есептеу жолы екіге тармақталып кетеді. Суретте көрсетілген құрылымдарға сәйкес
бұл оператор мынадай түрде жазылады:
іf (өрнек) 1
-
оператор; [ else 2
-
оператор; ]
(оқылуы іf – иф,
else
–
элс). Mұндағы 1-ші және 2-ші операторлардың өздері
қарапайым немесе құрама оператор болуы мүмкін.
36
Алдымен іf сөзінен соң жазылатын өрнек түрінде берілген шарт есептеледі, ол
арифметикалық типте немесе нұсқауыштық типте болуы тиіс. Егер ол шарттың мәні
true
(иә), яғни ақиқат болса, онда 1-оператор атқарылады, онда
else
сөзінен кейінгі
2-
оператор атқарылмайды. Екінші жағдайда, шарт мәні
false
(жоқ), яғни жалған
болса, онда
else
сөзінен кейінгі 2-оператор атқарылып, 1-оператор атқарылмайды.
Іf операторлары бірінің ішіне бірі кіріп қабаттасып та орындала береді.
Тармақтың бірі болмайтын жағдайда,
else
сөзінен кейінгі 2-оператор
жазылмайды. Егер бір тармақта бірнеше операторларды орындау қажет болса, оларды
блок түрінде жүйелі жақшаға алып жазу керек, әйтпесе компилятор тармақтың қай
нүктеде аяқталатынын анықтай алмай қалады. Блокта кез келген операторлар жазыла
береді, кейде онда тағы да шартты оператор орналасуы мүмкін.
Әдетте, шарт өрнегін жазу үшін қатынас (салыстыру) белгілері =, >, >=, <, <=, < >
жиі пайдаланылады. Жалпы түрде шартты k1
⊗
k
2 түрінде қарастыруға болады, мұнда
⊗
–
салыстыру белгілерінің бірі, k1, k2 – тұрақты, айнымалы немесе кез келген өрнек
болуы мүмкін. Бір мезгілде бірнеше шартты, яғни күрделі құрама шартты жазу үшін
логикалық амалдарды пайдалануға болады.
Достарыңызбен бөлісу: |