МАСИВИ РЯДКІВ СИМВОЛІВ

У розд 41 ми бачили, що групу чисел можна зберігати в масиві, скажімо, на імя А при цьому числа запамятовуються в елементах масиву А, а саме А (1), А (2), А (3) і т д Аналогічно групу рядків можна зберігати в масиві А $ і звертатися до окремих рядків по іменах А $ (1), А $ (2) і т д Зазвичай для масивів рядків допустимі ті ж імена, що і для звичайних масивів, тільки до імені додається в кінці знак $     ,

Найбільші обмеження на імена масивів, у тому числі і масивів рядків, які повинні бути однобуквені, накладаються Бейсиком в системі ICL 2903/4 Інші системи дозволяють використовувати відповідні змістовні імена, наприклад: RESPONSES (відповідь), TOTALS (підсумок) і ADDRESSESS (адреси) Як і у випадку числових масивів, в програмі треба вказувати оператор DIM, що задає максимальне значення індексу У системі не повинно існувати ніякого звязку між строковим масивом і однойменним числовим масивом

Уточнимо поняття масиву рядків: кожен його елемент рівноцінний строкової змінної і може містити від нуля до великої кількості символів (Граничні значення числа символів наведено в табл 41) Елементами масивів рядків можна користуватися в поєднанні з усіма рядковими функціями, обговорювалися в попередніх розділах

Одновимірний масив рядків можна уявляти собі у вигляді списку елементів, наприклад списку прізвищ у телефонному довіднику або списку покупок Наведена нижче тривіальна програма читає і потім друкує елементи такого списку:

10 Rем ДЕМОНСТРАЦІЯ роботи з масивами рядків символів

20 DIM A

У розд. 4.1 ми бачили, що групу чисел можна зберігати в масиві, скажімо, на ім’я А; при цьому числа запам’ятовуються в елементах масиву А, а саме А (1), А (2), А (3) і т. д. Аналогічно групу рядків можна зберігати в масиві А $ і звертатися до окремих рядків по іменах А $ (1), А $ (2) і т. д. Зазвичай для масивів рядків допустимі ті ж імена, що і для звичайних масивів, тільки до імені додається в кінці знак $.     ,

Найбільші обмеження на імена масивів, у тому числі і масивів рядків, які повинні бути однобуквені, накладаються Бейсиком в системі ICL 2903/4. Інші системи дозволяють використовувати відповідні змістовні імена, наприклад: RESPONSES (відповідь), TOTALS (підсумок) і ADDRESSESS (адреси). Як і у випадку числових масивів, в програмі треба вказувати оператор DIM, що задає максимальне значення індексу. У системі не повинно існувати ніякого зв’язку між строковим масивом і однойменним числовим масивом.

Уточнимо поняття масиву рядків: кожен його елемент рівноцінний строкової змінної і може містити від нуля до великої кількості символів. (Граничні значення числа символів наведено в табл. 4.1.) Елементами масивів рядків можна користуватися в поєднанні з усіма рядковими функціями, обговорювалися в попередніх розділах.

Одновимірний масив рядків можна уявляти собі у вигляді списку елементів, наприклад списку прізвищ у телефонному довіднику або списку покупок. Наведена нижче тривіальна програма читає і потім друкує елементи такого списку:

10 Rем ДЕМОНСТРАЦІЯ роботи з масивами рядків символів

20 DIM A$< 10)

30 FOR I = 0 ТО 3

40   INPUT A$(I)

50 NEXT I

60 REM

70 PRINT

80 PRINT “ВИСНОВОК ІЗ МАСИВУ у зворотному порядку” .

90 FOR I = 3 ТО 0 STEP -1100 PRINT A $ (I) 110 NEXT I 120 END RUN

?1 ФУНТ КАРТОПЛІ

?2 унції ГРИБІВ

?1 КАБАЧОК

?6 ЯБЛУК

ВИСНОВОК З МАСИВУ у зворотному порядку

6 ЯБЛУК

1 КАБАЧОК

2 Унції ГРИБІВ

1 ФУНТ КАРТОПЛІ END AT LINE 120

В силу обставин можуть знадобитися двовимірні масиви рядків і масиви рядків більшого числа вимірів. Не забувайте, що багатовимірні масиви займають в пам’яті багато місця, особливо масиви рядків символів, в кото-

рих кожен елемент може містити велику кількість символів, кожному з яких потрібно один байт пам’яті. Масиву А $ (9,9,9) при середньому числі символів по 20 на кожен елемент буде потрібно не менше 20 * 10 * 10 * 10 == 20 000 байт пам’яті!

4.3.1. ПРИКЛАД ПРОГРАМИ ДЛЯ РОБОТИ ЗІ рядків символів

Обговорювана тут програма перетворює десяткове число в римське. Форма запису римських чисел обумовлює необхідність використання рядків символів. Рішення завдання аж ніяк не полягає в простій заміні десяткових цифр римськими цифрами внаслідок різних принципів побудови цих двох систем числення. Наприклад,

1025 перетвориться в MXXV 1982 перетвориться в MCMLXXXII 2000 перетвориться в ММ Десяткова система заснована на значенні, визначеному позицією цифри в числі, а система римських чисел на складення (І вирахуванні) значень цифр. Існує правило повторення однієї цифри до трьох разів, так що III одно 3, а XX 20. Існує правило віднімання, згідно з яким менше значення віднімається з стоїть праворуч більшого значення, наприклад XL одно 40. Існує правило складання, згідно з яким значення цифр складаються з урахуванням зазначених вище правил, наприклад CXLIII одно 100 + 40 + 3 = 143. Десяткові еквіваленти римських цифр такі:

1= 1 V=5

Х = 10 L = 50 С = 100 D = 500 М = ​​1000

Необхідність комбінувати зазначені три правила ускладнює програму з огляду на те, що їй треба стежити за змінами в розташуванні цифр. Запишемо послідовність римських чисел від 1 до 10:

I   II   III   IV   V   VI   VII   VIII   IX   X

На цій послідовності проглядається симетрія по відношенню до кожного нового символу. 1, 2, 3 і 6, 7, 8 підкоряються правилу повторення (і додавання), 4 і 9 – правилом віднімання, а 5 і 10 є новими символами.

Масив рядків символів застосовується як таблиця для пошуку римських цифр, йому присвоюються такі значення:

I X З М

V L D порожній рядок X З М порожній рядок 117

Перший стовпець використовується для десяткових значень від 0 до 9, друга – від 10 до 90, третій від 100 до 900, а четвертий для 1000 і великих чисел. Так як символи для позначення великих чисел важко надрукувати, то ця програма не зможе перетворити числа, великі 3999. Однак при бажанні в четвертий стовпець можна включити такі символи для великих значень:

В основному циклі з введеного десяткового числа витягуються цифри: спочатку число тисяч, потім сотень, потім десятків і на закінчення одиниць. Всередині циклу присутній новий елемент, службовець прикладом оператора вибору. У Бейсике він називається ON-GOTO. Цей оператор схожий на розширений оператор IF, звідси і подібне накреслення символу структограмми. Спочатку обчислюється вираз, вказане після ON; воно округло-

ється до цілого числа, значення якого використовується для вибору одного з номерів рядків, зазначених після GOTO. Якщо обчислення виразу призвело до значення 1, то вибирається перший номер рядка, до значення 2 – другий номер рядка, 3 – третій і т. д. Потім управління передається до рядка з обраним номером.

Оператор ON-GOTO

Загальна форма запису:

ON e GOTO s1,s2,s3,. . . ,sn

де е – арифметичний вираз, a s1 — sn номери операторів (принаймні, один повинен

бути вказаний).

Дія оператора полягає в передачі управління (GOTO) одному з декількох операторів залежно від значення виразу е, яке обчислюється і потім округлюється до найближчого

цілого числа.

Якщо це ціле число дорівнює 1, то управління передається оператору з першим номером (рахуючи зліва), тобто з номером s1; якщо ціле число дорівнює 2, то управління передається оператору з номером s2 і т. д.

Якщо ціле число лежить поза допустимого діапазону (1 … n), то управління передається оператору,

наступного за оператором ON-GOTO.

Простий ілюстрацією служить програма

10 REM ДЕМОНСТРАЦІЯ ЗАСТОСУВАННЯ ОПЕРАТОРА ON-GOTO

20 К = -1

30 PRINT “К =”; К; “І ВИПОВНЮЄТЬСЯ РЯДОК”;

40 ON До GOTO 70,90,110

50   PRINT " 50"

60  GOTO 120

70   PRINT " 70"

80   GOTO 120

90   PRINT " 90"

100   GOTO 120

110   PRINT " 110"

120 K=K+1

130 IF K<=4 THEN 30

140 END RUN

К = -1 І ВИПОВНЮЄТЬСЯ РЯДОК 50

К = 0 І ВИПОВНЮЄТЬСЯ РЯДОК 50

К = 1 І ВИПОВНЮЄТЬСЯ РЯДОК 70

К = 2 І ВИПОВНЮЄТЬСЯ РЯДОК 90

К = 3 І ВИПОВНЮЄТЬСЯ РЯДОК 110

До 4 І ВИПОВНЮЄТЬСЯ РЯДОК 50 END AT LINE 140

Кожна альтернатива повинна закінчуватися оператором GOTO “кінець групи”, щоб уникнути продовження виконання в інший альтернативі. Якщо результат обчислення виразу виходить за межі числа номерів операторів в списку після GOTO, то виконання програми триває з оператора, наступного за оператором ON-GOTO, в даному випадку-з рядка 50. Повна програма перетворення така:

10 REM ПРОГРАМА ПЕРЕТВОРЕННЯ десяткового числа в РИМСКОЕ

20 REM допускається вводити ЧИСЕЛ ВІД 0 ДО 3999

30 DIM R$(3,3)

40 REM ЗАПОВНЕННЯ МАСИВУ значень

50 R$ ( 0,1)="I"

60 R$ (0,2)="V"

70 R$(0,3)="X"

80 R$(1,1)="X"

90 R$(1,2)="L"

100 R$(1,3)="C"

110 R$(2,1)="C"

120 R$(2,2)="D"

130 R$(2,3)="M"

140 R$(3,1)="M"

150 REM

160 INPUT N

170 PRINT “десяткові”; N; “РИМСКОЕ”;

180 N$=""

190 FOR J=3 TO 0 STEP -1

200  T=10**j

210        S=INT(N/T)

220   N=N-S*T

230   ON S+1GOTO 430,260,260,260,310,340,340,340,340,410

240 REM ПО ЗАМОВЧУВАННЯМ холостого ПРОХІД

250   GOTO 430

260 REM S = 1, 2, 3

270   FOR K=1 TO S

280     N$=N$+R$(J,1)

290 NEXT До

300   GOTO 430

310 REM S=4

320   N$=N$+R$(J,1)+R$(J,2)

330   GOTO 430

340 REM S = 5, 6, 7, 8

350   N$=N$+R$(J,2)

360   S=S-5

370   FOR K=1 TO S

380     N$=N$+R$ (J,1)

390 NEXT До

400   GOTO 430

410 REM S=9

420   NS=N$+R$(J,1)+R$(J,3)

430 REM КІНЕЦЬ ON-GOTO

440 NEXT J

450 PRINT N$

460 END

He піддайтеся спокусі використовувати симетрію дій для чисел від 1 до 4 і від 5 до 9 за допомогою безладного застосування операторів GOTO. Подібне ускладнення програми знецінює можливу вигоду. Пізніше в одній з глав буде показано, як можна застосувати підпрограми і

функції в такій ситуації.

На основі наведеної вище програми виконайте наступну вправу: після рядка 170 перетворіть N в строкове значення (назвіть його М $), потім замініть рядки 200-220 на витяг черговий цифри як символу рядка М $, після чого не забудьте перетворити цифру в число, необхідну для оператора ON-GOTO в рядку 23 (5. Результати мають бути ті ж, що і до внесення змін.

Загальна форма оператора вибору не реалізована в Бейсике; її можна проілюструвати наступним символом:

У всякому разі, Бейсік дозволяє сконструювати спрощений варіант оператора вибору за рахунок ретельного поєднання оператора ON-GOTO і операторів GOTO, що вказуються в кінці кожної альтернативи. Недоліками наведеного вище символу є його громіздкість і те, що для написання тексту в прямокутниках процесів виділяється неоднакова простір. Кілька втрачаючи в наочності, можна використовувати символ

але зі збільшенням N він росте вшир, і іноді його доводиться перетворювати до виду

який може ввести в оману тим, що всупереч прийнятому для нормальної діаграми правилом дії в прямокутнику процесу не тривають діями низлежащего

прямокутника. Дві останні форми символу оператора вибору не будуть використовуватися в даній книзі.

Джерело: Уолш Б. Програмування на Бейсике: Пер. з англ. М.: Радіо і зв’язок, 1988. 336 с: ил.

lt 10)

30 FOR I = 0 ТО 3

40   INPUT A$(I)

50 NEXT I

60 REM

70 PRINT

80 PRINT ВИСНОВОК ІЗ МАСИВУ у зворотному порядку

90 FOR I = 3 ТО 0 STEP -1100 PRINT A $ (I) 110 NEXT I 120 END RUN

?1 ФУНТ КАРТОПЛІ

?2 унції ГРИБІВ

?1 КАБАЧОК

?6 ЯБЛУК

ВИСНОВОК З МАСИВУ у зворотному порядку

6 ЯБЛУК

1 КАБАЧОК

2 Унції ГРИБІВ

1 ФУНТ КАРТОПЛІ END AT LINE 120

В силу обставин можуть знадобитися двовимірні масиви рядків і масиви рядків більшого числа вимірів Не забувайте, що багатовимірні масиви займають в памяті багато місця, особливо масиви рядків символів, в кото-

рих кожен елемент може містити велику кількість символів, кожному з яких потрібно один байт памяті Масиву А $ (9,9,9) при середньому числі символів по 20 на кожен елемент буде потрібно не менше 20 * 10 * 10 * 10 == 20 000 байт памяті

431 ПРИКЛАД ПРОГРАМИ ДЛЯ РОБОТИ ЗІ рядків символів

Обговорювана тут програма перетворює десяткове число в римське Форма запису римських чисел обумовлює необхідність використання рядків символів Рішення завдання аж ніяк не полягає в простій заміні десяткових цифр римськими цифрами внаслідок різних принципів побудови цих двох систем числення Наприклад,

1025 перетвориться в MXXV 1982 перетвориться в MCMLXXXII 2000 перетвориться в ММ Десяткова система заснована на значенні, визначеному позицією цифри в числі, а система римських чисел на складення (І вирахуванні) значень цифр Існує правило повторення однієї цифри до трьох разів, так що III одно 3, а XX 20 Існує правило віднімання, згідно з яким менше значення віднімається з стоїть праворуч більшого значення, наприклад XL одно 40 Існує правило складання, згідно з яким значення цифр складаються з урахуванням зазначених вище правил, наприклад CXLIII одно 100 + 40 + 3 = 143 Десяткові еквіваленти римських цифр такі:

1= 1 V=5

Х = 10 L = 50 С = 100 D = 500 М = ​​1000

Необхідність комбінувати зазначені три правила ускладнює програму з огляду на те, що їй треба стежити за змінами в розташуванні цифр Запишемо послідовність римських чисел від 1 до 10:

I   II   III   IV   V   VI   VII   VIII   IX   X

На цій послідовності проглядається симетрія по відношенню до кожного нового символу 1, 2, 3 і 6, 7, 8 підкоряються правилу повторення (і додавання), 4 і 9 – правилом віднімання, а 5 і 10 є новими символами

Масив рядків символів застосовується як таблиця для пошуку римських цифр, йому присвоюються такі значення:

I X З М

V L D порожній рядок X З М порожній рядок 117

Перший стовпець використовується для десяткових значень від 0 до 9, друга – від 10 до 90, третій від 100 до 900, а четвертий для 1000 і великих чисел Так як символи для позначення великих чисел важко надрукувати, то ця програма не зможе перетворити числа, великі 3999 Однак при бажанні в четвертий стовпець можна включити такі символи для великих значень:

В основному циклі з введеного десяткового числа витягуються цифри: спочатку число тисяч, потім сотень, потім десятків і на закінчення одиниць Всередині циклу присутній новий елемент, службовець прикладом оператора вибору У Бейсике він називається ON-GOTO Цей оператор схожий на розширений оператор IF, звідси і подібне накреслення символу структограмми Спочатку обчислюється вираз, вказане після ON воно округло-

ється до цілого числа, значення якого використовується для вибору одного з номерів рядків, зазначених після GOTO Якщо обчислення виразу призвело до значення 1, то вибирається перший номер рядка, до значення 2 – другий номер рядка, 3 – третій і т д Потім управління передається до рядка з обраним номером

Оператор ON-GOTO

Загальна форма запису:

ON e GOTO s1,s2,s3, ,sn

де е – арифметичний вираз, a s1 — sn номери операторів (принаймні, один повинен

бути вказаний)

Дія оператора полягає в передачі управління (GOTO) одному з декількох операторів залежно від значення виразу е, яке обчислюється і потім округлюється до найближчого

цілого числа

Якщо це ціле число дорівнює 1, то управління передається оператору з першим номером (рахуючи зліва), тобто з номером s1 якщо ціле число дорівнює 2, то управління передається оператору з номером s2 і т д

Якщо ціле число лежить поза допустимого діапазону (1 .. n), то управління передається оператору,

наступного за оператором ON-GOTO

Простий ілюстрацією служить програма

10 REM ДЕМОНСТРАЦІЯ ЗАСТОСУВАННЯ ОПЕРАТОРА ON-GOTO

20 К = -1

30 PRINT К =; К І ВИПОВНЮЄТЬСЯ РЯДОК;

40 ON До GOTO 70,90,110

50   PRINT &quot 50&quot

60  GOTO 120

70   PRINT &quot 70&quot

80   GOTO 120

90   PRINT &quot 90&quot

100   GOTO 120

110   PRINT &quot 110&quot

120 K=K+1

130 IF K&lt=4 THEN 30

140 END RUN

К = -1 І ВИПОВНЮЄТЬСЯ РЯДОК 50

К = 0 І ВИПОВНЮЄТЬСЯ РЯДОК 50

К = 1 І ВИПОВНЮЄТЬСЯ РЯДОК 70

К = 2 І ВИПОВНЮЄТЬСЯ РЯДОК 90

К = 3 І ВИПОВНЮЄТЬСЯ РЯДОК 110

До 4 І ВИПОВНЮЄТЬСЯ РЯДОК 50 END AT LINE 140

Кожна альтернатива повинна закінчуватися оператором GOTO кінець групи, щоб уникнути продовження виконання в інший альтернативі Якщо результат обчислення виразу виходить за межі числа номерів операторів в списку після GOTO, то виконання програми триває з оператора, наступного за оператором ON-GOTO, в даному випадку-з рядка 50 Повна програма перетворення така:

10 REM ПРОГРАМА ПЕРЕТВОРЕННЯ десяткового числа в РИМСКОЕ

20 REM допускається вводити ЧИСЕЛ ВІД 0 ДО 3999

30 DIM R$(3,3)

40 REM ЗАПОВНЕННЯ МАСИВУ значень

50 R$ ( 0,1)=&quotI&quot

60 R$ (0,2)=&quotV&quot

70 R$(0,3)=&quotX&quot

80 R$(1,1)=&quotX&quot

90 R$(1,2)=&quotL&quot

100 R$(1,3)=&quotC&quot

110 R$(2,1)=&quotC&quot

120 R$(2,2)=&quotD&quot

130 R$(2,3)=&quotM&quot

140 R$(3,1)=&quotM&quot

150 REM

160 INPUT N

170 PRINT десяткові; N РИМСКОЕ;

180 N$=&quot&quot

190 FOR J=3 TO 0 STEP -1

200  T=10**j

210        S=INT(N/T)

220   N=N-S*T

230   ON S+1GOTO 430,260,260,260,310,340,340,340,340,410

240 REM ПО ЗАМОВЧУВАННЯМ холостого ПРОХІД

250   GOTO 430

260 REM S = 1, 2, 3

270   FOR K=1 TO S

280     N$=N

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*