по дисциплине Информатика (раздаточный материал)

АЛГОРИТМИЧЕСКОМ

ЯЗЫКЕ БЕЙСИК

 

Методические указания,

Лабораторный практикум и контрольные задания

по дисциплине Информатика (раздаточный материал)

 

 

Алгоритмические языки предоставляют возможность человеку управлять действиями ЭВМ. Существует множество таких языков, среди которых самыми популярными в настоящее время являются языки: Си, Паскаль, Бейсик. Последний является не только “школьным” языком. Его поддержка влиятельным мировым производителем программных продуктов – корпорацией Microsoft и, особенно, распространение этого языка на среду Windows (версия Visual Basic) сделали хрестоматийный Бейсик очень популярным и перспективным языком как начального, так и профессионального уровней.

Ниже мы рассмотрим средства, алгоритмического языка QBasic фирмы Microsoft в объеме, необходимом для программирования несложных процессов и выполнения контрольных работ.

Алфавит языка. В Бейсике разрешены следующие основные символы:

1. Буквы латинского и русского и языков (буквы кириллицы могут использоваться только в константах).

2. Цифры.

3. Специальные символы: + плюс, – минус; *умножение, /деление, ^ возведение в степень;

= равно, > больше, < меньше (отношение неравенства отображается двумя значками <>);

.точка, , запятая, ( ) скобки, " кавычки, ; точка с запятой, : двоеточие и некоторые другие.

Переменные. Все, используемые в программе, переменные снабжаются латинскими именами. Имя должно начинаться с буквы и может содержать до сорока букв и цифр. Программист выбирает имена произвольно, но таким образом, чтобы они указывали на смысл переменной. За каждой переменной компьютер закрепляет ячейку памяти. Большие и маленькие буквы в именах и операторах воспринимаются компьютером одинаково, т.е. буквы W и w обозначают одну и ту же переменную. Имена переменным лучше давать, сообразуясь со смыслом физических величин, которые они обозначают. Так будет легче ориентироваться в тексте программы.

Примеры имен: X, y, A24, VES, Netto, MAXIMUM.

Типы переменных.Переменные могут быть следующих типов.

Целое число (Integer) от -32768 до +32768.

Длинное целое (Long) от -2147483648 до +2147483647.

Вещественное обычной точности (Single) в приблизительном диапазоне ±1038.

Вещественное двойной точности (Double) в приблизительном диапазоне ±10308.

Символьный тип (String) – до 32567 символов.

В тексте программ типы переменных указываются специальным оператором или специальным символом сразу после имени переменной. Целый тип обозначается знаком %, длинный целый – &, вещественный – !, вещественный двойной точности – #, символьный – $. Например: A%, B&, C!, D#, E$. Если тип не указан явно, он считается вещественным обычной точности. Таким образом, переменные C! и C являются одной и той же переменной обычной точности.

Выражения. Выражения используются для вычисления формул. Участники выражения соединяются знаками операций, которые были приведены выше. Выражения строятся по определенным правилам, учитывающим необходимость записи формул в строку. Вычисления в них реализуются слева направо в последовательности: 1. возведение в степень, 2. умножение-деление, 3. сложение-вычитание. Порядок действий может быть изменен скобками.

Следующие два примера иллюстрируют правила построения выражений.

Формулы в обычной записи: Выражения на Бейсике:

XC+2.5^H/(6*K)

F4/(B–3)+(C*B/(TM–5))*8.4

Кроме привычных математических операций (сложение, вычитание и т.д.) в языке имеется специальная операция вычисления модуля MOD. Она имеет следующий формат

üчисло1 MOD число2

Здесь число1 делится на число2. Результатом остаток от деления. Примеры: 5 MOD 2=1; 2 MOD 6=2.

И, конечно, Бейсик располагает рядом математических функций. Вот некоторые из них.

üSIN(число)– синус угла, заданного в радианах.

üCOS(число) – косинус угла, заданного в радианах.

üTAN(число) – тангенс угла, заданного в радианах.

üATN(число) – арктангенс числа.

üLOG(число)– натуральный логарифм числа.

üABS(число)– абсолютное значение числового выражения. Пример: ABS(–6)=6.

üSGN(число)– функция, возвращающая знак числа. Если число положительно, возвращается +1, если

равно нулю – ноль, если отрицательно – минус 1. Примеры: SGN(12)=1; SGN(0)=0; SGN(–13.4)=–1.

üFIX(число) – усечение числа до целого. Примеры: FIX(1.2)=FIX(1.9)=FIX(1.5)=1; FIX(–1.2)=FIX(–1.5)=–1.

üEXP(число)– основание натурального логарифма в степени аргумента – eчисло.

üSQR(число)– квадратный корень числа.

 

1. ПРОСТЕЙШИЕ Операторы языка

Оператор является основной единицей программы и выполняет какое-то элементарное действие. Во многих версиях Бейсика операторы в программе нумеруются. В QBasic, однако, сплошная нумерация не обязательна. При задании формата оператора символами [ ] будем ограни­чивать необязательную часть оператора.

Оператор присваивания. Формат оператора:

üпеременная=выражение

Такая запись означает, что выражение, стоящее справа, вычисляется и его результат присваивается переменной, стоящей слева.

Примеры операторов: Z=2, A=3.5+EXP(8), S=X^4+Y/2.

Присваивание не является равенством в обычном смысле. Справа и слева от знака “=” можно указывать одну и ту же переменную, например: М=М+2, X=X/3. Эти выражения следует понимать как реализацию так называемых рекуррентных соотношений, то есть новое содержимое переменной М будет равно старому, увеличенному на 2, и новое X будет равно старому, деленному на 3. В алгебре для записи такого рода выражений используются индексы, указывающие последовательность действий. Например Мt+1t+2.

По обе стороны равенства могут стоять переменные разных типов. Но если слева от знака равенства – целочисленная переменная, а справа получено вещественное число, то его дробная часть будет отброшена. Так, если М целочисленная переменная и A=2, то после вычислений в операторе М=A*0.2+0.5 получим не М=0.9, а М=0.

Присвоение может осуществляться и другим образом – с помощью пары операторов

üDATE список_констант

üREAD список_переменных

Например, операторы

DATE 2, 3.5, 100

READ x, y, z

соответствуют следующим операторам присваивания: x=2, y=3.5, z=100.

Использовать эту пару операторов удобно при необходимости вводить большое число констант.

Оператор перестановки.Часто возникает необходимость в перестановке значений переменных. Так, если нужно поменять значения X и Y, следует запи­сать три оператора: A=X, X=Y, Y=A. Здесь понадобилась дополнительная “тран­зитная” перемен­ная A, в которой временно запоминается значение X.

Оператор

üSWAP переменная1, переменная2

позволяет выполнить обмен значений сразу. Например: SWAP X,Y

Наше общение с компьютером имеет характер переписки. Мы пишем, он читает. Он пишет, читаем мы. Эти действия реализуются следующими специальными операторами ввода-вывода.

Оператор вывода.Для просмотра и анализа результатов вычислений необходимо вывести их на внешний носитель – бумагу или экран дисплея. Для этой цели используется следующий оператор.

üPRINT [список_выводимых_переменных]

или? [список_ выводимых_переменных]

Вопросительный знак может заменять слово PRINT, что экономит время ввода программы. Например, оператор:

PRINT a, mчитается так –“Печатать переменные A, М”.

Оператор PRINT может вообще использоваться без аргументов. Тогда при выводе будет формироваться только пустая строка.

В оператор вывода могут включаться не только переменные, но константы и целые выражения. Например, если X=12, а Y=100, то применение оператора

? "СУММА=" x+y

даст следующий результат: СУММА=112

При выводе данных имеет значение, какой разделительный знак использован для перечислении переменных. Если используется точка с запятой или пробел, следующая переменная будет выведена непосредственно за предыдущей. Если запятая – следующая переменная будет выведена с начала следующей зоны вывода. Бейсик разделяет каждую строку вывода на зоны по 15 символов. Это означает, что первое выводимое значение займет колонки с 1 по 15, второе – с 16 по 30, третье с 31 по 45 и т.д.

Если необходимо управлять положением и разрядностью выводимых данных, следует использовать оператор

üPRINT USING шаблон; список,_выводимых_переменных

Здесь шаблон содержит символы, определяющие эти параметры. Символ “#” в шаблоне указывает на то, что в этой позиции будет выведена цифра. Символ “.” определяет место десятичной точки. Например, положим, что X=2539.23745. Оператор

PRINT USING "######.##"; x

выведет число 2539.24, которому предшествуют два пробела, поскольку под целую часть числа отводиться 6 позиций, а фактически их 4. Дробная часть округляется до двух разрядов.

Оператор ввода. Исходные данные, обрабатываемые програм­мой, можно задавать оператором присваивания. Пусть нужно вычислить площадь круга S=2ПR2. Если задать непосредственно в программе значение радиуса окружности, например оператором R=5, то программа будет вычислять площадь только такой окружности. Если нужно вычислить значение S с иным радиусом, придется изменить оператор непосредственно в программе. Это очень неудобно, поскольку пользователь программы не имеет квалификации и возможности изменять что-нибудь в программе. Необходимо сделать так, чтобы результаты вычислений зависели не от текста программы, а только от данных. Для этого имеется оператор чтения данных вида:

üINPUT [приглашение ;/,] список_вводимых_переменных

где приглашение – необязательная символьная константа, указывающая, что именно нужно вводить. Если после приглашения указана точка с запятой, после приглашения будет выведен вопросительный знак. Если запятая – нет.

Если список переменных содержит более одной переменной, вводимые значения следует разделять запятыми. Число вводимых данных по количеству и типу должно соответствовать списку переменных. По завершении ввода всех переменных для данного оператора INPUT следует нажать клавишу ENTER. Если ввод был осуществлен неверно, ПК выдаст сообщение “Redo from start” о необходимости его повторить.

Пример: INPUT "Введите переменные R и L"; r, l

Дословно оператор интерпретируется следующим образом: “Читать в па­мять ЭВМ, введенные с клавиатуры, переменные R и L”. При этом на экра­не сначала будет выведено приглашение вида “Введите переменные R и L?”

Оператор завершения END(“конец”) завершает выполнение программы. Он может находиться в любом месте программы. Таких операторов может быть несколько в случае, если предполагается завершение программы не только в ее конце. Присутствие END в конце программы необязательно, поскольку после выполнения последнего оператора, она все равно заканчивается.

Комментарии. Написанная программа спустя некоторое время даже автору кажется малопонятным набором символов. Для облег­чения понимания программы в нее вставляются комментарии – тексты, поясняющие суть процессов и не влияющие на ее исполнение. Такие тексты должны начинаться со знака апостроф – '.

Оператор очистки CLSосвобождает экран от информации и устанавливает курсор в его левый верхний угол.

üCLS

@ Задачи для самостоятельного решения.

1. Пусть известны координаты вершин треугольника X1,Y1; X2,Y2; X3,Y3. Найти: периметр треугольника P и его площадь S. Треугольник лежит на длинной стороне (D).

2. Пусть некоторый процесс начался в H1 часов, Min1 минут, а закончился, когда было H2 часов и Min2 минут. Вычислить длительность этого процесса (в часах HD и минутах MinD). Считаем, что процесс идет внутри одних суток.

Эти и другие задания “для самостоятельного решения” являются также материалом для лабораторных работ

 

2. Операторы управления

В программе принят естественный порядок выполнения операторов – в той последовательности, в которой они записаны. В случае если этот порядок должен быть нарушен, используются операторы перехода.

Оператор безусловного перехода. Оператор вида:

üGOTO метка_оператора

вынуждает программу выполнять не следующий по порядку оператор, а опера­тор с указанной меткой. Например, оператор GOTO 25 читается как “Идти к оператору с меткой 25”и передает управление оператору с меткой 25.

В некоторых версиях Бейсика все операторы в программе нумеруются. В QBasic, однако, сплошная нумерация не обязательна, хотя и возможна. Здесь для организации ссылок используются метки (в частном случае это могут быть и номера операторов), которые расставляются слева от тех операторов, на которые есть ссылки. Метками могут быть любые целые числа, идущие в произвольном порядке (не обязательно по возрастанию). Важно только, чтобы они не повторялись.

Оператор анализа условий.Если переход, или какое то другое действие должно быть выполнено в зависимости от некоторых условий, то используется оператор IF. Его формат:

üIF логическое_условие THEN оператор1 ELSE оператор2

Здесь, если заданное условие истинно, выполняется оператор1, если нет – оператор2. Например, оператор

IF a>b THEN ? "А больше В" ELSE ? "А не больше В"

 

выводит сообщение о фактическом соотношении переменных A и В.

Фраза ELSE необязательна, т.е. возможен и такой формат

ü IF логическое_условие THEN оператор

Например, следующий оператор читается: “Если X>Z, напечатать Y, иначе идти к следующему оператору (непосредственно под оператором IF)”.

 
 


IF x>z THEN ?Y

¯нет

да
Например

 
 


IF a>=b-2 THEN GOTO 40читается так:

¯нет

“Если A³B–2, то идти к оператору 40, иначе – к опе­ратору, стоящему ниже ”.

Если требуется осуществить только переход слово THEN можно опустить

ü IF логическое_условие GOTO метка

Другой пример. На практике иногда приходится выяснять, четное число (например, X) или нечетное. Это можно сделать с помощью любого из следующих выражений

IF FIX(x/2)=x/2 THEN "X – четное" ELSE "X – нечетное"

IF x MOD 2=0 THEN "X – четное" ELSE "X – нечетное"

Структурный оператор анализа условий.Здесь уместно напомнить, что всюду, где в синтаксисе команд встречается слово оператор, может быть записано несколько операторов, разделен­ных двоеточием. Однако этого может оказаться недостаточно – внутрь выражений THEN/ELSE может потребоваться включить много действий и даже целые процессы. В этом случае используется структурный оператор, позволяющий формировать условия, включающие любое число строк программы.

Вид оператора:

üIF логическое_условие THEN

Операторы1

ELSE

Операторы2

END IF

Здесь если логическое условие истинно, выполняются операторы1, если нет – операторы2. Присутствие фразы ELSE и следующих за ней операторов2 необязательно.

Для примера используем предыдущую задачу о сравнении двух чисел A и В.

IF a>b THEN

? "А больше В"

ELSE

? "А не больше В "

END IF

Замечание к нотации. Для придания более наглядного вида программе удобно использовать отступы при вводе “подчиненных” операторов в структурах IF, FOR и других, как показано выше. В данном случае подчиненными операторами по отношению к структуре IF являются операторы печати.

Блок-схема.При разработке алгоритма программы сначала удобно построить его графическое представление – блок-схему. В блок-схеме отдельные операции или группы операций помещаются в прямоугольные блоки. Операции анализа (операторы IF) отображаются ромбами, имеющими два выхода. Выход ДА, соответствует истинному значению, анализируемого условия, НЕТ – ложному. Обычно, блок-схемы обрамляют блоки НАЧАЛО и КОНЕЦ. Мы будем изображать последние только в случае, если возможно разночтение.

Организация ветвлений

Очень распространенной задачей является программирование процессов с несколькими исходами – ветвящихся процессов.

Задача 3.1. Для произвольного аргумента X вычислить значение кусочно-ломаной функции Y(X) (рис. 3.1).

 
 

 


Возможные решения задачи приведены на рис. 3.2 и 3.3. Здесь имена переменных отображены строчными буквами, а ключевые слова – прописными только для наглядности. Как уже указывалось, регистр букв безразличен – в Бейсике они воспринимаются одинаково.

 

 
 

 


Здесь используется помеченный оператор (2 PRINT y). Необходимость в этом возникла вследствие потребности перейти к печати от операторов IF, минуя оператор y=10-0.5*x. В данном случае метка может быть любым числом, а не только 2. Замечание. В блок-схеме, на связях имеющих очевидное направление, стрелки можно не указывать.

Отметим, что практически любая задача может быть запрограм­мирована различными способами. Например, здесь возможно и такое решение.

INPUT x

IF x<0 THEN y=5+x: PRINT y: END

IF x<10 THEN y=5: PRINT y: END

y=10-0.5*x: PRINT y

Задача 3.2. Даны три произвольных числа A, В, С. Составить программу, которая анализирует их и, если сумма первых двух чисел не меньше третьего, а второе число больше первого – выдает сообщение ВЕРНО. Если хотя бы одно из условий не выполняется – то сообщение НЕВЕРНО. Иными словами

“ВЕРНО” если A+В>=C и В>A

“НЕВЕРНО” – в противном случае

На рис. 3.4 и 3.5 представлено решение (блок-схема и программа), полностью адекватное условию. Однако в некоторых случаях решение удобно искать, преобразовав условие на обратное, т.е.

“НЕВЕРНО” если A+В<C или В<=A

“ВЕРНО” – в противном случае

Это позволяет иногда упростить программирование (рис. 3.6).

При необходимости выполнять анализ одновременно нескольких условий удобно воспользоваться логическими функциями. Аргументами логических функций являются высказывания, в отношении которых всегда можно сказать, истинны они или ложны. К таким высказываниям относятся математические операции сравнения – равно, больше, меньше и т.д. Так, например, выражение вида X=Y всегда может быть только истинным или только ложным. Рассмотрим важнейшие логические функции (см. таблицу ниже).

Функция одного аргумента НЕ истинна тогда и только тогда, когда ложен ее аргумент. То есть значение функции всегда обратно аргументу. Поведение функции полностью описывает таблица. В операторе IF функция И обозначается словом NOT. Например, следующие два оператора полностью идентичны

IF X<10 THEN Y=5 IF NOT X>=10 THEN Y=5

Аргумент Функция НЕ Первый аргумент Второй аргумент Функция И Функция ИЛИ
Ложь Истина   Ложь Ложь Ложь Ложь
Истина Ложь   Ложь Истина Ложь Истина
      Истина Ложь Ложь Истина
    Истина Истина Истина Истина

Из функций двух аргументов для нас важны И и ИЛИ. Функция И истинна тогда и только тогда, когда истинны все ее аргументы (в программах обозначается словом AND). Функция ИЛИ (OR) истинна тогда, когда истинен хотя бы один из ее аргументов. Если нет скобок, функции вычисляются в такой последователь­ности: НЕ, И, ИЛИ.

В качестве примера снова рассмотрим задачу 3.2 в исходной формулировке. Теперь ее решение сводится практически к одной строке и приведено ниже

INPUT a,b,c

IF a+b>=c AND b>a THEN ? "Верно" ELSE ? "Неверно"

Другой пример. Для A,В,С выяснить, правда ли что первое число самое большое, а последнее – самое маленькое.

IF a>b AND a>c AND c<a AND c<b THEN ? "Верно" ELSE ? "Неверно"

Еще. Верно ли, что среди чисел имеется ровно одна единица?

IF (a=1 AND b<>1 AND c<>1) OR (a<>1 AND b=1 AND c<>1)

OR (a<>1 AND b<>1 AND c=1) THEN ? "Верно" ELSE ? "Неверно"

Здесь скобки введены лишь для наглядности, поскольку операция AND все равно выполняется прежде операции OR.

Но как решить такую задачу, если чисел не три, а например 20. Логическое выражение сделается слишком громоздким. Здесь можно использовать “арифметический” подход и сосчитать число единиц:

IF a=1 THEN s=s+1

IF b=1 THEN s=s+1

. . .

IF z=1 THEN s=s+1

IF s=1 THEN ? "Верно" ELSE ? "Неверно"

Пример. Написать программу, которая для любого года G определяет високосный он или нет (ответ Да/Нет). Признаком високосно­го года является кратность года числу 4 за исключением тех лет, которые делятся на 100 и не делятся на 400. Кратность чисел можно определять с помощью операции MOD.

INPUT g

IF (g MOD 4=0) AND NOT((g MOD 100=0) AND (g MOD 400<>0) ) THEN ? "Да" ELSE ? "Нет"

@ Задачи для самостоятельного решения.Напишите программу, выясняющую следующие факторы:

1). Даны три произвольных числа A, В, С. Выяснить правда ли что числа расположены в порядке возрастания их значений? Ответы должны быть даны словами: Да/Нет.

2). Даны A, В, С. Выяснить правда ли что среди чисел имеются отрицательные (хотя бы одно)? Ответы – Да/Нет.

3). Выяснить правда ли что среди чисел A, В, С имеются одинаковые? Ответы – Да/Нет.

4). Найти наибольшее из чисел A, В, С. Здесь удобно использовать три оператора IF, каждый из которых проверяет на максимум одно из чисел. Если данное число оказалось самым большим, следует его напечатать и сразу прекратить вычисления оператором END, включенным внутрь структуры IF.

5). Вывести число, занимающее промежуточное положение между самым большим и самым маленьким из чисел A,В, С.

6). Положим, автомобиль был взят на прокат с датой G1, M1, H1, Min1 (год, месяц, день, час, минуты), а был возвращен в G2, M2, H2, Min2. Вычислить сколько времени использовался автомобиль T (в часах), а также, сколько должен заплатить клиент за использование автомобиля при часовом тарифе 100 руб. Длительность всех месяцев считать равной 30 дням. Считаем, что прокат возможен не более чем на 20 дней.

7). То же, но прокат возможен на срок до 70 дней.

8). Те же условия, но длительность каждого месяца брать фактической (с учетом високосности года). Считать также, что событие может происходить в период (2006-2009гг).

9). То же, но до 2050 года.

10). Известны координаты трех вершин треугольника X1,Y1; X2,Y2; X3,Y3. Найти: периметр треугольника P и его площадь S. Треугольник может быть одного из трех видов: (нижняя сторона лежит горизонтально).

11). Известны координаты трех вершин треугольника X1,Y1; X2,Y2; X3,Y3. Найти: периметр треугольника P и его площадь S. Треугольник расположен произвольным образом.

12). На плоскости нарисован прямоугольник (рисунок ниже). Напишите программу, которая для точки с произвольными координатами Xт и Yт определяет факт ее попадания внутрь прямоугольника. Ответ – Да/Нет. Кроме того, вычислить площадь прямоугольника S.

13). Для той же фигуры определить факт ее попадания точки в область j или k или вне квадрата. Ответ должен быть дан в виде цифр 1, 2 или фразы «Вне квадрата».

14). На плоскости проведена прямая и заданы координаты Xт и Yт точки на плоскости. Определить в какую из областей j, k, l, mпопала наша точка. Подсказка. Определим принадлежность точки к области 4. Очевидно, что 0<Xт<4, а 0<Yт<3. Далее нам понадобится уравнение прямой (у нас Y=3–X*3/4). Как узнать, что наша точка находится под прямой? Ясно, что Yт должен находиться ниже, чем прямая для того же аргумента 3–Xт*3/4. Т.е. если Yт<3–Xт*3/4, значит точка находится в области 4.

15). На плоскости проведены две прямые линии. Определить, попала ли точка в заштрихованную область. Ответ Да/Нет.

 

Организация циклов

В простых примерах, рассмотренных выше, вообще говоря, не требо­валось привлечения ЭВМ и программирования. Все они достаточно быстро могли быть решены вручную или с помощью калькулятора. Сила ЭВМ заключается в возможности простыми средствами осуществлять многократное повторение заданных действий – циклов.

Итерационные циклы.В случае если количество циклов, необходимых для решения задачи, заранее неизвестно, такие циклы называются итерационными. Рассмотрим ряд примеров.

Задача 4.1. Пусть для некоторого множества чисел X нужно вычислить функцию 2/X. Ввод и вычисления следует прекратить после обнаружения первого X, равного нулю (деление на ноль невозможно).

Очевидна следующая (рис. 4.1а) блок-схема. Блоков ввода, вычисления и анализа столько, сколько чисел в последовательности до первого нуля. На рисунке показаны только два первых блока. Чисел может быть очень много и подобный подход, конечно, неприемлем, не говоря уже о том, что и количество их заранее неизвестно. Такие программы строятся по-иному. Обрабатывающая часть программы записывается только раз, но охватывается петлей возврата (рис. 4.1б). Тогда одни и те же операторы будут выполняться многократно до тех пор, пока X¹0.

Задача 4.2. Пусть для аргумента X, находящегося в диапазоне от 3 до 9, требуется вычислить и напечатать значение функции Y=(X–6)2, где X изменяется с шагом 2 (рис. 4.2а). Блок-схема алгоритма показана на рис. 4.2б.

Справа от текста программы сделаны выкладки по проверке решения. В каждой строке вручную вычисляется и указывается значение соответствующей переменной. Выкладки по проверке выполняются сверху-вниз, слева-направо по ходу исполнения программы. Стрелки показывают связи между циклами. Видим, что заданная последовательность изменения X (3, 5, 7, ...) наблюдается и последнее значение Y вычисляется для X=9. При следующем приращении X оно становится равным 11 и пятый цикл не выполняется, поскольку при X>9 программа завершается.

 
 

 

 


Здесь следует отметить, что нет никакого технически простого способа проверки правильности написанных программ. Для этой цели программисту приходится вручную по тексту программы рассчитывать значения всех переменных и сличать их с желаемыми (известными из условия). Конечно, проверка выполняется не для всей задачи, а только для небольшого числа (например, трех) начальных циклов и при этом тщательно анализируется значение условия выхода из цикла (оператор IF).

@ Задачи для самостоятельного решения.Напишите программы:

1). Решите задачу 4.2 для X, изменяющегося в обратном направлении (9¸3).

2). Вычислить и напечатать значения функции Y=10–2X для последовательных значений X: 0, 0.5, 1, 1.5, 2, 2.5, ... и т.д. до тех пор, пока Y не станет отрицательным.

3). Решите задачу 4.1, где вычисления Y прекращаются после того, как будут встречены три числа X<0. Указание. Здесь понадобится переменная – счетчик таких значений. Назовем ее К. В каждом цикле следует увеличивать ее значение на единицу и прекратить вычисления при К>=3.

Арифметические циклы.Если число повторений известно заранее – такие циклы называются арифметическими.

Задача 4.3. Пусть в условиях предыдущей задачи 4.2 не известно предельное значение аргумента, но зато задано количество точек аргумента – 4. Поскольку не известно последнее X, признак окончания циклов придется формировать самим. Для этого вводится переменная, которая фиксирует число уже выполненных циклов, т.е. счетчик циклов (назовем ее I). В исходном состоянии (рис. 4.3) берем его равным 1.

После выполнения очередного цикла счетчик получает приращение, увеличиваясь на единицу (I=I+1). В начале каждого цикла в операторе IF делается проверка на достижение счетчиком последнего разрешенного значения (у нас 4). Если I<=4 программа продолжает вычисление функции, если нет (I>4) – счет прекращается. Ниже приведена программа и выкладки по ее проверке. Как видим, результат проверки совпал с результатом, полученным ранее.

Исходное значение счетчика циклов и его приращения могут выглядеть по-разному. Главное, чтобы было выполнено заданное число циклов. В нашем примере был использован счетчик на возрастание I=1,2,3, ... до N (N – число шагов). Можно начинать счетчик с нуля: I=0,1,2, ... до N-1. Возможен счетчик на убывание: I=N–1, ... 3,2,1 до 0 и т.д. Обычно, если нет оснований для другого, используется счетчик на возрастание с шагом единица от 1 до N.

@ Задачи для самостоятельного решения.

1). Решите задачу 5 для X, изменяющегося в обратном направлении (X начинается с 9).

2). Напечатайте цепочку из 10-ти чисел X, изменяющихся по закону 2, 6, 18, … .

Задачи на накопление.В практике очень распространены задачи на накопление, т.е. на нахождение сумм и произведений последовательности переменных. Такие задачи могут встречаться как в формулировке итерационных, так и арифметических циклов.

Задача 4.4. Пусть требуется найти сумму N произвольных чисел X. Блок-схема алгоритма на рис. 4.4. В программе сумма накапливается в переменной S оператором S=S+X. Начальное значение суммы берется равным нулю (S=0).

Числовые ряды.Типичной циклической задачей на накопление является вычисление числовых рядов.

Задача 4.5. Пусть требуется найти сумму S для N членов бесконечной геометрической прогрессии вида

A1 A2 A3 A4 N

S = 3 + 6 + 12 + 24 + ... + = åAi

 
 


S1 S2 S3 S4

Здесь каждый следующий член прогрессии Aiравен предыдущему Ai+1, умноженному на два. Если учесть введенные обозначения, можно записать так называемые рекуррентные формулы

Si= Si–1+ Ai, где Sо = 0 Или, как принято в программировании S=0, S=S+A

Ai= 2Ai–1 A1= 3 A=3, A=2A

Aналогично строятся программы для циклического произведения, однако исходное значение искомого произведения берется равным единице. Если действовать по аналогии с суммой и сделать его равным нулю, результат всегда будет также нулем, поскольку умножение на нуль дает только нуль.

 
 


@ Задачи для самостоятельного решения.

1). Найдите произведение N элементов ряда: Y=3×6×12×24×... .

2). Найдите сумму N элементов ряда: Y=–3+6–12+24–… .

Указание. Поскольку члены ряда образуют геометрическую прогрессию, для вычисления очередного его члена нужно умножить предыдущий на –2.

3). Найдите сумму N элементов ряда: Y=–2+4–6+12–… .

Указание. Здесь прогрессия арифметическая и подход, примененный в предыдущем случае (умножение на отрицательное число), не применим. Для фор­мирования изменяющегося знака в задаче 3 можно ввести специальную переменную Z, равную то +1, то –1 на которую будет умножаться очередной элемент ряда. Первоначальное значение Z определяется знаком при первом элементе ряда. У нас будет Z=–1. Далее эта переменная должна меняться по закону Z=–Z. Таким образом, Z будет то –1 то +1, что при перемножении на элемент ряда будет каждый раз менять его знак на противоположный.

ОПЕРАТОРЫ циклов

Оператор арифметического цикла.Принципы построения программ с арифметическими циклами можно проиллюстрировать обобщенной блок-схемой на рис. 5.1.

Группа операторов внутри цикла называется телом цикла. Толь­ко обрабатывающая часть цикла полезна. Остальные операторы являются обслуживающими, необходимыми для организации цикла. Этот механизм в алгоритмических языках обычно реализует специальный оператор цикла, который мы сейчас рассмотрим. Его применение упрощает программирование и снижает возможность совершения ошибок.

Структура вида:

ü FOR изменяемая переменная = начальное значение TO конечное значение STEP шаг

Операторы в цикле

NEXT имя_переменной_цикла

последовательно выполняет операторы, находящиеся между оператором FOR до оператора NEXT столько раз, сколько нужно для того, чтобы изменяемая переменная от начального значения достигла конечного значения с установленным шагом.

Например:

FOR a = 3 TO 7.5 STEP 0.8

Операторы

NEXT a

Здесь группа операторов от оператора FOR до оператора NEXT будет повторяться столько раз, сколько нужно, чтобы переменная A, изменяясь с шагом 0.8 от значения равного 3, достигла 7.5. Таким образом, мы последовательно получим: A=3; 3.8; 4.6; 5.4; 6.2; 7, т.е. цикл будет выполнен 6 раз. При следующем значении A=7.8 циклы более не выполняются, поскольку A становится больше предельно возможного (7.8>7.5) в данном операторе FOR. Далее программа продолжаться с оператора, следующего сразу после NEXT.

В качестве параметров оператора цикла разрешены выражения. Например: FOR c=b+2 TO k STEP x–2.Если шаг изменения переменной цикла 1, разрешается его не указывать. Так, операторы

FOR i=4 TO k STEP 1иFOR i=4 TO k

полностью эквивалентны. Дословно такой оператор интерпрети­руется следующим образом: “Выполнять операторы цикла от оператора FOR до оператора NEXT столько раз, сколько нужно, чтобы переменная I, изменяясь с шагом 1, достигла значения k.” Цикл перестанет выполняться в момент, когда переменная цикла становится больше предельного значения цикла (k).

Допускается отрицательный шаг с превышением начального значения цикла над конечным, например

FOR i=20 TO 10 STEP -3

Здесь переменная I последовательно получит значения: 20, 17, 14, 11.

Оператор цикла является сильнейшим средством программиста. Он один заменяет несколько операторов в цикле, построенном обычным образом – это операторы задания исходного значения циклической переменной (или счетчика циклов) и операторы ее приращения и анализа. Оператор FOR удобен для реализации арифметических циклов.

Программа к Проверка для N=3
задаче 4.5 (с FOR) 1 цикл 2 цикл 3 цикл  
INPUT n a=3: s=0 FOR i=1 TO n s=s+a a=2*a NEXT i ? s n=3 a=3, s=0 i=1<3 s=0+3=3 a=2*3=6 2<3 3=3 4>3 s=21

Решим задачу 4.5 с применением оператора FOR. Здесь необходимо просум­мировать в переменную S все числа X из множества N чисел.

Если необходимо выйти из цикла FOR до его естественного завершения (до выполнения всех циклов), можно применить оператор GOTO, но удобнее воспользоваться специальным оператором выхода вида

üEXIT FOR

который передает управление на оператор, следующий непосредственно за оператором NEXT.

Если нужно, не выполняя до конца текущего цикла, начать следующий, следует перейти оператором GOTOнепосредственно на оператор NEXT. В задаче 8, например, это оператор IF x<0 THEN s=s+x: GOTO 9.

Программа Проверка для N=5
к задаче 5.1 1 цикл 2 цикл 3 цикл 4 цикл 5 цикл  
INPUT n kp=0: s=0: p=1 FOR i=1 TO n INPUT x IF x=0 GOTO 7 IF x<0 THEN s=s+x: GOTO 9 kp=kp+1 p=p*x 9 NEXT i ?"Нулей нет" 7 ? s p kp n=4 i=1<5 x=3 x0 x>0 kp=1 p=3 2<5 x=-2 x0 x<0, s=-2 3<5 x=1 x0 x>0 kp=2 p=3 4<5 x=-3 x0 x<0, s=-5 5=5 x=2 x0 x>0 kp=3 p=6 Нулей 6>5 нет -5,6,3

Задача 5.1. Для N произвольных чисел X вычислить и отпечатать: сумму отрицательных чисел S, количество положительных КР, произведение положительных чисел Р. Все вычисления производить до появления первого нуля в последовательности. Если нуль не встретился, кроме S, KP и Р напечатать сообщение НУЛЕЙ НЕТ. В программе сделана проверка для N=5 и чисел X=3,–2,1,–3,2. В результате получено S=–5, P=6, KP=3.

Задача 5.2. Для чисел X и Y найти наибольший общий делитель, т.е. наибольшее число, которое делит X и Y без остатка. Нахождение НОД будем выполнять путем последовательного перебора сверху вниз всех натуральных чисел от минимального из X и Y до 1. Наибольшим делителем считаем первое значение i, которое делит оба числа без остатка.

Программа к задаче 5.2

INPUT "Введите числа X и Y", x, y

IF x<y THEN k=x ELSE k=y'определение минимального (переменная К) значения из X и Y

FOR i = k TO 1 STEP –1'перебор чисел от К до 1

IF (x MOD i=0) AND (y MOD i=0) THEN ?"НОД="; i: EXIT FOR 'если X и Y делятся нацело на i, НОД=i найден

NEXT

Напоминаем, что взятие модуля X по I означает получение целого остатка от деления X на I. Иными словами, если x MOD i=0, то число X кратно числу I.

@ Задачи для самостоятельного решения.

1). Имеется N произвольных чисел X. Составить программу вычисления суммы S всех положительных чисел меньших 10 и среднее арифметическое SR всех отрицательных чисел.

2). Напечатать цепочку чисел, каждое из которых равно сумме двух предыдущих. Самые первые два числа X и Y задаются произвольно.

3). Напечатать все числа, на которые число X делится без остатка.

4). Вычислить наименьшее общее кратное (НОК) чисел X и Y. НОК – это минимальное число, которое делится на X и Y без остатка. Общим кратным, конечно, является произведение X на Y, но оно не обязательно наименьшее. Так если X=6, а Y=9, то X*Y=54. Однако еще есть общие кратные 36 и 18. Т.е. НОК=18. Удобно поиск НОК осуществлять, перебирая все числа от 1 до X*Y, до встречи первого числа, которое делится на X и Y без остатка.

5). В банке хранится известное количество N срочных вкладов. О каждом вкладе известно его значение на начало года – X. Размер годовой прибыли зависит от величины вклада. Если вклад до 10000 руб. – прирост составляет 10% годовых, если до 50000 руб. – 12%, если больше – 15%. Вычислить и напечатать значение каждого вклада на конец года Y, а также сумму всех вкладов на начало SX и конец SY года. Задачу решить двумя способами – с оператором цикла и без него. Указание. Процент увеличения вклада удобно отобразить в виде коэффициента. Так при 12% годовых, значение вклада Y на конец года соответствует 1.2X.

Оператор итерационного циклаимеет вид

üWHILE условие

Операторы

WEND

Такая конструкция позволяет организовывать итерационные циклы. Операторы, входящие в тело цикла выполняются до тех пор, пока истинно условие.

Для примера снова решим задачу 3 (вычислять и печатать Y=2/X до обнаружения первого X=0). Программа приведена ниже.

INPUT x

WHILE x< >0

?х; x/2

INPUT x

WEND

Если параметр условие опущен, цикл будет выполняться бесконечно. В этом случае внутри него должно быть предусмотрено средство выхода, например строка GOTO. Кроме того, в Бейсике имеется еще один оператор цикла с условием. Он имеет две разновидности: цикл с предусловием (условие рассматривается до входа в цикл)

üDO [WHILE/UNTIL условие]

Операторы

LOOP

и цикл с постусловием (условие оценивается после выполнения тела цикла)

üDO

Операторы

LOOP [WHILE/UNTIL условие]

Ключевое слово UNTIL действует обратным образом по отношению к WHILE, т.е. UNTIL-цикл будет выполняться до тех пор, пока условие не станет истинным. Иными словами WHILE условие это UNTIL NOT условие.

Здесь, имеется собственный оператор принудительного выхода из цикла

üEXIT DO

Структуру с постусловием удобно применять в случае, если цикл необходимо выполнить хотя бы один раз независимо от значения условия или, если само условие формируется в цикле и не может быть оценено до входа в цикл.

@ Задачи для самостоятельного решения.

1). Решите задачу 4.2, используя оператор WHILE, а затем оператор DO.

2). Суммировать элементы числового ряда вида 2+6+18+… до тех пор, пока сумма не превысит число 120. Напечатать получившуюся сумму и номер элемента, на котором произошло это событие.

 

6. Работа с массивами

Как правило, данные для вычислений на компьютере задаются в упорядоченной форме – в виде последовательности (вектора) чисел или в виде таблицы (матрицы) чисел. Такие совокупности данных называются массивами. Построение программ, оперирующих с элементами массивов – важнейшая часть техники программирования.

Например, вектор A длиной К чисел и матрица В из N строк и M столбцов (всего из N×M элементов) выглядят следующим образом (рис. 6.1).

 

 

Цифры при имени массива, указывающие порядковый номер эле­мента, называются индексами. В алгоритмических языках элементы массивов AIи BIJобозначаются как A(I) и B(I,J). К массиву в целом обратиться нельзя. Обработка массива обычно означает последовательную обработку отдельных его элементов.

Оператор описания массивов.Если предполагается работа с массивами, предварительно следует “известить” об этом компьютер оператором вида

üDIM список_массивов

Описание массива содержит имя массива и его размерность. Например, оператор DIM A(20), B(4,6) читается как “Установить размерность одномерного массива A из 20 элементов и двумерного массива В из 24–х элементов (4 строки, 6 столбцов)”.

По умолчанию отсчет элементов в Бейсике начинается с нуля, то есть оператор DIM A(20) определяет на самом деле 21 элемент памяти (нулевой элемент можно игнорировать). Если есть необходимость установить нестандартную нумерацию, можно при определении размерности использовать указатель вида нижняя граница индекса ТО верхняя граница. Например, оператор DIM Y(5 TO 20, 1 TO 8) определяет двухмерный мас­сив Y, у которого первый индекс изменяется от 5 до 20, а второй – от 1 до 8. Размерность массива задается исходя из условий решаемой задачи. Первоочередной задачей при работе с массивами является ввод-вывод данных, который организуется с помощью циклов. На рис. 6а осуществляется ввод данных в вектор A размерностью N эле­ментов. На рис. 6б – в матрицу В размерностью N строк на M столбцов. Ввод осуществляется с помощью двух циклов, один из которых вложен в другой. В наружном цикле изменяется первый индекс I элемента матрицы В, во внутреннем – второй индекс J. Таким образом, второй индекс J изменяется быстрее, чем первый. Это означает, что ввод элементов матрицы будет производиться в следующей последовательности: B(1,1), B(1,2), ... , B(1,M); B(2,1), B(2,2), ... , B(2,M); ... ; B(N,1), B(N,2), ... B(N,M), т.е. по строкам. Замечание. Два последних оператора могут быть объединены в один вида NEXT j,i (первым должен быть указан индекс внутреннего цикла, вторым – внешнего). Аналогичным образом осуществляется и вывод (рис. 6в), но вместо оператора INPUT используется оператор PRINT. Здесь, однако, следует позаботиться об удобстве восприятия выводимых данных. Желательно, чтобы строка матрицы занимала на экране именно одну строку. Для этого во внутреннем цикле печати нужно поставить точку с запятой после оператора вывода (PRINT;), что подавляет переход на новую строку монитора после вывода каждого числа. Напротив, после завершения вывода всех элементов строки матрицы, как раз следует перейти на следующую строку монитора. Для этого ниже оператора NEXT j следует поставить пустой оператор PRINT, который переведет вывод на следующую строку экрана. Кроме того, для обеспечения фиксированного расположения элементов матрицы друг под другом в столбцы, имеет смысл использовать для вывода не оператор PRINT, а PRINT USING (например, PRINT USING "####.##"; b(i,j);).

Программа к задаче 6.1 INPUT n DIM c(n) FOR i=1 TO n INPUT c(i) NEXT Проверка
m=c(1): k=1 FOR i=2 TO n IF m<c(i) THEN m=c(i): k=i NEXT ?m k m=5, k=1 i=2 5>2 i=3 5<7 m=7,k=3 i=4 7>4 i=5 7, 3

Задача 6.1. В векторе С размерности N элементов найти максимальный по значению элемент и его номер в С. Ниже приведена программа и ее проверка для N=4 и C=[5,2,7,4] (с оператора m=c(1)). Здесь переменная М запоминает значение максимального элемента, а К – номер этого элемента в векторе С. Первоначально в качестве такого элемента берется самый первый.

Sub primer()

n = Val(InputBox("vvedite n"))

Dim a(5) As Integer

For i = 1 To n

a(i) = Val(InputBox("vvedite a(i)"))

Next

m = a(1): k = 1

For i = 1 To n

If m < a(i) Then m = a(i): k = i

Next

MsgBox (m)

MsgBox (k)

End Sub

 

Задача 6.2. Определение значения вклада в банке на конец года.Пусть в банке имеется N счетов вкладчиков. Для всех известны значения остатков на счете в конце каждого квартала. Следует определить и напечатать значения всех вкладов на конец года с учетом известного процента роста вклада Р. Данные о вкладах хранятся в массиве X из N строк и пяти столбцов. Первые четыре элемента каждой i-ой строки X(i,1), X(i,2), X(i,3), X(i,4), хранят остатки вклада на конец каждого из четырех кварталов года. В последний пятый элемент строки X(i,5) следует занести вычисленную величину вклада на конец года. Он равен остатку вклада на конец последнего квартала X(i,4) плюс установленный процент Р/100 от среднего значения вклада (X(i,1)+X(i,2)+X(i,3)+X(i,4))/4 за год. Отсюда X(i,5)=X(i,4)+(Р/100)*(X(i,1)+X(i,2)+X(i,3)+ X(i,4))/4.

 

I кв X(i,1) II кв X(i,2) III кв X(i,3) IV кв X(i,4) Остаток на конец года X(i,5)=X(i,4)+(Р/100)*(X(i,1)+X(i,2)+X(i,3)+X(i,4))/4

 

Кроме перечисленного, следует найти сумму всех вкладов в банке S и среднее значение вклада, приходящееся на одного вкладчика S/N.

Программа к задаче 6.2 INPUT "Введите число вкладчиков и процент ",N,P DIM x(n,5) FOR i=1 TO n FOR j=1 TO 4 ?"Введите остаток вклада №"i "за" j "квартал "; INPUT x(i,j) NEXT j,i s=0 ?" Счет Остатки по кварталам ВСЕГО" ?" I II III IV" FOR i=1 TO n x(i,5)=x(i,4)+(р/100)*(x(i,1)+x(i,2)+x(i,3)+x(i,4))/4 PRINT USING "#######"; i,x(i,1),x(i,2),x(i,3),x(i,4),x(i,5) s=s+x(i,5) NEXT ? "Сумма вкладов =" s, "Средний вклад =" s/n Программа к задаче 6.3 INPUT n DIM x(n) 'формирование исходного вектора FOR i = 1 TO n: x(i) = i: NEXT FOR i = 1 TO n - 1 FOR j = i + 1 TO n 'при x(i)<x(j), числа меняются местами IF x(i)<x(j) THEN SWAP x(j), x(i) NEXT j NEXT i 'вывод результатов FOR i = 1 TO n: PRINT x(i): NEXT

Задача 6.3. Сортировка чисел в массиве.Пусть имеется вектор чисел X длиной N. Напечатать массив в порядке убывания значений его элементов. Алгоритм реализуется при помощи двух вложенных циклов. В наружном цикле последовательно перебираются числа X(i) в массиве и во вложенном цикле сравниваются со всеми оставшимися числами справа от данного X(j). Если выясняется, что какое-то из X(i) меньше сравниваемого, они меняются местами – большее число становится на место меньшего. В программе для упрощения в качестве элементов массива взяты их номера i. Если вектор имеет длину четыре (X(4)), то будет выполнена следующая последовательность перестановок чисел массива: 1,2,3,4; 2,1,3,4; 3,1,2,4; 4,1,2,3; 4,3,2,1.

@ Задачи для самостоятельного решения.

1). Напечатать число из массива X(N), предшествующее минимальному. Sub primer()

n = Val(InputBox("vvedite n"))

Dim a(5) As Integer

For i = 1 To n

a(i) = Val(InputBox("vvedite a(i)"))

Next

m = a(1): k = 1

For i = 1 To n

If m > a(i) Then m = a(i - 1): k = i - 1

Next

MsgBox (m)

MsgBox (k)

End Sub

2). Переместить элементы массива X в массив Y таким образом, чтобы в нем сначала оказалась вторая половина исходного массива X, а затем первая.

3). В массиве X(N) N произвольных чисел (N нечетное). Напечатать эти числа, начиная с центрального, затем число, стоящее рядом слева, затем справа и т.д. до достижения границ массива.

4). Имеются (рис. 6.3) массивы X(N) и Y(N) с координатами X, Y точек на плоскости в порядке их обхода. Определить (с помощью теоремы Пифагора) периметр замкнутой фигуры, с вершинами в этих координатах.

5). Построить вложенный цикл для печати таблицы умножения (как на обложке ученической тетради).

7. обРАБОТКА Символьных данных

Все символы в ПК имеют уникальные коды, значения которых закреплены в ASCII-таблице. С ней можно ознакомиться в любом справочнике. В Бейсике имеются несколько функций и операторов обработки символьных данных.

üLTRIM$(строка) –удаляет начальные про­белы в символьном выражении.

üRTRIM$(строка) –удаляет конечные пробелы в символьном выражении.

üSPACE$(числовое_выражение) –возвращает строку пробелов длиной N символов (N в пределах 0-32767).

üINSTR([начальная_позиция],строка1, строка2) –возвращает позицию первого вхождения строки2 в строку1, начиная с начальной позиции. Если начальная позиция не задана, отсчет производится с начала.

Пример. ?INSTR(”Саша”,”а”),INSTR(3,”Саша”,”а”) Результат: 2,4

üLEFT$(строка, n) –возвращает строку, содержащую n первых символов.

Пример. ?LEFT$(”Саша”,2) Результат: ”Са”

üRIGHT$(строка, n) –возвращает строку, содержащую n последних правых символов.

Пример. ?RIGHT$(”Саша”,2) Результат: ”ша”

üMID$(строка, начальная_позиция [,длина]) –возвра­щает фрагмент ситроки, с начальной позиции заданной длины.

Пример. ?MID$(”теория”,4), MID$(”теория”,4,2) Результат:”рия”, ”ри”

üMID$(строка, начальная_позиция [,длина])=строка –символьный оператор, заменяющий фрагмент строки на сим­вольное выражение, начиная с начальной позиции заданной длины.

Пример. x$ = "здесь вход"

MID$(x$, 7, 2) = "выход"

? x$ Результат: "здесь выхо"

üSTR$(число) –возвращает символьное представление числа или числового выражения.

Пример. STR$(3) Результат: "3"

üVAL(строка) –возвращает числовое представление символьного выражения. Функция обратна функции STR$().

Пример. STR$("3") Результат: 3

üLEN(строка) –возвращает длину символь­ного выражения.

Пример. LEN(”теория”) Результат: 6

üASC(символ) –возвращает код символа ПК.

üCHR$(число) –возвращает символ по его коду.

Примеры. ASC(“R”) Результат: 82 (код буквы R=82)

CHR(82) Результат: “R”

Т.е. функции эти обратны друг другу.

Текстовые данные можно соединять в одну строку, используя знак “+”.

Текстовые данные можно сравнивать между собой на больше, меньше, равно. Сравниваются, конечно, не сами символы, а их коды. Так верным будет отношение “A”<”R”, поскольку ASCII-код (65) английской буквы A меньше кода (85) буквы R. Сравнивать можно и целые слова. Так верно отношение “TOM”>”JON”. Сравнение начинается с первой пары символов. Здесь код английской T (код 84) больше кода J (74). Остальные символы далее не сравниваются. Если же первая пара букв совпадает, будет проверена следующая пара и т.д. до первого несовпадения. Если число символов в сравниваемых словах различно, сравнение выполняется до исчерпания первого операнда. Рост кодов символов соответствуют их порядку в алфавите. Для русских символов это не совсем так (см. справочник).

Пример. Напечатать символьную переменную X$ в обратном порядке

x$="Внимание": y$ =""

FOR i = LEN(x$) TO 1 STEP -1

y$ = y$ + MID$(x$, i,1)

NEXT

PRINT y$ Результат: “еинаминВ“

Здесь в переменной y$ формируется нужный результат.

Задача 7.1. Напечатать число X (в диапазоне 0-99) прописью. Такая потребность возникает при печати в финансовых документах “суммы прописью”. Результат поместить в переменную P$.

Нам понадобятся три текстовых массива. s1$(0 to 9) для числительных в диапазоне "ноль" – "девять", s2$(10 to 19) для "десять" – "девятнадцать", s3$(2 to 9) для "двадцать" – "девяносто". Начальный и конечный индексы массивов лучше выбирать в соответствии со значениями числительных. Наполнение массивов проще произвести операторами Data и Read.

CLS 'Программа к задаче 7.1

DIM s1$(0 TO 9), s2$(10 TO 19), s3$(2 TO 9)

DATA "ноль","один","два", "три","четыре","пять","шесть","семь","восемь","девять"

READ s1$(0), s1$(1), s1$(2), s1$(3), s1$(4), s1$(5), s1$(6), s1$(7), s1$(8), s1$(9)

DATA "десять","одиннадцать","двенадцать","тринадцать","четырнадцать","пятнадцать",

"шестнадцать","семнадцать","восемнадцать","девятнадцать"

READ s2$(10),s2$(11),s2$(12), s2$(13), s2$(14), s2$(15), s2$(16), s2$(17), s2$(18), s2$(19)

DATA "двадцать","тридцать","сорок","пятдесят","шестьдесят","семдесят","восемдесят","девяносто"

READ s3$(2), s3$(3), s3$(4), s3$(5), s3$(6), s3$(7), s3$(8), s3$(9)

INPUT "введите число X"; x

IF x > 99 THEN PRINT "если число X слишком велико – выход": END

x$ = LTRIM$(STR$(x)) 'число X превращается в сроку X$ с удалением пробелов

IF x < 10 THEN P$= s1$(x): PRINT P$: END 'формирование строки если X < 9

IF x < 20 THEN P$= s2$(x): PRINT P$: END 'формирование строки если X от 10 до 19

'если число от 20

n1 = VAL(MID$(x$, 1, 1)) 'формируются десятки X

n2 = VAL(MID$(x$, 2, 1)) 'формируются единицы X

P$= s3$(n1) + " " + s1$(n2) 'формируется итоговая строка

PRINT P$

@ Задачи для самостоятельного решения.

1). В символьной строке X (придумайте ее сами) удалить лишние (начальные, конечные и сдвоенные) пробелы.

2). В X подсчитать число вхождений слова ‘его’.

3). В X поменять порядок символов внутри каждого слова на обратный.

4). В X напечатать самое длинное слово.

5). В X подсчитать число вхождений произвольного символа.

6). В X подсчитать число вхождений всех встречающихся знаков.

7). В X в каждом слове поменять порядок символов на обратный.

8). В X расположить слова в порядке увеличения их длины.

9). Имеется строка X длиной N, предназначенная для вывода. Выровнять при печати X к правой границе так, чтобы строка занимала все N позиций. Вырав­нива­ние производить за счет равномерного увеличения числа пробелов между словами.

10). Зашифровать строку X, заменив каждый символ, на символ, следующий за данным по алфавиту (буква А заменяется на Б и т.д., буква Я заменяется на А). Расшифровать полученный текст.

11). В строке X имеются открывающиеся и закрывающиеся скобки (включая вложенные). Выяснить, правильно ли они расставлены. Если есть ошибки – сообщить об этом конкретно, включая номер позиции, где она обнаружена.

12). Строка X содержит любые русские и латинские символы (как заглав­ные, так и строчные), цифры и знаки препинания. Преобразовать все символы X в строчные. Результат занести в Y.

13). Пусть имеется таблица работников бригады со столбцами: Имя, Отрабо­тано дней, Зарплата. Отсортировать любым методом таблицу по алфавиту. Для упрощения будем считать, что имена не превышают 8-ми символов, содержат только заглавные буквы и не имеют буквы Ё (эта буква в кодовой таблице русских символов находится не на месте).

14). Отсортировать таблицу по алфавиту, где для имен допускаются любые буквы русского алфавита, включая Ё и ё. Сложность здесь заключается как раз в этих буквах. Их коды 240 и 241, т.е. самые большие среди русских букв, в виду чего сравнивать слова придется не целиком, а побуквенно. В случае, если встретилась буква Ё и ё, в программе они должны считаться большими букв Е/е и меньшими Ж/ж.

15). Написать программу, которая из заданной даты (в диапазоне 1900..2100) формирует следующую. Исходная дата задается в форме текстовой строки вида ‘дд.мм.гггг’, например ’06.04.2002’. Подсказка: признаком високосного года является кратность года числу 4. Исключением являются года с двумя нулями на конце, число сотен в которых не кратно 4 (например, 1800, 1900, 2100).

16). Написать программу, которая от заданной даты (диапазон 1900¸2100) находит новую, отстоящую от данной на М месяцев. Если в новом месяце такой даты нет, берется последний день нового месяца. Так, если вследствие вычислений получилась, например, дата 31 сентября, в качестве результата нужно взять 30 сентября.

17). Написать программу, которая от заданной даты (1900¸2100), находит но­вую, отстоящую от данной на X дней.

18). Преобразовать число X, отображенное цифрами, в число “прописью”, что необходимо для финансо