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

Задача 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);________________________________

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

Рассмотрим пример: нужно пдсчитать сумму элементов числовой последова­тельности определенной длины. Число элементов последовательности должен задать пользователь. Допустим, 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);______________________________________________








Дата добавления: 2015-12-11; просмотров: 2185;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.038 сек.