- •Министерство образования российской федерации
- •Var X,y: real;
- •Var X,y: real;
- •Var t:integer; p:char;
- •0..17: Write('детство');
- •20..30: Write('молодость');
- •31..54: Write('зрелость');
- •Var s:char;
- • Оператор цикла с предусловием имеет вид
- •Program p5_8;
- •Var y,X,z: integer;
- •Var I,j:integer; X,y,r:real;
- •Var I,j: integer;
- •Var n,I,j:integer; s,y,sr:real; X: array [1..10,1..5] of real;
- •Var I,j,n,m: integer;
- •X:array [1..10] of integer;
- •Var n,I,j,st,kl,k:integer;
- •Var st: char; sm: string[32]; ss: string;
- •Var n:integer;y:string;
- •Var k,I:integer; X: string;
- •Var X:string[1]; d:string; I:integer;
- •Var X:vr; y:array [1..5] of vr;
- •Ввод и вывод информации для типизированных и текстовых файлов производится процедурами:
- •X,y:real;
- •X,y:real; I:integer;
- •Im: string[4];
- •I: integer;
- •Im: string[4];
- •I: integer;
- •Im:string[4]
- •Im:string;
- •Var d,I,m,rx,ry:integer;
- •Var d,m,rx,ry:integer;
- •X,y,xn,xk,ymin,ymax,dx:real;
- •Ответы на тестовые задания, имеющиеся в тексте пособия:
- •& Тесты по курсу
- •Тираж: 150. Заказ №
begin for
x:=0 to 4 do for
z:=0 to 10 do begin
y:=x*x+z;
writeln('x=',x,
'
z=',z,
'
y=',y)
end; end.
PROGRAM
P5_7; uses
crt;
const
e=0.001; {погрешность} begin clrscr;
write(‘введите
Х
’); readline(x); r:=1;
y:=r; i:=1; while
r>e do begin; r:=r*x/i;
y:=y+r; i:=i+1;
writeln(i,'-ый
член=',r:6:4,' Y=',y:6:4); end;
write('exp(x)=',exp(x):8:4)
{проверка} end.
Program p5_8;
Var y,X,z: integer;
Var I,j:integer; X,y,r:real;
В этой функции два аргумента, т.е. она является не плоской кривой, а криволинейной поверхностью. Решение здесь очень простое. Строятся два цикла – внешний (по Х) и внутренний (по Y). Поскольку аргументы и функция целочисленные и шаг равен 1, можно использовать оператор for. В данном случае безразлично, какой параметр поместить снаружи, а какой внутри. Здесь на одно изменение переменной Х произойдет 11 изменений Z.
В следующих заданиях условия целочисленности аргумента и/или шаг=1 не соблюдаются, и для организации циклов придется использовать оператор while.
Задание 5.8. Вычислить функцию
Y=X2+Z для 0≤X≤4 с шагом 1 и 1≤Z≤10 с шагом 2.
Задание 5.9. Вычислить функцию
Y=X2+Z для 0≤X≤4 с шагом 0,5 и 1≤Z≤10 с шагом 2.
6. МАССИВЫ
Как правило, данные для вычислений задаются в упорядоченной форме – в виде последовательности ряда (вектора) чисел или в виде таблицы (матрицы) чисел. Такие совокупности данных называются массивами. Например, вектор А длиной К чисел и матрица В из N строк и M столбцов (всего из NM элементов) выглядят следующим образом.
B11, B12, ... B1M
A=[A1, A2, A3, ... AК] B= B21, B21, ... B2M
. . . . .
BN1, BN2, ... BNM
Построение программ, оперирующих с элементами массивов – важнейшая часть техники программирования.
Цифры при имени массива, указывающие порядковый номер элемента, называются индексами. Элементы массивов Аi и Bij обозначаются как А[I] и B[I,J]. К массиву в целом обратиться нельзя. Обработка массива означает последовательную обработку отдельных его элементов.
Оператор описания массивов. Если предполагается работа с массивами, предварительно следует “известить” об этом компьютер в разделе описаний (VAR) программы. Для одномерного массива это оператор вида
имя_массива: ARRAY [диапазон] OF тип_массива
Например, var x,z: array [1..8] of real; y: array [5..10] of integer; b: array [1..4, 1..5] of integer;
Здесь первый оператор описывает массивы X и Z из 8-ти элементов (с номерами от 1 до 8) вещественного типа. Второй – массив Y из 5-ти элементов (с номерами от 5 до 10) целочисленного типа, третий – двумерный массив B из четырех строк и пяти столбцов.
Var I,j: integer;
for i:=1 to 8 do begin {ввод вектора Х с подсказкой}
write('x[',i,']='); readln(x[i]) end;
for i:=1 to 4 do {ввод матрицы В с подсказкой}
for j:=1 to 5 do begin
write('b[',i,j,']='); readln(b[i,j]);
end;
for i:=1 to 4 do begin {построчный вывод матрицы В}
for j:=1 to 5 do write('b[',i,j,']=',b[i,j]:4:1,' ');
writeln {вывод пустой строки}
end;
Первоочередной задачей при работе с массивами является ввод-вывод данных. Ввод организуется с помощью циклов, как показано ниже. Сначала осуществляется ввод в вектор X. На экране мы увидим, например, подсказку вида х[2]=, после чего можно ввести значение этого элемента. Аналогичную подсказку (b[2,4]=) увидим для матрицы В размерностью 4 строки на 5 столбцов. Ввод осуществляется с помощью двух циклов, один из которых вложен в другой. В наружном цикле изменяется первый индекс I элемента матрицы В, во внутреннем – второй индекс J. Второй индекс J изменяется быстрее, чем первый (на одно изменение I индекс J изменяется 5 раз). Это означает, что ввод элементов матрицы будет производиться в следующей последовательности: B[1,1], B[1,2], ... B[1,5]; B[2,1], B[2,2], ... B[2,5]; ... B[4,1], B[4,2], ...B[4,5], т.е. по строкам. Аналогично осуществляется и вывод, но вместо оператора READLN используется оператор WRITELN. В примере производится вывод данных из матрицы В. Если позволяет ширина экрана, удобно выводить одну строку матрицы на одной строке монитора. Оператор WRITE('b[',i,j,']=', b[i,j]:4:1,' ') выводит данные, например, в виде b[2,3]=25.3. Поскольку оператор WRITE не переводит строку вывода, принудительный переход на новую строку осуществляется пустым оператором WRITELN после того, как строка была полностью выведена.
Начальные значения скалярным переменным и элементам массива (в особенности при отладке) можно задать в разделе констант (начинается со слова const). Например:
const z:array [1..3] of integer=(4,5,2);
x: integer=5;
r:array [1..3,1..2] of integer=((1,2),(3,4),(5,6));
Здесь вектору Z присваиваются значения: z[1]=4, z[2]=5, z[3]=2, переменной х=5, а прямоугольной матрице R: r[1,1]=1, r[1,2]=2, r[2,1]=3, r[2,2]=4, r[3,1]=5, r[3,2]=6.
Пример 6-1. В векторе С предельной размерности 10 элементов найти максимальный по значению элемент и его номер в С по порядку. В программе сделана проверка для N=4 и C=[5,2,7,4] в ее обрабатывающей части. Здесь переменная М запоминает значение максимального элемента, а К – номер этого элемента в векторе С. Первоначально в качестве такого элемента берется самый первый.
PROGRAM P6_1; var i,n,m,k: integer; c: array [1..10] of integer; begin write('n='); readln(n); for i:=1 to n do begin write('i=',i:2,' c='); readln(c[i]); end; |
n=4
|
Проверка |
|
|
m:=c[1]; k:=1; for i:=2 to n do if m<c[i] then begin m:=c[i]; k:=i end; writeln('m=',m:2,' n=',k:1); end. |
m=5, k=1 i=2 5>2 |
i=3 5<7 m=7,k=3 |
i=4 7>4 |
i=5
7, 3 |
Пример 6-2. Определим значения вкладов в банке на конец года. Положим, имеется N счетов вкладчиков. Для всех них известны значения остатков на счете в конце каждого квартала. Следует определить и напечатать значения всех вкладов на конец года с учетом известного процента роста вклада. Все суммы считаем целочисленными (копейки игнорируем). Данные о вкладах хранятся в массиве Х из N строк и пяти столбцов. Первые четыре элемента каждой i-ой строки (Х[i,1], Х[i,2], Х[i,3], Х[i,4]), хранят остатки вклада на конец каждого из четырех кварталов года. В последний, пятый элемент строки X[i,5] следует занести вычисленную величину вклада на конец года, который равен остатку вклада на конец последнего квартала Х[i,4], плюс установленный процент от среднего значения вклада Y=(Х[i,1]+Х[i,2] +Х[i,3]+Х[i,4])/4 за год.
Положим, определено, что на вклад до 5000 предусмотрен процент роста – 10%, на вклад до 10000 – 15%, на вклад свыше 10000 – 20%. Иными словами установлены коэффициенты роста 1.1, 1.15 и 1.2 соответственно. Кроме перечисленного, следует найти сумму всех вкладов в банке S и среднее значение вклада, приходящееся на одного вкладчика (S/N).
PROGRAM P6-2;