Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

С постусловием и предусловием




Основные различия между операторами циклов

1. В операторе цикла с предусловием задается условие работы цикла; в операторе цикла с постусловием - условие выхода из цикла.

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

3. Между REPEAT и UNTIL можно поместить несколько операторов, в операторе цикла с предусловием тело цикла содержит только один оператор (иначе используются операторные скобки BEGIN... END).

ПРИМЕР 1

Написать программу для вычисления величины

для всех n, удовлетворяющих условию

1/(nx)2>a; (x≠0).

Решение

Так как n - в знаменателе, то при увеличении n дробь уменьшается.

Программа будет иметь следующий вид:

{Применение оператора цикла с предусловием}

Var

n:integer;

A,Z,x: real;

Begin

Read(x,a);

n:=1;

z:=0;

while 1/sqr(n*x)>a do {Если при n=1 условие истинно, то z будем увеличивать, иначе – сразу конец цикла и мы попадаем на вывод z}

begin

z:=z+1/sqr(n*x);

n:=n+1

end;

Write(z)

End.

Напишем структурную схему программы:

 


ЗАДАНИЯ

№1. Определить значение переменной S после выполнения следующих операторов:

а) s:=0;

i:=0;

While i<5 do i:=i+1; s:=s+1/i;

б) S:=0;

i:=1;

While i>1 do begin s:=s+1/i; i:=i-1 end;

№2. Вычисление f=10! описать каждым из трех вариантов оператора цикла.

№3. Найти сумму чисел, предшествующих первому отрицательному в последовательности данных чисел. (Должна многократно выполняться процедура ввода read(x).)

№4. Так же, как и в предыдущей задаче, рассмотрим все числа, предшествующие первому отрицательному в последовательности данных чисел. Написать программу, которая позволяет получить те из них, которые лежат в интервале от 1,5 до 2.

№5. Написать программу нахождения среди чисел 1, 1+1/2, 1+1/2+1/3,... первого, большего данного числа a.

№6. Комиссия отбирает студентов в колхоз и на СКЗ по следующему признаку: если студенту нет 18 лет, он едет в колхоз, а если есть - на СКЗ.

а) Сколько из первых 20 студентов, пришедших на комиссию, поедет на СКЗ?

б) Сколько студентов пройдет перед комиссией, прежде чем наберется первый отряд из 20 человек на СКЗ?

№7. Дана последовательность из 70 целых чисел, содержащая ноль. Определить местоположение первого неотрицательного числа в этой последовательности.

№8. Если среди чисел SinXn (n=1,2,...,30) (X?0) есть хотя бы одно отрицательное число, то логической переменной t присвоить значение true, а иначе - значение false.

№9. Дана непустая последовательность различных натуральных чисел, за которой следует 0. Определить порядковый номер наименьшего из них.

№10. Курсор находится на экране в точке с координатами (40,13). Организовать перемещение курсора по экрану, используя клавиши I (вверх), J (влево), K (вниз), L (вправо). (Вместо оператора READ(C) использовать функцию READKEY модуля CRT. Учесть границы экрана.)

6.4. работа с двухмерными массивами.

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

ЗАДАНИЯ

№1. Дана матрица A(4,6). Напечатать элемент, стоящий на пересечении n строки и m столбца.

Примечание. Как же осуществить ввод двухмерного массива? Двухмерный массив - это матрица. Введем сначала первую строку этой матрицы. Элементы первой строки:

а11 а12 а13 ... a16.

В ней первый индекс у элементов - постоянный - равен 1 (номеру строки), а второй - изменяется от 1 до 6 («пробегает» все столбцы первой строки). Следовательно, надо организовать цикл по столбцам (j), чтобы ввести всю первую строку матрицы:

for j:=1 to 6 do

read(a[1,j]);

Но строк у нас 4. Следовательно, первый индекс тоже должен «пробежать» все свои значения от 1 до 4, чтобы можно было ввести все строки матрицы:

for i:=1 to 4 do for j:=1 to 6 do read(a[i,j]);  

При i=1 введем все элементы первой строки. Потом i станет равно 2, и мы введем все элементы второй строки. И т.д., пока не введем всю матрицу.

Процедура read позволяет нам вводить числа как через пробел (и не один!), так и через <Enter>. Поэтому, организовав такой ввод, мы можем вводить матрицу в привычном для нас виде, например:

3 5 7 -8 4 100

-3 4 1 0 3 5

0 0 1 -1 2 –6

4 6 1 0 4 1.5

Таким образом можно ввести любую матрицу. Советуем Вам ввод матрицы выделить в рамочку, как это сделано выше, и хорошо запомнить!

№2. Дано: матрица А(5,3); Х. Если Х>0, то элементы четвертой строки матрицы увеличить в два раза.

Примечание. Вывод матрицы аналогичен вводу. Если мы напишем, например, так:

for i:=1 to 5 do

for j:=1 to 3 do

writeLN(a[i,j])

то матрица будет выводиться по строкам (т.е. при i=1 (1 строка) j «пробегает» все значения от 1 до 3 (все столбцы) и т.д.), но вывод элементов этой матрицы будет осуществлен в столбик (по одному элементу в строке экрана), т.к. стоит LN. Если убрать LN, т.е. написать просто WRITE, то элементы будут выводиться в строку (пока позволит длина строки экрана). Как же сделать, чтобы они выводились в виде матрицы? То есть нам надо, чтобы машина вывела одну строку матрицы, а затем выполнить перевод курсора на следующую строку, чтобы новая строка матрицы выводи­лась с новой строки. Перевод на новую строку у нас должен осуществляться во внешнем цикле (по i). Следовательно, после вывода одной строки (т.е. после отработки цикла по j) надо поставить WRITELN. Тогда операторы, осуществляющие вывод матрицы (цикл), приобретают следующий вид:

for i:=1 to 5 do

for j:=1 to 3 do

write(a[i,j]);

writeln

Но это еще не все. Последний оператор (WRITELN) стоит за телом циклов и, следовательно, будет выполняться один раз. А нам надо, чтобы перевод строки (WRITELN) стоял во внешнем цикле. Значит, раз нам надо выполнить более одного оператора в цикле, мы эти операторы должны заключить в операторные скобки:

for i:=1 to 5 do

begin

for j:=1 to 3 do

write(a[i,j]);

writeln

end

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

-5.4189222353E+01 1.5933608403E+00 2.6595828123E+00

-6.4226175728E+01-4.9656302622E+01-5.6398568978E+01

1.4007135108E+01 2.1996811428E+01-5.6369144702E+01

-5.3711999441E+00-3.9245778788E+01-4.2954834620E+01

-5.8254164038E+01-1.8887273339E+01-1.9566185586E+01

Как мы видим, в строках между значениями практически нет пропусков. Это не очень удобно. Если мы используем формат для вывода результатов, то мы получим более удобочитаемый вид. Например, следующий вывод:

for i:=1 to 5 do Begin for j:=1 to 3 do write(a[i,j]:10:2); writeln end  

нам даст уже такой вид выводимой информации:

-80.00 -76.86 6.10

-59.74 -52.71 -12.83

-48.13 -63.82 -42.78

-37.43 -71.80 -32.52

-72.94 4.09 -74.03

Советуем Вам выделить вывод матрицы в рамку, как это сделано выше, и хорошо запомнить!

№3. Определить сумму элементов шестой строки матрицы А(10,11).

№4. Дана матрица А(10,4). Вывести на печать минимальный элемент восьмой строки.

№5. Дана матрица А(12,5). Определить вектор В, каждый элемент которого может быть получен как сумма соответствующих элементов первого и последнего столбцов.

№6. Переставить местами элементы второго и четвертого столбцов в матрице С(10,10).

ПРИМЕР 1

Определить сумму элементов матрицы Х(10,5).

Решение

Определим сумму элементов одной (первой) строки матрицы. Первый индекс не изменяется, второй - изменяется от 1 до 5.

s:=0;

for j:=1 to 5 do

s:=s+x[1,j];

Но нам надо найти сумму по всем строкам, т.е. первый индекс тоже должен изменяться. Строк 10, значит, первый индекс изме­няется от 1 до 10:

S:=0;

for i:=1 to 10 do

for j:=1 to 5 do

S:=S+X[i,j];

Вся программа будет иметь вид:

Var

X:array[1..10,1..5] of real;

i,j:integer;

S:real;

Begin

for i:=1 to 10 do

for j:=1 to 5 do

Read(X[i,j]);

S:=0;

for i:=1 to 10 do

for j:=1 to 5 do

S:=S+X[i,j];

Writeln(S)

End.

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

 

 


Ввод массива (если вводится весь массив) допускается оформлять в схемах и так:

 
 

 


Тогда схема примет следующий вид:

 


ЗАДАНИЯ

№7. Определить максимальный элемент матрицы А(10,4).

№8. Все элементы первого столбца матрицы А(7,8) вычисляются по формуле

Остальные элементы вычисляются по формуле

Напишите программу для вычисления значений элементов матрицы.

№9. Вывести на печать элементы строки и столбца, на пересечении которых находится минимальный элемент матрицы Х(7,8).

№10. Вычислить

№11. Вычислить

Все элементы массивов X и Y положительные.

7. ПОИСК И СОРТИРОВКА ЧИСЛОВЫХ ДАННЫХ

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

ПРИМЕР 1

Упорядочить массив Х(50) по убыванию значений элементов.

Решение

Нам надо найти максимальный элемент и поставить его на первое место, а первый элемент поставить на место максимального. Потом, начиная со второго элемента, ищем максимум и меняем со вторым элементом и т.д. Последний раз будем искать максимальное число из последних двух элементов. Следовательно, эти операции надо повторять 49 раз при J, изменяющемся от 1 до 49.

Var

x:array [1..50] of real;

nmax,j,i:integer;

b,max:real;

Begin

for i:=1 to 50 do

Read(x[i]);

for j:=1 to 49 do

begin

nmax:=j;

max:=x[j];

{Первый раз j=1 } for i:=j+1 to 50 do

{Ищем максимум, } if max<x[i] then

{который будет } begin

{стоять на } nmax:=x[i];

{первом месте } nmax:=1 {Номер надо}

end; {запоминать для}

b:=x[j]; {того, чтобы знать,}

x[j]:=x[nmax]; {какие элементы нам}

x[nmax]:=b {надо менять местами}

end;

for i:=1 to 50 do

Writeln(x[i])

End.

ЗАДАНИЯ

№1. Для одномерного числового массива Х из n элементов определить сумму элементов, стоящих на четных местах.

№2. Для одномерного числового массива Y из m элементов определить количество неположительных элементов массива.

№3. Для одномерного числового массива Y из 20 элементов определить количество элементов, кратных заданному числу.

№4. Для одномерного числового массива F из 10 элементов определить количество отрицательных четных элементов.

№5. Для одномерного числового массива R из 15 элементов определить количество элементов, попадающих в интервал [54,67].

№6. Для одномерного числового массива R из 25 элементов составить другой массив W, состоящий из всех отрицательных элементов исходного массива.

№7. Проверить, строго ли чередуются положительные и отрицательные элементы в одномерном числовом массиве G.

№8. Проверить, равны ли все суммы двух элементов, равноотстоящих от концов одномерного числового массива.

№9. В одномерном числовом массиве заданной длины переставить элементы в обратном порядке.

№10. Упорядочить массив K(65) в порядке возрастания.

№11. Из элементов одномерного числового массива сформировать два массива так, чтобы элементы каждого массива принадлежали к заданным интервалам числовой оси.

№12. Из элементов двух упорядоченных одномерных массивов разной длины сформировать один одномерный упорядоченный массив, содержащий все элементы исходных массивов.

№13. Для двухмерного числового массива А(5,6) найти максимальный элемент и его индексы.

№14. Для квадратной матрицы определить сумму элементов, расположенных выше главной диагонали.

№15. Для квадратной матрицы определить количество положительных элементов, расположенных на побочной диагонали.

№16. Из элементов двухмерного числового массива сформировать одномерный массив, состоящий из максимальных элементов строк исходного массива.

№17. Из элементов двухмерного числового массива сформировать одномерный массив, состоящий из минимальных элементов столбцов исходного массива.

№18. Из элементов двухмерного числового массива D(9,10) сформировать одномерный массив, элементы которого являются суммами элементов столбцов исходного массива.

№19. Из элементов двухмерного числового массива N(6,7) сформировать одномерный массив Q, элементы которого являются суммами элементов строк исходного массива.

№20. В двухмерном числовом массиве J(7,8) переставить строки по неубыванию значений первых элементов строк.

№21. В двухмерном числовом массиве W(8,9) переставить столбцы по неубыванию значений первых элементов столбцов.

№22. В двухмерном числовом массиве J(7,8) переставить строки по невозрастанию сумм элементов строк.

№23. В двухмерном числовом массиве W(8,9) переставить столбцы по невозрастанию сумм элементов столбцов.

№24. В двухмерном числовом массиве J(7,8) переставить строки по неубыванию значений наименьших элементов строк.

№25. В двухмерном числовом массиве W(8,9) переставить столбцы по неубыванию значений наименьших элементов столбцов.

№26. В двухмерном числовом массиве J(7,8) переставить строки по невозрастанию значений наибольших элементов строк.

№27. В двухмерном числовом массиве W(8,9) переставить столбцы по невозрастанию значений наибольших элементов столбцов.

№28. Написать программу для определения количества дней от начала года до некоторого дня (включая его), заданного номером месяца от 1 до 12, номером дня в данном месяце от 1 до 31 и номером года от 1980 до 2010. Учесть високосность.

№29. Написать программу, которая по номеру дня (от 1 до 366) от начала года (от 1980 до 2000), определит номер месяца (от 1 до 12) и номер дня в данном месяце (от 1 до 31). Учесть високосность.

№30. Дано: сегодняшняя дата (день, месяц, год), день недели (от 1 до 7), фамилия и дата рождения каждого студента группы (день, месяц, год). Написать программу для определения: в какой день недели родился каждый студент и сколько дней он прожил. Ответ представить в табличной форме. Учесть високосность.

8. РЕШЕНИЕ ЗАДАЧ С ПРИМЕНЕНИЕМ ПОДПРОГРАММ

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

Такие повторяющиеся фрагменты удобно оформлять в виде подпрограмм.

В PASCALe существуют два типа подпрограмм:

1) процедуры;

2) функции.

Этим подпрограммам даются имена, и к ним можно обратиться по этому имени.

процедуры

Так же, как и остальные объекты программы, процедуру перед использованием необходимо объявить. Каждая процедура определяется только однажды, но может использоваться многократно.

ОПРЕДЕЛЕНИЕ процедур и функций (т.е. их место расположения в программе) осуществляется после объявления переменных и перед первым словом BEGIN программы.

Описание процедуры имеет вид:

PROCEDURE имя(список параметров);

Объявления;

Begin

S1;S2;S3;...;Sn

END;

где

имя - имя процедуры;

S1,S2,S3,...,Sn - операторы;

список параметров (это формальные параметры) может отсутствовать (вместе со скобками).

Список параметров имеет вид:

идентификаторы:имя типа;идентификаторы:имя типа;...; идентификаторы:имя типа

либо

Var идентификаторы:имя типа;...;var идентификаторы:

имя типа;...; идентификаторы:имя типа;…;

идентификаторы:имя типа;

либо

Var идентификаторы:имя типа;...; var идентификаторы:

имя типа

Идентификаторы записываются через запятую.

В программе может содержаться несколько описаний различных процедур. Все они располагаются друг за другом.

Примеры описания процедур:

PROCEDURE STR;

PROCEDURE STREL(var a,b,c,d:real);

PROCEDURE UR(a,b,c:real;var S:real);




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


Дата добавления: 2014-12-27; Просмотров: 692; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.107 сек.