Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Логические операции: 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)); }

Вложенные циклы

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

Обратите внимание — при программировании вложенных циклов необходимо соблюдать следующее дополнительное условие: все операторы внутреннего цикла должны полностью располагаться в теле внешнего цикла.

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

var i, j:byte;
begin
for i:= 1 to 10 do
for j:=1 to 10 do
writeln (i,’*’,j,’=’,i*j);
end;

Проанализируем действие данной программы. В разделе описания переменных описываются переменные I, J целого типаbyte, выполняющие функции управляющих переменных циклов for.

Выполнение программы начинается с внешнего цикла. При первом обращении к оператору внешнего цикла for вычисляются значения начального (1) и конечного (10) параметров цикла и управляющей переменной I присваивается начальное значение 1.

Затем циклически выполняется следующее:

1. Проверяется условие I<=10.

2. Если оно соблюдается, то выполняется оператор в теле цикла, т. е. выполняется внутренний цикл.

• При первом обращении к оператору внутреннего цикла for вычисляются значения начального (1) и конечного (10) параметров цикла и управляющей переменной J присваивается начальное значение 1.

Затем циклически выполняется следующее:

• Проверяется условие J<=10.

• Если оно удовлетворяется, то выполняется оператор в теле цикла, т. е. оператор Writeln(I,' * ',J,' = ',I*J), выводящий на экран строку таблицы умножения в соответствии с текущими значениями переменных I и J.

• Затем значение управляющей внутреннего цикла J увеличивается на единицу и оператор внутреннего цикла for проверяет условие J<=10. Если условие соблюдается, то выполняется тело внутреннего цикла при неизменном значении управляющей переменной внешнего цикла до тех пор, пока выполняется условие J<=10.

Если условие J<=10 не удовлетворяется, т. е. как только J станет больше 10, оператор тела цикла не выполняется, внутренний цикл завершается и управление в программе передается за пределы оператора for внутреннего цикла, т. е. на оператор forвнешнего цикла.

3. Значение параметра цикла I увеличивается на единицу, и проверяется условие I<=10. Если условие I<=10 не соблюдается, т. е. как только I станет больше 10, оператор тела цикла не выполняется, внешний цикл завершается и управление в программе передается за пределы оператора for внешнего цикла, т. е. на оператор end, и программа завершает работу.

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

Рис. 3.5. Условное обозначение на схемах алгоритмов вложенных циклов с параметром

Еще один вариант программы, выводящей на экран таблицу умножения, но уже в виде "квадрата Пифагора", приведен ниже. Использование оператора writeln в теле внешнего цикла по i позволяет выполнить перевод курсора в начало следующей строки экрана при завершении вывода предыдущей.

24. Организация циклов с помощью операторов if и goto

Циклы используются для организации многократно повторяющихся вычислений. Любой цикл состоит из тела цикла, то есть тех операторов, которые выполняются несколько раз, начальных установок, модификации параметра цикла и проверки условия продолжения выполнения цикла, которое записывается в виде логического выражения (рис. 2.1). Выход из цикла может быть организован как при истинности выражения – «Да», так и при его неистинности «Нет» (на рис. 2.1 лишь пример выхода по – «Нет»).

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

Рис. 3.1, Структурные схемы операторов цикла: а – цикл с предусловием; б – цикл с постусловием

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

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

Цикл завершается, если условие его продолжения не выполняется. Передавать управление извне внутрь тела цикла, минуя его заголовок, не рекомендуется, так как параметры цикла могут быть не определены.

Рассмотрим пример, который можно использовать для решения задания 1. Требуется вычислить арифметическое выражение, содержащее бесконечную сумму:

Для инициализации вычислений переменной n присваивается начальное значение 0 и переменной F также присваивается 0. В цикле переменная n после каждого вычисления выражения, стоящего под знаком суммы должна изменяться по формуле n = n + 1. Таким образом, n – счетчик цикла. Если бы был конечный верхний предел суммы, то условием завершения цикла было бы равенство n конечному пределу. Но в данном случае предел бесконечный и, следовательно, F может быть вычислена только приближенно.

Для этого вводится понятие погрешности вычисления e. Истинную погрешность вычислений найти можно аналитически, но не для всех выражений. Поэтому воспользуемся приближенными методами оценки погрешности. Один из вариантов такой оценки – отбросить все слагаемые, абсолютная величина которых меньше e. Конечно, это не та e, которая близка к истинной погрешности вычислений, но зато такая оценка универсальна (для любого выражения). Понятно, что истинная погрешность всегда больше e. Поэтому e следует выбирать меньше ожидаемой истинной погрешности раз в 10. В большинстве случаев это оправданно. Хотя, конечно, анализ выражения под знаком суммы никогда не помешает.

Переменная F, то есть сумма должна накапливаться с каждым циклом, для этого слагаемые, содержащие в том или ином виде n, складываются с переменной F и результат заносится также в F.

Цикл с постусловием для приведенного выше выражения будет выглядеть так:

n=0; F=0;eps=0.001; //инициализация переменных

// переменную eps в задании 3 следует вводить с клавиатуры

m1: Fp=1.0/n; //вычисление выражения под знаком суммы

F=F+Fp; //накопление суммы

n++; //изменение переменной цикла

if (Fp>=eps) goto m1;

Здесь eps – погрешность e;

Переменная Fp вводится, чтобы при анализе условия не вычислять выражение повторно. После выхода из цикла переменная F будет содержать сумму вычисленную приближенно. Можно также контролировать число циклов n с целью защиты от ошибок программирования. Обычно это делают при отладке программы. Если число циклов программирования слишком велико (например, n>100000) можно выйти из цикла по этому условию. Для этого в последней строке программы можно связать 2 условия логическим оператором:

if (Fp>=eps & n<=100000) goto m1;

25. Применяется для организации циклов с неизвестным заранее числом повторений, логика которых предполагает выполнение цикла до тех пор пока не станет истинным некоторое условие.

Синтаксис оператора REPEAT…UNTIL:

REPEAT
Оператор1;
Оператор2;
···
ОператорN;
UNTIL Условие;

Операторы (Оператор1, Оператор2, … ОператорN), образующие тело цикла, будут выполнятся циклически, до тех пор пока значение “Условия” не станет равно TRUE (истина). Иными словами, в цикле REPEAT…UNTIL условием продолжения итераций является невыполнение “Условия” (его значение FASLE – ложь).

Условие цикла может быть логической константой, переменной или логическим выражением.

Оператор REPEAT…UNTIL имеет две части: начальную (слово REPEAT) и завершающую (слово UNTIL), которые охватывают группу операторов, составляющих тело цикла. Поэтому необходимости в использовании составного оператора для построения тела цикла из нескольких простых операторов не возникает.

Принципиальное отличие оператора REPEAT…UNTIL от оператора WHILE в том, что проверка условия производится не перед началом выполнения тела цикла, а после его выполнения, когда решается вопрос, повторить ли еще раз действия. Поэтому тело цикла всегда выполняется по крайней мере один раз.






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных