Задача. Вычислить площадь круга.
Дано: R, радиус круга.
Требуется: S, площадь руга.
Связь: S=3.14R2.
Запишем алгоритм словесно (на русском языке). То есть запишем последовательность команд, выполнение которых позволит при заданном значении радиуса круга найти его площадь:
Прочесть (получить) значение R. (ВВОД ДАННЫХ)
Присвоить переменной S значение выражения 3,14*R*R. (КОМАНДА ПРИСВАИВАНИЯ)
Записать (вывести) полученное значение S. (ВЫВОД РЕЗУЛЬТАТА)
Короче можно записать так:
Прочесть значение R
S := 3,14*R*R
Записать значение S
Знак ":=" означает "присвоить". Запись А:=А+2 в программировании она означает команду присваивания. Сначала исполнитель вычисляет значение выражения, стоящего в правой части, а затем полученное значение присваивает переменной, стоящей в левой части. Например, после выполнения команд х:=3; х:=х*5 переменная х примет значение 15.
Графическая форма представления основана на замене типичных алгоритмических команд определенными геометрическими фигурами.
Блок ввода
Блок вычисления
Блок вывода
Разветвляющиеся алгоритмы. Команда ветвления.
Существует широкий круг задач, при решении которых необходимо сделать определенный выбор в зависимости от выполнения некоторых условий. Процесс решения таких задач описывается алгоритмом, тип которого определяется как ветвящийся (разветвляющийся). В разветвляющихся алгоритмах принцип линейного автоматического перехода от команды к команде, от действия к действию в порядке естественного следования не является всеобщим, так как иногда возникает необходимость произвольного перехода к предписанию, то есть нарушения линейности переходов. Ветвящиеся алгоритмы допускают два способа представления - графический и словесный.
При графическом представлении алгоритма ветвление (развилка, выбор дальнейших действий) организуется с помощью логического элемента (ромб с записанным внутри условием), имеющего один вход и несколько (в простейшем случае - два) выходов. Назначение логического элемента - проверка заданного условия. В зависимости от выполнения (истинности) или невыполнения (ложности) проверяемого условия возможен выход соответственно на ветвь "Да" или "Нет". Пример:
Задача: вычислить y=|x|.
Дано: х – значение аргумента.
Требуется: у – значение функции. Связь: y =
Словесное представление:
Прочесть значение x.
Если х>=0 то
y:= х
иначе
у:=– х
Конец ветвления
Записать значение у
Упражнение.Какое значение примет Z в результате выполнения алгоритма
X:=3; Y:=4
ЕСЛИ X>Y, ТО Z:=X*X+Y
ИНАЧЕ Z:= Y*Y+X
Конец ветвления
Z:=2*Z
Вид получившейся графической схемы объясняет, почему алгоритм, соответствующий ей, назвали ветвящимся. Кроме того, на схеме наглядно проявляется важное свойство ветвящихся алгоритмов: их исполнение всегда проходит только по одному из возможных путей, который определяется конкретными текущими условиями, причем в каждом случае от начала алгоритма (входа) до его конца (выхода). Это свойство присуще всякому логически правильно составленному алгоритму и является признаком правильной организации ветвлений.
Составляя алгоритм решения задачи о вычислении абсолютной величины заданного значения переменной, мы получили так называемую полную условную конструкцию. Общий вид полной условной конструкции, реализующей ветвление при графическом представлении алгоритма, изображен на рисунке
Здесь Q - проверяемое условие; P1, P2, …, Pn - действия, которые должны быть выполнены в случае истинности условия Q (положительная ветвь ветвления); T1, T2, …, Tm - действия, выполняемые, если условие Q ложно (отрицательная ветвь ветвления).
При словесном представлении алгоритма полная условная конструкция реализуется командой ветвления вида:
Если Q то
P1
P1
…
Pn
иначе
T1
T2
…
Tm
Конец ветвления
Циклические алгоритмы. Команда повторения
При составлении алгоритмов решения достаточно большого круга задач нередко возникает потребность в неоднократном повторении одних и тех же команд. Алгоритм, составленный с использованием многократных повторений одних и тех же действий (циклов), называется циклическим.
Однако "неоднократно" не значит "до бесконечности". Организация циклов, никогда не приводящая к остановке в выполнении алгоритма (так называемое "зацикливание"), является нарушением требования его результативности - получения результата за конечное число шагов.
Рассмотрим графическое представление циклического блока алгоритма. В него входят в качестве базовых следующие структуры: логический элемент с проверкой условия Р и блок S, называемый телом цикла. Здесь тело цикла S расположено после проверки условия Р (цикл с предусловием), поэтому может случиться, что при определенных условиях блок S не выполнится ни разу. Такой вариант организации цикла, управляемый предусловием, называется цикл-пока. При словесном представлении алгоритма команда, организующая повторение в цикле-пока имеет вид:
Пока Р повторять
S
Конец цикла
Таким образом, если Р не выполняется, то предусмотрен выход из цикла на команду, записанную после строки "Конец цикла". Здесь условие Р - это условие на продолжение цикла.
Возможен другой случай, когда тело цикла S выполняется по крайней мере один раз и будет повторяться до тех пор, пока не выполнится условие Р. Такая организация цикла, когда тело цикла, расположено перед проверкой условия Р, носит название цикла с постусловием или цикла-до. Истинность условия Р в этом случае - причина окончания цикла. Команда, организующая цикл-до, приведена ниже:
Повторять
S
Пока не Р
Конец цикла
Отметим основное отличительное свойство циклических алгоритмов: количество действий, исполняемых в процессе выполнения алгоритма, может существенно превышать количество команд, из которых организован цикл. Чтобы в этом убедиться, достаточно алгоритм "проиграть", то есть выполнить его шаг за шагом при некоторых наборах допустимых исходных данных, перевоплотившись в предполагаемого педантичного исполнителя. (Отметим также, что перед началом этапа программирования полезно проводить указанным образом "проигрывание" любого алгоритма, так как эта процедура позволяет легко обнаружить ошибки, допущенные в логической организации алгоритма).
Для примера напишем блок-схему алгоритма вычисления суммы всех натуральных чисел от 1 до введенного пользователем N. Надо отметить, что можно было бы обойтись линейным алгоритмом, используя формулу суммы n членов арифметической прогрессии. Однако нам интересно именно на этом простом примере проиллюстрировать работу циклического алгоритма.
Дано n=10.
Найти S=1+2+…+10.
Учитывая то, что Si+1= Si+i+1, где Si =1+2+…+i.
Наша цель – получить тело цикла, т.е. блок команд, который будет повторяться несколько раз.
Шаг | |||||
S:=0; | Усовершенствуем, программу, введя новую переменную i, которая пробегала бы все числа от 1 до 100. | S:=0; | S:=0; i:=0; | ||
S:=S+1; | i:=1; S:=S+i; | i:=i+1; S:=S+i; | |||
S:=S+2; | i:=2; S:=S+i; | i:=i+1; S:=S+i; | |||
S:=S+3; | i:=3; S:=S+i; | i:=i+1; S:=S+i; | |||
… | … | … | |||
S:=S+100; | i:=100; S:=S+i; | i:=i+1; S:=S+i; |
Итак, тело нашего цикла:
Найдем условие продолжения цикла. Так как перед входом в цикл значение переменной i равно 0. Поставим условие продолжения <100, т.е. i =0,1,2,…,99.
[kgl]
[gl]ЛЕКЦИЯ 11. ОСНОВЫ ЯЗЫКА ПАСКАЛЬ[:]
Алфавит языка
Элемента основного словаря языка Паскаль принято подразделять на символы, используемые в идентификаторах, специальные знаки и зарезервированные слова.
Идентификатор – это имя какого-либо элемента программы (константы, переменной, типа, процедуры или функции). Он может состоять из строчных и прописных латинских букв (a,...,z, A,…,Z), цифр (0,...,9) и знака подчеркивания и не должен начинаться с цифры. Прописные и строчные буквы в идентификаторах и зарезервированных словах считаются идентичными, они различаются лишь в строковых константах. Длина идентификатора не ограничена, но значимыми являются лишь первые 63 символа.
Разделители используются для отделения друг от друга идентификаторов, чисел и зарезервированных слов. К разделителям относятся, например, пробел и комментарий. В любом месте программы, где разрешается один пробел, их можно вставить любое количество.
Комментарии заключаются либо в фигурные скобки { комментарий 1 }, либо в символы (* комментарий 2 *) и могут занимать любое количество строк. Последовательность из трех символов (*) начинает комментарий до конца строки. Текст комментария игнорируется при компиляции, если это не директивы компилятора, которые имеют вид
К специальным знакам относятся знаки пунктуации (. () [] .. : ;), знаки операций и зарезервированные слова. Знаки операций могут быть как символьные (+,-,*,/ и т.д.), так и буквенными (mod, div, not). Зарезервированные слова являются служебными и не могут быть переопределены пользователем, т.е. их нельзя использовать как имена пользовательских объектов. Неиспользуемые символы - это коды ASCII, которые используются только в комментариях и символьных строках, но не в языке. К ним относятся все русские буквы, а также символы %, &, ! и т.п.
Структура программы
В программе, написанной на Турбо Паскале, могут быть следующие разделы:
Program ... ; { Заголовок программы }
Uses ... ; { Подключение модулей }
Label ... ; { Раздел объявления меток }
Const ... ; { Раздел объявления констант }
Type ... ; { Раздел объявления новых типов }
Var ... ; { Раздел объявления переменных }
Procedure ... ; { Описание своих процедур }
Function ... ; { Описание своих функций }
Begin { начало основной программы }
...;
{ Операторы }
...;
End.
Обязательной частью является лишь тело программы, которое начинается словом begin, а заканчивается словом end с точкой. Операторы в Паскале разделяются точкой запятой. Заголовок программы является хотя и необязательным, но желательным элементом и состоит из зарезервированного слова program и идентификатора - имени программы, за которым следует точка с запятой. Порядок объявлений и описаний не регламентируется.
ПРИМЕР : Простейшая программа.
program prim_1; { демонстрация структуры программы}
{эта программа не требует никаких объявлений и описаний}
Begin
write('Привет! Вот мы и начали.') (* эта строка текста появится на экране *)
end.
program olimpiada;
var num,year:integer;
begin
write('Year: ');
readln(year);
if year<1896
then writeln('Too early year.')
else if year mod 4=0
then begin
num:=(year-1896) div 4+1;
writeln('num=',num);
end
else writeln('Non olimpic year.');
readln;
end.
ТИПЫ ДАННЫХ
Понятие типа данных является ключевым в языке Паскаль. Тип данных характеризует внутреннее представление, множество допустимых значений для этих данных, а также совокупность операций над ними. Среди типов данных различают стандартные (предопределенные разработчиками языка) и пользовательские (определяемые программистом в своей программе). Мы будем рассматривать следующие стандартные типы: целые числа, вещественные числа, логический тип, символьный и строковый типы. Программист может описать свой тип на основе этих базовых в разделе описания типов, который начинается словом Type. Затем для каждого типа следует конструкция вида:
идентификатор типа = определение типа;
Рассмотрим сначала простые типы данных, каждый из которых определяет упорядоченное множество значений: целые типы, логический тип, символьный тип, вещественные типы. Все эти типы, кроме вещественых являются порядковыми. Каждому значению порядкового типа функция Ord ставит в соответствие натуральное число - порядковый номер данного значения в множестве допустимых значений. К любым порядковым типам также можно применять функции Pred - возвращает предыдущее значение и Succ - следующее значение. Тип относится к упорядоченным если для переменных и выражений этого типа определены операции отношения или сравнения: =, <>, <, >, <=, >=. Любой порядковый тип является упорядоченным, но не наоборот. Так вещественные типы и тип string упорядоченные, но не порядковые.
Целые типы
В языке Турбо Паскаль определено 5 целых типов:
Shortint (-128 ... 127, 1 байт),
Integer (-32767 ... 32768, 2 байта),
Longint (-2147483648 ... 2147483647, 4 байта),
Byte (0 ... 255, 1 байт),
Word (0 ... 65535, 2 байта).
Для целых чисел определены такие операции. Унарные: +,-. Бинарные: сложение, вычитание, умножение, получение частного (div) и остатка (mod) при целочисленном делении и некоторые другие. Также с целыми числами можно производить операции, результаты которых не целые числа. Это обычное деление и операции отношения. Кроме того, имеется большое количество встроенных функций для работы с целыми числами: abs, sqr, sqrt, sin, cos, exp, ln и др.
Вещественные типы
В Турбо Паскале имеется 5 вещественных типов.
Real (занимает 6 байт, диапазон от 2.9E-39 до 1.7E+38 по модулю, точность 11-12 значащих цифр)
Single(занимает 4 байта, диапазон от 1.5E-45 до 3.4E+38 по модулю, точность 7-8 значащих цифр)
Double(занимает 8 байт, диапазон от 5.0Е-324 до 1.7Е+308по модулю,точность 15-16 значащих цифр)
Extended (занимает 10 байт, диапазон от 3.4E-4932 до 1.1E+4932 по модулю, точность19-20 значащих цифр).
Comp(занимает 8 байт, диапазон от -9.2E-18 до 9.2E+18, хранятся точно, поскольку это целые числа)
Вещественные типы являются упорядоченными, но не порядковыми. Операции над вещественными числами: сложение ,вычитание, умножение, деление и операции отношения. Кроме того, имеется большое количество встроенных функций для работы с числами: abs, sqr, sqrt, sin, cos и т.п.
Вещественные числа хранятся неточно. Каждый из имеющихся вещественных типов гарантирует правильное хранение только определенного количества значащих цифр, их называют верными цифрами. С математической точки зрения, из за особенностей внутреннего представления речь идет об относительной погрешности.
Неточности в хранении вещественных чисел могут привести к тому, что при вычитании близких чисел может произойти потеря значимости. Это же объясняет, почему следует избегать сравнения вещественных величин на точное равенство.
ПРИМЕР: тип Single - хранится 7-8 знаков после десятичной точки, тип Double - 15-16, тип Extended - 19-20.
program sravnenie;
var x : single; y : double; z : extended;
Begin
x := 1/3; y := 1/3;
z := abs(x-y);
writeln('z=',z);
end.
Эта программа выдаст в результате число z=9.93410748106882E-0009. Обычно принято считать, что a=b, если выполняется условие abs(a-b)<eps. Число eps можно определять следующим образом: min(abs(a),abs(b))*10^(-m), где m - необходимое число совпадающих десятичных разрядов.
Логический тип
В обычной школьной и вузовской практике учащимся и студентам предлагаются для решения те задания, которые представлены в задачниках или составлены преподавателем. Однако усвоение материала будет более осознанным, если предоставить ученикам возможность самостоятельно разработать и решить задачи на указанную тему. Здесь появляется возможность дать волю фантазии, выдумке, сделать какие-то нестандартные ходы. Всё это идёт на пользу делу.
В настоящей публикации представлены наиболее удачные задачи по теме "Логические выражения и их запись на языке Pascal", которые были составлены студентами. Задание они получили в следующей формулировке: "Составить высказывание, содержащее переменные, которое в зависимости от их значений принимает значение TRUE или FALSE. Записать соответствующее логическое выражение.". Тема "Логические выражения" является очень важной при изучении программирования как в школьном, там и вузовском курсе. Зачастую она остается незаслуженно обойденной, в то время как именно по этой причине учащиеся затрудняются правильно построить логическое выражения, являющееся условием в развилке или цикле. Потому подобного рода задания позволяют акцентировать внимание на указанной проблематике и лучшей степени подготовить учащихся к изучению тем "Развилка", "Циклы".
Что касается моего задания, то следует отметить, что некоторые студенты подошли к его выполнению формально, предложив полные аналоги задач из учебников, но были и своего рода находки. Ниже приведены сами задания и соответствующие им логические выражения.
1. Сумма цифр заданного четырёхзначного числа N превосходит произведение цифр этого же числа на 1.
N Div 1000 + N Div 100 Mod 10 + N Mod 100 Div 10 + N Mod 10 - 1 =
(N Div 1000) * (N Div 100 Mod 10) * (N Mod 100 Div 10) * (N Mod 10)
2. Сумма двух последних цифр заданного трёхзначного числа N меньше заданного K, а первая цифра N больше 5.
(N Div 10 Mod 10 + N Mod 10 < K) And (N Div 100 > 5)
3. Заданное натуральное число N является двузначным и кратно K.
(N >= 10) And (N <= 99) And (N Mod K = 0)
или
(N in [10..99]) And (N Mod K = 0)
4. Сумма двух первых цифр заданного четырёхзначного числа N равна произведению двух последних.
N Div 1000 + N Div 100 Mod 10 = (N Mod 100 Div 10) * (N Mod 10)
5. Каждая последующая цифра трёхзначного числа N, начиная со старшего разряда, больше предыдущей на 1.
(N Mod 10 - N Div 10 Mod 10 = 1) And (N Div 10 Mod 10 - N Div 100 = 1)
6. X — отрицательное целое число, делящееся на 3 нацело.
(X < 0) And (X Mod 3 = 0)
7. Заданы три положительных числа A, B, C. Эти числа являются сторонами равнобедренного треугольника.
(A + B > C) And (A + C > B) And (B + C > A) And
((A = B) Or (B = C) Or (A = C))
Для действительных A, B, C
(A + B > C) And (A + C > B) And (B + C > A) And
((Abs(A - B) < 1E-7) Or (Abs(B - C) < 1E-7) Or (Abs(A - C) < 1E-7))
8. Среди заданных целых чисел A, B, C, D есть хотя бы два чётных.
Ord(Not Odd(A)) + Ord(Not Odd(B)) + Ord(Not Odd(C)) + Ord(Not Odd(D)) >= 2
9. Прямоугольник с измерениями A, B подобен прямоугольнику с соответствующими измерениями C, D.
Abs(A / C - B / D) < 1E-7
10. Дробь A / B является правильной.
(A < B) And (B > 0)
11. Дано натуральное число N — некоторый год. Этот год является високосным.
(N Mod 4 = 0) And (N Mod 100 <> 0) Or (N Mod 400 = 0)
или
(N Mod 4 = 0) And Not((N Mod 100 = 0) Xor (N Mod 400 = 0))
Переменные логического типа Boolean занимают в памяти один байт и могут принимать одно из двух значений False - ложное или True - истинное. Этот тип является порядковым (Ord(False) = 0, Ord(True) = 1) и, следовательно, упорядоченным. Результат любых операций сравнения имеет логический тип и может быть присвоен логической переменной. Для операндов типа boolean определены следующие логические операции: NOT - отрицание (превращает false в true, а true в false), AND - логическое умножение "и", OR – логическое сложение "или", XOR - исключающее или (true если операнды разные). Принцип действия этих операций можно проиллюстрировать такими схемами:
Символьный тип
Символьный тип Char также называют литерным. Он позволяет работать с символами, которые записываются двумя способами: в одинарных кавычках или по их коду, например 'a', 'B', '*' или, что то же самое, #97, #130, #42. В отличие от текста программы на паскале, символы, соответствующие строчным и заглавным буквам различаются. Множество значений типа Char представляет собой полный набор ASCII - символов (американская стандартная кодировка). В компьютере хранятся шестнадцатеричные коды символов (1 байт), которые и используются в операциях отношения (сравнения). Функция Ord выдает код соответствующего символа, который может быть от 0 до 255. Обратной функцией, которая по коду выдает соответствующий символ, является функция Chr.
Дата добавления: 2015-12-08; просмотров: 3003;