Продовжуємо вивчати поглиблений курс програмування мовою Pascal.
Цей матеріал стане в нагоді на уроках інформатики при поглибленому вивченні мови програмування та при підготовці учнів до олімпіади з інформатики. Пропонуємо поглиблений теоретичний матеріал:
- структура програми
- типи даних та їх сумісність
- оператор присвоювання, процедури введення та виведення.
А також розглядаються задачі та їх розв'язки з поясненнями. Пропонуються завданнядля перевірки знань та великий перелік практичних завдань.
ЛИНЕЙНЫЕ ПРОГРАММЫ.
Программа состоит: заголовок программы; раздел указания используемых модулей; раздел описаний; раздел операторов.
|
Program заголовок программы; |
|
|
USES подключаемые модули, библиотеки; |
|
|
|
|
LABEL объявление глобальных меток; CONST объявление глобальных констант TYPE объявление глобальных типов; VAR объявление глобальных переменных;
PROCEDURE (FUNCTION) заголовок процедуры или функции; label объявление локальных меток; const объявление локальных констант; type объявление локальных типов; var объявление локальных переменных; begin основной блок процедуры или функции; end; |
|
||
BEGIN основной блок программы- раздел операторов; |
END. |
А теперь немного обо всем.
Заголовок программы начинается с зарезервированного слова Program, после которого идет идентификатор программы. В Турбо Паскале эта строка не обязательна, но правила хорошего тона в программировании требуют задания некоторого имени программы, чтобы уже при первом знакомстве можно было получить хоть какую-нибудь информацию о ее назначении. Имя программы не должно совпадать с другими идентификаторами в самой программе.
Оператор USES играет важную роль в подключении к тексту программы системных модулей из библиотек.
Например, Uses Graph, Crt - подключение модуля графики и модуля экрана.
Объявление констант, типов, переменных.
В разделе CONST(констант) содержатся перечисленные константы, используемые в программе в виде ИМЯ=ЗНАЧЕНИЕ .
Например:
const year=1995; Pi=3.1415; name=’Елена’;
Раздел описания типов TYPE позволяет программисту определять новый тип в программе. В данном разделе могут быть использованы ранее определенные константы.
В разделе описания глобальных переменных VAR содержится список переменных, используемых в программе, и определяется их тип в виде:
VAR {зарезервированное слова определяющее переменные}
имя1,имя2 : тип1; имя3, имя4: тип2; Примечание:
Разделы Label, Const, type и Var могут располагаться в любом порядке и, произвольно чередуясь.
Основной блок программы состоит из последовательности операторов, причем работа программы начинается именно с первого оператора основного блока. Тело основного блока программы ограниченно операторными скобками BEGIN и END. Обратите особое внимание на наличие точки после оператора END.
Комментарии используются в любом месте программы для пояснения различных фрагментов. В комментариях указывается вся та информация, которая призвана в будущем служить более глубокому пониманию программы и упорядочению программного текста. Комментарии берутся с двух сторон фигурными скобками {}.Если в комментарий включается другой комментарий , то используют символы (* и *).
Ввод и вывод данных
Рассмотрим организацию ввода и вывода данных с терминального устройства. Терминальное устройство - это устройство, с которым работает пользователь, обычно это экран (дисплей) и клавиатура.
Для ввода и вывода данных используются стандартные процедуры ввода и вывода Read и Write, оперирующие стандартными последовательными файлами INPUT и OUTPUT.
Эти файлы разбиваются на строки переменной длины, отделяемые друг от друга признаком конца строки. Конец строки задается нажатием клавиши ENTER.
Чтобы ввести данные в процессе выполнения программы используются встроенные процедуры READ ([имя файл.переменной], список переменных)
READLN([имя файл.переменной], список переменных ).
В случае стандартного ввода-вывода имя файловой переменной указывать необязательно.
Например,
Read(A1,A2,...AK); ReadLn(A1,A2,...AK); ReadLn;
Первый из них реализует чтение К значений исходных данных и присваивание этих значений переменным А1, А2, ..., АК. Второй оператор реализует чтение К значений исходных данных, пропуск остальных значений до начала следующей строки, присваивание считанных значений переменным А1, А2, ..., АК. Третий оператор реализует пропуск строки исходных данных.
Процедура READ при считывании данных переход на другую строку не делает. Такой переход может сделать только процедура READLN. Процедуру READLN без параметров можно использовать как паузу, ожидание нажатия клавиши «ENTER», при просмотре результатов выполненной программы.
При вводе исходных данных происходит преобразование из внешней формы представления во внутреннюю, определяемую типом переменных. Переменные, образующие список ввода, могут принадлежать либо к целому, либо к действительному, либо к символьному типам. Чтение исходных данных логического типа в языке ПАСКАЛЬ недопустимо.
Операторы ввода при чтении значений переменных целого и действительного типа пропускает пробелы, предшествующие числу. В то же время эти операторы не пропускают пробелов, предшествующих значениям символьных переменных, так как пробелы являются равноправными символами строк.
Эти процедуры при работе в стандартном режиме, т.е. ввод с клавиатуры ,выполняют два действия:
1) прерывают выполнение программы, наступает режим ожидания ввода значений;
2) присваивают полученные данные переменным из списка, соблюдая порядок следования.
При использовании этих процедур необходимо помнить о следующих особенностей их работы. 1) Эти операторы требуют обязательного ввода некоторой информации. Если Вы таковую не введете, а просто нажмете клавишу ENTER, то работа процедуры на этом не закончится, она будет снова и снова входить в режим ожидания ввода. Прервать ожидание можно либо введя данные, либо путем аварийного завершения программы - нажатием клавиш Ctrl+Break или Сtrl+c. 2) При введении нескольких данных разделять их некоторыми
разделителями, например пробелами или клавишей Enter (но не запятой!).
Для вывода результатов работы программы на экран используются операторы:
WRITE([имя_файловой_переменной],список_элементов вывода)
WRITELN([имя_файл._переменной],список_элементов вывода)
В случае стандартного ввода-вывода имя файловой переменной указывать необязательно.
Write(A1,A2,...AK);
WriteLn(A1,A2,...AK);
WriteLn;
Первый из этих операторов реализует вывод значений переменных А1, А2,...,АК в строку экрана. Второй оператор реализует вывод значений переменных А1, А2, ..., АК и переход к началу следующей строки. Третий оператор реализует пропуск строки и переход к началу следующей строки.
Переменные, составляющие список вывода, могут относиться к целому, действительному, символьному или булевскому типам. В качестве элемента списка вывода кроме имен переменных могут использоваться выражения и строки.
Вывод каждого значения в строку экрана происходит в соответствии с шириной поля вывода, определяемой конкретной реализацией языка.
Форма представления значений в поле вывода соответствует типу переменных и выражений: величины целого типа выводятся как целые десятичные числа, действительного типа - как действительные десятичные числа с десятичным порядком, символьного типа и строки - в виде символов, логического типа - в виде логических констант TRUE и FALSE.
WRITE(имя1[действие]:кол-во позиций для числа: кол-во после запятой);
Например, Writeln(1/3:0:4) на экран выведет результат 0.3333
Оператор вывода позволяет задать ширину поля вывода для каждого элемента списка вывода. В этом случае элемент списка вывода имеет вид А:К, где А - выражение или строка, К - выражение либо константа целого типа.
Если выводимое значение занимает в поле вывода меньше позиций, чем К, то перед этим значением располагаются пробелы. Если выводимое значение не помещается в ширину поля К, то для этого значения будет отведено необходимое количество позиций. Для величин действительного типа элемент списка вывода может иметь вид А:К:М, где А - переменная или выражение действительного типа, К - ширина поля вывода, М - число цифр дробной части выводимого значения. К и М - выражения или константы целого типа. В этом случае
действительные значения выводятся в форме десятичного числа с фиксированной точкой.
Например, writeln( aа:10:5) выведет числовое значение переменной аа , которое займет 10 позиций и из них 5 будет отведено под дробную часть.
Применение процедур WRITE и WRITELN .
1) если write(‘текст’), то выводится текст, заключенный в апострофы;
если writeln(‘текст’), то выводится текст, заключенный в апострофы и переводится курсор на новую строку;
2) если write(числовое выражение), то выводится результат этого выражения; например write(2+3), то на экране появится 5;
3) если write(имя1), то выводится значение переменной с этим именем;
4) если write(имя1,имя2), то выводятся значения переменных с этими именами, но они идут подряд. Поэтому необходимо между идентификаторами вставить символ пробел- Write(a1,’
‘,a2);
5) если write(алгебраическое выражение), то на экране появится результат вычисления. Например, write(a+b-c) - результат вычисления будет с данными, хранящимися в a,b и с;
6) если write(‘текст’,имя1,’текст’, выражение), то на экран выводится текст, значение переменной с именем имя1, опять текст и результат выражения.
При работе с процедурами вывода также нужно быть внимательными, так если Вы неправильно расставите апострофы, то Ваши переменные могут выводиться как элементы текста.
Задача 1
Определить, является ли данное четырехзначное число палиндромом (симметричным).
Идея решения.
1) Выделить каждую цифру числа;
2) присвоить логической переменной выражение, что бы проверить будет ли это число симметричным.
Алгоритм решения:
1) вводим четырехзначное число ;
2) выделим последнюю цифру, как остаток от деления на 10;
3) отбросим последнюю цифру с помощью целочисленного деления на 10, получаем трехзначное
число, состоящее из первой, второй и третьей цифры данного числа;
4) выделим из него последнюю цифру как остаток от деления на 10;
5) отбросим последнюю цифру с помощью целочисленного деления на 10, получаем двухзначное число, состоящее из первой и второй цифры данного числа;
6) выделим из него последнюю цифру как остаток от деления на 10;
7) отбросим последнюю цифру, останется первая цифра;
8) имея четыре цифры, составим логическое выражение проверки на существование равных цифр; 9) выведем значение логической переменной.
Программа решения
Program Task1;
var n,m : longint; {данное число и его копия} a,b,c,у : 0..9; {переменные для хранения цифр} z : boolean; {логическая переменная} begin writeln(‘Введите четырехзначное число’); readln(n); m:=n; {копируем данное число } a:=n mod 10; {последняя цифра-четвертая} n:=n div 10; {отбрасываем четвертую, остаются первая, вторая и третья} b:= n mod 10; { третья цифра} n:=n div 10; { отбрасываем опять последнюю(третью)} c:= n mod 10; {имеем вторую цифру} у:= n div 10; {а вот и первая} z:= (a=у) and (b=c) ; {симметрично ли число? } writeln( ‘Является ли число ‘, m, ‘симметричным?-‘, z); {ответ - true или false } end.
Задача 2
Вычислить площадь данного треугольника по формуле Герона. (учитывая, что треугольник уже существует)
Идея решения.
1) Вычислить полупериметр треугольника; 2) Вычислить площадь треугольника.
Алгоритм решения:
1) вводим три числа, соответствующие сторонам треугольника ;
2) вычисляем полупериметр по формуле р=(a+b+c)/2; 3) вычисляем площадь треугольника по формуле Герона
S = p( p a)( p b)( p c).
4) выведем результат на экран.
Программа решения : Program Task2;
var a, b, c, p, s : real; begin
write(‘Введите первую сторону треугольника а=’); readln(a); write(‘Введите вторую сторону треугольника b=’); readln(b); write(‘Введите третью сторону треугольника c=’); readln(c); p:= (a+b+c)/2;
s:=sqrt(p*(p-a)*(p-b)*(p-c)); writeln(‘площадь треугольника равна ’,s,’ кв.ед.’); end.
Задача 3.
Известна длина окружности. Найти площадь круга, ограниченного этой окружностью.
Идея решения.
1) Вычислить радиус окружности, зная ее длину; 2) Вычислить площадь круга.
Алгоритм решения:
1) вводим число, соответствующие длине окружности ;
2) вычисляем радиус по формуле r=c/(2* ); 3) вычисляем площадь по формуле S = R2;
4) выводим результат на экран.
Программа решения : Program Task3; const Pi=3.1415;
var c, r , s : real; begin
write{‘Введите длину окружности c=’); readln(c); r:= c/(2*Pi); s:=Pi*r*r; writeln(‘площадь круга равна ’,s,’ кв.ед.’); end.
Задача 4.
Поменять местами значения переменных Х и У, не используя дополнительной переменной.
Идея решения:
Если мы присвоить одной из переменных их сумму, тогда поочередное вычитание поможет нам обойтись без дополнительной переменной.
Алгоритм решения:
1) присвоим переменной Х сумму Х+У;
2) присвоим переменной У разность Х-У, тогда в этой переменной уже будет лежать значение равное первоначальному значению Х;
3) присвоим переменной Х разность Х(это еще сумма) и У(которое равно Х), тогда результат будет равен первоначальному значению переменной У.
Программа решения: Program Task1;
var x,y : real; begin
write(‘Введите два числа’); readln(x,y); writeln(‘x=’,x,’ y=’,y); x:= x+y; y:=x-y; x:=x-y; writeln((‘x=’,x,’ y=’,y); end.
Проведите эксперимент :
n при всех ли значениях х и у работает эта программа?
3.3. Вопросы и задания для самопроверки
1. Можно ли для программы program умножение;
var a: integer; b: real; begin read(a,b); writeln(a*b) end.
задать в качестве исходных данных числа 5.0 и 6.2?
3. Что будет напечатано программой
program aba; var a,b:integer; begin read(a,b,a); writeln(a,b,a) end. если для ввода заданы числа 1,2,3?
4. Имеется программа
program pr; var x:integer; begin x:=2; writeln('x+1') end.
Что она напечатает: 3 или х+1?
5. Когда процедура вывода writeln(x1,x2,...,xn) осуществляет перевод строки: до печати первого параметра х1 или после печати последнего параметра хn?
Нарисовать расположение чисел, напечатанных следующей последовательностью процедур: write(1); write(2,3); writeln(4); write(5,6); writeln; writeln(7,8)
6. Написать программу, которая для заданного целого числа а печатает следующую таблицу: а а3 а6
а6 а3 а
7. Программа
program stepen; const e=2.71828; var e2: real; begin e2:=e*e; writeln(e,e2,e*e2,e2*e2) end.
печатает первые четыре степени числа е. Какие изменения (по возможности минимальные) надо внести в программу, чтобы она печатала первые четыре степени числа PI.
8. Найти ошибки в следующих программах.
а) program A; const d=5; begin d:=sqr(d); wrireln('d**2=',d) end. б) program B;
const k=true; var x:real; begin read(x); writeln(ord(x)=k) end. в) program C; var a,b,c:integer; begin read(a,b); writeln((a+b+c)/3) end. г) program D; var x:real; begin read(x); y:=sqrt(x)+1; writeln(y) end. д) program F;
const B=2.5;var a,b,c:real; begin read(a,c); writeln(a*c>b) end.
Задания.
1.Даны два действительных числа. Получить их сумму, произведение, разность и частное.
2.Даны два действительных числа Х и У. Получить | x| | y|
;
1 | xy|
3.Дана длина ребра куба. Найти объем куба и площадь его боковой поверхности.
4.Даны два действительных положительных числа. Найти среднее арифметическое и среднее геометрическое этих чисел.
5.Даны катеты прямоугольного треугольника. Найти его гипотенузу и площадь.
6.Смешано V1 литров воды температурой t1 и V2 литрами воды температурой t2. Найти объем и температуру образовавшейся смеси.
7. Даны x, y, z. Вычислить а и b, если
a , b x(arctgx ;
2 4
8. Даны x, y, z. Вычислить а и b, если
a , b ;
2 3
9 . Даны x, y, z. Вычислить а и b, если
2 1
a x; b cos (arctg 2 x).
10. Дана сторона равностороннего треугольника. Найти площадь этого треугольника.
11. Найти площадь кольца с радиуса R и r.
Написать программы для следующих задач:
12. Вычислить дробную часть среднего геометрического трех заданных положительных чисел.
13. Вычислить длину окружности и площадь круга заданного радиуса.
14. Вычислить периметр и площадь прямоугольного треугольника по длинам его катетов.
15. Найти произведение цифр заданного четырехзначного числа.
16. Определить число, полученное выписыванием в обратном порядке цифр заданного трехзначного числа.