- •Язык программирования паскаль
- •Литература
- •1. Понятие о структурном программировании
- •1.1Особенности написания программ
- •1.2Алгоритм и его свойства
- •1.3Блок-схема
- •2.Общие сведения о языке программирования паскаль
- •2.1Название языка Паскаль
- •2.2Алфавит языка Паскаль
- •2.3Типы данных
- •2.4Перечисляемые типы данных
- •2.5Арифметические операции. Функции. Выражения
- •2.6Основные математические функции
- •2.7Структура программы
- •3.Текстовый режим работы в системе Паскаль
- •4.Основные операторы языка Паскаль.
- •4.1Оператор ввода данных с клавиатуры
- •4.2Оператор вывода данных на экран
- •4.3Оператор присваивания.
- •4.4Составной оператор и пустой оператор
- •4.5Оператор условного перехода
- •If условие then оператор;
- •4.6Оператор выбора варианта
- •4.7Оператор безусловного перехода
- •4.8Операторы цикла(повторения)
- •5.Массивы
- •6.Процедуры и функции
- •7.Строки
- •8.Особенности графики
- •8.1Переход в графический режим и возврат в текстовый
- •8.2Начало и окончание программы для работы с графикой:
- •8.3Рисование контурных геометрических изображений.
- •8.4Рисование закрашенных изображений.
- •8.5Вывод текста на графический экран
- •8.6Очитска экрана, тип и толщина линии
- •8.7Смещение в точки и смещение на вектор
- •8.8Иммитация движения
- •8.9Элементы мультипликации
- •8.10Построение графиков математических функций
- •8.11Работа с фрагментами изображения
- •8.12Управление видеостраницами
5.Массивы
При описании массива (таблица) указывается число его компонент, и это число остается постоянным. Для реализации прямого доступа к любой компоненте массива используются специальные обозначения. Все компоненты массива имеют общее имя – имя массива. Указание на конкретный элемент массива осуществляется с помощью индексов. Обозначение компоненты массива имеет вид:
имя массива [индекс, индекс,..., индекс].
k[1,4,2].
Количество индексов в обозначении компонент массива определяет размерность массива. Массив описывается в разделе описания переменных. При этом описание массива включает описание типа массива и типа индексов. Для описания используется конструкция
имя массива: array [1..40] of тип;
k: array [1..50] of real;
Одномерный массив k. Индексы изменяются от 1 до 50. Элементы массива имеют вещественный тип и будут обозначаться k[8], k[14]. Для обозначения типа индекса в этом описании использован отрезочный тип данных. Этот тип не относится к стандартным, может образовываться непосредственно программистом. Описание этого типа задается с помощью констант, разделенных двумя точками: 1..50. Первая константа указывает нижнюю границу отрезка, а вторая – его верхнюю границу. Переменная, относящаяся к этому типу (в нашем случае переменная, обозначающая индекс массива), должна принимать значение того же типа, что и границы отрезка (integer). Причем эти значения должны принадлежать указанному отрезку. Если же значение переменной отрезочного типа выходит за пределы указанного отрезка, то возникает ошибка. Границы отрезка в описании переменной отрезочного типа не могут быть вещественного типа. Если компоненты массива имеют более одного индекса, то в описании массива должен быть описан тип каждого индекса.
matr:array [1..10,1..4] of real;
mat [1..4];
Тот факт, что элементы массива имеют явное обозначение, делает их равнодоступными в любой момент выполнения программы, но это налагает определенные ограничения на использование типа памяти ЭВМ. Обычно для этих целей используется основная память ЭВМ, которая называется памятью с произвольной выборкой, т. к. время выборки и записи информации в такой памяти одинаково для всех ее ячеек. Поэтому, если массив находится в основной памяти, его компоненты одинаково доступны. Однако, если массив так велик, что не вмещается в основной памяти, его хранят в виде отдельного файла на периферийных устройствах. Для обработки же вызывают в основную память ту часть массива, которая может там разместиться.
Пусть одномерный массив описан в разделе описания переменных так:
var
vector:array[1..50] of real;
Тогда ввод начальных значений компонент этого массива может быть представлен:
for k:=1 to 50 do read(vector[k]);
Приведенный фрагмент программы плох тем, что он годится только для ввода таких массивов, которые содержат ровно 50 компонент Если же программа должна быть написана для работы с массивом, который при каждом новом исполнении программы может иметь другое число компонент, то целесообразно описать этот массив в разделе описаний переменных как массив с максимально возможным кол-вом компонент. Предположим, что кол-во компонент массива не может быть больше 100. Это может быть записано так:
program wwod;
uses crt;
const m=100;
var vector:array [1..m] of real;
k:integer;
BEGIN
clrscr;
for k:=1 to m do read (vector[k]); {ввод массива с клавиатуры}
END.
или так:
program wwod;
uses crt;
const m=100;
var vector:array [1..m] of real;
k:integer;
BEGIN
clrscr;
randomize;
for k:=1 to m do vector[k]:=random(50)-20 ; { массив задан случайным образом}
writeln(‘задан массив’);
for k:=1 to m do write( vector[k]:8:2);writeln;
END.
Задача. Найти максимальный элемент одномерного массива и его номер. Число элементов массива меньше 100.
program maxelem;
const k=100;
var
x:array [1..k] of real ;
max:real;
n,i,jmax:1..k;
BEGIN
write ('введите размерность массива n ');
readln (n);
for i:=1 to n do
begin
write('введите х[',i,'] ');
readln (x[i]);
end;
max:=x[1];
jmax:=1;
for i:=2 to n do
if x[i]>max then
begin
max:=x[i];
jmax:=i;
end;
writeln('максимальный элемент', max:6:2);
writeln('индекс ', jmax);
END.
Задача. Определим количество элементов одномерного массива, больших среднего арифметического его положительных элементов (обязательно есть такие элементы).
program asd;
const n=20;
var x:array[1..n] of integer;
k,s,i:integer; u:real;
BEGIN
randomize;
for i:=1 to n do
begin x[i]:=random(40)-15; write(x[i]:7); end;
writeln;
s:=0; k:=0; for i:=1 to n do
if x[i]>0 then begin s:=s+x[i];k:=k+1 end;
u:=s/k;
writeln('cp=',u:7:2);
k:=0; for i:=1 to n do if x[i]>u then k:=k+1;
writeln('ответ ',k);
END.
Задача. Найти максимальный элемент матрицы и его индекс.
program maxelement;
const m=5;n=7;
var
x:array [1..m, 1..n] of real;
max:real;
i,j,c,d:integer;
BEGIN
writeln('размерность матрицы ',m,'x',n);
for i:=1 to m do
begin
writeln('введите через пробел элементы строки ',i);
for j:=1 to n do read (x[i,j]);
end;
max:=x[1,1];
c:=1; d:=1;
for i:=1 to m do
for j:=1 to n do
if x[i,j]> max then
begin
max:=x[i,j];
c:=i; d:=j;
end;
writeln('max строка столбец');
writeln (max:5:2,c:4,d:7)
END.
Дана символьная матрица размера . Требуется получить последовательность из нулей и единиц, в которой тогда и только тогда, когда в -м столбце число символов * не меньше числа "!".
program aaa;
const m=3;n=4;
type matr=array[1..m,1..n] of char;
var
s:matr;
i,j,k,c:integer;
b:array[1..n] of char;
BEGIN
for i:=1 to m do
for j:=1 to n do
begin
writeln ('ww s[',i,' ',j,']');
readln (s[i,j]);
end;
writeln; вывод в виде матрицы на экран
for i:=1 to m do
begin
for j:=1 to n do write (s[i,j]:3);
writeln;
end;
writeln;
for j:=1 to n do
begin
k:=0; c:=0;
for i:=1 to m do
if s[i,j]='*' then k:=k+1
else if s[i,j]='!' then c:=c+1;
if k>=c then b[j]:='1' else b[j]:='0';
end;
for j:=1 to n do write (b[j]:7);
writeln;
END.
Работа с массивами.Одномерные массивы
Задание 1. Составьте программу вычисления значения выражения:
где х может принимать следующие значения {1; 2.3;5;6.1}
По условию задачи х[1]=1, х[2]=2.3, х[3]=5, х[4]=6. Для вычисления выражения необходимо вначале ввести данные с клавиатуры и найти сумму синусов заданного значения х.
program zzz;
const n=4;
var x:array[1..n] of real;
i:integer; s,z:real;
BEGIN
for i:=1 to n do
begin
writeln('vvetite x[',i,']');
readln(x[i]);
end;
s:=0;
for i:=1 to n do s:=s+sin(x[i]);
z:=2+s;
writeln('z=',z:7:3);
end.
Задание 2. Определите среднее геометрическое элементов одномерного массива, предшествующих первому неположительному числу.
Элементы массива зададим случайным образом.
Средним геометрическим из n чисел называется корень n-ой степени из произведения всех n чисел.
Чтобы решить эту задачу необходимо знать номер первого неположительного элемента (т.е. элемента >=0). Есть много способов решения этой подзадачи, но мы рассмотрим один из простейших: поиск элемента с заданными свойствами будем осуществлять, рассматривая массив не с начала, а с конца.
program zzz1;
uses crt;
const n=10;
var x:array[1..n] of real;
i,c:integer; s,z:real;
BEGIN
clrscr;
randomize;
writeln('Здан массив:');
for i:=1 to n do
begin
x[i]:=random(20)-15;
write(x[i]:5);
end;
writerln;
c:=0;
for i:=n downto 1 do
if x[i]<=0 then c:=i-1;
if c=0 then writeln('неположительных элементов нет или этот элемент первый ')
else
begin
p:=1;
for i:=1 to c do p:=p*x[i];
z:=exp(1/c*ln(p));
writeln('z=',z:7:3);
end;
readln;
end.
Задание 3. Дано натуральное число n, целые числа а1,а2, …, аn. Найти наименьшее из чисел кратных 3 в последовательности а1,а2, …, аn.
program zzz1;
uses crt;
const n=10;
var a:array[1..n] of integer;
i,min:integer; p,z:real;
BEGIN
clrscr;
randomize;
writeln('dan massiv:');
for i:=1 to n do
begin
a[i]:=random(20)+4;
write(a[i]:5);
end;
writeln;
min:=0; \Находим любой элемент
for i:=1 to n do \ кратный 3, чтобы было с чем
if a[i] mod 3=0 then min:=a[i]; \ сравнивать для нахождения min
if min=0 then writeln('нет элементов кратных 3')
else
begin
for i:=1 to n do
if (a[i] mod 3=0) and (a[i]<min) then min:=a[i];
writeln('min=',min);
end;
readln;
end.
Матрицы
Задание 4. Определите сумму всех положительных элементов матрицы А, если
program zzz1;
uses crt;
const m=3; n=5;
var a:array[1..m,1..n] of real;
i,j:integer; s:real;
BEGIN
clrscr;
randomize;
writeln('dan massiv:');
for i:=1 to m do
begin
for j:=1 to n do
begin
a[i,j]:=5*sin(i)-j*j;
write(a[i,j]:9:2);
end;
writeln;
end;
s:=0;
for i:=1 to m do
for j:=1 to n do
if a[i,j]>0 then s:=s+a[i,j];
writeln('summa ', s:9:2);
readln;
end.
Задание 5. В каждой стоке данной квадратной целочисленной матрицы определите количество отрицательных элементов.
program zzz1;
uses crt;
const m=3; n=5;
var a:array[1..m,1..n] of integer;
b:array[1..m] of integer;
i,j,k:integer; p,z:real;
BEGIN
clrscr;
randomize;
writeln('dan massiv:');
for i:=1 to m do
begin
for j:=1 to n do
begin
a[i,j]:=random(100)-20;
write(a[i,j]:5);
end;
writeln;
end;
for i:=1 to m do
begin
k:=0;
for j:=1 to n do
if a[i,j]<0 then k:=k+1;
b[i]:=k;
writeln('в строке ', i, ' отрицательных элементов ', b[i]);
end;
readln;
ЕND.
Задание 6. В каждом столбце данной квадратной вещественной матрицы определите сумму модулей всех элементов.
program kk;
const n=2; m=3;
var A:array[1..n,1..m] of real;
B:array[1..m] of real;
i,j:integer;
BEGIN
for i:=1 to n do {ввод матрицы с клавиатуры}
for j:=1 to m do
begin
write('введите A[',i:2,',',j:2,'] ');
readln(A[i,j]);
end;
for i:=1 to n do {вывод матрицы}
begin
for j:=1 to m do write(A[i,j]:7:2);
writeln;
end;
for j:=1 to m do {если работаем со столбцами, то внешний }
begin { идет по переменной j}
D:=0;
for i:=1 to n do D:=D+abs(A[i,j]);
B[j]:=D;
writeln('сумма столбца',j,'=',B[j]:7:2);
end;
END.
Задание 7. Определите наибольший элемент в заштрихованной области:
Для решения задачи расмотрим следующие свойства матрицы.
-
i j
1 2 3 4
1
2
3
4
а11 а12 а13 а14
а21 а22 а23 а24
а31 а32 а33 а34
а41 а42 а43 а44
Составим две соответствующие таблицы: в первой разность индексов, а во второй сумму индексов элементов матрицы
i - j |
i + j |
0 -1 -2 -3 1 0 -1 -2 2 1 0 -1 3 2 1 0
|
2 3 4 5 3 4 5 6 4 5 6 7 5 6 7 8 |
Из анализа этих таблиц видно, что:
- если элемент матрицы на главной диагонали, то i-j=0
- если элемент матрицы выше главной диагонали, то i-j<0
- если элемент матрицы ниже главной диагонали, то i-j>0
- если элемент матрицы на побочной диагонали, то i+j=n+1
- если элемент матрицы выше побочной диагонали, то i+j<n+1
- если элемент матрицы ниже побочной диагонали, то i-j>n+1
(n – размерность матрицы, в нашем случае n=4)
Тогда условия принадлежности заштрихованным областям:
левому треугольнику -- (i-j>=0) and (j+i<=n+1)
правому треугольнику -- (i-j<=0) and (j+i>=n+1)
Для примера рассмотрим матрицу А
1 11 4 7
5 9 2 10
7 6 4 2
3 1 4 5
program lo1;
{масcив описан как типизированная константа}
const a:array[1..4,1..4] of integer= ((1,11,4,7), (5,9,2,10), (7,6,4,2),
(3,1,4,5));
var i,j,s:integer;
BEGIN
{вывод матрицы на экран}
for i:=1 to n do
begin for j:=1 to n do write(a[i,j]:5); writeln; end;
s:=a[1,1];
for i:=1 to n do
for j:=1 to n do
if ((i-j>=0) and (j+i<=n+1)) or ((i-j<=0) and (j+i>=n+1))
then if a[i,j]>s then s:=a[i,j];
writeln(‘ответ',s);
END.