Текущий указатель.

При построении изображения иногда надо указать точку начала вывода. В тек­стовых режимах эту точку указывает курсор, который присутствует на экране(его мож­но убрать). В графических режимах видимого курсора нет, но есть невидимый текущий указатель. Для перемещения текущего указателя по экрану дисплея служит процедура MoveTo(x, y), перемещающая указатель в точку с координатами (х, у).

Процедура MoveRel(dx, dy), перемещает указатель на dx точек по горизонтали ;и

dy точек по вертикали от предыдущей позиции.

Примеры.

1. ......

MoveTo(200,100); {указатель переместится в точку (200,100)} MoveRel(5,10); {указатель переместится в точку (205,110)}

Чтобы определить максимальное значение координат Х и Y для установленного видеорежима, используют функции

GetMaxX:integer; для определения максимального значения Х GetMaxY:integer; для определения максимального значения Y.

2. Установить указатель в центр экрана.

VAR Xcentr. Ycentrinteger;

begin

Xcentr^GetMaxX div 2;

Ycentr:=GetMaxY div 2;

MoveTo(Xcentr, Ycentr);

Вывод точки.

PutPixel(x, y:integer;<uBeT_T04KH>);

x, y - координаты точки.

Вывод отрезка.

Line(xl, yl, x2,y2);

(х1,у1)-координаты начала отрезка;

(х2,у2)-координаты конца отрезка;

Обратите внимание на то, что в процедуре не задается цвет. В этом и аналогичных случаях цвет определяется процедурой SetColor().

Процедура UneTo(x, y) строит отрезок из точки текущего положения указателя в точку с координатами (х. у).

Процедура LineRel^x. dy) строит отрезок из точки текущего положения указателя (пусть это будут коордлваты Х и Y) в точку с координатами (x+dx, y+dy).

НЕ нашли? Не то? Что вы ищете?

Построение прямоугольника.

Rectangle(xl, у1 ,х2,у2-и»^ег);

(х1,у1)-координаты лево\\" «^рунего угла прямоугольника;

(х2,у2)-координаты право! i ниа^-^о угла прямоугольника;

Процедура Bar(xl, yl, x2,y2:integer) рисует прямоугольник и закрашивает его цветом и стилем, определенньм в процедуре SetFillStyle(), при этом границы прямоугольника не обводятся.

Построение дуг, окружностей, эллипсов.

Процедура Circle(x, y,<panHyc>:word); вычерчивает окружность указанного радиуса с центром в точке (X, Y).

Процедура построения эллиптических дуг:

Ellipsc(X, Y:intcger;<Ha4_yron>,<KOH_yron>:word; xR, yR:word);

X, Y - координаты центра,

xR, yR - длина горизонтальной и вертикальной полуосей в пикселах. Угол отсчитывается против часовой стрелки и указывается в градусах. Дуга эллипса вычерчивается от заданного начального угла до конечного утла. Если значение началь­ного угла 0, а конечного 360 - будет построен полный эллипс.

Процедура построения закрашенного эллипса:

FillEllipse(x, y:integer;xR, yR);

X, Y - координаты центра,

xR, y-R - длина горизонтальной и вертикальной полуосей. Стиль заполнения области внутри эллипса устанавливается процедурой SetFillStyleQ, а цвет самого эллипса • процедурой SetColorQ.

Процедура заполнения внутренней или внешней области замкнутой фигуры

стилем, заданным процедурой SetFillStyleQ:

FloodFill(x, y:integer;<UBeT_rpaHHUbi_o6nacTH>);

X, Y - координаты точки внутри (или вне) замкнутой области.

Пример разработки простейшей графической программы.

Задание: Построить в центре экрана синий прямоугольник, закрасив его линиями вида \\ темно-серого цвета. Фон экрана сделать белым.

Вариант программы:

Program Graph 1;

uses Graph;

var Uriver, Mode:Integer;

Begin

{инициализация графического режима} Driver:=Detect;

InitGraph(Driver, Mode,"); •' {установка цвета фона экрана - белого} '<f SetBkColor(15); •-'-•;

{установка текущего цвета - синего} SetColor(l);

{очистка экрана установленным цветом фона} Cleardevice;

{установка стиля заполнения: штриховка темно-серыми линиями вида \\} SetFillStyle(5,8);

{вычерчивание в центре экрана синего прямоугольника}

Информатика

Rectangle(290,290,GetMaxX-290,GetMaxY-290);

{заполнение прямоугольника выбранным стилем} FloodFill(301,230,1);

ReadLn; {рисунок остается на экране дисплея до нажатия

клавиши ENTER}

CloseGraph;{ закрытие графического режима} end.

Этапы построения программы:

1.Необходимость подключения модуля GRAPH.

2.Необходимость инициализации графического режима.

3.Установка цвета фона (пояснить, что эта процедура сама но себе не меняет цвет фона).

4-Установка цвета вычерчиваемой фигуры(текущий цвет). 5.Выбор стиля заполнения фигуры, которую будем строить. б. Собственно построение графического изображения. 7.3акрытие графического режима.

Упражнение 10.

Написать программу построения рисунка.

кошка

Л Л

птица


улыбки



Карлик -Нос


а


Информатика Ш

§10. Оператор ветвления. Программирование алгоритмов с ветвлениями

Ветвление - такая форма организации действий, при которой в зависимости от выполнения или невыполнения. некоторого условия совершается либо одна, либо другая последовательность действий._________________________

10.1. Программирование ветвлений в программе на PASCAL. Оператор ветвления в полной форме

При записи алгоритма в виде программы проверка условия и переход к выпол­нению соответствующей части программы осуществляется посредством так называемо­го условного оператора, который образуется с помощью служебных слов №(если)..'.ТНЕМ(тогда)...ЕЬ8Е(иначе)..

рис.1. Блок проверки условия

рис.2. Блок-схема ветвления в полной форме

рис.3. Блок-схема неполной формы ветвления


нет


Формат оператора для полной формы ветвления:

IF <условие> THEN < оператор_1> ELSE < оператор_2>;

Если в качестве оператора_1 или оператора_2 должна выполниться серия операто­ров, то они должны быть заключены в операторные скобки

BEGIN - END.

Условие в операторе IF...THEN...ELSE может быть простым или сложным. Простое условие представляет собой логическое выражение, состоящее из двух выра­жений одинакового типа ( числового, строкового ), соединенных знаком операции от­ношения (>,<>=,<=,<:>,=).

Примеры.

1 .Записать на языке программирования условие того, что переменная А имеет значение не большее, чем 18.

ответ: А<=18

Это условие будет выполняться (или говорят, что его значение будет "истина") при таких, например, значениях переменной А: 18,0,-18,4 и т. д.. Это же условие не бу­дет выполняться (его значение будет "ложь") при всех значениях, больших числа 18, например, 19,100,101 и т. д..

2-Записать условие того, что сумма значений переменных А и В не равна значению пе­ременной С.

ответ: (А+В)оС

Это условие будет иметь значение "истина", например, при таких значениях, входящих в него переменных: А=1, В=2, С=5 .

Если же А=1, В=2, С=3, то записанное выше условие не будет выполняться, т. е. получит значение "ложь".

Сложное условие состоит из простых, соединенных знаками логических операций:

ОР(или), КОТ(не), AND(n). При этом каждое простое условие ограничено с обеих сто­рон круглыми скобками.

Приоритет операций «условных выражениях:

1. not

2. * , /, div, mod, and

3. + , -, or

4. = , о, > , >= , < , <==

Примеры.

1. Записать условие того, что человек имеет паспорт, но не достиг совершеннолетия.

Пусть возраст человека хранится в переменной G, тогда должно быть выполне­но условие G>=14 и, одновременно, G<18. В языке программирования это записывается так:

(G>=14)AND (GOS)

2.Написать условие того, что точка Х на прямой лежит вне отрезка [-5,5].

В математике это условие записали бы так: Х>5 или Х<-5. На языке программирования соответствующая запись имеет вид :

(Х>5) OR (X<-5)

Выполнение оператора IF...THEN...ELSE

1. Проверяется: выполняется или нет условие, стоящее после слова IF (т. е. имеет оно значение "истина" или "ложь").

2.Если условие выполняется, т. е. значение его "истина", то выполняется оператор, стоящий после слова THEN, а затем управление передается оператору программы, записанному после оператора IF...THEN...ELSE. Если условие оператора IF не выполняется (т. е. оно имеет значение "ложь"), то вы­полняется оператор, стоящий после слова ELSE, а затем начинает выполняться сле­дующий после IF...THEN...ELSE... оператор. Познакомимся с условным оператором на примере решения задачи вывода на экран большего из двух данных чисел.

Исходные данные:

два числа, поскольку ничего не сказано про их значения, будем считать, что они вещественные. Пусть переменная Х хранит значение первого числа, а переменная Y - значение второго.

Алгоритм решения задачи достаточно прост:

надо сравнить значения переменных Х и Y.

Если X>Y, на экран вывести значение переменной X, иначе - переменной Y. Ло­гическое условие, которое будет записано в условном операторе, в данном случае совпадает с тем, которое используется в математике.

3. Запишем алгоритм на языке PASCAL. Program PR 1;

Uses Crt;

Var x, y:real;

Begin CIrScr;

\Уп1е1п('введите два числа');

Readln(x, y);

Ifx>yThenWriteln(x) {если (If) x больше у, то (Then) выводим х} Else Writeln(y);

{иначе (Else) выводим у} End.

Выполним программу, введя для переменной Х значение 2.2 и для переменной Y зна­чение - 10.8 .

Условие X>Y выполняется, управление передается оператору, записанному после сло­ва Then, на экране появится число 2.2, Задание:

Выполните программу при Х=4.5, Y=21.9;

Х=6.6, Y=6.6.

10.2.0ператор ветвления в неполной форме

Если в случае невыполнения условия никаких действий не предусмотрено, луч­ше воспользоваться условным оператором в неполной форме.

Формат условного оператора для неполной формы ветвления.

IF <условие> THEN < оператор>;

Действие этого оператора отличается от предыдущего тем, что и случае невы­полнения условия начинает выполняться следующий после IF...THEN... оператор про­граммы.

Примеры.

1.Написать программу поиска наибольшего из двух чисел. Найденное число должно быть помещено в ячейку с именем МАХ. Program PR1J2;

Uses Crt;

Var x, y,max:real;

{x, y хранят значение исходных данных} {max - предназначена для хранения результата}

Begin CIrScr;

^Уп1е1п('введите два числа');

Readln(x. y);

тах:=х;{будем считать, что х - наибольшее число} if max<y then max:=y;

{если (If) тах(т. е.Х) меньше Y, то (Then) в ячейку MAX посылаем Y} Writeln(max);

End.

2.Написать программу, проверяющую, принадлежит ли число, введенное с клавиату­ры, интервалу (О

Обозначим через Х число, вводимое пользователем с клавиатуры. Пусть что будет це­лое число. Принадлежность числа заданному интервалу определяется одновременным выполнением двух неравенств: Х>0 и Х<5.

На языке Pascal это условие записывается так:(Х>0) and (X<5).

Program Pr2;

Uses Crt;

Var x:integer;

Begin

CIrScr;

Writeln('Bвcдитe число X');

Readln(x);

If(x>0) and (x<5) Then Writeln(x,' принадлежит интервалу')

Else Writeln(x,' не принадлежит интервалу') End.

В качестве оператора, записанного после слов THEN и ELSE, может быть любой опе­ратор языка PASCAL, в том числе и оператор ветвления.

3. Написать программу для определения того, находится ли вес человека в пределах нормы, является избыточным или недостаточным, учитывая, что в простейших случаях для определения нормального веса человека из величины его роста вычитают 100. Вес считается нормальным, если он отличается от этой разности не более чем па 5 кг. Зна - • чения роста и веса должны вводиться с клавиатуры по запросу программы. Результат нужно вывести на экран дисплея в виде сообщения:

" вес в норме ", "вес избыточен" или "вес недостаточен". Выполнить эту программу для следующих исходных данных:

а)р=83,4кг 1=179,1см

б)р=57,9кг 1=167,7см

в) р=71,7кг 1= 166,3см

Решение.

Program РгЗ;

Uses Crt;

Var p, l,r:real;

{г-переменпая для хранения разности 1-100} Begin CIrScr;

Writeln('Bвeдитe ваш вес');


в


Информатика




Readln(p);

Writeln('BBeAHTe ваш рост');

Readln(l);

r:=l-100;

Ifabs(p-r)<=5

Then Writeln('Bec нормальный') Elself(p-r)>0

Then Writeln('Bec избыточный') Else Writeln('Bec недостаточный');

End.

Приведем решение этой задачи в виде таблицы для заданных исходных данных:

Р

1

г

значение условия

результат

|p-r

<=5

р-г>0

8

17Г66.3

7

истина ложь ложь

истина ложь истина

вес нормальный вес недостаточный вес избыточный

Упражнение 11.

1. Какое эначение "истина" или "ложь" имеет следующее условное выражение (х>у) or (y>x) and not((x>0) or (z>x)), еслих=-1 у=-1 z=-2.

2. Написать программу нахождения наибольшею ич грех чисел.

3. Запишите на языке программирования условие, которое надо проверить:

а) значение переменной М больше значения квадрата разности величины 1- и числа 5?

б) значение переменной S раино константе 'хорошо'?

в) лежит ли точка с координатами (х, у) на оси абсцисс?

4. Выполняется ли условие А-^7.1, если А равно

а)-7

б) 7.1

в) -7.2

5. При каких значениях неременной Л условие А-'три' имеет значение "истина"?

а) Т

б) 'три'

в)' три'

г)'три '

6. Найдите значение величины С после выполнения операторов IF В<=-2.2 THEN С:-В»6 RI..SF. Г:=В-3, если значение переменной В равно:

а) 2.2

б)-2.2

в) 7

7. Найдите значение величины С после исполнения фрагмента программы:

С:=2

IFB>5THENC:=10 значение В равно:

а) 8 б) 3

8. Вычислить

у= { 5,73х+1,09 , еслих<2

^ I 25,17 - 6,24х, если х>=2

клавиатуры по запросу программы. Найти значения функции при х=-0,35; х=4,07; х=2

Значения аргумента функции вводить с

9.Написать программу, определяющую, попадает ли точка с координатами (х, у) в заштрихо­ванную область плоскости.

10. Вычислить значение функции у(х), заданной графиком:

10. Написать программу, которая запрашивала бы ввод с клавиатуры одного из слов 'yes' или 'по'. Если было введено слово 'yes', па жране должно появиться изображение закрашенно­го прямоугольника, если введено слово 'по', прямоу! ельник должен быть незакрашеп. Коли же было введено любое другое слово, то па -жране должно появиться изображение Kpyi ;i.

§11. Виды циклических алгоритмов

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

Существует два вида циклов:

цикл ДЛЯ - повторяет тело цикла для всех значений некоторой переменной, кото­рая называется параметром цикла;

цикл ПОКА - повторяет тело цикла до выполнения или невыполнения некоторого

условия. В программах циклические структуры реализуются с помощью операторов цикла.

I L1. Цикл ДЛЯ

For <параметр цикла^^нач. значение> to <кон. значение> do <оператор>;

<параметр цикда> - переменная целого типа, от значения которой

зависит, будет продолжать выполняться цикл или нет. <начальное значение> и <конечное значение> - выражения того же

типа что и параметр.

Если операторов в теле цикла больше, чем один, тогда используем операторные скоб­ки.

Begin

<операторы тела цикла>;

End;

• Фрагмент блок - схемы цикла ДЛЯ :

Выполнение цикла:

1. Параметру цикла присваивается начальное значение N1

2. Проверяется условие: параметр не больше конечного значения N2 ?

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

Внимание

При выполнении цикла ДЛЯ мы заранее знаем количество повторений, т. е. применять цикл ®с параметром можно только в тех случаях, когда известно начальное и конечное значение параметра.

Примеры решения задач на использование цикла с параметром.

Задача 1. «Звездное небо»:

На экране должно появиться N звезд.

Для определенности допустим, что N=100. То есть необходимо вывести 100 точек с помощью функции PutPixel (X, Y,Color). Получение каждой точки описывается после­довательностью трех операторов:

X:=Random(GetMaxX); {получение координаты X}

В Информатика 0

Y:=Random(GetMaxY); {получение координаты Y} PutPixel(X, Y, White); {Вывод полученной точки на экран}

Эти операторы необходимо повторить 100 раз. Так как известно число повторений, то применим цикл с параметром.

В качестве параметра используем переменную I, конечное значение которой будет равно числу рисуемых на экране точек. Цикл будет выглядеть следующим образом:

Forl:=l to 100 do Begin X:=Random(GetMaxX);

Y:=Random(GetMaxY);

PutPixel(X, Y,White);

End;

Forl:=l toNdo Begin X:=Random(GetMaxX);

Y^Randon^GetMaxY);

PutPixel(X, Y,White);

End;

Полностью программа выглядит так :

Program PrgOl;

Uses Graph;

Var

Driver, Mode:Integer;

N, X,YJ:Integer;

Begin Randomize;

\Уп1еЬп('Введите количество звезд на небе');

ReadLn(N);

Driver:=Detect;

InitGraph(Driver, Mode,'c:\tp7\bgi');

SetBkColor(Black);

ForL-ltoNdo

Begin

X^Randon^GetMaxX);

Y:=Random(GetMaxY);

PutPixel(X, Y,White);

End;

SetTextStyle(0,0,4); {установка стиля текста} Ои1Тех1ХУ(100,100,'Звездное Небо'); {вывод текста в графическом режиме,} ReadLn; {начиная с пикселя 100,100} CloseGraph;

End.

Задача 2. Нарисовать

Program Prg02; ' Uses Graph;

Const N=100;

Var

Driver, Mode: Integer;

I: Integer;

Begin Driver:=Detect;

InitGraph(Driver, Mode,'c:\tp7\bgi');

SetBkColor(Black);

For I:=0 to 3 do

Rectangle(i*N, i*N, i*N+N, i*N+N);

ReadLn;

CloseGraph;

End.


Задача 3.

Нарисовать:


Создание данного рисунка возможно несколькими способами. Один из них состоит в том, чтобы вывести на экран компьютера 64 квадрата, соединенных согласно рисунку. 64 клетки - 64 квадрата. Предположим, что нам необходимо вывести один квадрат в точке 0,0 со стороной 50. Левая верхняя точка будет 0,0, а правая нижняя 50,50. Rectangle( 0, 0 , 50 , 50);

Теперь попытаемся вывести первые 8 квадратов. Из рисунка видно, что координаты Y у всех квадратов одинаковые, т. е. необходимо изменять координату X. Координата Х правой стороны 1 - го квадрата будет координатой левой стороны 2-го квадрата; коорди-

ната X правой стороны 2-го квадрата будет координатой левой стороны 3-го квадрата и т. д.

Rectangle( 0 ,0, 50 , 50);

Rectangle( 50,0, 2*50 , 50);

Rectangle( 2*50 , 0 , 3*50 , 50 );

Rectangle( 3*50 ,0 , 4*50 , 50);

Rectangle( 4*50, 0,5*50, 50);

Rectangle( 5*50, 0 , 6*50 , 50);

Rectangle( 6*50,0, 7*50 ,50);

Rectangle( 7*50,0 , 8*50 , 50 );

Мы видим, что левая граница квадратов Х*50, где Х изменяется от 0 до 7, а правая на 50 больше: (Х+1)*50, поэтому воспользуемся циклом с параметром.

For Х:=0 to 7 Do

Rectangle( X*50 , 0 , (X+l)*50, 50);

Для получения заданного рисунка эти действия нужно повторить 8 раз, но с различ­ными координатами по Y.

(0,50)

(50,2*50)

(2*50,3*50)

(3*50,4*50)

(4*50,5*50)

(5*50,6*50)

(6*50,7*50)

(7*50,8*50) Верхняя граница рисунка - Y*50, где Y изменяется от 0 до 7, а нижняя на 50 больше:

(Y+l)*50, т. е. количество повторений известно, поэтому воспользуемся циклом с пара­метром.

For Y:=0 to 7 Do For X--0 to 7 Do

Rectangle( X*50 , Y*50, (X+l)*50 , (Y+l)*50);

Такая конструкция называется вложенным циклом. Выполняется конструкция сле­дующим образом: для каждого значения параметра внешнего цикла выполняется вложенный цикл.

Program Prg03;

Uses Graph;

Const N=50;

Var

Driver. Mode: Integer;

X, Y:Integer;

Begin Driver:=Detect;

InitGraph(Driver, Mode,'c:\tp7\bgi');

SetBkColor(Black);

{1 способ} For X--0 to 8 do

LineCX^O^N^N);

For У--0 to 8 do

Line(0,Y*N,8*N, Y*N);

ReadLn;

ClearDevice;

f2 способ} For Y:=0 to 7 do

For X:=0 to 7 do

Begin

Rectangle(X*N, Y*N, X*N+N, Y*N+N);

If(x+y)mod2=0 then FloodFill(X*N+10,Y*N+10,White);}

End;

ReadLn;

CloseGraph;

End.

Упражнение 12.

Что получим в результате выполнения цикла:

1)ForI:=l to 4 do Rectang^Oj-^O, 100,(i+1 )*50);

2)ForI:=lto20do

If I mod 2=0 then LineRel(0,20) else LineRel(20,0);

3)ForI:=lto20do

If I mod 2 = 0 then L«ne(10,i*10,20,(i+l)*10) _______е1яеипе(10,0-Н)*10.20.1*10);________________________________

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

Рассмотрим пример: нужно пдсчитать сумму элементов числовой последова­тельности определенной длины. Число элементов последовательности должен задать пользователь. Допустим, N - число элементов последовательности,

S - сумма введенных элементов.

Введем первый элемент последовательности: ReadLn(X), и на это число увеличиваем сумму: S:=S+X;

Эти два действия мы должны выполнить N раз. Поскольку действия повторяются, мы можем применить ЦИКЛ. Так как мы знаем, сколько раз он должен выполниться, то применим ЦИКЛ С ПАРАМЕТРОМ.

Forl:=l toNdo Begin ReadLn(X);

S:=S+X;

End;

Напоминаем, что вначале переменная S должна быть обнулена: S:=0. Окончательно программа выглядит следующим образом:

Var

S, X,N:Integer;

Begin

Write(' Введите количество элементов -');

ReadLn(N);

S:=0;

Forl-1 toNdo

Begin

ReadLn(X);

S:=S+X;

End;

WriteLn(' Сумма ',N,' элементов ^ ',S);

ReadLn;

End.

Пример 2.

Подсчитать произведение N элементов числовой последовательности определенной длины.

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

Первый состоит в том, что начальное произведение необходимо задавать рав­ным не 0, а 1. 1*: 1 ;(иначе оно до конца останется 0).

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

If Not (ХЧ)) Then Г: l^X.

Var

I'.X^ongInt;

N: Integer;

Begin Write(' Введите количес! во элементов -');

ReadLn(N);

P:=l;

Forl-l toNdo Begin

ReadLn(X);

If Not (X=0) Then P:=P*X

P:=P*X;

End;

WriteLnC Произведение ',N,' элементов ^ ',P);

ReadLn;

End.

Пример 3. Подсчитать во введенной строке количество букв 'а'.

* Напоминаем, что букв 'а', вообще говоря, четырехтрочная и прописная, русская и ла­тинская.

Допустим, что введенная строка - S, а счетчик букв 'а' - К.

Нам необходимо выделять из строки каждую букву, сравнивать с буквой 'а' и, в случае совпадения, увеличивать счетчик на 1 (в начале программы он равен 0). Жела­тельно чтобы учащиеся сами выяснили, что процедура Copy(S, I,l), где I изменяется от 1 до последнего символа строки, позволяет выделить из строки один символ с номером I.

Последний символ строки определяется функцией Length(S).

Var

S: String;

K, I:Byte;

Begin K:=0;

WriteLnC Введите строку');

ReadLn(S);

ForI:=ltoLength(S)do

If(Copy(S, I,l) = 'a') Or { Строчная латинская } (Copy(S, I,l) = 'A') Or { Прописная латинская } (Copy(S, I,l) = 'a') Or { Строчная русская } (Copy(S, I,l) = 'A') { Прописная русская } ThenK:=K+l;

WriteLnC В строке ',S,' букв а ',К);

ReadLn;

End.

Пример 5. Заменить в строке букву 'о' на 'а'.

Решение задачи состоит в том чтобы найти в строке буквы 'о', удалить их с помощью функции Delete и вставить необходимую букву с помощью функции Insert. Const

A:string[2]='a';

0:string[2]-'o';

Var S: String;

I:Byte;

Begin

WriteLn('BBeAHTe строку');

ReadLn(S);

For I:=l to Length(S) do IfCopy(S, I,l)=OThen

Begin

Delete(SJ, l);

Insert(A, S,I);

End;

WriteLn(' Получили ',S);

ReadLn;

End.

Пример 6.

Подсчитать количество слов в строке (считая, что слово - это последователь­ность символов, не имеющая пробела).

* Обратите внимание на то, что :

- пробелы могут поставить перед первым словом,

- число пробелов между словами может быть больше 1,

- могут быть пробелы в конце строки. Поэтому программа должна выглядеть следующим образом:

Var

S:String;

K, I:Byte;

Begin

WriteLn(' Введите предложение');

ReadLn(S);

K-l;

{Подсчет пробелов} Forl:=l to Length(S) do

^(^(SJ,!)-'' Then K:=K+1;

{Удаление лишних}

{Лишних пробелов между словами - двойных }

Forl:=l toLength(S)-! do

lfCopy(SJ,2)-' 'ThenK:=K-l;

{Первого пробела} IfCopy(S, l,l)= '' Theo IC:=K-1;

{Последнего пробела} IfCopy(S, Length(S),l)- '' Then K:=K-1;

WriteLnC В предложении ',S);

WriteLn( К, • слов(а)');

ReadLn;

End.

Упражнение 13.

Что получится в результате выполнения цикла?

1)S:=0;

Forl:=l to 10 Do S:=S+I;

WriteLn(S);

2) S-0;

Forl:=l to 10 Do S:=S + I Div 5;

WriteLn(S);

3) 5:='Абракадабра';

Forl:=l toLength(S)Do IfCopy(S, l,l)='a'Then

Be. gin

Delete(S, I,l);

Insert('6',SJ);

End;

WriteLn(S);______________________________________________

§13. Цикл с предусловием

Синтаксическое оформление цикла с предусловием. Циклов ПОКА существует два вида:

Цикл с предусловием

• Цикл с постусловием.

Рассмотрим вначале цикл с предусловием. Называется этот цикл так потому, что сначала проверяется условие, а затем выполняется тело цикла. То есть для исполнения тела цикла необходимо выполнение условия (истинность условия).

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

While <условие> Do <оператор>;

Если в теле цикла более чем один оператор, их нужно заключить в операторные скоб­ки:

While <оператор> Do Begin

Операторы тела цикла> End;

Работу данного цикла можно представить на следующем фрагменте блок-схемы.

Выполнение цикла с предусловием:

• проверяется условие,

• если условие истинно, выполняется тело цикла и снова переход на проверку условия, иначе выход из цикла.

Внимание!

J 1. Цикл не выполнится ни разу, если условие сразу ложное.

2. Цикл не закончится, если условие всегда истинно.

3. Заранее количество повторений цикла не известно, так как выход происходит по невыполнению условия.

Нетрудно заметить, что блок-схема очень похожа на предыдущую для цикла с пара­метром. Поэтому цикл с предусловием называют еще универсальным. 1:=1;

Step^l;

While K=N do ' Begin I:=I+Step;

End;

Запись, правда, довольно длинна, но зато нет ограничений на шаг (т. е величину) и тип параметра.

Примеры решения задач.

1. Вводится последовательность чисел, заканчивающаяся 0. Определить сумму вве­денных чисел.

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

ReadLn(X); {Ввод числа} S:=S+X; {Увеличение суммы}

Но в той задаче мы знали количество членов последовательности, поэтому восполь­зовались циклом с параметром, в данной задаче количество членов последовательности заранее неизвестно, поэтому цикл с параметром использовать нельзя. Но из условия за­дачи нам известно, что последовательность заканчивается 0, то есть мы будем вводи ть числа (цикл будет работать) до тех пор ПОКА ХоО. Цикл в этом случае будет выглядеть следующим образом:

While XoO Do Begin Write(' Введите число (0 - конец ввода)');

RcadLn(X);

S:-=S+X;

End;

Обратите внимание на то, что на конец цикла влияет не количество членов последова­тельности, а ввод нуля; начальное значение суммы должно равняться 0. Окончательно программа выглядит так:

Var

X, S:Integer;

Begin S-0;

WriteLn('BBeAHTe первое число');

ReadLn(X);

IfXoO Then S:=S+X;

While XoO Do Begin Write(' Введите число (0 - конец ввода)');

ReadLn(X);

S-S+X;

End;

WriteLnC Сумма чисел = \S);

ReadLn;

End.

2. Вводится последовательность чисел, заканчивающаяся 0. Определить произведение введенных чисел.

Var

X, P:Real;

Begin P:=l;

WriteLn('Bвeдитe первое число');

ReadLn(X);

IfXoOThenP:=P*X;

While XoO Do

Begin

Write(' Введите число (0 - конец ввода)');

ReadLn(X);

If XoO Then P:=P*X; { Иначе произведение занулится }

End;

WriteLn(' Произведение чисел = ',Р:4:1);

ReadLn;

End.

3. Заменить в предложении одну подстроку на другую.

Решение. Var

S, Sl, S2:String;

K:Byte;

Begin

WriteLn(' Введите предложение');

ReadLn(S);

WriteLn(' Введите 1 подстроку');

ReadLn(Sl);

WriteLn(' Введите 2 подстроку');

ReadLn(S2);

K:=l;

While Pos( Sl, Copy(S, K, Length(S) )) > 0 Do

Begin

Begin

WriteLn(X: 10:2,Sin(x): 10:2);

X:=X+Step;

End;

WriteLn(B: 10:2,Sin(B): 10:2);

ReadLn;

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4