Uploaded by Asliel

C++Uslubi kursatma

advertisement
ТОШКЕТ АХБОРОТ ТЕХНОЛОГИЯЛАРИ УНИВЕРСИТЕТИ
САМАРҚАНД ФИЛИАЛИ
“ИНФОРМАТИКА ВА АХБОРОТ ТЕХНОЛОГИЯЛАРИ” кафедраси
С++ дастурлаш тили
бўйича услубий кўрсатма
Самарқанд- 2006
ТАТУ Самарқанд филиали “ Информатика ва ахборот технологиялари”
кафедра мажлисининг ____________ март 2006 йил ( баённома № ) қарори
билан тасдиқланган.
ТАТУ Самарқанд филиали “Информатика ва педагогик технологиялар”
факултетининг ўқув-услубий кенгашида «___» ________ 2006 йил ____-сон
мажлисининг қарори билан тасдиқланган.
ТАТУ Самарқанд филиали ўқув-услубий кенгашининг _________ 2006 йил
____-сон мажлисининг қарори билан тасдиқланган.
Тузувчилар: Қаршиев А.Б., Махмудов З.М.
Тақризчилар:
ТАТУ Самарқанд филиали “Информатика ва ахборот технологиялари”
кафедраси доценти .
2
1. С++ДАСТУРЛАШ ТИЛИГА КИРИШ
1.1. С++ тилидаги оддий дастур
Биз биламизки, хозирги вақтларда С++ дастурлаш тили замонавийлашиб
бормоқда. Бу тилни урганиш учун С++ тилида дастур структурасини
келтирамиз. Одатда ҳамма адабиётларда шу дастур келтирилади:
//Hello.cpp – дастур билан файл номи.
# include <iostream.h>
void main ( )
{
cout <<“\nHello, World!\n”;
}
Дастурнинг бажарилиши натижасида экранда Hello, World! сўзи
чиқади.
Эслатма: Бу дастур С++ дастурлаш тилининг барча компиляторларида
ишлайди.
Дастурнинг биринчи қаторида изоҳ келтирилган, (//-бу бўлиш
белгиларидан кейин ихтиёрий сатрли изоҳ келтирилиши мумкин) яъни шу
дастур матни келтирилган файл номи келтирилган. Иккинчи қаторда
препроцессор бўйруқлари, яъни директивалари келтирилган. Директиванинг
бажарадиган иши дастурга маълумотларни киритиш, чиқаришнинг стандарт
оқимларини кўрсатувчи алоқани урнатувчи ва шу каби файлларни улаш
воситасидир. Масалан, бу воситани кўрсатиш учун маълумотларни киритиш
ва чиқариш учун тайёрланган С++ дастурнинг стандарт файлни келтирамиз.
Умуман олганда ҳар бир кутубхона файллари қандай вазифани бажаришини
унинг номлари орқали аниқлаб олишимиз мумкин. iostream.h файлида
киртиш ва чиқариш восталари жойлашган бўлиб, i-input - киритиш: ooutput – чиқариш: stream – оқим: h (head) – сарлавҳани аниқлайди.
(Стандарт оқим клавиатурадан маълумотларни ўқиш учун хизмат қилади.)
Унинчи қатор main номли функциянинг исми (С++ дастурлаш тилида
тузилган ихтиёрий дастурда битта ва фақат битта шу номли функцияни
3
ишлата оламиз). С++ да дастурнинг бошланиши худди ана шу функцияни
бажарилиши билан бошланади. main ни олдида хизматчи сўз void
жойлашган. Бу махсус турни аниқлайди ва дастурда main функцияси ҳеч
қандай ечимни ҳал этмайди, яъни буш функция ҳисобланади. main функция
номидан сунгги ( ... ) – қавслар ичида функциянинг параметрлари
рўйхати жойлаштирамиз.
Дастурлаш тилида ҳар қандай функциянинг танаси {
} қавслар
орасида жойлашган ёзувлар, аниқловчилар ва операторлар кетма-кетлигидан
иборат бўлади. Ҳар қандай ёзувлар, аниқловчилар ва операторлар “ ; ”
(нуқта вергул) билан тугалланиши шарт. Шуни айтиб утиш лозимки, С++
дастурлаш тилида ҳар қандай оператор, у неча қатор бўлишидан қатий назар
“ ; ” дан “ ; ” гача битта оператор каби ҳисобланади.
main( )
функциясини танасида аниқ ёзувлар ва аниқловчилар йўқ. Унда фақат битта
операторлар
сout << ‘’\n Hello, World!\h”;
сout – операторига мос бўйруқлар iostream.h файлида жойлашган
бўлиб, бу маълумотларни дисплей экранга чиқариш учун хизмат қилади.
Ахборот cout объектига << (жойлаштириш) амали орқали жўнатилади.
<< амали фақат уни чап томонида cout объекти бўлгандагина кучга эга.
Дастурнинг
бажарилишгача
бўлган
вақтда
уни
матни
*.срр
кенгайтмали файлда сақланади. *.овj кенгайтмали файли ёзилган дастурни
компиляция қилади ва хатосини туғирлайди.
4
БАЖАРИЛАДИГАН ДАСТУРНИ ТАЙЁРЛАШ СХЕМАСИ
name.cpp
*.срр
Дастурнинг
бошланиш матни
Directory (ишчи каталог)
Қушиладиган
файллар
Препроцессор
*.срр
Дастурнинг
тулиқ матни
name.cpp
Компилятор
(Compile)
*.овг
name.obj
Дастурнинг
объектли коди
Output directory
Library directory
Функциялар
кутубхонаси
Компоновщик
(Linker)
*.яхя
name.exe
Бажариладиган
дастур
Output directory
1 – схема.
5
*.h
2. C++ ТИЛИНИНГ ЁЗИЛИШИ
2.1. Дастур, уни ёзилиши ва алфавити ҳақида умумий маълумотлар
Дастурни
қайта
ишлашни
умумий
схемаси
ва
пробелли
ажратувчилар. C++ дастурлаш тилидаги асосий бирлик файл – бу
дастурнинг матнини сақловчи <исми>.срр файлидир.
Матнли файлни аввал препроцессор (ПП) қайта ишлайди. ПП нинг ҳар
бир бўйруғи # билан бошланиб, бўйруқни аниқлайди ва бажаради. ПП нинг
бўйруғи
# include <қўшиладиган файл номи>;
Компилятор
дастур
матнини
қайта
ишлаш
давомида
пробелли
ажратувчилардан фойдаланилади.
Буларга пробел белгилари, табуляция белгилари, янги қаторга ўтказувчи
символлар ва изоҳлар киради.
C++ тилида изоҳларни икки хил усулда ифодалайди:
1) /* Бир неча қатордан иборат
бўлган изоҳ */.
2) // қаторли изоҳ
каби.
C++ тилининг алфавити.
 рақамлар 0,1,2,3,4,5,6,7,8,9;
 махсус белгилар:
//  ,  [ ] ( ) + -/ % \ ; / : ? < = > _ ! & # ~ ^ . *
Алфавитлардан дастурни тузишда фойдаланилади:
 идентификаторлар;
 калит (хизматчи) сўзлар;
 константалар;
 амал белгилари;
 ажратувчилар.
2.2. Идентификаторлар ва хизматчи сўзлар.
6
Идентификаторлар
–
лотин
алфавитидан,
рақамлардан
пастки
чизиқлардан (*фақат рақамлар билан бошланмайди) ташкил топади:
RUN,
run, heard,_RAM_disk, copy_54
C++ да катта ва кичик харфлар алоҳида аниқланган.
Калит (хизматчи) сўзлар – бу идентификаторлар бўлиб, C++ да
махсус фойдаланиш учун ажратилган:
Asm
Doble
Nen
Switch
Auto
Else
Operator
Template
Break
Enum
Private
This
Case
Extern
Protected
Thron
Catch
Float
Public
Try
Cahr
For
Register
Tupedef
Const
Goto
Short
Union
Continue
If
Signed
Unsigned
Default
Inline
Size of
Virtual
Delete
Int
Static
Void
Do
Long
Struct
Volatile
while
Бундан ташқари BС++ ва TС++ да қўшимча равишда аниқланган
хизматчи сўзлар:
Cdecl
- export
- loads
- saverege
- cs
Far
Near
- sed
- ds
Huge
Pascal
- ss
- es
interrupt
- regparam
Регестр ўзгарувчиларнинг хизматчи сўзлари
- AH
- BH
- CH
- DH
- SI
- SP
- SS
- AL
- BL
- CL
- DL
- DI
- CS
- ES
- AX
- BX
- CX
- DX
- BP
- DS
- FLAGS
7
2.3. Ўзгармаслар.
Ўзгармаслар (литерал) - бу фиксирланган сонли, қаторли ёки белгили
(литерли) қийматлардан иборат. Ўзгармаслар 5 гуруҳга ажралган: бутун,
хақиқий (сўзувчи вергулли), белгили (литерли), қаторли, ифодаланадиган
(перечислимые).
Бутун ўзгармаслар – унлик, саккизлик ва ун олтилик бўлиши мумкин.
Унлик бутун сон 404216, 0.4 каби аниқланган бўлиши мумкин. ВС++ да
бу константа 0 дан 42949867295 қийматларни қабул қилиш мумкин.
Манфий унлик ўзгармасларнинг қиймати 214748936489 нинг абсольют
қийматида ошиб кетмаслиги керак.
Ҳақиқий ўзгармаслар. Сузувчи вергулли ўзгармаслар. Сузувчи вергулли
ўзгармаслар 6 бўлимни ўз ичига олади. Бўлими; унлик нуқта; каср қисми;
экспопента белгиси е ёки Е; унлик даража кўрсатгичи; суффикс F (ёки f)
ёки L (ёки l).
Масалан,
66. .0 .12 3.14159 F
1.12 e-2
2E+6L2.71.
F(f) ёки L(l) ларнинг ҳақиқий ўзгармасларида қатнашмаслиги С++ да
double турига мос келади. f ёки F суффиксларни қўшиб float турига
ўтказиш мумкин. Агар L ёки l суффикси ишлатилса ўзгармас long double
турига айланади.
Ҳақиқий турларнинг маълумотлари
Маълумотлар тури
Ҳажми бит
Ўзгариш соҳаси
Float
32
3.4E-38 дан 3.4Е+38 гача
Double
64
1.7Е-308 дан 1.7Е+308 гача
Long double
80
3.4Е-4932 дан 1.1Е+4932
Олдиндан ифодаланадиган ўзгармаслар. Булар enum хизматчи сўзи
ёрдамида киритилади. Мазмуни жиҳатидан бу бутун сонли ўзгармас (int)
дан иборат.
Масалан:
8
enum {one=1, two=2, three=3};
бу ерда enum хизматчи сўз бўлиб, у ҳисоби олдиндан (перечисленные)
ифодаланган маъносини беради. One, two, three шартли исмлар бўлиб,
дастурчи томонидан 1, 2, 3 сонларини аниқлаш учун киритилган.
Агар ифодаланаётган ўзгармасларда = ва рақамлар кўрсатилмаса у
ҳолда идентификаторга ўз-ўзидан one, two, three га 0, 1, 2 сонлари
жўнатилади.
enum {zero, one, two, three};
enum
week
{dushanba,
seshanba,
chorshanba,
payshanba, juma, shanba, yakshanba};
Белгили (литерли) ўзгармаслар – бу апостроф ичида ёзилган битта ёки
иккита белги.
Битта белгили ўзгармаслар char стандарт турида ифодаланади.
Масалан: ‘z’, ‘x’, ‘1012’, ‘10’, ‘\n’.
char – 1 байт
Қатор ёки қаторли ўзгармас (литерли) белги қўштирноқ (апостроф
эмас) ичида кўрсатилган белгилар кетма-кетлигидир.
//P2-07.cpp – қаторли ўзгармас массивини аниқлаш.
# include <iostream.h>
void main ( )
{
char stroka [ ] = “Hello, World”;
}
2.4. Амал белгилари.
Амал
белгилари
ифодаларни
ҳисоблашда
қулланилади:
[ ]
&
( )
*
+
size of
>
<=
>=

,
/
++
--
-
!
%
<<
>>
= =
!=
^
9
<
ва
шакллантиришда
|
&&
/=
%=
+=
&=
^=
|=
::
||
.*
?:
=
*=
-=
<<=
>>=
,
#
*
##
new delete tepeid
Унар амаллар
& - аперанд адресини олиш амали;
* - адрес буйича мурожат амали;
- - унар минус;
+ - унар плюс;
~
-
иккиликдаги
бутун
сонли
аргументни
разрядлар
бўйича
инвертерлаш;
! – мантиқий йўқ (НЕ)
++ - ўзгарувчини бир бирликка ошириш;
-- - ўзгарувчини бир бирликка камайтириш;
size of – ҳажмини байтларда аниқлаш.
Бинар амаллар. Қуйидаги гуруҳларга бўлинади:
 аддитив; +
,
-
 мутипликатив; *
,
/
% (қолдиқни) модул бўйича:
 силжитиш; << , >>:
 разрядлар бўйича; & - ва | - ёки, ^ - ёки
 муносабат амаллари; < , > , <= , >= , ==, !=
 мантиқий; && - ва || - ёки
 жўнатиш; =, *=, /=, %=, +=, -=, <<=, >>=, &=, |=, ^=
 структурали объектлар компонентасини танлаш;
 синфлар компоненталари билан амаллар;
 “вергул” амали;
 қавс амал сифатида.
Шартли амаллар
1_Ифода ? 2_ифода : 3_ифода
10
1_Ифода қиймати ҳисобланади, агар унинг натижаси чин бўлса, (0)
2_ифода ҳисобланади, акс ҳолда (=0) 3_ифода ҳисобланади.
Масалан:
x < 0 ? – x : x
2.5. Ажратувчилар.
Ажратувчилар тил лексикасига киради: [ ] ( ) { }, ; : … * =
# &
[ ] – қавс бир ёки кўп улчамли массивларни ва индексланган элементларни
чегаралайди:
// 5 та элементи бор бўлган бир улчамли массив
int A [ ] = { 0, 2, 4, 6, 8 } ;
// – икки улчамли массив – 3х2
int x, e [3] [2] ;
( ) – кавслар:
1) шартли ифодаларни ажратади;
if (x<0) x=-x
2) ихтиёрий функцияларни элементларини ифодалашда ишлатилади;
Масалан:
float F(float x, int k) // функцияни аниқлаш
{функция танаси}
float F(float, int)
…
F(z, n); // функцияни чақириш.
3) функцияга кўрсаткичларда ишлатилади;
int (*func) (void); // функцияга кўрсатгични аниқлаш.
4) Y=(a+b)*c // функция.;
5) Цикл операторларида қатнашади.
Метка бу индефекатордир:
xyz:=(b-c)*(d-c);
cc : z*=1;
11
3. СКАЛЯР ТУРЛАР ВА ИФОДАЛАР
3.1. Асосий ва ясалган турлар
Маьлумотларнинг
турлар
ҳақидаги
урганишни
ўзгарувчилардан
бошлаймиз. Кўплаб дастурлаш тили учун бағишланган адабиётларида
ўзгарувчилар иккита ифода билан келтирилади яьни исми ва қиймати. Исми
бу ўзгарувчи (идинфикатор) қиймати ўзгарувчининг турига мос келади.
Шундай қилиб, ҳақиқий, бутун ва белгили ўзгарувчилар аниқланади. Бутун
ва ҳақиқий сонлар арифметик турлар скаляр турларнинг хусусий ҳоли
бўлади. Скаляр турларга арифметик турлардан ташқари кўрсаткичлар,
мурожаат ва ифодаланган турлар киради.
Ўзгарувчиларнинг асосий турларини ёзиш ва аниқлашда қуйидаги калит
(хизматчи) сўзлар ишлатилади:
*char
(белгили)
*short
(қисқа бутун )
*int
(бутун)
*long
(узун бутун)
*float
(ҳақиқий)
*double
(икки каррали аниқликдаги ҳақиқий)
*void
(қиймати йўқ)
Турларни аниқлашда бир вақтнинг ўзида бир нечта хизматчи сўзлардан
фойдаланишимиз мумкин. Масалан:
long double zebra, stop;
zebra ва stop ўзгарувчиларини юқори аниқликдаги қиймат беришини
эьлон қилади, лекин бошланғич қиймат бермайди.
Алоҳида ва бошқа хизматчи сўзлар билан ишлатиладиган unsigned
(белгисиз) ва signet (белгили) сўзлари арифметик ёки белгили турлар учун
белги разрядларини аниқлашда ёрдам беради:
unsigned int i,j,k;/ 0 дан 65535
unsigned long L,M,N;/ 0 дан 4294967295
unsigned char c,s; /0 дан 255
12
Маьлумотларнинг асосий турлари
Маьлум турлари Ҳажм
Қийматлар диапозони
Турларни белгилаш
0…255
Катта бўлмаган бутун
бит
unsigned
8
char
сон
char
8
-128…127
Кичик бутун сон
enum
16
-32768…32767
Бутун
сонларнинг
тартибланган қатори
16
0…65535
Катта сонлар
short int
16
-32768…32767
Кичик бутун
Int
16
-32768…32767
Кичик бутун
unsigned
32
0…4294967295
Астрономик масофа
32
-
Катта сон
unsignet
int
long
long
2147483648…21474836
47
float
32
3.4E-38…3.4E+38
Илмий ҳисоблаш (7рақам)
double
64
1.7E-308…1.7E+308
Илмий
ҳисоб
(15-
рақам )
long double
80
3.4E-4932…1.1E+4932 Молиявий ҳисоб(19рақам)
typedef хизматчи сўзидан фойдаланиб мураккаб турларни яратиш мумкин.
Масалан
typedef unsigned char cod:
cod simvol ;
Янги тур киритилиб унинг қийматини 0 дан 255 гача ўзгаради.
13
Ўзгарувчиларнинг
турларини
аниқлашда
биз
ҳозиргача
базавий
турлардан фойдаландик.
Бу базавий турлардан ‘*’,’  ' ,’[]’,’()’ амаллари орқали ихтиёрий
турларни яратишимиз мумкин.
Масалан
type исми [ ];
type турдаги массив. Масалан:
long int M[5]:-M[0], M[1], M[2] ,.., M[5].
type1 исми (type2);
type турини қабул қилувчи ва type1 қиймат ҳосил этувчи функция.
Масалан:
int f1(void): - аргументи йўқ, int турини ҳосил этувчи функция;
void f2(double):-double турини қабул қилувчи ва қиймат ҳосил
этмайдиган функция;
type*исми
type туридаги обеъктга кўрсатгич.
Масалан:
char*ptr; char туридаги обеъктга кўрсатгични аниқлаяпти.
type*исми [ ];
type туридаги обеъктга массив кўрсатгич.
type(*исми);
type туридаги массив обеъктга кўрсатгич.
type*исми(type2)
type2 туридаги қийматни қабул қилувчи type туридаги
қийматни ҳисоблаб чиқарувчи объектга кўрсатгич.
type 
исми = type_туридаги_обеъкт_номи;
type туридаги объектга мурожатни эълон қилиш. Масалан, unsegned char

cc=simbol;
unsegned
char туридаги сс объектга мурожатни
аниқлайди.
14
type1(  номи)(type2);
type2 турдаги қийматни қабул қилувчи
type1 турдаги қийматни ҳосил қилувчи функция.
struct исми { type1исми1: type2 исми2;…};
type1,type2 турдаги икки компонентали структура тури.
Масалан:
struct st
{
int x; char y; float z;
}
ҳар хил уч турдаги st структурани аниқлайди. х-бутун, у-белгили, zҳақиқий (компоненталар сони структурада ихтиёри бўлиши мумкин).
union исми{type1 исми1;type2 исми2;}; бирлаштирувчи тур.
Масалан:
union UN{int m;char c[2];}; UN бирлаштирувчи тур бўлиб, у
бутун ўзгарувчи m ва белгили массивларнинг c[0] ва c[1] элментларни
бирлаштиради.
class исми{type1 исми1;type2 исми2(type3);}
type1 ва type2 турдаги иккита функцияни type3 аргумент билан
қўшувчи синфни аниқлайди. Масалан:
class A{int N; float F(char);}; бутун ўзгарувчили.
Объектлар
ва
уларнинг
атрибутлари
С++
тилининг
асосий
тушунчаларидан бири булиб С тилидан олинган ва хотиранинг қандайдир
соҳаси ҳисобланади. Ўзгарувчи – бу объектнинг хусусий ҳоли бўлиб,
хотиранинг номланган қисмидир. Ўзгарувчиларнинг асосий хусусиятлари
унинг турларини аниқлаш ҳисобланади. Ўзгарувчиларни қийматларини
аниқлашда хотиранинг соҳасидан қандайдир код жой олади. Бу компляция
ёки дастурнинг бажарилиш вақтида руй беради.
Объектлар учун турлар аниқланганда:
15
 бошланғич тақсимотда унинг учун хотирадан кераклигича жой
ажратади;
 объектлар учун мумкин бўлган амаллар тўплами берилади;
Хотира синфи – объектларни хотирага жойлашишини аниқлайди ва унинг
ҳаракат доирасини аниқлаб беради. Хотира синфини аниқ таъсвирлаш учун
(по умолчаний) ўз-ўзидан қўйидаги махсус ташкил этилган операторлар
фойдаланилади:
auto (автоматик равишда ажратиладиган локал хотира)
Бу ердаги блок объектларни аниқлайди, масалан функция танасида. Бу
орқали блокдан объектлар учун хотирага кириш аниқланади ва чиқишда
тозаланади. Блокдан ташқарида синфлар учун йўқ .
register (автоматик равишда,имконият даражасида регистрли хотира
ажратиш). auto га ўхшаш:
static (статистик давомийлик);
extern (статистик давомийлик);
глобал, дастурнинг барча жойларида ўринли.
static (компоновканинг ички тури ва ўзгарувчининг статик мавжудлиги)
static бидан ёзилган объект у аниқланган дастуда мавжуд бўлади.
extern (комп. ички тури ва ўз-------)
extern синфининг обьекти глобал ҳисобланиб, у дастурнинг ҳамма
(файлларида) модулида мавжуд бўлади.
Иденфикатор таъсир (мавжудлиги) доираси бу дастурнинг шундай
қисмини унда ўзгарувчи алоқадаги обьектлар орасида фойдаланиши мумкин.
Ўзгарувчининг
таъсир
доираси
уларнинг
ёзилиши
ва
обьектларни
аниқланишига боғлиқ. Унинг имкониятлари блок, функция, файл (модул) ва
синф.
Mасалан
1
long fact (int z)
2
{long m=1
3
if (z<0) return 0;
16
4
for {int i=1; i<z; m=++i*m};
5
return m;
6
}
m нинг таьсир доираси 2+6
i – нинг таьсир доираси 4+6.
break оператори айниқса уловчи операторда қўлланилади: Масалан:
# include <iostream.h>
void main ( )
{int ic ;
cout <<”\n 8лик сонни киритинг:”;
cin >> ic;
cout <<”\n”<<ic;
switch (ic)
{ case 0: cout << “-нол”; break;
case 1: cout<< “-бир”;break ;
case 2:cout <<”-икки”; break;
case 3:cout <<”-уч”; break;
case 4:cout<<”-тўрт”; break;
case 5: cout <<”-беш”; break;
case 6: cout <<”-олти”;break;
case 7: cout <<”-етти “; break;
default : cout<<”- бу 8 лик сон эмас “ ;
}
cout<<”\n Дастур охири.”;
}
Агар дастурдан break операторини олиб ташласак у ҳолда операторлар
кема-кет равишда бажарилади.
Цикллар
ва
уловчи
операторлар
бир
неча
марта
ичма-ич
жойлаштиришимиз мумкин. break оператори энг охири ички циклдан битта
юқорига чиқиш имконини беради.
17
4. С++ТИЛИНИНГ ОПЕРАТОРЛАРИ
4.1. Кетма-кет бажариладиган операторлар
С++тилида ҳар қайси оператор орқасидан “ ; ” қўйилади ва белги
компилятор томонидан алоҳида оператор каби тушинилади.
Баъзида оператор – ифода ҳеч қандай қиймат ҳисоблаб чиқмайдиган
функциялар учун хизмат қилади. Масалан;
//р.срр-функцияга оператор –ифода каби мурожат қилиш.
#include<iostream.h>
void
cod_char(charc)
{cout<<"
\n"<<c<<"="<<(unsigned int)c;
}
void main( )
void cod_char(char);//функциянинг чиқарилиши
cod_char('A');//оператор ифода
cod_char('X');//оператор ифода
Дастурнинг бажарилиш натижасида:
А=65 ;
Х=120
Одатда оператор – ифода бу функцияни чиқариш бўлмай, жўнатиш
оператори эди. Операторларнинг махсус кўриниши бу оддий “ ; ” буш
оператордир. Буш оператор ҳеч қандай амалларни бажармайди. Бу
оператордан дастурда ҳеч қандай амал талаб этилмаган ҳолда ва унинг
бажарилиши зарур бўлган ҳолда ишлатилади. Буш оператор кўп ҳолларда
цикл танасида фойдаланилади.
//5! Факториални ҳисоблаш.
for (int i=0, p=1; i<5; i++, p*=1);
Ҳар қандай оператор олдида икки ( : ) нуқта билан ажратувчи метка (белги )
ишлатилиши мумкин. Белги сифатида дастурчи томонидан ишлатиладиган
иденфикаторлардан фойдаланиш мумкин.
АВС : х=4+х*3;
18
Белгилар функциянинг таьсир доирасида ишлатилади. Ўзгарувчиларни эьлон
қилиш вақтида фойдаланиладиган (метка) белги
Metka
:
int*z=0,d=4
Буш операторларни олдида ҳам белгилардан фойдаланиш мумкин.
Ҳар қандай блокнинг ичида операторлар нуқта вергул ( ; ) билан
тугалланади.
{int a; char
b='0';a=(int)b;}//блок
{funr(x+1.0,22);e=4*x-1;
}
{i--;if(i>k)goto MET;k++;MET:;
}
//буш оператор кўрсатилган
Қуйидаги чизиқли жараёнларга дастур тузинг.
1. Топшириқлар.
1).
tgx  ctg ( x  ln x)
x  ax  b

ax  by
2). 2 sin x 
2

x  y2
3). arctg 
 3 xy 
2
2
ln(
x

y


x2  y2
4). log sin x cos x  3
П
4  log (1  sin x 2 )
5).
sin x
1  Пx 2
1
1 x2
cos
7). sin 0.7 x cos 5.1x 
9). 6.4tg 3 ln 4 x   3
6). e tg x cos( ax 2  b  1)
2
e2x
2x
8). 4.03 cos
arctgx
11). x 2  y 2 
sin 2 x
13). arctg  log

10). arccos 3
1  4x
 ln
tgx  ctg 2 x
x2  y2 1
12). 0.98
3
1

x 1  2
2
 x y
15). e tg 2 x  arccos
e Пx  1
2x
 ln Пx
x
1
2x
 32 x
sin x  sin y

ln x 2  y 2
  0.61xy
14). 8.1tg1..5 x  log x 2 x  3
2
1
16).
1  2x
19
2
arcctg 4.7 x
 x cos x
2
x  sin x
17). ln ln
cos x
x 2  2x
3
0.625 x
x 1
18). tg3x sin x 
19). sin 2 xy  e x   e3 1  x 2
2
20).
x 2  2x  1
x 1
sin cos 4.89 x 
 0.8 x
sin x 2  y 2  1
21). Учбурчакнинг учта томони берилган. Унинг бурчаги, юзи, медианаси,
баландлиги ҳисоблансин.
22). Икки томони ва бурчаги аниқ бўлган учбурчакнинг томони, юзаси,
бурчаги, медианаси ва баландлигини аниқланг.
23). Y=mx+n тўғри чизиқ Y= ax 2  bx  c параболани икки нуқтада кесиб
ўтишини аниқланг.
24). А,Вва С бутун сонлар орасидан ҳеч бўлмаганда биттасини жуфтлигини
аниқланг.
25). А(0,а), В(в,0) ваС(с,0) учли учбурчак ичида М(х,у) нуқтани ётганини
аниқланг.
4.2. Танлов оператори
Танлов операторига, шартли оператор (if…else) ва уловчи оператор
(switch) лар киради. Улардан ҳар бири бошқарув йўлини танлашда
ишлатилади.
Шартли операторларнинг ёзилиши:
if (ифода) { 1 - операторлар кетма кетлиги;}
else {2 –
операторлар кетма кетлиги;}
Ифода – скаляр, арифметик тур ёки кўрсаткич тури бўлиши мумкин.
Агар ифода нолга тенг бўлмаса, у ҳолда шарт чин ҳисобланади ва 1 –
операторлар кетма кетлиги бажарилади, акс ҳолда 2 – операторлар кетма
кетлиги бажарилади.
Операторлар сифатида ёзувлар ва эълон қилинувчилардан фойдаланиш
мумкин эмас, лекин бу ерда таркибий операторлар ва блоклардан
фойдаланиш мумкин :
if(x>0)
20
{
x=-x;f(x*2);
}
else
{
int i=2 ; x*=I; f(x)
}
Блоклардан фойдаланаётганда обьектларни локаллаштиришимиз керак.
Масалан, қуйидагича ёзув хатоликка олиб келади:
if (j>0)
{
int: i=2*j;
}
else
{
i= - j;
}
i – ўзгарувчи блокнинг ичида локаллаштирилган лекин унинг ташқарисида
бу ўзгарувчи йўқ, яьни аниқланган.
Шартли операторларни қисқартирилган шаклда ифодаласа бўлади. Яьни
2-оператор ва else ларни тушириб қолдириш мумкин. Қуйидаги ҳолатда
ифоданинг ёлғонлигини ҳеч қандай амалнинг бажарилмаслигига олиб
келади:
if(a<0) a=-a;
Ўз навбатида 1 – ва 2 – операторлар кетма кетлиги шартли операторлар
ҳам бўлиши мумкин. Бу эса шартларни текширишни ичма-ич жойлаштириш
имконини беради.
Бу шартли операторда тулиқ ва тулиқ бўлмаган шартли операторлардан
фойдаланишимиз мумкин.
21
Шартли операторлардан фойдаланишда эҳтиёткорлик билан ёндашиш
зарур акс ҳолда хато юз бериши мумкин. Бу оператордан фойдаланишда else
унга энг яқин if учун тегишли бўлишини эсдан чиқармаслигимиз лозим.
Ичма-ич жойлашган шартли операторлардан нотуғри фойдаланиш:
if(x= =1)
if(y= =1)cout <<"x=1 ва у =1";
Else cout <<"x≠1";
x=1 ва у=1 да, x=1 ва у=1 ифода тўғри ҳисобланади. Лекин х≠1 ифода х=1
ва у≠1 бўлган ҳолда бажарилади. Чунки else га яқин if бажарилади. х=
=1 ифода текширилаётган шартли операторнинг қисқача кўриниши бўлиб у
ташқи оператор ҳисобланади.
Бу шартли операторни тугри ишлатишни ташкил этиш учун фигурали
кавслардан фойдаланамиз.
if(x= =1)
{if (y= =1) cout <<"x =1 ва у=1";}
else cout <<"x≠1";
Энди else биринчи if
га тегишли ва танлов тўғри амалга
оширилаяпти.
Иккинчи мисол сифатида учта элементларнинг энг каттасини топишни
келтирамиз:
int
max3(intx, inty,
intz)
{if(x<y)
if(y<z) return z;
else return y;
else
if(x<z) return
z;
else return x ;
}
Уловчи оператори кичик кичик тармоқланишларни ташкил этишда
қулай ҳисобланади. Унинг кўриниши қуйидагича:
22
switch (уловчи_ифода)
{case1-узгармас_ифода: 1-оператор;
case2-узгармас_ифода: 2-оператор;
…
casen-узгармас_ифода: n-оператор;
default: операторлар;
}
switch операторининг (уловчи_ифодасининг қиймати) case операторлар
қаршисидаги ўзгармас ифода қийматига тенг бўлса, у ҳолда бошқаришни
уша жойга узатади. Ўзгармас ифоданинг қиймати ҳар-хил бўлишидан қатиий
назар улар бир хил турда бўлиши шарт.
Агарда уловчи_ифоданинг бирор қиймати, ўзгармас_ифоданинг бирор
қиймати билан мос келмаса, у ҳолда default: белгисидаги операторларга
бошқаришни узатади. Ҳар қандай уловчи операторларда битта default:
белгиси бўлиши керак, лекин бу белги қатнашмаслиги ҳам мумкин.
Default: белгисининг бўлмаслиги, агар уловчи_ифода ≠ ўзгармас_ифода
бўлса бирорта case дан кейинги операторлар бажарилмайди.
Мисол:
# include <iostream.h>
void main ( )
{ic;
cout<<"\n Ихтиёрий унлик сони киритинг";
cin >> ic;
cout <<'\n';
switch (ic)
{case 0:case 1: cout<<"бир," ;
case2: case3:cout<<"уч,";
case4:case5:cout<<"беш,";
case6:case7:cout<<"етти,";
case8:case9:cout<<"туккиз.";
23
break;//уловчидан чикиш
default :cout<<"хато!Бу сон эмас !";
}//тамом
}//Дастур охири.
Дастур бажарилиши натижасида :
Ихтиёрий ўнлик сонни киритинг: 4 <enter> беш, етти, туққиз.
Ихтиёрий ўнлик сонни киритинг: z <enter> Хато! Бу сон эмас!
Break ёрдамида уловчидан чиқиш мумкин.
Уловчида ёзувлар бўлиши мумкин.
switch(n)
{сhar
//Хатоли уловчи
d='D' ;//Хеч качон ишламайди.
case1 : float F=3.14;
case2:….if (int (d) != int (t) )…//хато
…
}
2-Тармоқланувчи.
1) Текисликда М1 ва М2, y=mх+n тўғри чизиқни кесиб ўтса, у ҳолда
кесишувчи нуқта кординаталарини печатланг, акс ҳолда false печатга чиқсин.
2) x,y,z сонларни ўсиш тартибида печатга чиқаринг.
3) Қўйидаги функциянинг қиймати ҳисоблансин:
0, х  бутунсонучун
f ( x)  
ctgпtg , х  бутунбулмагансонучун
4).Тўртбўрчак а,в,с ва d сонлар билан ифодаланган кесмалардан ташкил
топган.Агар унга
айлана чизиш мумкин бўлса true ва қарама-қарши томонларини, акс ҳолда
false печатга
чиқарилсин.
5).y=kx+b ва x 2  y 2  r 2 ларнинг кесишиш нуқталари аниқлансин.
6).Функцияниг қиймати топилсин.
24
arcsin x, агар  1  x  1,
f ( x)  
arctgx, кколган колларда.
7).Системани ечимини топинг.
ax  by  c

dx  ey  f
8).Агар m сони n га қолдиқсиз бўлинса, у ҳолда экранда унинг натижаси акс
ҳолда false
чиқарилсин
9).Агар N сон жуфт бўлса экранда N/2 акс ҳолда (N+1)/2 чиқарилсин.
10). А,в,с сонлар орасидан энг кичигини топинг ва уларнинг энг каттаси
билан алмаштиринг.
11).М(х1,у1) ва М2(х2,у2) нуқталардан координаталар бошига энг яқинини
печатланг.
12). Қийматини ҳисобланг.
 z 2 , аагар  1
F ( z)  
1  z, аагар  1
қуйидаги шартларда
2 x, ггар г  0
z
 х, аагар  0
13).Агар а,в ва с узунликдаги кесмалар учбурчакни аниқласа унинг юзасини
ҳисобланг,
акс ҳолда false ни ҳисоюланг.
14). Функциянинг қийматини ҳисобланг.
П
 4 х , аагар  1

F ( x)  arccos x, аагар  1  х  1
 Пх

, аагар  1.
 4
15).R радиусли M массали ва  зичликка эга бўлган шар.Шардан z масофа
узоқликда жолашган М массали матуриал нўқтани тортиб турибди.Қуйидаги
формула бўйича тортиш кучини ҳисобланг.
25
R 3
, аагар а  R

F   r2
r , аагар  R.

4
3
бу ерда    fpm(  -гравитацион ўзгармас).
16).а,в ва с ларни
1
max( a, b, c)  min( a, b, c) лар билан алмаштиринг.
2
17). Агар а,в ва с сонлар орасида қарама-қарши сонлар мавжуд бўлса, у ҳолда
учинчи сонни печатга чиқаринг, акс ҳолда false ни.
18).а,в ва с сонлар берилган. Печатга чиқарилсин.
1) max  a , b , агар гга  0,
2) max  a , c , агар гга  0,
3) max  b , c , агар гга  0.
19). Қиймат ҳисоблансин.
2u  1, агар г  0
F (u )  
cos u, агар г  0
қўйидаги шартларда
lg(  x)агарх  0
U 
 x , агарх  0.
20). Агар y=ax+b ва y=cx+d тўғри чизиқлар кесишса у ҳолда уларнинг
кесишиш нуқтасининг координаталари чиқарилсин акс ҳолда false.
21).Агар
ax  1булса
b
3
 2ax   2 ln ax ,
ax
ax  1булса
Т
h  3 a2  x2 
ln a
a2  x2 1
ax  0, булса
S
1 3 1 3
x  a
3
2
ҳисоблансин.
26
4.3. Цикл оператори
Танасидаги операторлар бир неча бор такрорланадиган оператор
такрорланувчи (цикл) оператори дейилади. Уч хилдаги цикллар мавжуд:
 Шарти олдин бажариладиган цикл:
while (шартли_ифода)
цикл_танаси
 Шарти кейин текшириладиган цикл :
do
цикл_танаси
while(шартли_ифода);
 Итерацион цикл:
for (циклни_аниклаш; шартли_ифода; ифодалар _руйхати )
цикл танаси
Цикл_танаси ёзиш ёки аниқлаш учун фойдаланилмайди. Бунда буш
оператор, таркибий оператор, блок бўлиши мумкин.
Шартли ифода – бу бажарилиш давомийлигини аниқловчи ифода.
Цикл аниқлаш ҳар доим нуқта вергул билан тугалланади.
Циклнинг тугалланиши қуйидаги ҳолларда рўй беради.
 Шартли ифоданинг нол қийматида ;
 Цикл танасидаги бажаришни унинг ташкарисига узатувчи
операторлардан (break,goto,return) фойданилганда.
While (шарт бажарулгунча текшир) оператори шарти аввал
текшириладиган оператор дейилади. Циклга киришда шартли ифода
бажарилади. Агар унинг қиймати нолдан фарқли бўлса, у ҳолда цикл_танаси
бажарилади. Ҳисоблаш жараёни шартли ифода нол қийматни қилмагунча
давом этади.
While оператори хама мумкин бўлган кетма-кетликдан фойдаланиш
кулай. Агар унинг охирида қандайдир аниқловчи белги бўлса. Масалан:
Қуйидаги функция қатор узунлигини аниқлайди.
int
length (char * stroka)
27
{int
len =0
while (stroke++) len++ ;
return
len ;
}
Бу ерда циклдан чиқиш – stroka кўрсаткич адреси кўрсатилган қатор
элементини
нолга
муносабатлардан
тенглаштирмокда.
фойдаланилади.
Шартли_ифода
Масалан:
учун
натурал
кўпинча
сонларнинг
квадратларини ҳисоблайди.
int
i=0; //счетчик
Int
s=0 ;// Кейинги йигинди
while(i<k)
s++=++i*i ; //Йигиндини хисоблаш цикли
Агар шартли _ифодани нолга тенглаштириш керак бўлса, у ҳолда
қуйидаги учта текширув эквивалентдир:
while (point!= NULL) …
while (point) …
while
(point!=0) …
5. АДРЕСЛАР, КЎРСАТКИЧЛАР, МАССИВЛАР ВА ХОТИРА
5.1. Кўрсаткичлар ва объектларнинг адреси
С++тилида махсус объктлар сифатида кўрсаткичларни олсак бўлади.
Кўрсаткичлар
икки турда бўлади: ўзгарувчи кўрсаткич ва константа
кўрсаткичлар фарқланади. Аниқ турдаги объектлар учун кўрсаткичларнинг
қиймати сифатида хотира майдонинг адреси хизмат қилади. Шунинг учун
кўрсаткичларни аниқлашда ва ёзишда ҳар доим унинг тури
кўрсатилган
бўлади.
Кўрсаткичлар икки категорияга бўлинади: объектларга кўрсаткич ва
функцияларга
кўрсаткич. Бу категориялар ўзининг қоида ва ҳоссалари
билан фарқланади. Объектларга кўрсаткичлардан бошлаймиз.
28
Оддий
ҳолатда ўзгарувчи кўрсаткичининг аниқланиши ва ёзилиши
қуйидаги кўринишга эга:
type * кўрсаткич_ исми;
бу ерда type-турларни белгилаш;
кўрсаткич_исми – бу идентификатор;
*-адресга мурожат қилиш амали;
Кўрсаткич белгиси * каби аниқланган.
Масалан:
int *i1p,*i2p,*i3p,i;
3та бутун турдаги кўрсаткич ва бутун ўзгарувчи.
* - белги берилган турдаги объектга кўрсаткич .
Кўрсаткични аниқлашда кўп ҳолларда уни инициализациялаш мақсадга
мувофиқ. Инициализация шакли қуйидагича бўлади:
type *
кўрсаткич_исми
аниқлаш;
Аниқлаш 2 турда бўлади:
type * кўрсаткич_ исми=
type * кўрсаткич
исми
аниқланувчи_ ифода;
(аниқланучи_ ифода);
Аниқланувчи_ифода сифатида ўзгармас ифода ишлатилиши шарт,
хусусий ҳолда у қуйидагича бўлади:
 Хотира майдонинг аниқ кўрсатилган адреси;
 Қиймати бор бўлган кўрсаткич;
 &- амал ёрдамида объект адресини олувчи ифода.
Кўрсаткичларни аниқлаш мисоли:
char cc =’d’ ; //
char
*pc=&
белгили ўзгарувчи
cc;//char
турдаги
объектга
кўрсаткични
аниқлаш
char* ptr(NULL);//char турдаги нолли объектга кўрсаткич
char *p // char
турдаги
курсаткич
сс ўзгарувчи ‘d’ белгили ўзгармас билан инициализация қилинган.
рс кўрсаткич аниқлангандан сунг сс ўзгарувчига унинг номи орқали
29
киришимиз мумкин ва ўзгарувчи
-
кўрсаткич қиймати бўлган рс нинг
адреси орқали ҳам уни қийматини олиш мумкин.
Шундай қилиб қуйидаги дастурни ишлаш
cout << “ /n cc тенг “<< cc<<” ва *pc=”<<*pc;
натижасида
сс тенг d ва
ptr ва
*pc=d
p кўрсаткичлар ҳар хил ҳуқуқга эга. рtr кўрсаткич нолли
бошланғич қиймат олган (бўш кўрсаткич), ва уни қайта номлаш бефойдадир.
Кўрсаткичларни аниқлашда унинг ўзи ва унинг қиймати ўзгармас
сифатида эълон қилиниши мумкин. Бунинг учун const модификаторидан
фойдаланилади:
type
const * const кўрсаткич_исми инициализатор;
const- модификатори шарт бўлмаган элементдир.
Буни қуйидагича ҳам ёзиш мумкин:
type * const
курсаткич_исми инициализатор;
5.2. Адреслар арифметикаси, кўрсаткичларнинг турлари ва улар
устидаги амаллар.
Кўрсаткичларни аниқлашда уларнинг тури сифатида асосий
ихтиёрий
турларни олиш мумкин. С++ дастурлаш тилида
турлар чексиз кўп бўлиши мумкин.
функциялар,
кўрсаткичлар,
структуралар,
бирлашмалар
ихтиёрий
Ихтиёрий турларга массивлар,
мурожатлар,
ва
ва
ўзгармаслар,
синфлар,
томонидан
яратилган
фойдаланувчи
турлар кириши мумкин.
Асосий турларга таалуқли кўрсаткичлар, массивлар, кўрсаткичлар ва
ўзгармасларни кўриб чиқамиз.
Асосий
double,
турлар
биламизки,
short,
char,
unsigned,
int,
signed,
Масалан:
long
double
ld=0.0 //
ld-ўзгарувчи
30
float,
long,
void лар
киради.
long double *ldptr=&ld; // ldptr –кўрсаткич
void *vptr;
unsigned
//vptr-void *турдаги
char
*cucptr
кўрсаткич
//cucptr–бошланғич
қийматсиз
кўрсаткич
unsigned long int *uliptr =NULL //-кўрсаткич
Агар & адресни олиш амали ёрдамида объект ҳар доим бир қийматли
натижа берса, (хотирада объектни жойлаштиришга боғлиқ ҳолда) у ҳолда
катта номловчи * кўрсаткич
нафақат кўрсаткичнинг қийматига боғлиқ
бўлмай балки унинг турига ҳам боғлиқ бўлади. Хотирага қайта номловчи
ёрдамида кириш учун ижозат олганда нафақат уни жойлаш балки
фойдаланиладиган хотира майдони ҳажми ҳақида ахборотни
ҳам талаб
этади. Бу қўшимча ахборотни комплятор кўрсаткич туридан олади. char
*cp; кўрсаткич хотира майдони билан ишлашда 1 байтли майдонни талаб
этади.
long double *ldp; хотира майдонининг 10 байт жойини эгаллайди. Ҳар
хил турдаги кўрсаткичларга хотира 1 майдонинг адрес қийматини беради:
# inculude <iostream.h>
void main (
)
{unsigned long
L=0*12344445678L;
Char *cp=(char *)&L;
//*cp=0*78
Int *Ip =(int*)&L; // *ip=0*5678
long lp=(long*)&L; //*lp=0*12345678
cout <<hex;
cout <<”\n Адрес L, яни
&
L=”<<& L;
cout <<”\ncp =”<<(void*)cp<<”\t*cp=0*”<<(int)*cp ;
cout <<”\n ip=”<<(void*)ip<<”\t*ip=0*”<<*ip;
}
Дастурнинг бажарилиш натижасида
Адрес L, яъни &L=0*1E190FFC
cp= 0*1E190FFC
*cp=0*78
31
ip=0*1E190FFC
*ip=0*5678
lp=0*1E190FFC
*lp=0*12345678
Кўрсаткичларнинг қийматлари L ўзгарувчининг адреси билан мос
келмокда.
&L =0*1E190F
Байтлар адреси:
unsegned
long
1000
L ўзгарувчининг компютер хотирасида жойлашиш
схемаси
5.3. Массивлар ва кўрсаткичлар
Олдинги бобларда массивлар тўғрисида қисқача маълумот берилган.
char [ ] турдаги массивларни инициализация қилиш.
char массив_номи[
]
=’’ қаторли_ ўзгармас’’
(Массивнинг элементи уни эълон қилинган элементидан ҳар доим 1 та кўп ва
бу элемент ‘10’ га тенг).
С++ дастурлаш
тилида [
] амал орқали массивларнинг ихтиёрий
элементига яратиш учун имкон берилиши мумкин:
массив_исми [ индекс]
Энди массивлар ва кўрсаткичлар орасидаги муносабатни диққат билан
таҳлил этиб чиқишимиз зарур.
С++ дастурлаш тилида массивларнинг “ҳолати” унинг аниқланишида
ва фойдаланишда. Массивларни аниқлашда бошқа дастурлаш тилидаги каби
хотирадан жой ажратилган вақтда, массив исми шу турдаги (ўзгармас)
массив элементлари қарашли бўлган ўзгармас каби қабул қилинади. & амали
бундан мустасно (адрес олиш). Натижа – массивнинг бошланғич элементини
32
адреси. Қолган ҳолларда массив исмининг қиймати массив биринчи
элементининг адреси бўлади ва бу қийматни ўзгартириш мумкин эмас.
Шундай қилиб ихтиёрий массив учун қуйидаги тенглик уринли:
массив_исми == & массив исми==массив исми[ 0]
Массив С++дастурлаш тилининг структуралашган тури ҳисобланади.
Бошқа структуралаштирилган маълумотлардан массив унинг элементлари
бир хил турда эканлиги ва хотирада кетма-кет жойлашганлиги билан
фарқланади. Бир улчамли type турдаги массивлар:
type массив_ номи [ўзгармас_ ифода ];
бу ерда массив_ номи - идентификатор;
ўзгармас_ ифода массив улчамини яъни массивда нечта элементлар
борлигини аниқлайди. Бир қанча ҳолларда массивнинг элементлари сони
кўрсатилмаслиги мумкин.
Масалан:
extern
unsigned
long
UL [
] ;
массив дастурининг бошқа қисмида ташқи массивни аниқлайди.
Массивларни аниқлашда уни инициализация қилиш мумкин яъни
массив элементлари аниқ қиймат қабул қилади. Агар массив статик ёки
ташқи бўлса ўз-ўзидан инициализация қилинади. Бу ҳолларда массив
элементларига комплятор автоматик ҳолда нол қиймат беради:
void f (void)
{static float F(4);//Ички статик массив
long double A[10];//автоматик хотира массиви
}
void main( )
{extern int D[ ]; //Массивларни фодаланиши
…
f ( ) ;
…
}
33
Int D[8];
//
ташқи
массив
(аниқлаш)
D[8] ва F[4] нол қийматлар билан аниқланган.
Асосий дастурдаги D массив элементлари кўрсатилмаган. A[10]
массивни аниқланишида ўз элементлари учун аниқ қиймат олмайди.
Массивлар элементларини аниқ қийматини инициализация қилиш, фақат
уни аниқлаш вақтида икки хил усул ёрдамида бажариш мумкин: массив
ўлчамини квадрат қавслар ёрдамида ва квадрат қавсларда ноаниқ кўрсатиш:
char CH [ ] = { ‘A’, ‘B’, ‘C’, ‘D’}; //
4-элем.
Массив
int IN[ 6] = {10,20, 30,40,};
//
6-элем.
Массив
char STR[ ]=’ABCD’;
СН
//
5-элемент.
Массив
массив элементларининг комплятор унинг бошланғич қиймати
асосида аниқлайди. IN массивда 6 та элемент бўлиб, унинг 4 элементи
аниқланган. IN[4],
IN[5] аниқланмаган ёки ташқи статик массив бўлса
нол қиймат қабул қилади. STR массив элементи STR[4] ‘/0’ га тенг,
лекин массивда 5 та элемент бор.
Квадрат қавслар ичида ўзгармас ифода йўқ бўлса массивнинг бошланғич
қийматларини кўрсатишимиз зарур.
Нотўғри талқин:
float A[ ] ;//массивни аниқлашда хато
double B[4]={ 1,2,3,4,5,6} //инициализацияда хато.
Агар массив аниқланмаса, лекин ифодаланаётган (ёзилаётган) бўлса
бошланғич қийматларини бериш мумкин эмас. Массивларни ёзаётганда
унинг ўлчами кўрсатилмаслиги мумкин:
extern float E[ ];//ташқи массивни ёзилиши
Е массивни аниқланишининг ўрнига унинг учун хотира ажратилган ва
иницализация қилинган.
34
Массивларни ифодаланиши функциянинг аниқланишида унинг формал
параметрларида
(ўлчами
кўрсатилмаган
ва бошланғич
қийматларини
рўйхатисиз) фойдаланиш мумкин:
float MULT(floatG[ ],float F[ ]);//функцияни
аниқловчи
{ …
функция_
танаси
...
}
void print_array(int I[ ]): /
5.4.
функция
прототипи
Кўп ўлчовли массивлар, массивларнинг кўрсаткичлари, динамик
массивлар.
Кўп ўлчовли массивларга массивларнинг массиви яъни массив элементи
ҳам массивлардан иборат бўлганлари киради. Массивларни аниқлашда
умумий ҳолда унинг тури ҳақида маълумот, ўлчами ва ҳар қайси ўлчамдаги
элементлар сони кўрсатилади.
type массив_исми [K1][K2]… [KN];
бу ерда type тури, массив_исми идинтификатор, N–массив ўлчами,
К1-массив элементларини ўлчамини сони.
int ARRAY[4][3][6];
Уч ўлчамли массив 4 та элементдан иборат, ҳар қайси икки ўлчамли
массив 3 ва 6 ўлчамдан иборат.
Масалан:
int ARRAY[4][3][6]={ 0,1,2,3,4,5,6,7};
Бу хилдаги аниқлашда бошланғич қийматлар фақат уч ўлчамли
массивнинг 8 та элементини ўз ичига олади:
ARRAY[0][0][0]==0
ARRAY[0][0][1]==1
ARRAY[0][0][2]==2
ARRAY[0][0][3]==3
ARRAY[0][0][4]==4
35
ARRAY[0][0][5]==5
ARRAY[0][0][6]==6
ARRAY[0][0][7]==7
Массив кўрсаткичи
int*array [6];
int туридаги 6 элементли массив. Массив исми array.
Массивларнинг аниқланиши бўйича унинг элементлари бир хил турда ва
бир хил ўлчамли бўлиши керак. Масалан:
Синф ўқувчиларининг фирма ишчилариниг фамилясини ифодаловчи
массивни ҳосил қиламиз
char spisok[25][20];
фамилиялар рўйхати 25 тадан ошмайди. Унинг узунлиги 19 ҳарфгача ёки
char* pointer[3];
бу ерда pointer массив–кўрсаткичли ўзгармаснинг номи, * ўзгарувчи –
кўрсаткичи [3] массив ўлчами
char*pointer[ ]={«ИВАНОВ»,«ПЕТРОВ»,«СИДРОВ»}
Динамик хотира массиви.
Ёзилиши
new массив_тури
Бундай амал динамик хотира майдонида жой ажратиб уни иницализация
қилмайди.
Динамик хотирани ажратищда массив ўлчами тўлиқ аниқланиши шарт:
long(*lp)[2][4];
lp=new long[3][2][4];
динамик хотирани тозалаш учун
delete[ ] lp;
36
Файллар билан ишлаш.
ЭҲМнинг оператив хотирасидан унинг ташқи хотирасининг фарқи
шундаки, ЭҲМни ўчириш вақтида ундаги ахборотларни сақлаб қолади.
Ташқи хотирада ахборотлар файллар кўринишда сақланади ва бу файллар ўз
номига эга бўлади ва унга операцион тизим орқали мурожаат этилади.
Операцион тизим
 Файлларни ҳосил қилиш;
 Уларни ўчириш;
 Ташқи ташувчиларда ахборотларни излаш;
 Маълумотларни файлда ўқиш ва ёзиш;
 Файлларни очиш;
 Файлларни ёпиш;
 Файлларни позициялаш;
каби ишларни амалга оширади.
С++нинг киритиш-чиқариш кутубхонаси кетма-кет файллар билан
ишлаш воситаларига эга. Мантиқий кетма-кет файлни боши ва охирига эга
бўлган (лента, қатор …) номланган занжир шаклида тасаввур этишимиз
мумкин. Кетма-кет файллар бошқа тузилишга эга бўлган файллардан ундаги
маъмулотларни ўқиш ёки унга маълумотларни ёзиш унинг бошидан охирига
қараб амалга оширилиш ҳоссаси билан фарқ қилади. Вақтнинг ҳар бир
позициясида
файл
қаерига
ёзилаётганлиги
ёки
файл
қаеридан
ўқилаётганлиги, файлга ёзиш ва ундан ўқиш кўрсатгичи орқали амалга
оширилади.
Ёзиш ва ўқиш кўрсатгичи автоматик ёки уни бошқариш орқали амалга
оширилади. С++ тилида киритишнинг стандарт кутубхонасида қуйидаги
воситалар мавжуд.
Файллар билан киритиш-чиқариш оқимлари орасидаги боғланишларни
кўриб чиқишда қуйидаги процедураларни айтиб утиш мақсадга мувофиқ:
1. Файлларни ҳосил қилиш;
2. Оқимларни ҳосил қилиш;
37
3. Файлларни очиш;
4. Файлларни оқимга «қўшиш»;
5. Оқимлар ёрдамида файллар билан алмашиш;
6. Файллардан оқимларни «ажратиш»;
7. Файлларни ёпиш;
8. Файлларни ўчириш;
Ҳамма
юқоридаги
амаллар
С++
тилининг
киритиш-чиқариш
кутубхонасининг воситалари ёрдамида амалга ошириш мумкин, лекин
уларни бажарилишини амалга оширувчи алтернатив вариантлари ҳам
мавжуд. Юқоридаги амалларни бажарувчи оддий ва қулай механизмини
кўриб чиқамиз.
Файлларни ҳосил қилиш «қуйи даражада» (ANSIC) ги кутубхона
функциялари ёрдамида амалга оширилади :
int creat (const char *path, int amode);
Бу функциянинг прототипи io.h сарлавҳа файлида жойлашган.
Creat функцияси path номи кўрсатилган файл бўйича яъни файлни
ҳосил қилади, агар у бор бўлса уни «тозалайди» ва ҳосил этилган файлни
ишлаш учун тайёрлайди.
Amode параметри фақат яъни ҳосил қилинадиган файллар учун зарур.
Файллар fcntl.h ва stdlib.h сарлавҳа файлларида аниқланган
глобал ўзгарувчилар _fmode( O_TEXT ёки O_BINARY) лар қийматларига
мос келувчи, алмашиш таркибида ишлаш учун ҳосил қилинади. O_TEXT
қиймат файллар билан матнли тартибда алмашишида аниқлайди. Файлдан
ўқиш жараёнида ҳар қайси жуфт белги CR(OXOD- қатор охири), LF(OXODқатор бошига ўқиш) янги қаторнинг битта белгисига айланади. Матнли
тартибда файлга ёзиш қаторнинг янги белгиси ‘/n’ CR , LF га аксланади.
Матнли тартибда файлдан ўқишда файл охирини кўрсатувчи белгини учратса
ўқишдан тухтайди. Бу ҳолда кўрсаткич файл охирига келади, яъни EOF шарт
бажарилади деб тушинилади.
38
Жимлик
холатида
_fmode
ўзгарувчиси
О_ТЕХТ
тартибида
ўрнатилади, яъни файл матнли тартибда ҳосил этилади. Дастурчи алмашиш
тартибини қуйидаги кетма-кетликдан фойдаланиб ўрнатиш мумкин:
#include<fcntl.h>
_fmode=O_BINARY;
Amode параметри ҳосил қилаётган файлга мурожаат тартибини аниқлайди.
sys/stat.h сарлавҳа файлида amode нинг қуйидаги ўзгармас қийматлари
аниқланган :
S_IWRITE - файлга ёзишга рухсат;
S_IREAD - Файлдан факат укиш мумкин;
S_IRED/S_IWRITE - ўқиш ва ёзишга рухсат этилади.
Агар *path
файл тўлиқ номи бўлмаса, у ҳолда янги файл ҳосил
қилинади ва унга amode ва _fmode параметрлари танланади.
Агар *path файлнинг тўлиқ номи билан берилган бўлса ва у учун
«фақат ўқиш» тартиби S_IREAD
ўрнатилган бўлса, у ҳолда crat( )
функция ўз ишини тўлиқ бажармайди ва кўрсатилган файл номи ўзгармасдан
қолади.
Агар *path файл бор бўлса ва у учун S_IWRITE тартиби ўрнатилган
бўлса, у ҳолда creat( ) функцияси файл узунлигини нолга айлантиради,
лекин унинг тартибидаги атрибутларни ўзгартирмайди.
сreat(
) функциянинг муваффақиятли тамомланиши файлнинг
(дескриптор) индивидуал мантиқий номерига мусбат бутун сон беради. Акс
ҳолда – 1 қийматни беради.
Файлларни натижасини текшириш билан ҳосил қилиш учун намунавий
мисол:
#include <io.h>//create( ) функция учун
#include <process/h>//exit( ) функция учун
#include <iostream/h>
#include <sys/stat/h>//amode параметрининг қиймати
39
.
.
.
char *filename=”EXAMPLE.CPP” ;
int fileNumb;
fileNumb=creat(filename , S_IWRITE);
if(fileNumb= = -1)
{cerr<< «Файл ҳосил қилишдаги хато» ;
exit(1) ;
}
.
.
.
Бу ерда EXAMPLE.CPP номли файл жорий каталогда ҳосил қилинади.
Файлга фақат ёзиш учун мулжалланган тартиб аниқ кўрсатилади. Жимлик
ҳолатида файллар фақат О_ТЕХТ матнли тартибда ҳосил қилинади.
Файллар билан ишлаш учун оқимлар қуйидаги синфлар объекти
сифатида ҳосил қилинади:
 ofstream.h- файлга маълумотларни ёзиш учун ;
 ifstream - файлдан маълумотларни ўқиш учун ;
 fstream - файлдан маълумотларни ўқиш ва унга ёзиш (икки
томон-лама йўналиш бўйича) учун.
Бу синфларни ишлатиш учун дастур матнига fstream.h сарлавҳа
файлини қушиш зарур. Шундан сунг дастурда аниқ файл оқимларини
аниқлаш мумкин, яъни уларнинг мос турларни (синфларнинг объектлари
ofstream, ifstream.h, fstream), масалан :
ofstream outFile; //чиқувчи файллар оқими аниқланмоқда
iftream inFile; //кирувчи файллар оқими аниқланмоқда
fstream
ioFile;//кирувчи
ва
чиқувчи
файллар
оқими
аниқланмоқда.
Файллар оқимини ҳосил қилиш (мавжуд синфлар учун) унинг учун
ажратилган буферлар билан оқимлар номини боғлайди ва оқимлар ҳолати
ўзгарувчиларини инициализациялайди. Шундай қилиб, келтирилган файллар
оқимининг синфлари, ios синф ҳоссаларидан мерос олади, ҳар қайси
40
файллар оқимининг ўзгарувчилари бу база синфининг меросхурлари
ҳисобланади. Файлли синфлар, ostream (ofstream синфи), istream
(ifstream синфи),
stream (fstream синфи) синфлардан ҳосил
қилинади, у ҳолда улар олдинги параграфларда ёзилган форматларни
қуллайди. Лекин, алмаштиришлардан олдин, мос файлни очиш ва уни файл
оқимлари билан боғлаш зарур.
Файлларни очиш умумий ҳолда файллар билан маълум ҳаракатларни
бажарувчи ахборот тизими процедурасини англатади. Си тилининг стандарт
кутубхонасидаги файлларни очишнинг fopen( ), open( ) функциялари
мавжуд. Лекин С++ тилининг киритиш-чиқариш кутубхонасидан файллар
оқими билан ишлашда, мос синфларнинг функциялари компоненталаридан
фойдаланиш қулай.
Файлли оқимларни ҳосил қилиб, уни open( ) компонентали функция
ёрдамида аниқ файлга «бирлаштириш» мумкин. open(
) функцияси
fstreambase синфидаги файлли синфлардан ofstream, ifstream,
fstream ҳосил қилинган. У ёрдамида нафақат файлларни очиш, балки уни
аниқ оқим билан боғлаш мумкин. Функциянинг шакли қуйидагича:
void open(const char *filename,
int mode=қиймат,
int protection=қиймат);
FileName - параметри мавжуд ёки ҳосил қилинмоқчи бўлган файл
номи. Бу қатор операцион тизим томонидан қабул қилинган файлларнинг
тулиқ ёки қисқача номи.
mode (тартиб) - параметри, байроқлар дизюнкцияси, очиладиган
файлларни ишлаш тартибини аниқлайди. Байроқлар қуйидаги тартибда
аниқланади:
ios: : open_mode
{in =0*01,//фақат ўқиш учун очиш
cut = 0*02,//фақат ёзиш учун очиш
ate =0*04,//очишда файл охирини излаш
app = 0*08,//маълумотларни файл охирига ёзиш
41
trunk
=0*10,//мавжуд
файл
ўрнига
янгисини
ҳосил
қилиш
nocreate
=0*20,//Янги
файл
очилмасин
(мавжуд
бўлмаган файл учун open ( ) функцияси хато беради )
noreplace =0*40,//мавжуд файл очилмасин
binary =0*80,//иккилик алмашинуви учун очинг
Protection (химоя) -учинчи параметри - ҳимоясини аниқлайди ва
етарлича кам ишлатилади. Аниғи, одатда у жимлик ҳолатида ўрнатилади ва
дастурчи томонидан ўзгартирилади.
Одатда open( ) функцияси аниқланган жм ёрдамида чақирилади.
синф_объектининг_исми. синфга_қарашли_функцияни_чақириш
Демак, файлларни аниқ файлли оқимларга қўшиши ва уларни очишни
open() функциясини чақириш орқали амалга оширилади:
поток_номи. open (файл_исми,тартиб,ҳимоя);
Бу ерда поток_номи_ofstream,ifstream,fstream синфларга
қарашли бўлган объект исми . Олдин аникланган оқимларни чакириш
мисоли:
outFile.open(“C://USER//RESULT.DAT”);
inFile/open(“DATA.TXT”);
ioFile/open(“CHANGE.DAT”, ios :: out);
ofstream синфининг оқимлари билан файлларни очишда иккинчи параметр
жимлик холатида ios : : out каби ўрнатилади, яъни файл фақат
чақириш учун очилади. Шу каби, open( ) функциясини муваффақиятли
бажарилиши C:/USER/RESUL.DAT файли ҳосил қилинади (агар у олдиндан
мавжуд бўлмаган бўлса) , шундан сунг алмашишда маълумотларни матнли
тартибда ёзиш учун очилади ва outFile оқимига қўшилади. Энди outFile
оқимига, масалан, eout, cerr оқимларига стандарт бўлган << амалини
қўллаш мумкин .ifstream синфидаги inFile оқими бизнинг мисолда
42
DATA.TXT файлига
open
(
) функцияси орқали қўшилмоқда. Бу
файлдаги маълумотларни матнли тартибда ўқиш учун очилмоқда.
Агар DATA.TXT номли файл мавжуд бўлмаса у ҳолда
inFile.
open( ) функциясини чақириш нотўғри бўлишига олиб келади.
оpen( ) функцияси муваффақиятли тугалланишини текшириш учун
! амали қўлланилади. Агар ! унар амали оқимларга қўлланилса, у ҳолда
хато бўлган ҳолатда натижа нол бўлмайди. Агар хато бўлмаган бўлса, у
ҳолда ! поток_исми ифодаси нол қийматга эга бўлади. Шундай қилиб,
оpen() функциясини бажарилишини текшириб кўриш мумкин:
.
.
.
if ( ! inFile)
{cerr <<” !/n” ;
exit (1);
}
.
.
.
fstream синфи учун open( ) фунциясининг иккинчи аргументи аниқ
қилиб берилган бўлиши керак, жимлик ҳолатида оқимлар билан алмашиш
қайси
йўналишда
эканлиги
ноъмалум
бўлиб
қолади.
Мисолдаги
CHANCE.DAT файли ёзиш учун очилмоқда ва ioFile оқими билан
боғланмокда. (Файлга мурожаат тартибини алмаштириш учун, уни close()
функцияси билан ёпиш керак).
fstreambase синфи, файлли синфлари учун хизмат қилади, бундан
ташқари мавжуд файлларни очиш учун бошқа воситалар ҳам мавжуд.
Агар файллар «паст даражали» кутубхоналари create() функцияси
орқали амалга оширилган бўлса, у ҳолда унинг учун дескриптор аниқланган
бўлади. Бу дескрипторни fstreambase::attach() функциянинг аниқ
параметри сифатида қўллаш мумкин .
Бу функцияни чақиришда унинг аниқланган номидан фойдаланилади.
Аниқланган дискриптор билан ҳосил қилинган файл:
43
#include <fstream.h>//файл оқимларининг синфи
#include
<sys/stat.h>//файлларга
мурожаат
тартиби
ўзгармаслиги
.
.
.
char name{20};//ёрдамчи массив
cin > >name ;//ҳосил қилинган файл номини киритинг
intdescrip=create (name,S_WRITE);//файл ҳосил қилиш
if (descrip= = -1)
{cout << «/nфайл ҳосил қилишдаги хато»);
exit ( );
}
//чиқувчи файл оқимларини аниқлаш
ofstream fileOut;
//файлларга потокни қўшиш
fileOut.attach (descrip);
if (! fileOut)
{cere << «/nФайлни қўшишдаги хато!»)
exit (1);
}
. .
.
ifstream, ofstream, fstream синфларида файлларни очиш ва
ҳосил қилишнинг бошқача очишнинг конструкторлари аниқланган. Ҳар –
хил синфларнинг оқимлари учун конструкторларнинг турлари жуда ўхшаш
бўлади :
синф_исми ( );
Ҳеч қандай файлга бирлаштирмасдан оқим ҳосил қилади;
синф_исми (intfd);
Оқим ҳосил қилади ва уни очилган файлга бирлаштиради, дескриптор
fd параметр сифатида фойдаланади ;
синф_исми (intfd, char *buf, int);
44
Оқим ҳосил қилади ва уни fd дескрипторли очилган файлга
бирлаштиради.
синф_исми (char *FileName, int mode, int = …);
Оқим
ҳосил қилади, FileName
номли файлга бирлаштиради,
зарурият туғилган пайтда шу номли файлни ҳосил қилади.
Киритиш-чиқариш оқимларининг кутубхонаси воситалари билан
ишлашда конструкторлар параметрсиз ва конструкторсиз файл номини аниқ
берган ҳолда ишлатилади. Параметрсиз конструкторга мурожаат қилиш учун
мисол:
ifstream fi //fi кирувчи файлли оқимларни ҳосил қилади.
ostream fo //fo чиқувчи файлли оқимларни ҳосил қилади.
fstream ff //ff
кирувчи ва чиқувчи файлли
оқимларни
ҳосил қилади.
Бу конструкторларнинг ҳар бирини бажаргандан сунг файлли
оқимларни аниқ файлга ореn(
) функциясини
компонентларидан
фойдаланган ҳолда бирлаштириш мумкин.
void open(char*FileName, int тартиб, int химоя);
Мисол :
fi.open(“File1.txt”, ios::in); //fi оқим File1.txt
файли билан бирлаштирилган
fi.close( ); //fi
оқим билан File1.txt ўртасидаги
алоқа ўзгартирилади.
fi/open(“File2.txt”);
//fi
оқими
File2.txt
файл
билан бирлаштирилган.
fo.open(“NewFile’);
бирлаштирилади;
агар
//fo
бундай
оқим
файл
NewFile
бўлмаса
файлига
у
ҳосил
қилинади.
Конструкторга файл номидаги 1-параметри аниқ кўрсатилган ҳолда
мурожаат қилиш унинг бошқа параметрлари жимлик ҳолатида аниқланади.
Мисоллар:
45
ifstream flowl(“File.1”);
Ўқиш учун flowl номли кирувчи файл оқимини ҳосил қилади. File.1
номли файл изланади. Агар шундай файл бор бўлса, у ҳолда конструктор
жимлик ҳолатида танлайди.
ofstream flow2 (“File.2”);
Ёзиш учун flowr номли кириш оқими ҳосил қилинади . Агар File.2
номли файл бўлмаса, у ҳосил қилинади, очилади ва flow2 оқими билан
богланади. Агар файл бор бўлса, олдинги вариант учирилади ва янги файл
ҳосил қилинади. Текшириш:
if (! flow2) cerr << «File.2 файлни очманг!»;
fstream flow3 (“File.3”);
flow3 файлли оқим очилади, File.3 файл очилади ва flow3 оқимга
қўшилади.
Ҳамма файлли синфлар close(
) функцияларининг базавий
синфларидан ҳосил қилинган, бу функция буферни оқимдан тозалайди,
файлдан оқимларни ажратади ва файлни ёпади. close( ) функцияси
файлли оқимлар билан ишлашда уни тартибини ўзгартириш учун ҳам
ишлатилади.
Дастур
тугалланишида
бу
функция
автоматик
тарзда
чақирилади.
Файллар
билан
ишлашнинг асосий
хусусиятларини кўрсатувчи
мисолни кўриб чиқамиз.
//P11-17.CPP->> амал ёрдамида матнли файлни ўқиш
#include <stdlib.h> // exit ( ) функцияси учун
#include <fstream.h>// файлли оқимлар учун
const int lenName =13; //файл номининг узунлиги
//Ёрдамчи массив узунлиги
//const int lenString =60;
void main ( )
{
char source [lenName]: // файллар номи учун массив
46
cout << «/n Бошланғич файл номини киритинг»;
cin >>sarce;
ifstream inFile;// кирувчи файлли оқим
//source файлини очинг ва уни
inFile оқими билан
// алоқа ўрнатинг
inFile.open (source);
if (!inFile) // файлнинг очилишини ва тўғрилигини
текширинг
{cerr << «/n файлни очишда хато» << source
exit (1); //дастурни тўхтатиш
}
//ўқиш учун ёрдамчи массив;
char string {lenString};
char next;
cout << «/n Файл матни: /n/n»;
cin.get( ); //cin оқимидан кодни ўчиради
while (1) // чегараланмаган цикл
{ // Файлдан биринчи пробели белгигача
// ёки EOFгача ўқиш:
inFile >>string
//кейинги белгини текшириш :
next=inFile.peek ( );
//файл охирига етгандан сунг чиқиш
if (next= = EOf) break ;
//пробел билан сўзларни чиқариш:
cout <<string << “
“;
if (next= = ‘/n’) //Қатор охирини ишлаш
{cout <<’/n’;
// 4-қаторни экранга жойлаш:
static int i=4;
47
//Саҳифаларни 20 қатор қилиб ажратиш
if (! ( + + i % 20 ))
{cout << «/n чиқаришни давом эттириш учун»
“Enter ни босинг . /n << endl;
cin.get( );
}
}
}
}
Дастур бажарилиши натижасида дисплей экранида 20 қатордан
файлдаги ёзувлар чиқа бошлайди. Кейин ёзувлар фойдаланувчи томонидан
Enter тугмасини босиш билан чиқарилади. Қатор ҳажми 20 та.
Дастур файлдан матнларни ўқишда >> амали ноқулайлик тўғдиради,
чунки бу амал ҳар бир пробел белги учун тўхталади. Пробели белгини ўқиш
istream синфидаги getline() компонентали функцияси орқали амалга
оширилади. Агар матнли файлда матнларни ўқишда қуйидаги равишда
дастур ёзилса, матнлар тўғри ўқилади.
while ( ) //Чегараланмаган цикл
{inFile.getline (string,lenstring);
next =inFile.peek ( );
if (next = = EFO) break;
cout <<string ;
.
Кейинги
.
.
кўрсатиладиган
дастур
файлдаги
матнларни
иккига
ажратилган ҳолда ўқийди, яъни С++ дастуридаги изоҳ // белгисидан кейинги
матнларни ўқимайди. Дастур матнни қуйидагича:
//Р//-18.СРР-С++ даги изохларни ажратиб ташлаш;
// символли тарзда матнли файлдан ўқиш
#include <stdlib.h>
#include <fstream.h>
48
void error F (char*ss) // ёрдамчи функция
{cerr << «/файл очишдаги хато»“ <<’ ‘c<ss <<‘/n’
exit (1) ;
}
const int lenName=23;
//файл номи учун массив узунлиги
void main ( )
{char progName {lenName}; //файл номи учун массив
cout<<«/n таҳлил қилинувчи дастур номини киритинг»;
cin >> progName;
ifstream inFile; //Чиқиш оқими
//Дастур файли билан чиқиш оқимини бирлаштирамиз
inFile.open (progName);
if (! inFile) error F (progName);
char simb, last, next; //ёрдамчи ўзгарувчилар
ofstream outtext, outcom ; //2 та чиқувчи оқим
//Дастур қаторининг узунлигини ҳисобловчи ўзгарувчи
int len=0;
out len=0;
outtext.open(“text.cpp”, ios : : ate);
if (! outext) error F (“text.cpp”);
outcom.open(“comment”, ios : : app);
if (! outcome) error F (“comment”);
while(inFile.get(simb));//СимволларниEOFгача ўқийди
{len++;//дастурнинг навбатдаги қаторининг узунлиги
if (simb = =’/n’)
len=0; // Дастурнинг янги қатори бошланади
if (simb !=’/’) // Изоҳ боши эмас
//Дастур қаторининг белгисини чиқариш :
outtext.put(simb);
else
49
// simb = =’/’ - изоҳ боши бўлиши мумкин
{// EOF ни текшириш :
if (! inFile.get (next)) break;
if (next = =’/’)
{//энди бу аниқ изоҳ
if (len !=1)
//Дастур қаторини «ёпамиз»:
outtext.put (‘/n’);
outcome.put (simb);
outcom.put (next);
//изоҳ охиригача бўлган цикл,
//қатор охиригача
do
{//файлдан белгиларни
inFile.get (simb);
3 while (simb !=’/n’);
}
else
//Изоҳ ичига киритган символларни чиқариш
{outtext.put(simb);
outtext.put(next);
}
}
}
}
// P //-19.cpp- <<амалини қўллаш
#include <fstream.h>
struct element {// структурани аниқлаш
int nk, nl;
float zn;
50
}:
//<<амални харакатини кенгайтирувчи операцияли-функция
ofstream operator << (ofstream out , element el)
{out<<’ ‘<<el.nk<<’ ‘<<el.nl << ‘ ‘<<el.zn <<’/n’;
return out;
}
int main ( )
{const int numbeEl =5; //Массивдаги структуралар сони
element arel
{numbeEl}={1,2,3.45,2,3,4.56,22,11,45.6,3,24,4.33,3.6,5.3};
//Оқимларни
аниқлаймиз ва уни ABC файл билан алоқасини ўрнатамиз:
ofstream file1(“abc”);
if (! file!)
{cerr <<”ABC файлни очмади“;
return 1;
}
// ABC файлига структуранинг массивини ёзиш
for (int i=0; I,numbEl ; I + +)
file1 <<arel{i};
}
Дастур бажарилиши -ABC номли файлни очиш ва унга
51
Download