23.10.2006

Методика преподавания темы «Понятие алгоритма. Программирование»

(продолжение)

Численные переменные и типы данных.

  Одним из самых главных препятствий при создании программ, является объём оперативной памяти компьютера. Программисту всегда приходится думать о том,  каким образом уменьшить потребность программы в памяти. Эту проблему можно решить ограничивая количество переменных используемых в программе, или уменьшая размер ячеек памяти для их хранения.

Целые типы.

Тип                    Диапазон            Размер в байтах
Shortint                 -128 .. 127                          1
Integer              -32768 .. 32767                      2
Longint    -2147483648 .. 2147483647        4
Byte                        0 .. 255                              1
Word                      0 .. 65535                          2

Тип-диапазон.

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

vcp = 1..32.

Вещественные типы.

Тип                  Диапазон           Колличество     Размер цифр   в байтах
Real          2.9E-39 .. 1.7E+38           11-12                 6
Single        1.5E-45 .. 3.4E+38             7-8                  4
Double      5.0E-324 .. 1.7E+308        15-16               8
Extended  3.4E-4932 .. 1.1E+4932    19-20             10
Comp           E-263+1 .. E263-1           19-20              8

Задание 3. Составить таблицу описания типов переменных.

Типы переменных

название

обозначение

пример

примечание

числовые переменные

 

целочисленные

byte                       

[-32768, 32767]

integer

a,b,c: integer

[0, 255]

longint   

a,b,c: longint

[-2147483648, 2147483647]

 

вещественные

real

a,b,c: real

2.9E-39 .. 1.7E+38

single       

a,b,c: single

1.5E-45 .. 3.4E+38

символьные переменныe

символьный

char

u:='a'

переменная записывается в апострофах

строковые

string

табличные величины

массив

Array

N : Array ['A'..'Z'] Of Integer;
T : Array [1..40] Of Real;

линейная таблица

Форматированый вывод

Имена переменных могут быть записаны в следующем виде:

E
E:m
E:m:n

где E - переменная, значение которoй выводится на экран.
m,n - выражения тип integer, необязательные параметры, указывающие соответственно ширину выводимого поля и количество дробных цифр. Конструкция вида E:m:n может использоваться для  вещественных чисел, для остальных - конструкция вида E:m.

Арифметические операции.

+  сложение    -  вычитание    *  умножение    /  деление
div  - деление целых чисел,  mod  - остаток от деления целых чисел.

Арифметические функции.

Abs(x)     абсолютная величина (модуль)
Arctan(x)  арктангенс       
Cos(x)     косинус
Exp(x)     e в степени x (експонента)
Frac(x)    дробная часть числа      
Int(x)     целая часть
Ln(x)      натуральный логарифм
Pi         число пи  Pi=3.1415926535897932385
Sin(x)     синус
Sqr(x)     квадрат     
Sqrt(x)    квадратный корень

Функции преобразования типов данных.

Round(x) - округление вещественного числа до ближайшего целого. 
Trunc(x) - получение целой части вещественного числа.

Логический тип (boolean).

В языке Паскаль имеются две логические константы: TRUE(истина) и FALSE(ложь).

Булевские операции:

Оператор

Операция

Тип операндов

Тип результата

not

отрицание

Boolean

Boolean

and

логическое И

Boolean

Boolean

or

логическое ИЛИ

Boolean

Boolean

xor

логическое исключающее ИЛИ

Boolean

Boolean

Результаты операций над логическими данными сведены в таблицу:

А

В

NOT (A)

(A) OR (B)

(A) AND (B)

T

T

F

T

T

T

F

F

F

T

F

T

T

F

T

F

F

T

F

F

Понятие алгоритма. Виды алгоритмов

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

Способы записи алгоритмов

Алгоритмический язык

ПАСКАЛЬ

Линейный алгоритм не содержит условий и имеет одну ветвь обработки

алг
   арг
   рез
нач
. . . . . .
кон

Program
Var
integer, real, longint
Write, Writeln
Read, Readln

Разветвленный алгоритм содержит две ветви обработки информации и несколько условий 

Неполная команда ветвления:

нач
   если … 
      то …
кон

IF- если
THEN- то

Полная  команда  ветвления

нач
  если … то …
      иначе …
кон

IF- если
THEN- то
ELSE- иначе

Цикл - многократно повторяемая  часть  алгоритма. Циклический  алгоритм содержит один или несколько циклов.

Цикл с «пока»

WHILE … DO – пока условие, делай
BEGIN
END;

Цикл с «до»

REPEAT - повторить
UNTIL … ; - условие

Цикл с параметром

нач
  для   от … до …
  тело цикла
кон

FOR … TO … DO – для параметра от … до … делай
   BEGIN
   END; 

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

Условный оператор.

IF  THEN позволяют выбрать для выполнения один из операторов (или не выбрать ни одного).  Условный оператор имеет вид:  IF <условие> THEN <оператор1> ELSE <оператор2>;

В выражении должен получаться результат, имеющий стандартный тип Boolean. Если результатом выражения является истинное значение (True), то выполняется оператор, следующий за ключевым словом then.

Если результатом выражения является значение False присутствует ключевое слово else, то выполняется оператор следующий за ключевым словом else. Если ключевое слово else отсутствует, то выполняется оператор, следующий за условным. В качестве условия может быть: операция отношения (<,>,>=,<=,<>,=) или логическая переменная.

if  (x>0) and (y<5) then оператор;

или,

если c:boolean
с=(x/2)>(y-5);
то  if c then оператор;

Синтаксическая неоднозначность, возникающая в конструкции: if e1 then if e2 then s1 else s2 разрешается путем следующей интерпретации этой конструкции:

if e1 then
            begin
            if e2 then s1 else s2
end;

В общем случае ключевое слово else связывается с ближайшим ключевым словом if, с которым еще не ассоциировано else.

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

     Write('Введите контрольное число');
     Readln(x);
     if x>=0
        then
           begin
            write('Контрольное число положительно');
            z:=z+1;
            d:=d-1;
            x:=x+10;
           end;
        else
           begin
            write('Контрольное число отрицательно');
            z:=z-1;
            d:=d+1;
            x:=x-10;
           end;

Оператор выбора (варианта).

Оператор выбора (варианта) используется в тех случаях, когда в зависимости от значения какого-либо выражения необходимо выполнить один из нескольких операторов. Оператор case состоит из выражения (селектора) и списка операторов, каждому из которых предшествует одна или более констант (они называются константами выбора) или ключевое слово else. Таким образом, строковый тип и тип LongInt являются недопустимыми типами селектора. Оператор вывода имеет следующую форму записи:

CASE <выражение> OF
константа 1: оператор 1;
константа 2: оператор 2;
................................................
константа n: оператор n;
ELSE оператор;
END;

Оператор case приводит к выполнению оператора, которому предшествует константа выбора, равная значению селектора или диапазону выбора, в котором находится значение селектора. Если такой константы выбора или такого диапазона выбора не существует, то выполняется оператор, следующий за ключевым словом else. Если ветвь else отсутствует, то не выполняется никакой оператор.В операторе выбора в качестве константы допускается использование списка констант. В качестве констант также могут использоваться перечеслимые и ограниченнные типы данных, но число имен не должно привышать 255. Пример:

case I of
0, 2, 4, 6, 8: Writeln(‘четное число’);
1, 3, 5, 7, 9: Writeln(‘нечетное число’);
10..100 : Writeln(‘между 10 и 100’);
else Writeln(‘отрицательноe или больше чем 100’);
end;

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

Концепция структурного  программирования  пришла  в своё время на смену линейному программированию,  реализованному в таких языках программирования как Бейсик. Для структурированных программ характерны легкость отладки и корректировка, низкая частота ошибок. В тоже время  его  применение  без особых на то оснований ухудшает понимание логики работы программы. Безусловный переход можно осуществлять далеко не из каждого места  программы. Форма записи оператора: GOTO <метка> Он указывает,  что  дальнейшая  работа  программы должна продолжатся с оператора, на котором стоит <метка>.  Описание меток:- число от 0 до 9999; - обычный идентификатором.

Все перечисленные метки должны быть перечислены в разделе объявления меток, начинающимся зарезервированным словом label, например: label  1, 2, Metka;

 Одной меткой можно пометить только один оператор. Метка от помеченного оператора  отделяется двоеточием.  Метка может устанавливаться перед любым оператором,  в том числе и перед пустым оператором. Например: 1:  Write('Привет ');

Пустой оператор.

Пустой оператор не предписывает никаких действий.  По определению он представляет собой пустую совокупность символов. Как и все операторы, пустой оператор может быть помечен меткой.

PROGRAM Ex1;
  Label
     Out; {описание метки}
  Var     {описание переменных}
     X,Y,Res: Integer;
Begin
  Write('Введите делимое:');
{вывод сообщения на экран}
       Readln(X);{ввод числа}
  Write('Введите делитель:');
       Redln(Y);
     if Y = 0 then         {ветвление}
   begin    {составной оператор}
    Writeln('деление на ноль');
             GOTO Out;      {использование GOTO}
              end;
       Res := X div Y;
     Write('Частное = ',Res);
  Out: {метка на "пустой" оператор}
End.                 

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

Операторы цикла с параметром.

Оператор цикла for вызывает повторяющееся выполнение оператора (который может быть составным оператором), пока управляющей переменной присваивается возрастающая последовательность значений. Форма записи оператора: For start to finish do <оператор>, где

For управляющая переменная:=исходное значение
to конечное значение
do оператор

Если управляющая переменная пробегает значения от большего значения к меньшему, то форма записи имеет вид:  For управляющая переменная:=исходное значение

downto конечное значение
do оператор

В качестве управляющей переменной должен использоваться идентификатор переменной, который обозначает переменную, объявленную локальной в блоке, в котором содержится оператор for. Управляющая переменная должна иметь порядковый тип. Начальное и конечное значения должны иметь тип, совместимый по присваиванию с этим порядковым типом. Когда начинает выполняться оператор for, начальное и конечное значения определяются один раз, и эти значения сохраняются на протяжении всего выполнения оператора for.

PROGRAM ex2;
VAR
    i:integer;
    s:real;
BEGIN
    s:=0;
    for i:=1 to 50 do
    s:=s + 1/i;
    Writeln('Cумма равна: ',s);
END.

Вычислительный процесс называется циклическим,  если он содержит многократное повторение одних и тех же действий. Многократно повторяемые участки вычислений называются ЦИКЛАМИ.

Операторы цикла с предварительным условием.

Оператор цикла  с предусловием организует выполнение одного (возможно составного) оператора неизвестное чиcло разВыход из цикла осуществляется, если некоторое логическое выражение окажется ложным.  Так как истинность логического выражения проверяется вначале,  тело  цикла может не выполнится ни разу.

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

while выражение do
begin
Внутренний оператор;
end;

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

Примерами оператора цикла while могут служить программа:

PROGRAM ex3;
     Var
       s: real;
       n: integer;
BEGIN
         s:=0; n:=1;
         While n <= 50 do  { пока значение n не превзойдёт 50 }
           begin           { тело цикла }
             s:=s + 1/n;
             n:=n + 1
           end;
         Writeln('Сумма равна: ',s)
END.

Операторы цикла с последующимным условием.

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

В операторе цикла repeat выражение, которое управляет повторным выполнением последовательности операторов, содержится внутри оператора repeat.

repeat
Внутренний оператор;
until логическое выражение;

    Структура оператора:
     REPEAT
      <Оператор 1>;
      <Оператор 2>;
          . . .
      <Оператор N>;
     UNTIL <условие>;

Результатом выражения должен быть результат булевского типа. Операторы, заключенные между ключевыми словами repeat и until, выполняются последовательно до тех пор, пока результат выражения не примет значения True. Последовательность операторов выполняется по крайней мере один раз, поскольку вычисление выражения производится после каждого выполнения последовательности операторов.

Приведем примеры оператора repeat:  {Вычисление суммы S = 1 + 1/2 + 1/3 + ... + 1/50}

 Program EX4;
     Var
       n: integer;
       s: real;
     Begin
      s := 0; n := 1;
      REPEAT
       s := s + 1/n;
       n := n + 1;
      UNTIL n > 50;
      Writeln('Результат суммирования ... ', s);
     End.

Строковый тип. Символьные переменные.

Переменные, предназначенные для хранения одиночных символов,  называются символьными переменными. В языке Turbo Pascal для них определён тип данных CHAR.  В переменную этого типа может быть помещён любой из 256 символов расширенного кода ASCII. Объявление символьных  переменных осуществляется в разделе объявления переменных с помощью служебного слова CHAR. Этот тип данных обладает некоторыми особенностями.  Обычно значения для переменных типа "CHAR" задаются в апострофах. Например, если в программе есть описания u, v: char то возможны операторы присваивания  u:='a'; v:=u; v:='*' и т.д.

Способы описания переменных:

1. В разделе описания типов:

type word=string [ 20 ];
var a:word;

2. В разделе описания переменных:

var a,b,c:string [ 30 ];
d:string [ 54 ];

3. Можно определить строковую переменную и ее начальное значение как констант-строку:

const 1:string[11]='информатика';

Символы, составляющие строку, занумерованы слева направо, начиная с нуля. К ним можно обращаться с помощью индексов, как к элементам одномерного массива. Ввод и вывод элементов массива осуществляется с помощью циклов. Над строками можно выполнять следующие действия: 

1. Сложение:

A1:='привет '; (string [7])
A2:='друг'; (string [4])
A3:=A1+A2;  значение A3 стало: 'привет друг' (string[11])

2. Операция сравнения (сравниваются строки одинаковой длины):        

'fbr'>'cru' т.к. 'f'>'c'

3. Функции:

  • функция соединения: CONCAT(s1,s2,...,sn) - складывает строки s1,s2,...,sn (результат не должен привышать 255);
  • функция выделения: COPY(S,T,K) где S - какая строка, T - с какого элемента, K - сколько элементов выделять;
  • функция определения длины строки: LENGTH(S) - результатом является число;
  • функция определения позиции: POS(T,S), где T - элемент, позицию которого надо определить, S - строка, в которой будет определение;

4. Процедуры:

  • процедура вырезания: DELETE(S,T,K), где S - какая строка, T - с какого элемента, K - сколько элементов вырезать;
  • процедура вставки: INSERT(T,S,K), где T - что вставлять, S - в какую строку, K - с какой позиции;
  • процедура преобразования числа в строку: STR(T,S), где T - число, которое будет преобразовано, S - строка, в которую будет преобразовано число;
  • процедура преобразования строки в число: VAL(S,K,T), где S - из какой строки, K - будущее число, T - с какого места.

Примеры:

  1. C:=POS('o','лось') результат c=2;
  2. STR(125,S) результат S=’125’;
  3. VAL('125',K,1) результат k=25.

Описание функций работающих с символьными переменными.

CHR(x: byte): char; Преобразует целое  число,  имеющее  тип  BYTE,  в   один   символASCII-кода. Следующая  программа  иллюстрирует   возможности   функции "CHR".  Она выдаёт все символы кода ASCII на экран. При этом некоторые символы ASCII-кода (например 7,  10, 13) при обычных условиях не имеют изображения,  а используются для реализации специальных функций (перевод курсора и т.д.) Благодаря использованному в операторе Write формату каждый из изображаемых символов отделяется  от  соседнего  пробелом(занимает две позиции)

ORD(c: char): byte; Функция Ord выполняет действие,  обратное функции Chr, т.е. возвращает порядковый номер символа параметра в таблице ASCII.

UpCase(c: char): char; Осуществляет преобразование  символов  английского  алфавита   из строчных символов  в  прописные.  Все остальные символы при применении этой функции остаются непреобразованными.

program ex5;
     var
      x: real;
      s: char;
     begin
      s:='д';
      while s='д' do
       begin
        write('x=);read(c);
        writeln(' ,f(x)=',sin(sqrt(x)));
        writeln('продолжить?(д или н)');
        read(s);
        write(' ');
       end;
     end.

Массивы.

Массивами называются упорядоченный набор данных одного типа. Для обработки массива вводят его имя, а элементы пронумеровывают. Описание массива можно представить следующей схемой: Array [ тип индекса ] of тип;

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

1. В разделе описания переменных           

var <имя массива> array[ t1 ] OF t2;

где t1-тип индекса, t2-тип элемента массива, t1- любой простой тип, кроме real и integer.

Пример:

var a:array [1..100] of Rea;l
b,c,d:array[char] of integer;

2. В разделе описания типов.          

type <имя типа>=arrey [t1] of [t2];
var <имя массива>:<имя типа>;

Пример:

type mas=array[1..5] of real;
var a:mas;

Для доступа к элементам массива необходимо указать идентификатор массива в скобках. Например: a[1] , a[100].

Для ввода массива с клавиатуры и для вывода на экран используются циклы. Можно вводить по другому, с помощью типизированных констант.

Пример:

туре word=array[1..5] of real;

или

const a:word=[5,-7,2,-8,32];

Действия, выполняемые над элементами массива:

Все операции допустимые для базового типа массива. В качестве индекса может быть выражения, переменная или константа. Элементы массива могут стоять как в левой части выражений, так и в самих выражениях. A[ I ]:=5;

S:=A[ I ] - 5;

Запрещен оператор присваивания типа: a[1]:=b[1]+1 (так нельзя) и разрешены: a[1]:=b[1]; b[1]:=b[1]+1

Если тип компоненты в типе массив также является массивом, то результат можно рассматривать как массив массивов или как один многомерный массив. Ввод и вывод элементов многомерных массивов осуществляется при помощи вложенных циклов.  

Процедуры.

В Паскале подпрограммы называются процедурами и функциями и описываются в разделе с тем же названием.

Процедура имеет такую же структуру, как и программа, но с двумя отличиями:

  •     заголовок процедуры имеет другой синтаксис и имеет служебное слово procedure;
  •     описание процедуры заканчивается точкой с запятой.

Все имена, описанные в программе до процедуры, действуют во всей программе и в любой ее подпрограмме (если они там не описаны заново). В процедуре каждый аргумент имеет свое имя – формальный параметр, описываемый в заголовке процедуры по схеме:

  •       procedure имя (список описания формальных параметров)

Описание формальных параметров может иметь вид:

  •     список имен:тип

или

  •     var список имен:тип

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

Пример: составим программу, которая с помощью строки символов разделит экран на части, где напечатает таблицу квадратных корней для чисел 1, 2, ..., 10 и таблицу натуральных логарифмов для чисел 1, 2, ..., 5.

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

program section;
   var x: integer:
   procedure line (a: integer; c: char);
   var j: integer;
begin
   for j: =1 to a do write(c);
   writeln
   end;
begin
  line (35, ‘-‘);
  writеln(‘таблица квадратных корней’);
  line (35, ‘-‘);
  for x: =1 to 10 do writeln(x: 8, sqrt(x): 8: 4);
  line (35, ‘-‘);
  writеln(‘таблица натуральных логарифмов’);
  line (35, ‘-‘);
  for x:=1 to 5 do writeln(x:8, ln(x):8:4);
  line (35, ‘*‘);
end.

Оператор вызова структуры имеет вид:

имя процедуры (список выражений);

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

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

Функции в Паскале.

Функция – это подпрограмма, определяющая единственное значение. Отличия подпрограммы – функции от процедуры:  заголовок функции начинается со служебного слова function и заканчивается указанием типа значения функции:    Function имя(описание формальных параметров): тип;

  • раздел операторов функции должен содержать хотя бы один оператор присваивания имени функции;
  • обращение к функции – не оператор, а выражение вида:
    • имя функции (список фактических параметров);

Функции (и процедуры) могут использовать свое имя в собственном описании, т.е. могут быть рекурсивными.

Пример: составим программу, которая для заданных четырех натуральных чисел a, b, c, d напечатает наибольшие общие делители первой и второй пар чисел и сравнит их по величине.

program Ex6;
  var a, b, c, d m,n: integer:
  function nod(x, y: integer):integer;
  var h: integer;
    begin
      if y=0 then h: =x else
      if x<y then h:= nod(x,) else
      h:= nod(x mod y, y);
      nod: =h
      end;
begin
  writln(‘введите 4 натуральных числа’);
  read(a, b, c, d);writeln;
  m: =nod(a, b);
  n: =nod(c, d);
  writeln(‘НОД(‘,a,’ ,’,b,’)=,m);
  writeln(‘НОД(‘,c,’ ,’,d,’)=,n);
  if m>n then writeln(‘первый > второго’)
  else
  if m<n then writeln(‘первый < второго’)
  else writeln(‘НОД пар равны’)
end.

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

 

Название функции

функция

примечание

алгебраические

Квадратный корень

SQRT(X)

Х>0, X=0

Число «пи»

PI

3,14159226

Показательная функция (ех)

EXP(X)

e=2,718281828

Возведение в квадрат

SQR(X)

X – любое число

Возведение в степень (ах)

EXP(X*(LN(A))

Значение функции действительное число

Абсолютное значение (модуль)

ABS(X)

X - любое число

тригонометрические

Синус

SIN(X)

аргумент в радианах, значение функции – вещественное число

Косинус

COS(X)

Тангенс

TAN(X)

арктангенс

ATN(X)

значение функции в радианах

стандартные

Целая часть числа

INT(X)

наибольшее целое число, не превосходящее аргумента х

Остаток от деления

A MOD B

остаток от деления числа а на в

Генератор случайных чисел

RANDOM(X)

RANDOMIZE

символьные

Длина строки

LENGTH(A)

Количество всех символов

Функция выделения

COPY(S,T,K)

S - какая строка, T - с какого элемента, K - сколько элементов выделять

Соединение слов

А$+B$

Словосочетание