Матрица мен жұмыс. INT, RND, RANDOMIZE, SGN функциялары

Матрицаны жадыға ендіру , шығару программалары цикл ішінде циклді пайдаланрып құрылады.

 A(N,M) матрицасын жадыға ендіру операторы:

mFORk=1 to n : FOR j =1 to m

…INPUTA(k,j)

nNEXT j,k

k – сыртқы цикл параметрі (матица жолының нөмірі).

N – жол саны, j – ішкі цикл параметрі (баған нөмірі).

M – баған саны.

ЦиклдеINPUT орнына READ операторын пайдалану да мүмкін. Цикл алдында DIM A(N,M) арқылы матрицаның сипатталып қойылуы тиіс.

Нәтиженіәкранға матрица түрінде шығару үшін PRINT операторын орналастыру қажет.

А=

Матрицасын ЭЕМ жадына ендіру және эранға шығару программасын құру керек.

10 REM матрицаны ендіру , шығару

20 INPUT “n,m=”, N,M : DIM A(N,M)

30 FOR K=1 TO N : FOR j=1 TO M

  • READ A(k,j): PRINT USING “####”; A(k,j);

50 NEXT j: PRINT : NEXT K

60 DATA 0, 2, 5, 13, 4, -7, 3.9, -12, 85, 9, 16

Мысалы:

А=; B=

Үшінші реттіквадрат матрицалардың қосындысы мен көбейтіндісін табу керек.

ТабылатынS=A+B жәнеC=A*Bматрицалары да, үшінші иретті квадрат матрицалар болатыны математика курсынан белгілі. Олардың элементтері:

S(k,j)=a(k,j)+(k,j)

C(k,i)=

формулалары бойынша есептеледі.

10REM матрицаларды қосу.

20INPUT “n=”,N: DIM A(N,N), B(N,N), S(N,N)

30FOR K=1 TO N: FOR j=1 TO N

40READ A(K,j), B(K,j)

50S(K,G)=A(K,G)+B(K,G)

60PRINTUSING “###” ; S(K,j);

70NEXT j: PRINT: NEXT K

80DATA 3, 1, 2, 2, 0, 4, 3, 0, 1, 5, 5, 2,-4, 1, 0, 1, 7

10REM матрицаларды көбейту

20INPUT “n=”,N: DIM A(N,N), B(N,N), C(N,N)

30FOR K=1 TO N: FOR G=1 TO N

40READ A(K,j), B(K,j): NEXT j,K

50FOR K=1 TO N: FOR I=1 TO N

60C(K,I) =0

70FOR j=1 TO N

80C(K,I) =C(K,I)+A(K,j)*B(j,I)

90NEXT j

100 PRINTUSING “####” ; C(K,I);

110 NEXT I: PRINT: PRINT : NEXT K

120 DATA 3, 1, 2, 2, 0, 4, 3, 0, 1, 5, 5, 2,-4, 1, 0, 1, 7

Матрицаларды көбейту формуласына k,j,i параметрлері қатысқандықтан программада бір-біріне салынған үш цикл пайдаланылды. Мұндай циклдерде алдымен ішкі цикл , сонан соң ортаншы цикл, ең соңында сыртқы цикл орындалады. Егер цикл бір-біріне салынған төрт не одан да көп циклдерден тұрса, ондай күрделі циклдің орындалу реті де осылайша.

Практикада INT , RND, RANDOMIZE, SGNстандартты функцияларын пайдалану жиі кездеседі (integer-бүтін, random не randomize- кездейсоқ, sign- таңба).

INT(X) – X нақты санынан кіші ең үлкен бүтін санды анықтайтын функция, мысалы, INT(3.6)=3,INT(-3.6)=-4(х-тің мәні оң болса,INT функциясының орындайтын әрекеті FIX(X) функциясының әрекетімен бірдей).

Әдетте INT(X) ЭЕМ арқылы х нақты санын кез-келген n ондық разрядты дәлдікпен дөңгелектеу үшін пайдаланылады. Дөңгелектеу формуласы:

INT (x*10^n+0.5/10^n) (n=0,1,2…)

МысалыINT (15.8376+0.5)=16(n=0)

INT (15.8376*10+0.5)/10=15.8(n=1)

INT (15.8376*10^2+0.5)/10^2=15.84 (n=2)

RND(x) – 0 мен 1 аралығында кездейсоқ нақты санды өндіретін функция. Мұнда х-тің мәні үшін кез-келген санды, мысалы,1-ді алуға болады,не оған сандық мән берілуі де мүмкін. RND функциясы стандартты функция болғандықтан, оның мәнін ендіру программасы Бейсик интерпретаторымен бірге тұрақты жазып қойылған. Сондықтан бұл функцияның кездейсоқ деудің орнына псевдокездейсоқ деп те атайды. (псевдо-жорамал, жалған). Мысалы,10 PRINT RND(1) операторының орындалу нәтижесі экранда .1213501 түрінде көрінуі мүмкін. Осы операторды циклдің денесі ретінде пайдаланып экранға (0,1) аралығындағы басқа кездейсоқсандарды да шығаруға болады, мысалы,

10FOR n=1 to 5

20PRINT RND (1)

  • NEXT

run

. 1213501

.651861

.8688612

.7297625

.7988531

RUN командасын қайталап берсе де, экранға осы мәндер шығады. Оларды осы аралықтағы басқа мәндер бойынша өндіру үшін цикл алдындаRANDOMIZE (TIMER) командасын беру қажет. (TIMER-ді жақшаға алмай да жазу мүмкін ).

Кейде кез-келген (a:b) аралығындағы кездейсоқ санды пайдалануға тура келеді. Бұл кездеRND функциясын (B-A)* RND (1)+A түрінде алу керек. Мысалы, әр жолы (20:50) аралығындағы кез-келген 5 бүтін санды экранға шығару программасы мынадай:

10 RANDOMIZE (TIMER)

20 FOR K=1 TO 5

30 Y=INT (30*RND(1)+20)

40 PRINT Y

50 NEXT K

SGN(X) функциясы х санының таңбасын анықтайтын функция(мұны сигнум функция деп те атайды):

Программада бұл функцияны кейде шартты өту (IF) операторының орнына пайдалану да ықтимал, мысалы,А(20) массивінің нольге тең элементтерінің санын анықтау программасының мынадай үзіндісін

100j = 0

110FORk=1 to 20

120IF A(k)< > 0 THEN 140

130j=j+1

  • NEXT

төмендегіше жазу да мүмкін.

100j=0

110FORk=1 to 20

120j =j +1 – SGN(ABS(A(k)))

  • NEXT

Мұнда алғашқы үзіндіге қарағанда бір жол үнемделгені көрініп тұр. 

Динамикалық массивтер.

Көптеген массивтерде массив өлшемін алдын-ала емес, программа жұмысы барысында анықтаудың маңызы зор. Бұл үшін массив өлшемдерін еркімізше бірнеше рет өзгерте алу мүмкіндігі болу керек. Қандай жағдайда керек болуы мүмкін. Мысалы, массив ойында әскерлердің Санин сақтауға арналған болсын. Басында әскерлер саны 100 болсын, ойында оларды жою барысында олардың саны азаяды. Ойында жаңадан бастаған кезде қайтадан 100-ге тең болады. Мұндай жағдайларды элементтерінің саны белгісіз массивтерді пайдаланған дұрыс.

DIM операторы арқылы статикалық (орныққан) массивтер деп. аталатын массивтер сипатталды. Олардың элементтерін сақтау үшін жады інтерпретатор арқылы бөлінеді және жұмыс барысында өзгермейді. Программада элементтерінің саны айнымалы болатын динамикалық массивті пайдалану үшін REDIM операторы қолданылады. Оның DIM операторынан айырмашылығы жоқ, тек ол арқылы сипатталған масив динамикалық деп. аталады және оларға жады программа жұмысы кезінде бөлінеді.

REDIM DinArr (100) AS INTEGER

Динамикалық массивті анықтаудың мынадай да екі жолы бар:

  • DIM операторында массив шекаралары ретінде сан емес, айнымалы немесе өрнек қолданылады. Олардың мәні тек программалық жұмыс істеу кезінде анықталады, сондықтан мұндай операторды QBASIC динамикалық массивті анықтау операторы деп есептейді.

DIM ABC (X1% TO X2%+12) AS STRING

  • DIM операторының алдындағы жолды дәйекше ‘ символынан соң немесе REM операторынан массив құрылымдарын көрсету керек. Құрылым статикалық ($STATIC) немесе динамикалық ($DINAMIC). Мысалы, бастапқы өлшемдері 100 және 1000 болатын екі динамикалық массивті сипаттау үшін төмендегі операторларды орындау керек.

$DINAMIC

DIM A1 (100) AS INTEGER, A2 (1000) AS INTEGER

345 элементтен тұратын статикалық массив былай сипатталады.

$STATIC

DIM A (345) AS INTEGER

Динамикалық массивтер өлшемдерін өзгерту үшін құрылған. Өзгерту үшін REDIM операторы арқылы жаңа шекарасын көрсетіп, қайтадан анықтау керек.

Мысалы:

REDIM A% (1 TO 2)

A%(2)=2

AY.(3) элементі жоқ

REDIM A% (2 TO 3)

A%(3)=3

Енді A%(1)элементі жоқ.

Динамикалық массив өлшемдерін өзгертуді үйрендік. Егер массив өлшемдері нақты сандары арқылы емес, айнымалы шама арқылы берілсе, онда массивтің ағымдық шекараларын анықтау үшінLBOUND( ) және UBOUND( ) деген стандартты функциялар қолданылады.

Жазылуы:

LBOUND {массив аты},{өлшем нөмірі}

UBOUND {массив аты},{өлшем нөмірі}

LBOUND функциясы динамикалық массивтің төменгі шекарасының ағымдық мәнін анықтау үшін қолданылады. Өлшем нөмірі ағымдық шекараның қай өлшем үшін анықталатынын көрсетеді (1-бірінші, 2-екіншісі т.с.). Егер массивте бір – ақ өлшем болса. бұл өлшемді көрсетпей-ақ қоюға болады.

Мысалы:

x%=5

REDIM A%(X% TO 15, 200)

x%=UBOUND (A%) ‘x% 15-ке тең болады

x%=LBOUND (A%,2)‘x% 0-ге тең болады

Массивті тазалау.

ERASE операторы динамикалық массивке бөлінген жадының барлығын тазалайды. Бұл кезде массивте бірде-бір элемент қалмайды. Тазаланған массивпен жұмыс істеу қатеге әкеледі. Бұл массивпен қайтадан жұмыс істеу үшін REDIM операторы арқылы оныңшекараларынанықтапалукерек.

ERASE операторысандық типті статикалық массивке қолданылса, оның барлық элементері0-ді қабылдайды, STRING типті массив болса бос жолдар болады.

Оператордың жазылуы.

ERASE (үтір арқылы ажыратылған массив аттары)

Мысалы

REDIM A% (20)

DIM B% (1 TO 1)

B%(1)=5

ERASEB%

A%(0)=B%(1) ‘A%(0)0-мәнін қабылдайды

ERASEA%,B%

A%массивімен жұмыс істеуге болмайды

REDIMA%(50 TO 100)

Aмассивіменқайтаданжұмыс істеуге болады.