Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 1928.pdf
Скачиваний:
4
Добавлен:
30.04.2022
Размер:
2.95 Mб
Скачать

введите a[1]

0

введите a[2]

-5

введите a[3]

-1

введите a[4]

0

введите a[5]

-44

ответ: при таких исходных данных решения у задачи нет

6.1.Задания для самостоятельной работы

1.Вычислить сумму натуральных чётных чисел не больших заданного натурального числа N.

2.Вычислить факториал натурального числа N.

3.Дано натуральное число N. Определить K – количество делителей этого числа, меньших чем само заданное число N (например, для N=12 делители 1, 2, 3, 4, 6. Количество K=5).

4.Дано натуральное число N. Определить, является ли оно простым. Натуральное число N называется простым, если оно делится без остатка только на единицу и на само себя. Число 19 – простое, так как делится только на 1 и 19, а число 12 не является простым, так как делится на 1, 2, 3, 4, 6 и 12.

5.Из N заданных вещественных чисел определить наибольшее число.

6. Целые числа вводятся до тех пор, пока не ввели числ о 0. Найти наименьшее число среди положительных. Если найденный минимум – не единственный (есть повторы), определить, сколько их.

7.Водятся числа до тех пор, пока не введет число 0. Определить среднее арифметическое всех введенных чисел.

8.Водятся числа до тех пор, пока не введет число 0. Вычислить процент положительных и отрицательных чисел.

9.Вводится последовательность из N положительных целых чисел. Найти наименьшее число среди чётных элементов последовательности.

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

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

12.Водятся числа до тех пор, пока не введет число 0. Вычислить среднее значение чётных элементов последовательности.

13.Водится одномерный массив из N произвольных чисел, найти среднее значение отрицательных элементов этого массива.

64

13.Водится одномерный массив из N произвольных чисел, Определить, содержит ли массив хотя бы два соседних одинаковых числа.

14.Водятся числа до тех пор, пока не введет число 0. Найти наибольшее число среди чисел больших, чем заданное число K.

15.Водятся числа до тех пор, пока не введет число 0. Вычислить сумму и количество отрицательных чисел среди введенных.

16.Задан массив из N действительных чисел. Найти сумму положительных и сумму отрицательных элементов этого массива.

17.Задан массив из N элементов. Вычислить, сколько раз элементы в

18.Дано K массивов из N элементов, 2. Определить количество

массивов, элементы которых возрастают.

19. В массиве из N вещественных чисел определить количество простых чисел.

20. Вывести на экран таблицу значений утроенных косинусов в интервале от -B до B с шагом H.

21. Ввести целое положительное число K. Вычислить сумму натуральных нечётных чисел, не превышающих это число и произведение натуральных чётных чисел, не превышающих число K.

22. Ввести целое положительное число K. Вычислить количество натуральных чисел кратных двойке и не превышающих число K.

23. Задано целое положительное число n. Определить значение выражения: = ! .

=1

24.

Задано целое положительное

число n. Определить значение

выражения:

=

 

=1 2

.

 

!

25.

Задано целое положительное число n. Определить значение

выражения:

=

=1 2

 

 

 

 

 

( + 1)! .

26. Задано целое положительное число n. Определить значение выражения: = (=15)!3 .

27. Задано целое положительное число n. Определить значение выражения:

65

 

 

 

 

 

 

 

10

2i .

 

 

 

 

 

 

 

 

 

 

 

 

p =

 

 

 

 

 

 

28.

Задано

целое

положительноеi=0число n. Определить

значение

выражения:

 

 

 

 

 

∑i=515

i

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

число

 

 

 

 

 

 

Составить алгоритм

вывода

29.

Вводится

целое

N,

 

 

,

P = (2n +

1)! .

 

 

 

 

 

.

наименьшего целого числа K, при

 

котором выполняется неравенство

 

 

 

 

 

 

( >

1)

 

алгоритм

вывода

30.

Вводится

целое

число

N,

 

 

.

Составить

 

5 >

 

наибольшего целого числа K, при

котором выполняется неравенство

5 <

.

 

 

 

( >

1)

 

 

 

 

31.Найти минимальное число большее 100, которое нацело делится на 15.

32.Найти минимальное из трех заданных чисел.

33.Найти произведения двух наименьших чисел из трех заданных.

7. ВЛОЖЕННЫЕ ЦИКЛЫ

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

ПЦВШ=НЗ,КЗ

ПЦВТ=НЗ1,КЗ1

ТЦ

Рис. 65. Пример изображения вложенного цикла на блок-схеме

Здесь ТЦ – тело внутреннего цикла.

 

В

пунктирной

рамке

на этом рисунке – тело внешнего

цикла. Здесь могли быть любые базовые алгоритмические структуры (цикл с

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

66

ПЦВШ – параметр внешнего цикла (т.е. счетчик повторений внешнего цикла);

ПЦВТ – параметр вложенного (внутреннего) цикла (т.е. счетчик повторений вложенного цикла);

НЗ,НЗ1 – начальное значение переменной цикла; КЗ,КЗ1 – конечное значение переменной цикла; В Паскале такая конструкция будет описана так:

for ПЦВШ:=НЗ to КЗ do

For ПЦВТ:=НЗ1 to КЗ1 do

ТЦ;

 

А

 

11

12

1 .

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

массива:

 

=

21

22

2

 

 

 

.

.

.

.

Т.е. вычислить:

 

 

1

2

 

 

 

 

для

 

 

 

=

 

= 1, .

 

=1

 

 

 

 

Блок-схема алгоритма разобрана в пособии «Информатика. Основы алгоритмизации», пример 20. Блок-схема без пояснения на рис. 66.

Обозначения:

N – количество строк в заданном массиве;

M – количество столбцов в заданном массиве; i – номер строки в заданном массиве;

j – номер столбца в заданном массиве; A – заданный массив;

S – сумма элементов в каждой строке заданного массива.

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

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

Строчный комментарий обычно комментирует одну строку и начинается с двух бэкслэшей (//). Блочный комментарий способен закомментировать несколько строк одновременно (обозначение {}). Блочный комментарий удобно использовать, если необходимо временно блокировать работу части программного кода при отладке (поиске ошибок) программы.

67

Начало

Ввод N,M i=1,N j=1,M

i=1,N

S=0 Конец

j=1,M

Рис. 66. Блок-схема алгоритма решения задачи примера 20

Вывод: лучше комментировать свой код строчными комментариями, а отлаживать блочными.

Программа: program primer_20;

var i,j,n,m:integer; s:real;

a:array[1..50,1..50] of real; begin

68

writeln('введите количество строк и столбцов в массиве');

readln(n,m);

//ввод массива обход элементов построчный for i:=1 to n do

for j:=1 to m do begin

writeln('введите a[',i,',',j,']'); readln(a[i,j]);

end;

//пропустим (отступим одну) строку в окне вывода writeln;

// вывод массива

writeln('исходная матрица имеет вид'); for i:=1 to n do

//в теле этого цикла два оператора, поэтому открываем операторные скобки

begin

//следующий оператор цикла распечатает все элементы одной строки массива в строку for j:=1 to m do

write(a[i,j]:5:2);

//следующий оператор перенесет курсов ввода не новую строку

writeln; end;

//пропустим (отступим одну) строку в окне вывода writeln;

//цикл повторится для каждой строки заданного массива

for i:=1 to n do

//в теле внешнего цикла несколько операторов, поэтому открываем операторную скобку

begin

// обнуляется сумма элементов в текущей строке s:=0;

69

//во вложенном цикле суммируются все элементы текущей строки (т.е. элементы во всех столбцах выбранной строки

for j:=1 to m do s:=s+a[i,j];

//выводится вычисленный результат

writeln('в ',i,' строке матрицы сумма элементов равна ',s);

// конец тела внешнего цикла, операторная скобка закрывается

end; end.

Окно вывода:

введите количество строк и столбцов в массиве

3 3

введите a[1,1]

1

введите a[1,2]

2

введите a[1,3]

3

введите a[2,1]

4

введите a[2,2]

5

введите a[2,3]

6

введите a[3,1]

7

введите a[3,2]

8

введите a[3,3]

9

исходная матрица имеет вид

1.00 2.00 3.00

4.00 5.00 6.00

7.00 8.00 9.00

в

1

строке

матрицы

сумма

элементов

равна

6

в

2

строке

матрицы

сумма

элементов

равна

15

70

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

Комментарии: Проверку вычислений производим, складывая элементы в каждой строке матрицы вручную.

Пример 21. Найти сумму элементов

 

 

массива А, в котором N строк и M столбцов.

 

= для

=1

 

вкаждом столбце двумерного

=1, .

Обозначения:

N – количество строк в заданном массиве;

M – количество столбцов в заданном массиве; i – номер строки в заданном массиве;

j – номер столбца в заданном массиве; A – заданный массив;

S – сумма элементов в каждом столбце заданного массива.

Блок-схема алгоритма разобрана в пособии «Информатика. Основы алгоритмизации», пример 21. Блок-схема решения задачи без комментариев приведена на рис. 67.

Программа: program primer_21;

var i,j,n,m:integer; s:real;

a:array[1..50,1..50] of real; begin

writeln('введите количество строк и столбцов в массиве');

readln(n,m);

//ввод массива обход элементов построчный for i:=1 to n do

for j:=1 to m do begin

writeln('введите a[',i,',',j,']'); readln(a[i,j]);

end;

//пропустим (отступим одну) строку в окне вывода writeln;

// вывод массива

71

writeln('исходная матрица имеет вид'); for i:=1 to n do

//в теле этого цикла два оператора, поэтому открываем операторные скобки

begin

//следующий оператор цикла распечатает все элементы одной строки массива в строку for j:=1 to m do

write(a[i,j]:5:2);

//следующий оператор перенесет курсов ввода не новую строку

writeln; end;

//пропустим (отступим одну) строку в окне вывода writeln;

//цикл повторится для каждого столбца заданного массива

for j:=1 to m do

//в теле внешнего цикла несколько операторов, поэтому открываем операторную скобку

begin

//обнуляется сумма элементов в текущей строке s:=0;

//во вложенном цикле суммируются все элементы текущего столбца (т.е. элементы во всех строках выбранного столбца)

for i:=1 to n do s:=s+a[i,j];

//выводится вычисленный результат

writeln('в ',j,' столбце матрицы сумма элементов равна ',s);

// конец тела внешнего цикла, операторная скобка закрывается

end; end.

72

Начало

Ввод N,M i=1,N j=1,M

j=1,M

S=0

Конец

i=1,N

Рис. 67. Блок-схема алгоритма решения задачи примера 21

Окно вывода:

введите количество строк и столбцов в массиве

3 3

введите a[1,1]

1

введите a[1,2]

2

введите a[1,3]

3

введите a[2,1]

4

73

введите a[2,2]

5

введите a[2,3]

6

введите a[3,1]

7

введите a[3,2]

8

введите a[3,3]

9

исходная матрица имеет вид

1.00 2.00 3.00

4.00 5.00 6.00

7.00 8.00 9.00

в 1 столбце матрицы сумма элементов равна 12

в2 столбце матрицы сумма элементов равна 15

в3 столбце матрицы сумма элементов равна 18

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

Пример 22.

двумерного массива

где > 0.

Вычислить сумму всех положительных элементов

 

 

= ,

=1 =1

Блок-схема алгоритма разобрана в пособии «Информатика. Основы алгоритмизации», пример 22. Блок-схема без пояснений приведена на рис. 68.

Обозначения:

N – количество строк в заданном массиве;

M – количество столбцов в заданном массиве; i – номер строки в заданном массиве;

j – номер столбца в заданном массиве; A – заданный массив;

S – сумма всех положительных элементов массива.

74

Начало

Ввод N,M i=1,N j=1,M

 

S=0

 

 

i=1,N

 

 

j=1,M

 

нет

 

да

 

 

 

 

Конец Рис. 68. Блок-схема алгоритма решения задачи примера 22

75

Программа: program primer_22;

var i,j,n,m:integer; s:real;

a:array[1..50,1..50] of real; begin

writeln('введите количество строк и столбцов в массиве');

readln(n,m);

//ввод массива обход элементов построчный for i:=1 to n do

for j:=1 to m do begin

writeln('введите a[',i,',',j,']'); readln(a[i,j]);

end;

//пропустим (отступим одну) строку в окне вывода writeln;

// вывод массива

writeln('исодная матрица имеет вид'); for i:=1 to n do

begin

for j:=1 to m do write(a[i,j]:7:2); writeln;

end;

//пропустим (отступим одну) строку в окне вывода writeln;

//обнуляется сумма положительных элементов в массиве (начальный момент времени)

s:=0;

for i:=1 to n do

// во вложенном цикле суммируются все положительные элементы текущей строки for j:=1 to m do

if a[i,j]>0 then s:=s+a[i,j];

//точка с запятой в конце выше приведенного оператора - это конец вложенного цикла по j, а

76

поскольку во внешнем цикле по i один оператор (цикл по j), то эта точка с запятой закрывает и внешний цикл // выводится вычисленный результат

writeln('сумма положительных элементов матрицы равна ',s);

end.

Окно вывода:

введите количество строк и столбцов в массиве

3 3

введите a[1,1]

1

введите a[1,2]

-1

введите a[1,3]

0

введите a[2,1]

3

введите a[2,2]

0

введите a[2,3]

0

введите a[3,1]

-6

введите a[3,2]

1

введите a[3,3]

1

исходная матрица имеет вид

1.00-1.00 0.00

3.00 0.00 0.00 -6.00 1.00 1.00

сумма положительных элементов матрицы равна 6

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

Пример 23. Найти максимальный из положительных элементов двумерного массива.

77

Обозначения:

N – количество строк в массиве;

M – количество столбцов в массиве; i – номер строки в массиве;

j – номер столбца в массиве; A – двумерный массив;

MAX – максимальный из положительных элементов заданного массива. Блок-схема алгоритма разобрана в пособии «Информатика. Основы

алгоритмизации», пример 23. Блок-схема без комментариев приведена на рис. 69.

Программа: program primer_23;

var i,j,n,m:integer; max:real; a:array[1..50,1..50] of real; begin

writeln('введите количество строк и столбцов в массиве');

readln(n,m);

//ввод массива обход элементов построчный for i:=1 to n do

for j:=1 to m do begin

writeln('введите a[',i,',',j,']'); readln(a[i,j]);

end;

//пропустим (отступим одну) строку в окне вывода writeln;

// вывод массива

writeln('исходная матрица имеет вид'); for i:=1 to n do

begin

for j:=1 to m do write(a[i,j]:9:2); writeln;

end;

//пропустим (отступим одну) строку в окне вывода writeln;

//выбираем начальный максимум

78

max:=a[1,1];

for i:=1 to n do

//во вложенном цикле суммируются все положительные элементы текущей строки for j:=1 to m do

if a[i,j]>0 then if a[i,j]>max then max:=a[i,j];

//точка с запятой в конце выше приведенного оператора - это конец вложенного цикла по j, а поскольку во внешнем цикле один оператор (цикл по j), то эта точка с запятой закрывает и внешний цикл

if max>0 then

//выводится вычисленный результат

writeln('максимальный среди положительных элементов матрицы равен ',max) else writeln('при заданных исходных данных задача не имеет решения, нет положительных элементов в массиве');

end.

Окно вывода:

введите количество строк и столбцов в массиве

5 5

введите a[1,1]

1

введите a[1,2]

-2

введите a[1,3]

3

введите a[1,4]

-4

введите a[1,5]

5

введите a[2,1]

0

введите a[2,2]

0

введите a[2,3]

3

введите a[2,4]

-6

79

введите a[2,5]

10

введите a[3,1]

56

введите a[3,2]

100

введите a[3,3]

-300

введите a[3,4]

0

введите a[3,5]

0

введите a[4,1]

1

введите a[4,2]

2

введите a[4,3]

80

введите a[4,4]

44

введите a[4,5]

-76

введите a[5,1]

6

введите a[5,2]

0

введите a[5,3]

3

введите a[5,4]

-8

введите a[5,5]

9

исходная матрица имеет вид

-4.00

5.00

1.00

-2.00

3.00

0.00

0.00

3.00

-6.00

10.00

56.00

100.00

-300.00

0.00

0.00

1.00

2.00

80.00

44.00

-76.00

6.000.00 3.00 -8.00 9.00

максимальный среди положительных элементов матрицы равен

100

80

Начало

Ввод N,M

i=1,N

j=1,M

Ввод

11

i=1,N

j=1,M

 

 

 

элементов в массиве

Вывод MAX

Конец

Рис. 69. Блок-схема алгоритма решения задачи примера 23

81

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

Пример 24. Упорядочить по возрастанию элементы заданного одномерного массива А. В массиве N элементов.

Обозначения:

A – одномерный массив;

N – количество элементов массива;

I – номер упорядочиваемого в текущий момент элемента;

J – номера всех еще неупорядоченных элементов массива; S – вспомогательная переменная.

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

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

Блок-схема алгоритма решения задачи приведена на рис. 70.

Программа: program primer_24;

var i,j,n,m: integer; s:real;

a:array[1..50] of real; begin

writeln('введите количество элементов массива'); readln(n);

//ввод заданного массива

82

for i:=1 to n do begin

writeln('введите a[',i,']'); readln(a[i]);

end;

//выведем введенный массив writeln('исходный массив'); for i:=1 to n do

begin

writeln(' a[',i,']= ',a[i]); end;

//упорядочивание массива по убыванию for i:=1 to n-1 do

for j:=i to n do

if a[i]>a[j] then begin s:=a[i];a[i]:=a[j];a[j]:=s; end;

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

writeln('массив после упорядочивания'); for i:=1 to n do

begin

writeln(' a[',i,']= ',a[i]); end;

end.

Окно вывода:

введите количество элементов массива

5

введите a[1]

10

введите a[2]

0

введите a[3]

-5.5

введите a[4]

-1

введите a[5]

2

исходный массив a[1]= 10 a[2]= 0

83

a[3]= -5.5 a[4]= -1 a[5]= 2

массив после a[1]= -5.5 a[2]= -1 a[3]= 0 a[4]= 2 a[5]= 10

упорядочивания

Начало

Ввод N

i=1,N

Ввод Аi

i=1,N-1 j=i,N

нет Аi ˃ Aj

да

 

 

 

 

=

i=1,N

Конец Рис. 70. Блок-схема алгоритма решения задачи примера 24

84

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

Пример 25. Упорядочить все строки двумерной матрица по возрастанию. Блок-схема алгоритма решения задачи приведена на рис. 71. Обозначения:

А – двумерный массив;

N – количество строк в массиве;

M – количество столбцов в массиве;

I – номер упорядочиваемого элемента в текущей строке. J – номера всех еще неупорядоченных элементов строки; K – номер текущей строки;

S – вспомогательная переменная.

Алгоритм, рассмотренный в примере 24, требуется теперь выполнить в каждой строке двумерной матрицы. Т.е. добавится еще один цикл (по k), который и будет счетчиком строк матрицы.

Программа: program primer_25;

var i,j,n,m,k: integer; s:real;

a:array[1..50,1..50] of real; begin

writeln('введите количество строк и столбцов в массиве');

readln(n,m);

//ввод заданного массива for i:=1 to n do

for j:=1 to m do begin

writeln('введите a[',i,',',j,']'); readln(a[i,j]);

end;

// выведем введенный массив writeln('исходный массив'); for i:=1 to n do

begin

for j:=1 to m do write(a[i,j]:9:2);

85

writeln; end;

//пропустим (отступим одну) строку в окне вывода writeln;

//упорядочивание массива по убыванию for k:=1 to n do

for i:=1 to n-1 do for j:=i to n do

if a[k,i]>a[k,j] then begin s:=a[k,i];a[k,i]:=a[k,j];a[k,j]:=s; end;

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

writeln('массив после упорядочивания');

//выведем введенный массив

for i:=1 to n do begin

for j:=1 to m do write(a[i,j]:9:2); writeln;

end; end.

Окно вывода:

введите количество строк и столбцов в массиве

5 5

введите a[1,1]

4

введите a[1,2]

0

введите a[1,3] -1.1

введите a[1,4]

1.1

введите a[1,5]

7

введите a[2,1]

6

введите a[2,2]

1

введите a[2,3]

10

введите a[2,4]

86

500

 

 

 

 

введите a[2,5]

 

 

 

4.7

 

 

 

 

введите a[3,1]

 

 

 

-6

 

 

 

 

введите a[3,2]

 

 

 

-2

 

 

 

 

введите a[3,3]

 

 

 

-9.8

 

 

 

 

введите a[3,4]

 

 

 

-2

 

 

 

 

введите a[3,5]

 

 

 

-1

 

 

 

 

введите a[4,1]

 

 

 

5

 

 

 

 

введите a[4,2]

 

 

 

5

 

 

 

 

введите a[4,3]

 

 

 

5

 

 

 

 

введите a[4,4]

 

 

 

5

 

 

 

 

введите a[4,5]

 

 

 

5

 

 

 

 

введите a[5,1]

 

 

 

70

 

 

 

 

введите a[5,2]

 

 

 

69

 

 

 

 

введите a[5,3]

 

 

 

-70

 

 

 

 

введите a[5,4]

 

 

 

-69

 

 

 

 

введите a[5,5]

 

 

 

0

 

 

 

 

исходный массив

-1.10

1.10

7.00

4.00

0.00

6.00

1.00

10.00

500.00

4.70

-6.00

-2.00

-9.80

-2.00

-1.00

5.00

5.00

5.00

5.00

5.00

70.00

69.00

-70.00

-69.00

0.00

массив после упорядочивания

4.00

7.00

-1.10

0.00

1.10

1.00

4.70

6.00

10.00

500.00

-9.80

-6.00

-2.00

-2.00

-1.00

87

5.00

5.00

5.00

5.00

5.00

-70.00

-69.00

0.00

69.00

70.00

Начало

 

Ввод N,M

1

i=1,N

j=1,M 1

4

k=1,N

 

 

3

i=1,M-1

 

4

2

j=i,M

 

 

3

нет

 

 

да

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

5

i=1,N

i=1,M

5

Конец

Рис. 71. Блок-схема алгоритма решения задачи примера 25

88