Учебное пособие_Алгоритмизация
.pdfНачало
Ввод xn, xk,dx
x = xn
Нет |
Да |
|
|
x > 0 |
|
|
|
|
y = x2+5x |
|
y = ln(x) |
|
|
|
Вывод x, y
x = x + dx
x > xk
Конец
Рис. 28. Блок-схема к примеру 15
50
Задания для самостоятельной работы
1. Разработать алгоритм для вычисления значений функции
|
3 |
, |
t 0, |
(b t) |
|
||
y ln(t 3), |
t 0, |
||
|
|
|
t 0. |
2 сos t, |
|
2. Разработать алгоритм для вычисления значений функции
1 |
x |
, |
|
x |
0, |
|
|
2 |
, 0 |
x 2, |
|
y (x 2) |
|
||||
ln x3 , |
|
x 2. |
|||
|
|
|
|
|
|
|
|
|
|
|
|
3. Разработать алгоритм для вычисления значений функции
|
|
3 |
x, x |
5, |
sin |
|
|||
y 10, |
|
|
x 5, |
|
|
3 |
2, |
x 5. |
|
x |
|
4. Разработать алгоритм программы, которая переводит температуру,
заданную в градусах Цельсия, в фаренгейты или в кельвины (на выбор пользователя).
5. Разработать алгоритм для вычисления значений функции
x, |
x 0, |
y(x 2)2 , 0 x 5,
ln x3 1, x 5.
6.Задан параллелограмм со сторонами a и b и углом α между ними.
Определить тип параллелограмма (квадрат, ромб, прямоугольник), если это возможно.
7. Написать программу, которая выводит таблицу значений функции y = x2 - 8x - 1 в диапазоне от -3 до 3 с шагом 1.
8. Написать программу, которая выводит таблицу значений функции t = |a - 3|, где а изменяется от -5 до 5 с шагом 0,5.
9. Написать программу, которая вычисляет сумму первых n членов ряда
2 + 4 + 6 + 8 + …
10. Написать программу, которая вычисляет сумму первых n целых положительных чисел.
51
11. Разработать алгоритм, который вычисляет |
значение |
y, которое |
||||
|
|
|
|
|
|
|
|
|
y |
x |
|||
соответствует каждому значению x (x = 1, dx = 0,5), |
по формуле |
|
. |
|||
x 2 1 |
Считать y до тех пор, пока подкоренное выражение больше или равно 0,05.
Определить k – количество вычисленных y.
Одномерные массивы
Массив – это структурированный тип данных, состоящий из фиксированного числа элементов, имеющих один и тот же тип.
Элементы одномерного массива задаются именем массива и порядковым номером, например: Х[1]. Для описания массива служат служебные слова array
и of. В программе Турбо Паскаль описать массив можно двумя способами.
Первый способ предусматривает описание переменной в разделе var, например: var
y: array[1..20] of real;
Второй способ связан с вводом нового типа данных и последующим описанием переменных этого типа, например:
type massiv = array[1..15] of word; var a, b: massiv.
Ввод-вывод элементов массива, а также его обработка осуществляются в цикле. Для этого удобнее использовать цикл for …do.
Для того чтобы заполнить массив произвольными числами, используется функция Random (датчик случайных чисел). Диапазон случайных чисел в данном случае включает числа от 0,0 до 1,0. Чтобы изменить диапазон,
необходимо воспользоваться формулой a + (b – a)* Random, где а – левая граница значений, а b – правая. Чтобы получить неповторяющиеся элементы массива используют процедуру Randomize.
Randomize; for i:=1 to n do
a[i]:=-5+10* Random;
52
Рекомендации по решению задач на тему «Массивы» представлены в
табл. 9.
|
|
|
|
|
|
|
|
|
|
Таблица 9 |
||
|
|
|
Обработка одномерных массивов |
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|||
№ |
Формулировка задания |
|
Рекомендации к |
|
Фрагмент программы |
|||||||
п/п |
|
выполнению задания |
||||||||||
|
|
|
|
|
|
|
||||||
1 |
Найти сумму |
элементов |
1. |
Присвоить |
начальное |
s:=0; |
|
|
||||
|
массива А |
|
|
|
|
|||||||
|
|
|
значение сумме S:=0 |
|
for i:=1 to n do |
|
||||||
|
|
|
|
|
|
|||||||
|
|
|
|
2. В теле цикла выполнить |
s:=s+a[i]; |
|
|
|||||
|
|
|
|
команду S:= S + a[i] |
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
Найти |
произведение |
1. |
Присвоить |
начальное |
p:=1; |
|
|
||||
|
элементов массива А |
|
|
|||||||||
|
значение произведения P:=1 |
for i:=1 to n do |
|
|||||||||
|
|
|
|
|
||||||||
|
|
|
|
2. В теле цикла выполнить |
p:=p*a[i]; |
|
|
|||||
|
|
|
|
команду P:=P*a[i] |
|
|
|
|
|
|||
3 |
Найти |
максимальный |
1. Первый элемент массива и |
max:=a[1]; |
|
|
||||||
|
элемент в массиве А и его |
|
|
|||||||||
|
его номер |
запишем |
как |
kmax:=1; |
|
|
||||||
|
номер |
|
|
|
|
|||||||
|
|
|
максимальный |
|
|
for i:=2 to n do |
|
|||||
|
|
|
|
|
|
|
||||||
|
|
|
|
2. |
Все элементы, начиная со |
if a[i]>max then |
|
|||||
|
|
|
|
второго, |
|
сравниваем |
с |
begin |
|
|
||
|
|
|
|
максимальным |
|
|
max:=a[i]; |
|
|
|||
|
|
|
|
3. |
Если |
текущий |
элемент |
kmax:=i; |
|
|
||
|
|
|
|
массива |
оказывается больше |
end; |
|
|
||||
|
|
|
|
максимального, |
|
ему |
|
|
|
|||
|
|
|
|
присваивается |
значение |
|
|
|
||||
|
|
|
|
«максимальный» |
|
|
|
|
|
|||
4 |
Расположить |
|
элементы |
1. Сравним |
первый элемент |
for j:=1 |
to |
n-1 do |
||||
|
массива |
в |
порядке |
|||||||||
|
массива со вторым: если |
for i:=1 to n-j do |
|
|||||||||
|
возрастания их значений |
|
||||||||||
|
первый |
окажется |
больше |
if y[i] > y[i+1] then {Если |
||||||||
|
|
|
|
|||||||||
|
|
|
|
второго, то поменяем их |
элемент |
|
больше |
|||||
|
|
|
|
местами |
|
|
|
|
следующего, |
то |
поменять |
|
|
|
|
|
2. |
Повторить эти |
действия |
их |
|
местами} |
|||
|
|
|
|
для 2-го и |
3-го элементов, |
begin |
|
|
||||
|
|
|
|
3-го и 4-го и т.д. |
|
|
b:=y[i]; |
{Сохранить |
||||
|
|
|
|
3. Для |
преобразования |
n |
значение |
|
текущего |
|||
|
|
|
|
элементов, |
необходимо |
элемента} |
|
|
||||
|
|
|
|
обработать массив n-1 раз, |
y[i]:=y[i+1] {Заменить |
|||||||
|
|
|
|
каждый |
|
раз |
уменьшая |
текущий |
|
элемент |
||
|
|
|
|
диапазон просмотра на один |
следующим} |
|
|
|||||
|
|
|
|
элемент |
|
|
|
|
y[i+1]:=b; |
{Заменить |
||
|
|
|
|
|
|
|
|
|
|
следующий |
|
элемент |
|
|
|
|
|
|
|
|
|
|
текущим} |
|
|
|
|
|
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
|
writeln(„Упорядоченный |
||
|
|
|
|
|
|
|
|
|
|
массив‟); |
|
|
|
|
|
|
|
|
|
|
|
|
for i:=1 to n do |
|
|
|
|
|
|
|
|
|
|
|
|
write(y[i],‟ „); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
53
|
|
|
|
|
Окончание табл. 9 |
|
|
|
|
|
|
1 |
|
2 |
|
3 |
4 |
5 |
Удаление |
элемента |
из |
Записать элемент (m+1) на |
begin |
|
массива (из массива А, |
место элемента m, (m+2) – на |
write ('vvedite n'); |
||
|
состоящего из n элементов |
место (m+1) и т.д. |
readln (n); |
||
|
удалить m-й по номеру |
|
writeln('vvedite m'); |
||
|
элемент) |
|
|
|
readln(m); |
|
|
|
|
|
for i:=1 to n do |
|
|
|
|
|
begin |
|
|
|
|
|
write ('a[',i,']='); |
|
|
|
|
|
readln (a[i]) |
|
|
|
|
|
end; |
|
|
|
|
|
for i:=m to n-1 do |
|
|
|
|
|
a[i]:=a[i+1]; |
|
|
|
|
|
for i:=1 to n-1 do |
|
|
|
|
|
writeln(a[i],' '); |
|
|
|
|
|
readln |
|
|
|
|
|
end. |
Двумерные массивы
Двумерный массив в Паскале описывается аналогично одномерному: var <имя массива>:array[m1..m2, m3..m4] of <тип элементов массива>;
или
type <имя типа>=array[m1..m2, m3..m4] of <тип элементов массива>; var <имя массива>:<имя типа>;
m1, m2, m3, m4 – границы индексов элементов массива.
Ввод двумерных массивов осуществляется поэлементно по строкам: for i:=1 to n do
for j:=1 to m do read(a[i,j] );
Вывод элементов двумерного массива осуществляется по следующей схеме:
writeln (' Матрица А'); for i:=1 to n do
begin
writeln;
for j:=1 to m do
54
write( a[i,j]:6:2, ' ');{Печатается строка}
end;
При решении задач следует помнить следующие свойства матриц:
элемент лежит на главной диагонали, если номер строки элемента совпадает с номером столбца i = j;
элемент лежит ниже главной диагонали, если i > j;
элемент находится выше главной диагонали, если i < j;
элемент лежит на побочной диагонали, если выполняется равенство i + j – 1 = n.
ПРИМЕР 16. Напишите программу, которая вычисляет сумму двумерного массива по столбцам.
Листинг программы: program summa;
var a:array[1..100,1..100] of integer; s:array[1..100] of integer; i,j,n,m: integer;
begin
writeln ('Введите число строк и столбцов'); readln (n, m);
writeln ('Введите массив'); for i:=1 to n do
for j:=1 to m do read(a[i,j]);
writeln ('Введенный массив'); for i:=1 to n do
begin
for j:=1 to m do
write(a[i,j]:4);
writeln;
end;
for j:=1 to m do |
{Для каждого столбца} |
55
for i:=1 to n do s[j]:=s[j]+a[i,j]; {Суммируем элементы одного
столбца}
writeln('___________________');
for i:=1 to m do write(s[i]:4);
writeln;
readln;
end.
Задания для самостоятельной работы
1.Дан массив из N чисел. Определить количество чисел, превышающих число 7. Найти произведение этих чисел.
2.Дан массив вещественных чисел. Найти минимальный элемент массива
иего номер.
3.Дан массив из N чисел. Заменить все его отрицательные элементы 0.
Сформировать новый массив.
4.Дан массив из N чисел. Определить, сколько раз число 2 встречается в массиве. Сформировать новый массив, в котором все 2 заменить на 1.
5.Написать программу, которая вычисляет, сколько раз введенное с клавиатуры число встречается в массиве.
6.Найти минимальный элемент в двумерном массиве и вывести всю строку, в которой он находится.
7.Найти сумму элементов на главной и побочной диагоналях матрицы
A(NxN).
8.Определите, сколько раз число 0.5 встречается выше главной диагонали матрицы.
9.Дана матрица. Заменить 0 элементы на ее главной и побочной диагоналях.
10.Каждый столбец матрицы A(NxN) упорядочить по убыванию.
56
Строки
Строка – это набор символов, заключенных в апострофы, количество которых не превосходит 255.
Описание строк осуществляется следующим образом: var <имя строки> : string [длина строки];
<имя строки> : string;
или
type <имя типа данных> = string [длина строки]; var <имя строки> : <имя типа данных>;
Если в квадратных скобках длина строки не указана, то она по умолчанию равна 255 символам.
Обращение к элементам строк осуществляется следующим образом: st[5];
Строки можно склеивать и сравнивать между собой. Например: st1:=‟Добрый ‟;
st2:=‟ день‟; st:= st1 + st2;
В переменной st хранится строка символов „Добрый день‟.
Сравнение строк происходит слева на право, до первого несовпадения символов. Чем больше код символа в таблице кодов, тем длиннее считается строка („маша‟ > ‟мама‟).
Процедуры и функции, применяемые к строкам
Функция length (st) находит длину строки st.
Функция copy (st, pos, k) копирует подстроку длиной k, начиная с позиции pos строки st.
Процедура delete (st, pos, n) удаляет из строки st n символов, начиная с позиции pos.
Процедура str (x[:f] [:n],st) преобразует числовое значение x в строку st
(возможно задание формата, где f – количество позиций в числе, n – количество позиций после точки).
57
Процедура val (st, x, err) преобразует строковое значение st в числовую переменную x , err возвращает номер позиции, где произошла ошибка при преобразовании, или 0, если ошибки не было.
Подпрограммы в Турбо Паскале
На практике часто встречается, что один и тот же фрагмент программы должен многократно повторяться в процессе ее работы в различных местах.
При этом выполняемые действия совершенно одинаковые, но с различным набором данных, что приводит к различным результатам.
Подпрограмма (ПП) – это группа операторов, предназначенная для многократного использования в основной программе с различными наборами исходных данных.
Обычно в виде ПП оформляют логически завершенные части алгоритма,
имеющие смысловую ценность. Текст ПП записывается только один раз в разделе «Блок описаний» и ему присваивается некоторое имя. В основной программе выполняется только вызов этого участка по его имени.
В Паскале существует два вида подпрограмм: процедуры и функции.
Преимущества использования ПП:
позволяют сократить объем программы;
улучшить структуру программы;
существенно уменьшить вероятность ошибок;
облегчает процесс отладки всей программы целиком;
можно поручить разработку отдельных ПП разным исполнителям.
Главное отличие процедур от функций заключается в том, что результатом последних является одно значение.
Процедуры
Процедура – это особым образом оформленный фрагмент программы,
который можно многократно выполнять с различными входными данными в различных местах общей программы.
Описание процедуры в общем виде выглядит следующим образом:
58
procedure < имя> (<список формальных параметров>); var
{объявление внутренних переменных процедуры}; begin
{операторы процедуры};
end;
Для обращения к процедуре необходимо использовать оператор вызова процедуры. Он имеет следующий вид:
<имя процедуры> (<список фактических параметров>).
Пример процедуры:
Procedure Line (n: integer; c: char);
Var i: integer;
begin
for i:=1 to n do write(c); writeln;
end;
Для вызова процедуры в основной программе используется ее имя:
Line(20, ‘*’);
Line(15, ‘–’);
Line(20, ‘+’);
ПРИМЕР 17. Используя процедуру Line, постройте таблицу
логарифмов чисел от 1 до 10.
program log;
uses crt;
procedure Line(n: integer; c: char);
var i: integer;
begin
for i:=1 to n do write(c);
writeln;
end;
59