Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programmirovanie.docx
Скачиваний:
57
Добавлен:
31.03.2015
Размер:
500.74 Кб
Скачать

Разветвляющийся вычислительный процесс

Этот процесс в Pascal реализуется с помощью условного оператора. Синтаксис условного оператора : 

If <Условие> then <Оператор 1>

Else <Оператор 2> ;

Такая структура условного оператора называется полной формой. Неполная форма условного оператора Синтаксис 

If <Условие> then <Оператор 1> ;

Условный оператор может быть простым и составным. Если после служебного слова then или else стоит не один, а несколько операторов, то они заключаются в операторные скобки (begin … end), и говорят, что такая форма условного оператора называется составной. 

If < Условие > then

Begin

<Оператор 1> ;

<Оператор 2> ;

End

Else

Begin

<Оператор 3> ;

<Оператор 4> ;

End;

Если после then или else стоят операторные скобки begin – end, то выполняются действия описанные в них ( все последующие операции ). У условного оператора есть вложенная форма или сложная форма. Это форма представляет собой конструкцию, которая содержит после then или else еще один условный оператор. 

If <Условие 1> then

If <Условие 2> then <Оператор 1>

Else <Оператор 2> ;

Else

If <Условие 3> then

Begin

<Оператор 3>;

<Оператор 4> ;

End;

20.   Условный оператор if может быть записан в полной и неполной формах, которые имеют следующий вид.

    Неполная форма:

if <Выражение> then <Оператор>;

    Полная форма:

if <Выражение> then <Оператор1> else <Оператор2>;

    При выполнении условного оператора сначала вычисляется Выражение, результат которого может принимать только булевский тип, а затем, в зависимости от значения результата (True, False), выполняется Оператор1, стоящий после ключевого слова then (если результат равен True), или Оператор2, стоящий после ключевого слова else (если результат равен False).

    В случае, когда оператор if записан в неполной форме, при значении результата False управление передается оператору, следующему непосредственно после оператора if, а Оператор1, стоящий за ключевым словом then, пропускается.

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

    Напомним, что в Object Pascal операторы разделяются символом ; (точка с запятой). Это означает, что внутри любого структурного оператора символ ";" встречаться не должен, иначе все, что стоит после него, будет считаться другим оператором.

    Пример с ошибкой:

if А >В then С : = А; <--- Ошибка!

else С : = В;

    В показанном выше примере точка с запятой, стоящая перед ключевым словом else заканчивает текст оператора if. А это приводит к синтаксической ошибке, поскольку оператора, начинающегося с ключевого слова else в Object Pascalнет.

    Чтобы не допускать таких ошибок целесообразно запомнить следующее правило:

Перед ключевым словом else символ ";" никогда не ставится.

    По синтаксису после ключевых слов then и else может стоять всего лишь один оператор. Если же в какой-либо из ветвей альтернативы (then или else) или сразу в обоих требуется выполнить несколько операторов, то следует воспользоваться составным оператором:

begin

. . . .

end

который позволяет интерпретировать группу операторов как один оператор.

    Заметим, что операторы, расположенные между ключевыми словами begin ... end, также как и везде, должны разделяться точкой с запятой.

    Обобщенные формы простейшего случая оператора if приведены в таблице 1:

Таблица 1. Обобщенная форма оператора if

Количество операторов в ветви

Обобщенная форма оператора if

then

else

один

один

if <Выражение> then <Оператор1> else <Оператор2>;

несколько

один

if <Выражение> then

begin

<Оператор1>;

<Оператор2>;

. . . .

<ОператорN>;

end

else <ОператорM>;

один

несколько

if <Выражение> then <Оператор>

else

begin

<Оператор1>;

<Оператор2>;

. . . .

<ОператорN>;

end;

несколько

несколько

if <Выражение> then

begin

<Оператор1>;

<Оператор2>;

. . . .

<ОператорN>;

end

else

begin

<ОператорN+1>;

<ОператорN+2>;

. . . .

<ОператорN+M>;

end;

    Еще одна синтаксическая сложность корректного использования оператора if возникает при написании вложенных операторов if. В случае, если вложенный оператор if располагается в пределах составного oпeратора, больших проблем не возникает, так как ключевые слова begin и end точно ограничивают область каждой альтернативы.

    Например:

if <Выражение> then

begin

<Оператор1>;

if <Выражение1> then <Оператор2> else <Оператор3>;

<Оператор4>

end

else

begin

<Оператор5>;

if <Выражение2> then <Оператор6>

end;

    Однако, если вложенный оператор if является единственным оператором в ветви альтернативы, то может возникнуть неоднозначность: какому if соответствует ветвь else.

    Например:

if <Выражение> then

if <Выражение1> then

<Оператор>

else <Оператор1>;

    В таких случаях следует помнить правило:

Ключевое слово else связывается с ближайшим стоящим перед ним ключевым словом if,

которое еще не было связано с каким-либо ключевым словом else.

    Если в предыдущем примере более четко обозначить структуру вложенности, записав else на одном уровне с then, которому оно соответствует, то получим такой фрагмент:

if <Выражение> then

if <Выражение1> then

<Оператор>

else <Оператор1>;

    На следующем шаге мы рассмотрим оператор case.

21. Булевским типом называется тип данных, представленный двумя противоположными по смыслу значениями: True (истина) и False (ложь). Данное название "булевский тип" используется в математической литературе для обозначения типа логических выражений в память о выдающемся английском математике Джоне Булле (Boole), заложившем основы математической логики.       Этот тип часто используется не только в логических выражениях, но и в выражениях отношениях. При описании величин этого типа принято использовать слово: boolean. Переменная булевского типа занимает в памяти персонального компьютера один байт.  Например:  var     flag, result: boolean;       Отметим, что во многих случаях наука "Логика" предусматривает только два возможных исхода событий, результатом которых могут быть ответы: "да" и "да". Пусть сравниваются два числа a и b. Операция отношения a < b может иметь два исхода: истина или ложь. Все определяется значениями a и b. Например, если a=2 и b=3, то отношение a < b истинно. Если же a=2 и b=2, то оно ложно. Мы видим, что отношение a < b дает логический результат. Ниже в таблице приведены примеры числовых операций с логическим результатом. 

Выражения

Отношения

Результаты логических выражений при:

-

-

a=2, b=3

a=2, b=2

a<b< td=""></b<>

a меньше b

true

false

a>=b

a больше или равно b

false

true

a>b

a больше b

false

false

a<=b

a меньше или равно b

true

true

a=b

a равно b

false

true

a<>b

a не равно b

true

false

     Вы видите сами, что каждое рассмотренное нами логическое выражение имеет только одно значение: "истина" или "ложь" в зависимости от того, выполняется ли данное отношение. Другим примером, который тоже дает логический результат является функция odd(x), которая дает значение true, если ее аргумент нечетный, и false, если аргумент наоборот четный. Можно привести много примеров соотношений в языке Паскаль, для которых результат является логическим и имеет одно из значений: true или false. Так, например, из школьного курса геометрии известно, что "если в каком-либо треугольнике сумма квадратов двух сторон равна квадрату третей стороны, то есть a*a + b*b=c*c, то такой треугольник прямоугорльный". Это предложение называется теоремой, обратной теореме Пифагора. При необходимости можно написать на языке Паскаль операцию условного перехода if, которая будет проверять выполнение данного соотношения в рамках некоторой программы.  3. Логические операции: not, and, or, xor. Пример программы.       Для переменных логического (булевского) типа определены следующие логические операции:

  • операция "не" - not;

  • операция "и" - and;

  • операция "или" - or;

  • операция "исключающее или" - xor.

     Рассмотрим пример программы на языке Паскаль, в которой используются логические операции "or" и "and". Кроме того, в этой программе используются еще и операции отношения. Результат выполнения операций отношения, как известно, имеет логический тип. Приведенная программа вводит три произвольных числа как длины сторон некоторого треугольника. В программе прежде всего проверяется: выполняется ли неравенство треугольника? Если это неравенство для заданных трех чисел выполняется, то есть длина любой из сторон треугольника меньше суммы длин двух других его сторон, то треугольник существует, и стало быть дальше можно проверять, является ли он прямоугольным.  program pifagor; uses dos, crt;     var         a, b, c: real; begin     clrscr;     write('Введите три числа: длины сторон треугольника = ');     readln(a, b, c);     if (a < b+c) and (b < a+c) and (c < a+b) then          begin          if (a*a+b*b=c*c) or (a*a+c*c=b*b) or (b*b+c*c=a*a)          then write('Заданный треугольник прямоугольный')          else write('Заданный треугольник не прямоугольный');          end     else write('При заданной длине сторон треугольник не существует');     end.       На рисунке ниже показан момент открытия файла pifagor.pas перед компиляцией программы.  На следующем рисунке показан исходный текст программы перед компиляцией.  Далее Вы видите решение задачи на примере длин сторон египетского треугольника.  Проверьте, пожалуйста, все остальные варианты решения данной задачи. Это должны быть следующие случаи решения:

  • Треуголник существует (неравенство треуголника выполняется), но треугольник не прямоугольный.

  • Треуголник не существует, то есть неравенство треуголника не выполняется.

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

22. Оператор for является самой популярной структурой для организации циклов. В общем случае его можно представить так :

        for( выражение1; выражение2; выражение3) оператор;

В одной строке этот оператор определяет сразу три составляющие, отделяемые друг от друга точкой с запятой: а) начальное значение параметра цикла(выражение1), б) условие оканчания цикла (выражение2) , в) закон изменения параметра цикла(выражение3). Формально этот оператор эквиалентен последовательности операторов

выражение1; while(выражение2) {   оператор;   выражение3; )

  В следующей программе (пример 4.4) оператор for служит для организации и печати последовательных чисел Фибоначчи, не превосходящих m. Проверка k<=m происходит перед каждым (в том числе и перед первым)   выполнением тела цикла. Тело цикла выполняется, если проверочное выражение истинно. Затем следует изменение параметра: k=k+1; этот оператор, кстати, формирует очередное число Фибоначчи, а оператор j=k-j; хранит предыдущее.

        Пример 4.4

/*числа Фибоначчи*/ #include <stdio.h> main() { int m, k, j=1; printf("введи m\n"); scanf("%d",&m); for(k=1;k<=m;k=k+j) {      printf("%d",k);     j=k-j; } }

    Как и в операторе while, тело цикла for может состоять из единственного оператора или из нескольких, заключенных в скобки. Следующяя программа (пример 4.5) предназначена для печати гистопрограммы длин читаемых слов (признак конца слова - пробел, запятая или "\n"). Оператор for управляет циклом, состоящим по сути из одного оператора if , так что скобки можно было бы опустить. Для построения гистопрограммы выбран символ, внутреннее представление которого в коде ASCII численно равно 220.           В скобках после ключевого слова for можно размещать выражения. Однако выражение1 и выражение3 не обязаны присваивать начальное значение и изменять параметр цикла, а выражение2 не обязано быть проверкой условия. Но компилятор всегда интерпретирует выражение2 как истинну или ложь (ложь- двоичный нуль, истина - все остальное). Любое из трех может быть опущено, хотя точка с запятой должна остаться. Допускается даже такой вырожденный случай: for(;;);. Он означает бесконечный цикл, так как пропущенное выражение2 всегда трактуется как истина.

  Пример 4.5

#include <stdio.h> main()  {  char str[24];  int i,n=0;  printf("введи строку:\n"); while((str[n++]=getchar())!='\n';  printf("%d\n",n); for(i=0;i<n;i++)  {  if(str[i]!=' ' && str[i]!=',' && str[i]!= '\n') printf("%c",220);  else  printf("\n");  }  }

   В Си есть еще операция ", " (запятая), которая чаще всего используется в операторе for. Пара выражений, разделенных запятой, вычисляются слева направо. В каждой из трех составляющих оператора for можно помещать несколько выражений, разделенных запятыми. Этот прием часто используют, например, для синхронного изменения двух индексов при обработке массивов. В качестве примера приведем функцию substr, которая позволяет из задонной строки s1 выделить подстроку s2 указанной длины L, начиная с k-го по порядку символа (нумерация символов начинается с нуля). Функция принимает также параметр m- общее кол-во символов в исходной строке, чтобы контролировать возможный выход за ее пределы(пример 4.6).

              Пример 4.6

/*выделение подстроки*/  substr(char s1, char s2, int l, int k, int m) {  int j,i;  if(l+l>=m)k=m-l-1; for(i=1,j=0;i<l+k;i++.j++) s2[j]=s1[i];  }  #include <stdio.h> main() { char str[80], str2[80]; int k,l,m=0;  printf("ведите строку");  while((str1[m++]=getchar())!='\n');  printf("\n");  /*m сохраняет свое значение*/  printf("введите l и k\n");  scanf("%d %d",&l, &k); substr(str1,str2,l,k,m); printf("%s\n",str2);  }

  Преимущество оператора for - компактность и объединение в одной строке трех операторов управления циклом - особенно заметно проявляется во вложенных циклах. Очередная прогрпмма(пример 4.6) предназначена для упорядочения целых чисел по возрастанию. Функция sor реализует один из наиболее простых алгоритмов сортировки - метод "пузырька".

Пример 4.6

/*СОРТИРОВКА */ #include <stdio.h> main() { extern int sor(); int i,n; static a[10]={10,1,9,2,8,3,7,4,6,5}; n=10; sor(a,n); for(i=0; i<n; i++)   printf(" %d",a[i]); } /*________________*/ int sor(int x[], int n) { int i,j,z; for(i=0;i<n-1;i++)     for(j=i+1;j<n;j++) if(x[i]>x[j]) { z=x[i];           x[i]=x[j];           x[j]=z; }   return; }

            Еще один пример со вложенными циклами демонстрирует программа (пример 4.7). Она использует одну полезную при обработке текстов функцию index. Функция index определяет , входит ли в некоторую строку s1 заданная подстрока s2 и выдает положение (индекс)  в строке s1 , начиная с которого строка s2 содержится в s1. Если s2 не входит в s1, то функция возращает '-1'. 

        Пример 4.7

/*индекс строки */ index(s1,s2) char s1[],s2[]; { int i,j,k; for(i=0;s1[i]!='\0'; i++) { for(j=i,k=0;s2[k]!='\0' && s1[j]==s2[k]; j++,k++); if(s2[k]=='\0') return(i); } return(-1); } char str1[]="информатика" chra str2[]="форма" #include <stdio.h> main() { printf("%d\n",index(str1,str2)); }

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]