Разработка циклических программ с заданным числом повторений - shikardos.ru o_O
Главная
Поиск по ключевым словам:
страница 1
Похожие работы
Название работы Кол-во страниц Размер
Практическая работа за пк подведение итогов Домашнее задание 1 59.25kb.
Разработка и внедрение программ по борьбе с курением на рабочих местах 1 365.25kb.
Несколько замечаний об этике фокус-групп 1 103.91kb.
Методическая разработка Сценария Ежегодной традиционной встречи молодежи... 1 104.78kb.
Тема: Программирование циклических структур на языке Паскаль 1 80.08kb.
Основные характеристики 1 19.58kb.
«Защита данных на пк от вредоносных программ» 1 41.27kb.
Разработка специального программного обеспечения для сбора и конвертации... 1 64.08kb.
Применение параллельных программ в научных исследованиях и образовании 1 58.03kb.
Программа курса ) 1 курс, бакалавры направление «Прикладная математика... 1 24.68kb.
Сборник учебных программ 13 5769.33kb.
Учебно-методический комплекс по дисциплине «Информационные технологии... 1 82.44kb.
- 4 1234.94kb.
Разработка циклических программ с заданным числом повторений - страница №1/1

Лабораторная работа 3

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

3.1. Цель работы


Целью работы является освоение процесса разработки циклических программ с заданным (известным) числом повторений на языке Turbo Pascal.

3.2. Задание на лабораторную работу


Разработать программу с использованием оператора повтора (цикла) FOR для вычисления заданной величины – суммы N слагаемых – .

3.3. Требования к программе

Программа должна выводить:

сообщения-подсказки перед вводом данных;

сообщение о выводе результатов;

результаты в виде: <Имя_переменной> = <Значение_переменной>.

3.4. Порядок выполнения работы


1. Получить вариант задания (п. 3.6).

2. Изучить правила использования оператора FOR для разработки циклических программ (п. 3.5).

3. Составить и отладить программу вычисления заданной величины (суммы N слагаемых) в соответствии с вариантом задания.

4. Устно ответить на контрольные вопросы (п. 3.8).

5. Оформить отчет.

3.5. Оператор повтора (цикла) FOR


Для программирования циклических вычислительных процессов с известным числом повторений в языке Turbo Pascal предназначен оператор повтора (цикла) FOR. Оператор FOR состоит из заголовка и тела цикла. Синтаксическая диаграмма для данного оператора показана на рисунке 1.

Рисунок 1 – Синтаксическая диаграмма оператор повтора FOR


Как видно из диаграммы, оператор FOR может быть представлен в двух форматах:

For i:=N1 to N2 do S1; ...

или в форме

For i:=N1 downto N2 do <оператор>;...,

где Fordoзаголовок цикла;

i – управляющая переменная дискретного типа (Integer, Char, Boolean и др.); имя переменной может быть любым допустимым идентификатором,

N1, N2 – выражения, определяющие начальное и конечное значения управляющей переменной,

S1 – простой или составной оператор (тело цикла).

При использовании первой формы оператора FOR алгоритм работы следующий:

1) значению управляющей переменной присваивается начальное значение (i:=N1);

2) значение i сравнивается с конечным значением N2; если i <= N2, то выполняется оператор S1, затем переменная i принимает следующее значение из упорядоченной последовательности и п. 2 повторяется, в противном случае (т.е. если i > N2) передается управление оператору, следующему за оператором S1.

При использовании второй формы оператора FOR:

1) значению управляющей переменной присваивается начальное значение (i:=N1);

2) значение i сравнивается с конечным значением N2; если i >= N2, то выполняется оператор S1, затем переменная i принимает следующее значение из упорядоченной последовательности и п. 2 повторяется, в противном случае (т.е. если i < N2) передается управление оператору, следующему за оператором S1.

Ограничения оператора FOR:



  • выражения N1 и N2 должны иметь тип, совместимый с типом управляющей переменной;

  • в теле цикла запрещается изменять значение управляющей переменной;

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

Алгоритм подсчета суммы с использованием цикла с известным числом повторений. При подсчете суммы с использованием цикла с известным числом повторений (оператора FOR) следует обратить особое внимание на:



  1. первоначальное значение суммы

S:=0 – так называемое обнуление;

  1. присваивание значению управляющей переменной i начального значения, выбор конечного значения управляющей переменной;

  2. подсчет суммы в цикле: S:=S+{meкyщee значение};

  3. счетчик i (управляющая переменная увеличивается на единицу от начального значения до конечного значения, т.е. i = i+1, при этом при каждом новом значении i исполняется оператор внутри цикла).

Пример 1. Найти сумму N элементов натурального ряда чисел:



Решение. Блок-схема алгоритма показана на рисунке 2.

Начало


s:=0

s:=s+i


i:=1 to n
Вывод s

Ввод n


Конец

Рисунок 2 – Блок-схема алгоритма к примеру 1









– ввод конечного значения управляющей переменной (здесь – количество элементов натурального ряда чисел);




– начальные условия;







– начало цикла;







– тело цикла;







– конец цикла;










– вывод результата.


















Текст программы может выглядеть следующим образом:

program zadacha1; {вычисление суммы натуральных чисел}

var


n,s,i:integer;

begin


writeln (‘Введите натуральное число N=');

readln (n);

s:=0;

for i:=1 to n do



s:=s+i;

writeln (‘сумма=’, s)

end.

Алгоритм подсчета произведения с использованием цикла с известным числом повторений. При подсчете произведения с использованием цикла с известным числом повторений (оператора FOR) следует обратить особое внимание на:


  1. первоначальное значение произведения

р:=1;

  1. присваивание значению управляющей переменной i начального значения, выбор конечного значения управляющей переменной;

  2. подсчет произведения в цикле:

р:=р* {множитель}.

Классическим примером циклического алгоритма служит алгоритм для вычисления степени числа Y=Xn . Этот алгоритм может быть реализован на основе операции умножения. Например, табличное представление такого алгоритма, отражающего зависимость Y от X при изменении показателя степени n от 1 до 3, представлено в таблице 1. В этой таблице показаны также рекуррентные соотношения между Y и X, определяющие как на каждом шаге зависит значение Y от значения X и от значения Y, вычисленного на предыдущем шаге.


Таблица 1 – Рекуррентные соотношения при вычислении Y=Xn


Y[n]

Рекуррентные соотношения

Y[1]=Х

Y=X

Y[2]=X*X или Y[2]=Y[1]*X

Y=X*X или Y=Y*X

Y[3]=X*X*X или Y[3]=Y[2]*X

Y=X*X*X или Y=Y*X


Пример 2. Вычислить аn (п > 0).

Решение. Входные данные: a – вещественное число, которое необходимо возвести в целую положительную степень n.

Выходные данные: р (вещественное число) – результат возведения вещественного числа а в целую положительную степень n.

Промежуточные данные: i – целочисленная переменная, принимающая значения от 1 до n с шагом 1, параметр цикла.

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

Блок-схема приведена на рисунке 3.

Начало


p:=1

p:=p*a


i:=1 to n
Вывод p

Ввод a,n


Конец

Рисунок 3 – Блок-схема алгоритма к примеру 2









– ввод вещественного числа a и значения степени n;




– начальные условия (для вычисления произведения);







– начало цикла;







– тело цикла (вычисление степени числа a на основе операции умножения числа самого на себя n раз в цикле);




– конец цикла;







– вывод результата.

























Текст программы может выглядеть следующим образом:

var


a,p:real;

i,n:word;

begin .

write ('Введите основание степени а=');



readln (a);

write ('Введите показатель степени n=');

readln (n) ,

р:=1; {начальные условия}

for i:=l to n do

p:=p*a;


writeln ('P=', P:5:2);

readln;


end.

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

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


  1. внутренний (вложенный) цикл должен полностью укладываться в рабочую часть внешнего цикла;

  2. нельзя использовать одну и ту же переменную в качестве параметров внешнего и внутреннего циклов;

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

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

3.6 Определение и использование данных типа "массив"


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

Каждому используемому в программе массиву должно быть дано своё имя. Если массив объявлен, то к любому его элементу (компоненту массива) можно обратиться, указав имя массива и индекс элемента в квадратных скобках. Например: А [1]; B [3,4].

Синтаксическая диаграмма объявления массива показана на рисунке 4.

Рисунок 4 – Синтаксическая диаграмма объявления массива
Данные типа массив в языке Турбо Паскаль определяются следующими правилами:

а)

type



<имя типа данных> = Array[<список типов индексов>] of <тип данных, которые должны содержаться в массиве>;

var <список переменных> : <имя типа данных>;

б)

var


<список переменных>: Array[<список типов индексов>] of <тип данных, которые должны содержаться в массиве>;.

Массивы иметь вид списка (одномерный массив), матрицы (двумерный массив) и т.д. (трех-, четырех-, n-мерный); при этом должны использоваться 1, 2 и т.д. индексов.

Например:

...


type

digit = array [0..9] of char;

{ digit - новый тип данных - "одномерный массив"; 0..9 - тип индекса (диапазонный или ограниченный тип); char - тип данных, которые должны содержаться в массиве}

matrix = array [byte, byte] of real;

{ matrix - новый тип данных - "двумерный массив"; byte - тип индексов}

var


A, B : digit; {A,B - переменные типа digit}

M1, M2 : matrix; {M1,M2 - переменные типа matrix}

Cube : array[1..5, 'A'..'H', boolean] of char;

{ Cube - переменная типа "трехмерный массив" }

...

Доступ к элементам массива для присвоения значений (записи), использования в выражениях и других действиях выполняется с помощью указания индексов элементов; например:



...

readln(A[1]); {ввод с клавиатуры значения элемента 1 массива A}

A[3]:='F'; {присвоение элементу 3 массива A значения 'F'}

M1[i,j]:=M2[j,i]-5.55;{вычисление значения элемента с индексами i,j массива M1}



writeln(M1[k, n]); {вывод на экран значения элемента массива M1}

...


Ввод и вывод значений элементов массивов может выполняться с использованием оператора FOR, например:

writeln('Введите количество элементов массива (не более 10)');

readln(N);

for i:=0 to N do

begin

write(i,'-й элемент:');



readln(B[i])

end;


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

...


writeln('Введите количество элементов матрицы (<= 255 х 255)');

readln(k,n);

for i:=0 to k do

for j:=0 to n do

begin

write(i,' ',j,'-й элемент: ');



readln(M1[i,j])

end;


...

writeln('Результат формирования матрицы');

for i:=0 to k do

begin


for j:=0 to n do write(M2[i,j],' '); {вывод i-й строки}

writeln


end;

...


Пример 3. Вычислить сумму положительных элементов каждой строки матрицы А(10 х 8).

Решение. Для вычисления суммы положительных элементов одной строки матрицы необходимо:

  • организовать цикл с целью перебора всех элементов строки, поэтому параметром этого цикла следует выбрать номер столбца j;

  • перед циклом нужно задать начальное значение суммы S = 0;

  • после окончания цикла результаты необходимо вывести на экран

Примечание: если эти действия повторять во внешнем цикле, изменяя индекс строки i, то будут вычислены все десять сумм.

Схема программы решения этой задачи представлена на рисунке 5. Программа на языке Паскаль имеет следующий вид:



Рисунок 4 –Схема программы к примеру 3
Текст программы может выглядеть следующим образом:






Обработка матриц

Ввод/вывод значений элементов матрицы
1-1 Заполнение элементов матрицы с клавиатуры

program zadacha1;



{ввод - с клавиатуры, вывод - в столбик}

var


а: аrray [1..10,1..10] of real

i, j: integer;

begin

for i: =1 to 10 do



for j: =1 to 10 do

begin


readln (a[i,j]);

writeln (‘a(‘, i, ‘.,’,.j,’)=’, a[i,j]){вывод -в столбик}

епd.
1-2 Пример программы ввода-вывода матрицы


2 Заполнение элементов матрицы по формуле

program zadacha2;

{ввод - по формуле, вывод - таблицей}

var


а: аrray [1..10,1..10] of real;

i, j: integer;

begin

for i: =1 to 10 do begin



for j: =1 to 10 do begin

begin


а[i,j]: = (i+0.5)/(j+sin(j)); {ввод – по формуле}

write (a[i,j], ‘ ‘]) {вывод - таблицей}

епd;

writeln



епd;

епd;


епd.
3 Заполнение элементов матрицы случайными числами

program zadacha3;

{ ввод случайных чисел, вывод - в строчку}

var


а: аrray [1..10,1..10] of integer;

i, j: integer;

begin

randomize; {оператор, позволяющий генерировать новую}



{последовательность случайных чисел при}

{новом запуске программы на выполнение}

for i: =1 to 10 do

for j: =1 to 10 do

begin

а[i,j]: = random (30); {генерация случайного числа от 0 до x-1,



{в данном случае, от 0 до 29}

write (‘a(‘,I, ‘,’,j,’)=’, a[i,j])

епd;

епd.
4 Вывод массива



Варианты вывода массива:


{вывод элементов в строчку через пробел}

{вывод элементов в строчку без пробелов}




{вывод элементов в строчку с указанием номера элемента

(аналогично - в столбец)}



{вывод элементов в столбец}


Типовые задачи на матрицы
1 Суммирование значений элементов матрицы

Дана матрица А(1,15), заполненная датчиком случайных чисел. Найти сумму значений всех элементов данной матрицы.



2 Нахождения количества значений элементов матрицы

Дана матрица А(10,20), заполненная датчиком случайных чисел в диапазоне от -10 до 19 включительно. Подсчитать количество положительных значений элементов каждой строки матрицы.

program zadacha

{кол-во знач. элементов в каждой строке матрицы}

var

а: аrray [1..10,1..20] of integer;



i, j,k: integer;

begin


randomize;

for i: =1 to 10 do

begin

k:=0


for j: =1 to 20 do

begin


а[i,j]: = random (30)-10;

if a[i,j]>0 then k:=k+1

епd;

writeln ('кол-во полож. знач. в', i, ' строке=',k);



епd;

епd.
3 Поиск элементов массива



В одномерном массиве М, состоящем из N целых чисел, найти элементы, значения которых равны заданному числу k .

Исходными данными являются:

  1. массив целых чисел М,

  2. число для поиска k.

Результат:

  1. номера элементов массива, значения которых равны заданному числу.

Схема программы данного примера представлена на рисунке.




Вывод номера элемента,

совпадающего по значению с числом k




Сообщение 1:

Чисел, равных k, в массиве М нет.







Примечание: подобная задача может быть поставлена для двумерных массивов и массивов большей размерности (с использованием при вводе и обработке данных вложенных циклов).
4 Нахождение экстремумов

4-1 Дана прямоугольная матрица А(10,15), заполненная случайными числами в диапазоне от 0 до 29 включительно. Найти максимальное значение элементов данной матрицы.

4-2 В задачах обработки массивов часто встречается необходимость одновременного поиска экстремальных элементов массива (с минимальным и максимальным значениями).

Исходными данными являются:

- массив целых чисел М.



Результат:

  1. минимальный элемент Мin1,

  2. максимальный элемент Мах1.

Схема программы поиска экстремальных элементов массива приведена на рисунке.




5 Суммирование элементов строк матрицы

В матрице М2 подсчитать суммы элементов каждой строки. Cхема программы – на рисунке.









6 Перестановка элементов массива

6-1 Для обмена значениями двух элементов массива необходимо использовать вспомогательную переменную для временного хранения одного из элементов. Схема такого обмена i-го и j-го элементов массива М1 и фрагменты программы, описывающий обмен i-го и j-го элементов массива М1 через вспомогательную переменную K приведены на рисунке.


i=2; j=5;

K:=M1[i];

M1[i]:= M1[j];

M1[j]=K.


6-2 Дан массив А(40), заполненный датчиком случайных чисел. Поменять местами 1-й элемент с последним элементом, 2-ой элемент с предпоследним и т.д.







7 Преобразование матрицы

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

program preobr;

type


matrica=array[l..15,1..15] of real;

var


a:matrica;

i, j,n,m: integer;

s: real;

begin


write' (' Bведите n k m:');

readln(n,m);

for i:=1 to n do ,

for j:=1 to m do

begin

write ('a[‘,i',',',],'] = ');



read (a[i,j]);

end;


writeln ('Исходная матрица:');

for i:=l to n do

begin

for j:=1 to m do



write (a[i,j]:8:3,' ‘);

writeln

end;

for i:=1 to n do



begin

s:=0;


for j:=1 to m do

s:=s+a[i,j]; {вычисление суммы элементов строки}

a[i,1]:=s/m; {присваивание среднего значения элемента первому элементу строки}

end;


writeln ('Преобразованная матрица:');

for i:=l to n do

begin

for j:=1 to m do



write (a[i,j]:8:3,' ');

writeln


end;

end.
8 Формирование нового массива из значений элементов матрицы



8-1 Дана матрица, состоящая из 10 строк и 5 столбцов и заполненная случайными числами в диапазоне от 0 до 29. Сформировать одномерный массив SUM из сумм значений элементов каждого столбца матрицы.



8-2 Написать программу, которая формирует двумерный массив 2 (матрицу B), являющийся «зеркальным отражением» по горизонтали (относительно вертикальной границы) исходного массива 1 (матрица А).

Примечание: данный алгоритм используется в графических редакторах для получения зеркального отражения картинки.

Дано:

Массив 1 Массив 2

11 30 0 25 25 0 30 11

12 8 3 1 1 3 8 12

42 64 8 37 37 8 64 42

7 15 24 22 22 24 15 7



Решение:

Program otr;

USES CRT;

VAR A,B: ARRAY [1..100,1..100] OF INTEGER;

N,I,j:WORD;

BEGIN


CLRSCR; {Очистка экрана}

{----- Ввод размерности массива -----}

REPEAT {цикл с постусловием}

{Повтор ввода размерности N,}

{до тех пор, пока она не войдёт}

{в диапазон 1-100}

WRITE(’Введите размерность массива (1-100): ’);

READLN(N);

UNTIL (N>=2) AND (N<=100) {условие выхода из цикла}

{----- Заполнение исходного массива А -----}

FOR i:=1 TO N DO

FOR j:=1 TO N DO

A[i,j]:=(RANDOM(99));

{----- Вывод исходного массива А-----}

FOR i:=1 TO N DO

FOR j:=1 TO N DO

BEGIN

WRITE(A[i,j]:3);



IF j=N THEN WRITELN

END;


WRITELN;

{----- Формирование массива B -----}

FOR i:=1 TO N DO

FOR j:=1 TO N DO

B[i,N-j+1]:=A[i,j];

{----- Вывод массива B -----}

FOR i:=1 TO N DO

FOR j:=1 TO N DO

BEGIN

WRITE(B[i,j]:3);



IF j=N THEN WRITELN

END;


END.

Комментарии. В описательной части объявлены два одинаковых массива A и B максимальной размерностью 10000 элементов (100×100).

В программе используется:



  1. цикл с пост условием для ввода размерности массива.

Оператор REPEAT нужен, чтобы значение рабочей размерности массивов не вышло за пределы, определённые в описании (до тех пор, пока не будет введено число от 2 до 100, будет происходить запрос на его ввод).

  1. цикл (в цикле) «Заполнение исходного массива А».

В блоке «Заполнение исходного массива А» происходит присвоение элементам исходного массива случайных значений в диапазоне от 0 до 99. Эту задачу выполняет стандартная функция RANDOM.

  1. цикл (в цикле) «Вывод исходного массива А».

Блок «Вывод исходного массива А» выводит сформированный массив A на экран. Вывод производится построчно. Как только выведен последний элемент очередной строки, процедура WRITELN переводит курсор на новую строку экрана.

  1. цикл (в цикле) «Формирование массива B»

Основную работу выполняет блок «Формирование массива B». Каждый элемент исходного массива A записывается в массив B так, чтобы его положение в массиве B было зеркальным по отношению к A. Вычисление необходимого номера столбца массива B происходит по формуле N-j+1, где N – количество столбцов, j – номер текущего столбца массива A.

  1. цикл (в цикле) – вывод на экран сформированного массива B.


3.7. Варианты заданий


1.

  1. Вычислить

  2. Вычислить среднее арифметическое значений элементов массива.

2.

  1. Вычислить

  2. Сосчитать количество элементов матрицы, значения которых не превышают заданное число.

3.

  1. Вычислить

  2. Найти минимальное число в матрице.

4.

  1. Вычислить

  2. Вычислить сумму отрицательных элементов массива.

5.

  1. Вычислить

  2. Найти максимальное число в матрице.

6.

  1. Вычислить

  2. Сосчитать количество неотрицательных элементов массива.

7.

  1. Вычислить

  2. Сосчитать количество отрицательных элементов массива.

8.

  1. Вычислить

  2. Переставить два заданных элемента матрицы.

9.

  1. Вычислить

  2. Вычислить произведение элементов массива.

10.

  1. Вычислить

  2. Сосчитать количество отрицательных элементов матрицы.

11.

  1. Вычислить

  2. Вычислить произведение отрицательных элементов матрицы.

12.

  1. Вычислить

  2. Сосчитать количество элементов массива, значения которых превышают заданное число.

13.

  1. Вычислить

  2. Вычислить сумму положительных элементов матрицы.

14.

  1. Вычислить

  2. Заменить отрицательные элементы массива нулями.

15.

  1. Вычислить

  2. Вычислить сумму элементов каждой строки матрицы.

16.

  1. Вычислить

  2. Переставить две заданных строки матрицы.

17.

  1. Вычислить .

  2. Вычислить сумму элементов каждого столбца матрицы.

18.

  1. Вычислить .

  2. Переставить два заданных столбца матрицы.

19.


  1. Вычислить .

  2. Сформировать массив B содержащий максимальные элементы строк матрицы A.

20.

  1. Вычислить .

  2. Сформировать массив B содержащий суммы элементов строк матрицы A.


3.8. Содержание отчета (см. файл «Оформление_отчета_Pas»).

3.9. Контрольные вопросы


1. Каково назначение оператора цикла FOR?

2. Каковы правила записи оператора цикла FOR?

3. Каковы алгоритмы работы оператора цикла FOR?

4. Какие циклы называются вложенными?

5. Какие ограничения наложены на оператор FOR?

6. Для чего нужны рекуррентные формулы при обработке данных с использованием цикла? Как выглядит (в общем виде) рекуррентная формула для подсчета суммы с использованием цикла с известным числом повторений? Как выглядит (в общем виде) рекуррентная формула для подсчета произведения с использованием цикла с известным числом повторений?

7. Как определяются данные типа "массив"? Запишите примеры определения данных типа массив с использованием разделов type и var (или только var)?

8. Как получить доступ к элементам одно-, двумерного массивов?



9. Как можно организовать ввод (вывод) элементов одно-, двумерного массивов?