End.

advertisement
Практикоориентированные задачи к государственному экзамену по
направлению 230100 «Информатика и вычислительная техника»
профиль «Программное обеспечение средств вычислительной
техники и автоматизированных систем»
1.
Составить программу для нахождения площади лицевой стороны
изделия, образованного соединением из N уменьшающихся квадратов,
имеющих длины сторон A,A/2,...,A/N. Найти также объем и вес изделия, если
известна его толщина и удельный вес материала.
2.
Составить программу, которая записывает в файл информацию о
сотрудниках некоторого предприятия: фамилия, образование, оклад. Вывести
на экран список сотрудников, имеющих высшее образование.
3.
Известны данные о среднемесячной температуре за год. Требуется
составить программу, которая вычисляет среднегодовую температуру, а
также ежемесячные отклонения от этой величины.
4.
Спортсмен начал тренировки по бегу с 3 км и каждый день увеличивал
дистанцию на 500 м. Составить программу, которая определит через сколько
дней спортсмен сможет пробежать 10 км.
5.
Дан пятиэтажный дом, в нем 5 подъездов, на каждом этаже по 4
квартиры. Вводится номер квартиры. Составить программу, которая
выводит этаж и номер подъезда.
6.
Составить программу для расчета заработной платы для сотрудника
учреждения. Оклад, премия, количество детей вводятся пользователем.
Профсоюзный и пенсионный налоги определяются как 1% от оклада,
подоходный налог рассчитывается следующим образом: от величины оклада
вычитается минимальная заработная плат, умноженная на количество детей
плюс единица; от полученного результата берется 13%, что и составляет
величину подоходного налога т.е.
=(оклад-мин.зарп*(кол.дет+1))*13%.
Сумма к выдаче определяется как результат вычитания из оклада величины
всех налогов
7.
Составить программу вычисляющую доход вкладчика от вклада за
указанный период, при использовании простых процентов. Формула
простых процентов по вкладам:
,
где: S — сумма денежных средств, причитающихся к возврату вкладчику по
окончании срока депозита. Она состоит из первоначальной суммы
размещенных денежных средств, плюс начисленные проценты; I – годовая
процентная ставка; t – количество дней начисления процентов по
привлеченному вкладу; K – количество дней в календарном году (365 или
366); P – первоначальная сумма привлеченных денежных средств.
8.
Составить программу, вычисляющую остаточную стоимость и
ежегодную сумму амортизационных отчислений оборудования по способу
суммы лет. Для определения годовой амортизации использовать следующую
формулу:
. Сперв – первоначальная стоимость объекта; Тост –
количество лет, оставшихся до окончания срока полезного использования; Т
– срок полезного использования.
9.
Составить программу для расчета линейным способом месячной суммы
амортизации токарного станка, первоначальная стоимость которого N тыс. р.
Для токарного станка, отнесенного к третьей амортизационной группе,
установленный предприятием срок полезного использования составляет 4
года. Расчет месячной суммы амортизации основных фондов линейным
методом производится по формуле
где:
А – сумма
амортизационных отчислений, р.; Фп – первоначальная стоимость объекта,
р.; На – норма амортизации, %. Норма амортизации по каждому объекту
определяется по формуле
,
где Тп – срок полезного
использования объекта, выраженный в месяцах.
10. Составить программу расчета вводного кабеля и аппаратов защиты на
𝑈ф
термическую стойкость 𝑙к. з. =
где: Uф = максимальное фазовое
𝑍петли +𝑍т
напряжение; Zпетли – полное сопротивление жилы фазы и нулевой жилы; Zт –
полное сопротивление трансформатора при однофазном к.з.
11. Составить программу расчета вводного кабеля на потерю напряжения
∆𝑈 = 1,73 ∙ 𝐼 ∙ 𝐿 ∙ (𝑅 ∙ cos(𝛼) + 𝑋 ∙ sin(𝛼)) где: I – расчетный ток в А; L –
длина в км; R – удельное активное сопротивление в Oм/км; X – удельное
индуктивное сопротивление в Ом/км; Угол α = 0.2.
12. Составить программу вычисляющую доход вкладчика от вклада за
указанный период, при использовании сложных процентов. Формула
сложных процентов выглядит так:
, где: I – годовая
процентная ставка; j – количество календарных дней в периоде, по итогам
которого банк производит капитализацию начисленных процентов; K –
количество дней в календарном году (365 или 366); P – первоначальная
сумма привлеченных в депозит денежных средств; n — количество операций
по капитализации начисленных процентов в течение общего срока
привлечения денежных средств; S — сумма денежных средств,
причитающихся к возврату вкладчику по окончании срока депозита.
13. Разработать структуру базы данных для предметной
области
«Деканат». В базе должна быть отражена следующая информация: номер
студенческого билета, фамилия, имя, отчество студента, размер получаемой
студентом стипендии, наименования учебных предметов, фамилия, имя,
отчество преподавателя, дата сдачи экзамена, экзаменационная оценка,
полученная студентом по дисциплине. База данных должна находиться в 3-й
нормальной форме.
14. Разработать структуру базы данных для предметной
области
«Сотрудники». В базе должна быть отражена следующая информация: номер
договора сотрудника, фамилия, имя, отчество сотрудника, должность
сотрудника, разряд, дата принятия на работу, размер зарплаты, адрес
проживания. База данных должна находиться в 3-й нормальной форме.
15. Разработать структуру базы данных для предметной
области
«Продажи». В базе должна быть отражена следующая информация: код
товара, наименование товара, количество товара, единицы измерения товара,
цена единицы товара, наименование фирмы-производителя, дата продажи и
количество проданного товара, дата закупки и количество закупленного
товара. База данных должна находиться в 3-й нормальной форме.
16. Выбрать из таблицы ZARP (FIO CHAR(15), SUMMA INT) зарплату
сотрудника по фамилии Иванов.
17. Выбрать из таблицы ZARP (FIO CHAR(15), SUMMA INT) сотрудников
у которых зарплата лежит в диапазоне от 1500 руб. до 3000 руб.
18. Выбрать из таблицы ZARP (FIO CHAR(15), SUMMA INT)
сотрудников, упорядочив список по фамилиям.
19. Выбрать из таблицы ZARP (FIO CHAR(15), SUMMA INT)
сотрудников, подсчитав суммарную зарплату и суммарный налог по каждой
фамилии. Налог 20% от суммы.
20. Таблица ZARP (FIO CHAR(15), SUMMA INT). Составить команду
добавления новой записи с указанием конкретной фамилии и сумы.
21. Таблица ZARP (FIO CHAR(15), SUMMA INT), таблица SPISOK (FIO
CHAR(15)). Составить команду добавления в таблицу ZARP из таблицы
SPISOK всех фамилий.
22. Разработать программу вспомогательного модуля вычислительной
системы на языке Ассемблера, реализующую указанную формулу, исполнить
программу с несколькими наборами исходных данных, проверить
правильность результатов. Формула: Х=-4А+(В+С)/4+2
23. Разработать программу вспомогательного модуля вычислительной
системы на языке Ассемблера, реализующую указанную формулу, исполнить
программу с несколькими наборами исходных данных, проверить
правильность результатов. Формула: X = - (С + 2А + 4В + 8)
24. Разработать программу вспомогательного модуля вычислительной
системы на языке Ассемблера, реализующую указанную формулу, исполнить
программу с несколькими наборами исходных данных, проверить
правильность результатов. Формула: Х = (А - В) / 4 - 2С + 5
25. Разработать программу вспомогательного модуля вычислительной
системы на языке Ассемблера. Найти количество отрицательных чисел в
массиве байтов.
Методические рекомендации
Методические рекомендации к задачам №1-12
Линейные программы
Типы переменных в Паскале:
INTEGER – целый тип (диапазон -32768...32767)
REAL – действительный, вещественный тип (диапазон 2.9*10-39...1.7*10+38)
CHAR – литерный, символьный тип
BOOLEAN – логический тип
BYTE – целые числа от 0 до 255
LONGINT – целый тип (диапазон -2147483648... 2147483647)
STRING – строковый тип (от 0 до 255 символов)
Стандартные операции и функции от скалярных данных.
Функция,
операция
A+B
Назначение
Сумма
Тип
переменных
REAL, INTEGER
REAL, INTEGER
A-B
Разность
REAL, INTEGER
REAL, INTEGER
A*B
Произведение
REAL, INTEGER
REAL, INTEGER
A/B
Частное
REAL, INTEGER
REAL
ABS(x)
REAL, INTEGER
REAL, INTEGER
SQR(x)
Абсолютное
значение
Вычисление х2
REAL, INTEGER
REAL,INTEGER
SIN(x)
Нахождение sin x
REAL,INTEGER
REAL
COS (x)
Вычисление cos x REAL, INTEGER
REAL
REAL, INTEGER
REAL
REAL, INTEGER
REAL
LN(x)
Вычисление
arctan x
Вычисление
экспоненты ех
Вычисление ln x
REAL, INTEGER
REAL
SQRT(x)
Вычисление х
REAL, INTEGER
REAL
A div B
Нахождение
ARCTAN(x)
EXP(x)
Тип результата
целой части при
INTEGER
делении А на B
Нахождение
INTEGER
остатка при
делении А на B
Нахождение
REAL, INTEGER
целой части х
Округление х в REAL, INTEGER
сторону
ближайшего
целого
Зарезервированна
я константа
число π
A mod B
TRUNC(x)
ROUND(x)
PI
INTEGER
INTEGER
INTEGER
INTEGER
REAL
Некоторые математические функции, не реализованные в языке
Паскаль
В математике
xn
log b a
tg x
ctg x
В программировании на языке Паскаль
exp(n*ln(x))
ln(a)/ln(b)
sin(x)/cos(x)
cos(x)/sin(x)
ОПЕРАТОРЫ:
Оператор
Readln
Writeln
Read
Write
Назначение
ввод значений с клавиатуры
c переводом курсора на
новую строку
вывод значений на экран c
переводом курсора на новую
строку
ввод значений с клавиатуры
вывод значений на экран
Синтаксис
Readln( перем1, …, перемN)
Writeln('Текст')
Writeln(перем1, ..., перемN)
Read( перем1, …, перемN)
Write('Текст')
Write(перем1, ..,перемN)
ПРИМЕРЫ РЕШЕНИЯ ЗАДАЧ:
Пример:
Составить программу расчета значения функции.
Z = |cos х4 – 3 tg х2 |+0.8 sin yх2+ 10 при любых значениях х и у.
Результат вывести в виде: при х= и у=… z=…
Решение
Используемые переменные: x, y -аргументы, z – значение функции
Program pr1;
Var x,y,z: real;
Begin
writeln('введите X Y');
{вывод строки подсказки}
readln (x,y);
{ввод аргументов x и y}
z:=abs(cos(sqr(x)*sqr(x)-3*sin(sqr(x))/cos(sqr(x))))+0.8*sin(y*sqr(x))+10;
writeln('при x=',x:8:2,' y=',y:8:2,' z=',z:8:2);
{вывод результата}
readln;
{задержка до нажатия клавиши
Enter}
End.
Результат
введите X Y
12
при x=1.00 y=2.00 z=11.59
Пример:
Вводится вещественное число а. Не пользуясь никакими
арифметическими операциями, кроме сложения, получить 7а за четыре
операции.
Решение
Используемые переменные: а –вводимое число,
b, c, d – вспомогательные переменные
Program pr2;
Var a,b,c,d:real;
Begin
write('введите a ');
readln (a);
b:=a+a;
c:=b+b;
d:=b+c;
a:=d+a;
writeln('7a=',a:8:2);
readln;
End.
Результат
введите a 2
7а= 14.00
Пример:
{ввод исходного числа}
{2a}
{4a}
{6a}
{7a}
{вывод результата}
{задержка до нажатия клавиши Enter}
Найти площадь круга и длину окружности.
Решение
Используемые переменные: r - радиус, d – длина окружности,
s – площадь круга
Program pr3;
Var d,r,s:real;
Begin
write('введите радиус окружности ');
readln (r);
{ввод радиуса}
d:= 2*Pi*r;
{вычисление длины окружности}
s:=Pi*sqr(r);
{ вычисление площади круга}
writeln('длина окружности= ',d:4:2);
{вывод результата}
writeln('площадь окружности= ',s:4:2);
readln;
{задержка до нажатия клавиши Enter}
End.
Результат
введите радиус окружности 5
длина окружности=31.42
площадь окружности=78.54
Пример:
Вычисление суммы цифр введенного натурального двузначного числа.
Решение
Используемые переменные: n - двузначное число, a, b – цифры числа
Program pr4;
Var n, a, b: integer;
Begin
write('n= '); readln(n);
{ввод исходного двузначного числа}
a:=n div 10;
{1-я цифра}
b:=n mod 10;
{2-я цифра}
writeln('сумма = ', a+b);
{вывод результата}
readln;
{задержка до нажатия клавиши Enter}
End.
Результат
n=48
сумма=12
Пример:
Введенное натуральное 4-значное число изменить так, чтобы 2 и 3
цифры поменялись местами.
Решение:
Четырехзначное число N можно представить в виде суммы разрядных
слагаемых: N=n1*1000+n2*100+n3*10+n4, где n1, n2, n3, n4 – цифры
соответствующих разрядов. Например, 3562=3*1000+5*100+6*10+2
Чтобы во введенном числе N поменять цифры местами, нужно выделить
каждую цифру и записать число в виде N=n1*1000+n3*100+n2*10+n4
Используемые переменные: N – вводимое четырехзначное число,
n1, n2, n3, n4 – цифры
Program pr5;
Var N, n1, n2, n3, n4:integer;
Begin
write('введите n ');
readln (n);
{ввод исходного 4-значного числа}
n1=N div 1000;
{1-я цифра числа}
n2:=N div 100 mod 10;
{2-я цифра числа }
n3:=N div 10 mod 10;
{3-я цифра числа }
n4:=N mod 10;
{4-я цифра числа}
n:= n1*1000+n3*100+n2*10+n4; {получение числа в виде суммы разрядных
слагаемых}
writeln('результат ', n);
{вывод результата}
readln;
{задержка до нажатия клавиши Enter}
End.
Результат:
введите n 1234
результат 1324
Пример:
Обмен значениями переменных X и Y.
Решение:
Для того, чтобы переменные X и Y поменялись своими значениями,
можно использовать вспомогательную переменную, например, T.
Вспомогательная переменная нужна для того, чтобы сохранить временно
значение переменной X. После этого в переменную X можно занести
значение переменной Y, а Y - присвоить значение X.
Используемые переменные: X, Y – вводимые числа,
T – вспомогательная переменная
Program pr6;
Var X, Y, T: integer;
begin
write('Введите X Y ');
readln(X, Y);
{ввод исходных чисел}
T:=X;
X:=Y;
Y:=T;
writeln('X=', X, 'Y=',Y); {вывод результата}
readln;
{задержка до нажатия клавиши Enter}
end.
Результат:
Введите X Y 3 7
X=7 Y=3
Пример:
Вычислить значение y = (3tg x 2– ex )/2sin x для х = -34, 0.89, 1.23
Решение:
Используемые переменные: X – аргумент, Y – значение функции
Program pr7;
Var x,y:real;
Begin
Write('введите x ');
readln (x);
{ввод аргумента}
y:=(3*sin(sqr(x))/cos(sqr(x))-exp(x))/(2*sin(x)); {вычисление значения
функции}
Writeln('при x=',x:4:2,' y=',y:4:2);
{вывод результата}
readln;
{задержка до нажатия клавиши
Enter}
End.
Результат:
1 случай:
введите x 34
при x=34.00 y=-551389941339996.31
2 случай:
введите x 0.89
при x=0.89 y=0.39
3 случай:
введите x 1.23
при x=1.23 y=25.64
Операторы выбора и условного перехода
ОПЕРАТОРЫ:
Оператор
if … then…
Назначение
проверка
условий
case
выбор
Синтаксис
if <условие> then <оператор1> else <оператор2>
if <условие> then <оператор>
case <переменная> of
<константа 1>: <операторы 1>;
…
< константа n>: <операторы n>
[else <операторы>]
end;
ПРИМЕРЫ РЕШЕНИЯ ЗАДАЧ
Пример:
Выбор минимального из трех введенных целых чисел.
Решение
Для того, чтобы выбрать минимальное из трех введенных чисел, нужно
выбрать наименьшее сначала из двух и запомнить в переменную m, а затем
значение m сравнить с третьим числом.
Используемые переменные: a, b, c – вводимые числа, m – минимальное из
них
Program pr1;
Var a, b, c, m: integer;
BEGIN
Write('a, b, c='); readln(a, b, c);
{ввод исходных чисел}
if a<b then m:=a else m:=b; {выбор минимального из a и b}
if c<m then m:=c;
{сравнение с третьим числом}
writeln('Мin=', m);
{вывод результата}
readln
END.
Результат:
1 случай:
a, b, c= 15 6 9
Мin=6
2 случай:
a, b, c= 1 45 4
Мin=1
3 случай:
a, b, c= 25 16 9
Мin=9
Пример:
Решение квадратного уравнения вида Ax2 + Bx + C = 0.
Решение
Используемые переменные: a, b, c – коэффициенты квадратного
уравнения, d - дискриминант, x1, x2 – корни уравнения
Program pr2;
Var a, b, c, d, x1, x2: real;
Begin
Write('a, b, c='); readln(a, b, c); {вводим коэффициенты квадратного
уравнения}
d:=sqr(b)-4*a*c;
{вычисляем дискриминант}
if d>0 then begin
{если дискриминант положительный, то
вычисляем два корня}
x1:=(-b+sqrt(d))/(2*a); writeln('x1=', x1:6:2);
x2:=(-b-sqrt(d))/(2*a); writeln('x2=', x2:6:2)
end
else if d=0 then begin { иначе, если дискриминант равен 0, то
вычисляем один корень}
x1:=-b/(2*a); writeln('x=', x1:6:2)
end
else writeln('Корней нет'); {иначе выводим
сообщение
‘Корней нет’}
readln
End.
Результат:
1 случай:
a, b, c= 1 -2 1
x= 1.00
2 случай:
a, b, c= 1 -6 8
x1= 4.00
x2= 2.00
3 случай:
a, b, c= 5 1 2
Корней нет
Пример:
Определить, есть ли в записи трехзначного числа хотя бы одна
нечетная цифра.
Решение
Используемые переменные: a- вводимое трехзначное число,
a1, a2, a3 – его цифры
Program pr3;
Var a, a1, a2, a3: integer;
Begin
Write('a='); readln(a);
{ввод исходного числа}
a1:= a div 100;
{1-я цифра}
a2:= (a div 10) mod 10;
{2-я цифра}
a3:= a mod 10;
{3-я цифра}
if (a1 mod 2=1) or (a2 mod 2=1) or (a3 mod 2=1) {Если 1-я цифра
нечетная,
then writeln('Yes') else writeln('No'); или 2-я нечетная, или
3-я нечетная, то
выводим ‘Yes’, иначе
выводим ‘No’}
readln;
End.
Результат:
1 случай:
a=418
Yes
2 случай:
a=246
No
Пример:
Вводятся координаты точки. Определить попадает ли точка в
заштрихованную область или нет.
y
x2+y2=25
1
x
x2+y2=4
Решение
Точка будет принадлежать заштрихованной области, если она лежит
внутри большого круга (x2+y2 <25) И, одновременно, за пределами малого
круга (x2+y2>4).
Program pr4;
Var x,y: real;
Begin
Write('введите x y ');
readln (x,y);
{ввод координат точки}
if (sqr(x)+sqr(y)<25) and (sqr(x)+sqr(y)>4) {проверка условия
принадлежности}
then writeln('точка попадает в заштрихованную область')
else writeln('точка не попадает в заштрихованную область');
readln;
end.
Результат:
1 случай:
введите x y 1 1
точка попадает в заштрихованную область
2 случай:
введите x y 2 5
точка не попадает в заштрихованную область
Пример:
Введено трехзначное число. Изменить число, увеличив все четные
цифры на 2, а цифру 8 заменить на 0.
Решение
Для решения задачи необходимо разбить его на цифры. Каждую цифру
следует изменить следующим образом: если цифра четная и меньше 8, то
увеличить ее на 2, иначе, если цифра 8, то заменить ее на 0.
Используемые переменные: n – вводимое число, a,b,c – его цифры
Program pr5;
Var n,a,b,c:Integer;
begin
write('введите n'); readln (n);
{ввод числа}
a:=n div 100;
{1-я цифра}
b:=n div 10 mod 10;
{2-я цифра}
c:=n mod 10;
{3-я цифра}
{проверяем каждую цифру и изменяем ее}
if (a mod 2=0) and (a<8) then a:=a+2 else if a=8 then a:=0;
if (b mod 2=0) and (b<8) then b:=b+2 else if b=8 then b:=0;
if (c mod 2=0) and (c<8) then c:=c+2 else if c=8 then c:=0;
if (d mod 2=0) and (d<8) then d:=d+2 else if d=8 then d:=0;
n:=a*1000+b*100+c*10+d; {формируем число из измененных цифр}
writeln('n= ',n);
{вывод результата}
readln;
end.
Результат:
введите n1824
результат 1046
Пример:
Составить программу, которая выводит меню и выполняет указанные
действия с заданными целыми числами:
1 - произведение двух чисел
2 - частное двух чисел
3 - сумма двух чисел
Используемые переменные: а,b – вводимые числа, n – номер операции
Решение
program pr6;
var a,b,n: integer;
begin
writeln('1 – произведение двух чисел');
writeln('2 – частное двух чисел');
writeln('3 – сумма двух чисел');
write('введите номер операции ');
readln(n);
write('введите два числа'); readln(a,b);
case n of
1: writeln('произведение=',a*b);
2: writeln('частное=',a/b:4:2);
3: writeln('сумма=',a+b);
else writeln('не верный номер');
end;
readln;
end.
Результат:
1 – произведение двух чисел
2 – частное двух чисел
3 – сумма двух чисел
введите номер операции 2
введите два числа 3 5
частное=0.60
Циклы
ОПЕРАТОРЫ:
Оператор
For
While
Repeat
Until
Назначение
Цикл
с параметром
Синтаксис
For <перем>:=<начальное знач> to <кон.знач> do
<оператор>;
Значение переменной изменяется от начального
значения к конечному с шагом 1.
For <перем>:=<нач. знач> downto <конеч. знач> do
<оператор>;
Значение переменной изменяется от начального
значения к конечному с шагом -1
Цикл
While <условие> do <оператор>;
с предусловием
Цикл выполняется, пока условие истинно.
Цикл
Repeat
с постусловием
<Операторы>;
Until <условие>;
Цикл выполняется, пока условие ложно.
Пример:
Вывести квадраты первых десяти натуральных чисел.
Решение
Используемые переменные: i –натуральные числа, x– их квадраты
Program pr1;
Var i, x: integer;
begin
for i:=1 to 10 do begin
{перебираем натуральные числа от 1 до 10}
x:=sqr(i);
{возводим очередное число в квадрат}
write(x, ' ');
{выводим полученное значение}
end;
readln
end.
Результат
1 4 9 16 25 36 49 64 81 100
Пример:
Найти сумму 1 + 1/3 + 1/5 +...(N слагаемых).
Решение
Program pr2;
Var I, N: integer;
S: real;
begin
Write('N='); Readln(N); {вводим количество слагаемых}
S:=0;
{обнуляем сумму}
{выполняем цикл N раз, добавляя к сумме по одному слагаемому}
For I:=1 to N do
S:=S+1/(2*I-1);
Writeln('S=',S:5:2); {выводим результат с двумя десятичными знаками}
Readln
end.
Результат:
N=4
S= 1.68
Пример:
Дано натуральное число n. Найти сумму S=1+2/3+3/7... (n слагаемых)
Решение
Program pr3;
var i,b,n:integer;
s:real;
begin
write('Введите n ');
readln(n);
{вводим количество слагаемых}
s:=1;
{первоначальное значение суммы}
b:=3;
{первоначальное значение знаменателя}
for i:=2 to n do
begin
s:=s+ i/b;
{ добавляем к сумме по очередное слагаемое}
b:=b+4;
{ вычисляем следующий знаменатель}
end;
writeln('сумма=',s:4:2); {выводим результат с двумя десятичными знаками}
readln;
end.
Результат:
Введите n 5
сумма=2.79
Пример:
Дано натуральное число n. Вычислить 31+32+…...+3n
Решение:
program pr4;
var i,n:integer;
s:real;
begin
write('введите n ');
readln(n);
s:=0;
for i:=1 to n do
s:=s+ exp(i*ln(3));
writeln('сумма=',s:4:0);
readln;
end.
Результат:
введите n 5
сумма= 363
Пример:
Найти сумму ряда: S = x - x2 /4 + x3/9 - x4/16... (n слагаемых).
Решение:
Program Pr5;
Var i, n, z: integer;
p, s: real;
begin
writeln ('введите n'); readln ( n );
writeln('введите x'); readln( x );
z:=1; p:=x; s:=0;
for i:=1 to n do begin
s:= s + z*p/sqr(i); p:=p*x; z:=-z
end;
writeln ('S=', S :6:2);
readln
end.
Пример:
Вычислить произведение:
(1 + sin2 )*(2 + sin3 )*... (n сомножителей).
Найти сумму ряда: S = x - x2 /4 + x3/9 - x4/16... (n слагаемых).
Решение:
Рrogram Pr6;
Var n, i: integer;
p: real;
begin
write('n='); readln(n); p:=1;
for i:=1 to n do
p:=p* (i + sin(i+1));
writeln('p=', p:6:3);
readln
end.
Результат:
n=5
p=131.645
Пример:
Задана арифметическая прогрессия -21; - 16;… Определить номер
первого положительного члена прогрессии.
a – очередной член прогрессии, n – его порядковый номер
Решение:
Program Pr7;
var
a, n: integer;
begin
a:= -21; n:=1;
{задаем начальные значения}
while a<=0 do begin
{пока очередной член прогрессии меньше либо ра
a:=a+5; n:=n+1;
равен 0, вычисляем следующий член прогрессии
и end;
и его порядковый номер}
writeln(‘n=’, n);
{выводим номер 1-го положительного члена
прогрессии}
readln;
end.
Результат:
n=6
Пример:
Протабулировать функцию y:=sin(x)*x интервале [-/2,/2] с шагом
/10.
Решение:
Program pr8;
Var x, y: real;
begin
x:=-pi/2;
while x<=pi/2 do
begin
y:=sin(x)*x;
writeln('x=',x:8:2,' y=',y:8:2);
x:=x+pi/10
end;
end.
Пример:
Вычислить сумму:
S =cos(1+x)+cos2(1+x)+cos3(1+x)+...+cosn(1+x) (n слагаемых).
Решение:
Рrogram Pr9;
Var n, i: integer;
s,x,t: real;
begin
write(' n='); readln(n);
write(' x='); readln(x);
s:=0; t:=cos(1+x);
for i:=1 to n do begin
s:=s+t;
t:=t*cos(1+x);
end;
writeln('s=', s:4:2)
end.
Пример:
Подсчитать количество двузначных чисел, у которых сумма цифр
нечетна.
Решение:
Program Pr10;
Var n, a, b, k: integer;
begin
k:=0; for n:=10 to 99 do begin
a:= n div 10; b:=n mod 10;
if (a+b) mod 2=1 then k:=k+1;
end;
writeln('k=',k)
end.
Введение в визуальное программирование
Основные понятия. Технология работы в среде Delphi базируется на
идеях объектно-ориентированного и визуального программирования. Идея
объектно-ориентированного программирования состоит в объединении
данных и средств их обработки (методов) в тип, который называется
классом. Конкретной переменной определенного класса и есть объект.
Примерами объектов служат элементы управления в окне: кнопки, списки,
текстовые поля и др. Среда визуального программирования Delphi – это
графическая автоматизированная оболочка над объектно-ориентированной
версией языка Паскаль (Object Pascal). Если в языке Паскаль структурные
единицы – это данные и команды, то здесь такой структурной единицей
является визуальный объект, который называется компонентом.
Автоматизация программирования достигается благодаря возможности
переносить компонент на форму (в программу) из палитры компонентов и
изменять его свойства, не внося вручную изменений в программный код.
Формой называют компонент, который владеет свойствами окна
Windows и предназначен для расположения на нем других компонентов.
Компоненты на форме могут быть видимыми и невидимыми. Первые служат
для организации диалога с пользователем. Это различные кнопки, списки,
изображения и т.д. Они отображаются на экране во время выполнения
программы. Невидимые компоненты предназначены, в частности, для
доступа к системным ресурсам компьютера.
Проект – это совокупность файлов, из которых складывается Delphiпрограмма.
Инструменты среды Delphi. Основными инструментами являются:
- главное меню;
- панель инструментов;
- палитра компонентов (Component Palette);
- инспектор объектов (Object Inspector);
- окно формы;
- редактор кода (Code Editor).
Эти инструменты становятся доступными после запуска программы Delphi:
три находятся в главном окне (верхняя часть экрана, рис. 1), а остальные в
отдельных окнах.
Главное меню
Панель инструментов
Рис. 1
Палитра компонентов
Главное меню и панель инструментов. Главное меню состоит из таких
элементов (рис. 1):
 File - содержит стандартные команды для работы с файлами проекта. С
помощью этих команд можно создать новый проект (New Application),
новую форму или модуль (New Form, New Unit), открыть или закрыть
файл проекта (Open, Close), закрыть все открытые файлы (Close All),
сохранить файл, проект или все сразу (Save, Save As, Save Project As,
Save All).
 С помощью команды Edit можно выравнивать компоненты
относительно сетки и между собой (Align to Grid, Align), задавать
порядок отображения компонентов, которые перекрываются (Bring to
Front, Send to Back), изменять размер избранного компонента (Size),
масштабировать визуальные компоненты (Scale) и т.п.
 Меню Search содержит стандартные команды поиска и замены
фрагмента текста (Find, Replace, Search Again, Incremental Search) и
прочие.
 В меню View находятся команды визуализации элементов среды.
 Меню Project содержит команды компиляции (Compile, Build All) и
проверки синтаксиса программы (Syntax Check).
 Меню Run содержит команды отладки и запуска программы.
 Меню Component используют для создания и инсталяции новых
компонентов.
 Меню Database содержит команды вызова инструментов базы данных.
 В меню Tools находятся команды для настройки параметров среды.
Панель инструментов служит для дублирования команд меню с помощью
кнопок.
Палитра компонентов. Палитра компонентов расположена в главном
окне и имеет вид многостраничного блокнота. Каждая страница имеет свой
набор компонентов (рис. 1). Чтобы поместить компонент в центре формы,
дважды щелкают на его пиктограмме. Если нужно разместить компонент где
либо на форме, щелкают один раз на его пиктограмме и один раз в нужном
месте формы. Для того, чтобы вставить один и тот же компонент несколько
раз, нужно нажать клавишу Shift и щелкнуть на его пиктограмме – теперь
можно щелкать в окне формы. Чтобы отказаться от этого режима, надо
нажать кнопку палитры компонентов с изображением стрелки. Выбранный
компонент можно перемещать на форме, а также изменять его размеры,
перетягивая маркеры.
Инспектор объектов (Паспорт). С помощью инспектора объектов
можно задавать начальные значения свойств объекта и реакцию на
стандартные события. Окно инспектора объектов содержит список
компонентов текущей формы, а также две закладки: свойства (Properties) и
события (Events). Чтобы активизировать окно инспектора объектов,
нажимают клавишу F11. Рассмотрим это окно (рис. 2). Закладка свойств
состоит из двух столбцов: левый содержит названия свойств компонентов, а
правый – их значения. Свойства могут быть простыми или комплексными
(составными). Комплексные свойства состоят из набора других свойств.
Такие свойства в инспекторе объектов обозначены символом «+».
Закладка событий
Закладка свойств
Список компонентов
текущей формы
Закладка событий также имеет два столбца. В левом отображаются
имена стандартных событий, на которые объект может реагировать, а в
правом – имена методов (процедур), реализующих реакцию на событие.
Каждому стандартному событию отвечает название метода, которое
появляется после двойного щелчка мыши в правом столбце. В этот момент в
окно текста программы добавляется шаблон кода (процедуры) для
соответствующего
метода.
Шаблон
необходимо
заполнить
соответствующими командами.
Для ввода значений свойств числового и текстового типов (Width, Name и
т.п.) используют стандартное поле ввода. Значение свойств перечислимого
типа (Align, Cursor и т.п.) описываются комбинированным списком, из
которого выбирают необходимое. Некоторые комплексные свойства (Font,
Picture, Glyph и т.п.) используют диалоговые окна, набор управляющих
элементов которых зависит от конкретного свойства.
Окно формы. Форма – это окно Windows, которое создается в одном из
возможных для окон стилей. Все внутреннее пространство формы называется
рабочей областью. На рабочую область нанесена сетка выравнивания для
удобного расположения на ней компонентов. Для выполнения групповых
операций несколько компонентов можно объединять. Для этого необходимо
нажать на левую кнопку мыши и перемещением указателя охватить на экране
все нужные компоненты. В группу приобщаются компоненты, которые хотя
бы частично попадают в охваченную область. Или щелчком левой кнопки
мыши по нужным компонентам, при нажатой клавише Shift. Удаление
выделенных компонентов или группы выполняют клавишей Delete.
Перемещение выделенного компонента в границах формы осуществляют
мышью. Над компонентами и их группами можно выполнять операции
вырезания, копирование в буфер обмена и вставки из буфера.
Выравнивать компоненты можно как относительно окна формы, так и
относительно друг друга. Для этого используют команду Edit => Align
главного меню или палитру выравнивания (команда View => Alignment
Palette главного меню). Другая возможность – можно непосредственно
задать значения свойствам Left и Top компонентов в окне инспектора
объектов. Компоненты в группе выравниваются относительно компонента,
попавшего в группу первым.
Структура проекта. Проектом называют совокупность файлов, из
которых
Delphi создает готовую для выполнения программу. В состав
каждого проекта обязательно входят следующие файлы:
- файл проекта *.drp. Это небольшой файл с программным кодом на
языке Object Pascal, в котором записаны ссылки на все файлы проекта.
именно этот файл инициализирует (стартует) программу;
- файлы описания всех форм, которые входят в проект: файл модуля
*.pas и файл формы *.dfm. Каждой форме проекта соответствует свой
модуль;
- файл ресурсов программы *.res. В нем описаны ресурсы, не входящие
в форму, например, пиктограмма программы;
- файл параметров проекта *.dof;
- файлы параметров среды *.drf, *.dsk, *.dsm. Эти файлы создаются
лишь после компиляции проекта.
Для сохранения Delphi–проекта необходимо задать имена модулей
(автоматически предлагаются имена Unit1.pas, Unit2.pas, …) и имя проекта
(Project1.dpr). Эти имена можно заменить на собственные (латинские).
Каждый проект необходимо сохранять в отдельную папку. Для перемещения
Delphi–проекта на другой компьютер необходимо с собой брать файлы таких
типов: *.dpr, *.dfm, *.pas, *.res. Другие файлы создаются автоматически.
Редактор кода. Редактор кода находится в отдельном окне, чтобы
перейти в него из окна формы необходимо нажать F12. Это окно
организовано как многостраничный блокнот открытых на данное время
файлов. В момент открытия нового проекта в модуль Unit1.pas, который
соответствует форме Form1, редактор автоматически заносит программный
код описания этой формы. Во время добавления новых компонентов в окно
формы в программу автоматически заносятся коды с описаниями параметров
этих компонентов (высота, ширина, расположение, стиль и т.д.). Добавление
определенного объекта или применение к нему метода ведет к появлению
заготовки базового кода соответствующей процедуры в окне редактора.
Заготовка (шаблон) состоит из заголовка процедуры и ключевых слов begin и
end; (операторных скобок). Заготовку заполняет пользователь. Заканчивается
модуль собственной командой end. (с точкой). Итак, модуль Unit1 имеет
такой общий вид:
unit Unit1;
{Название модуля}
interface
{Раздел деклараций процедур и функций}
uses
{Список использованных модулей, например}
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialigs;
type
{Описание классов и типов объектов, например}
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: Tobject);
…
private
{Частные объявления}
public
{Общедоступные объявления}
end;
var
{Описание глобальных переменных}
Form1: TForm1;
{Форвард-объявление процедур и функций пользователя, например}
procedure Information;
procedure SetPicture;
{Раздел описаний процедур и функций}
implementation
{$S *.dfm} {Добавляется файл с описанием формы}
procedure TForm1.Button1Click(Sender: TObject);
begin
{Здесь пользователь записывает тело процедуры}
end;
{Конец модуля}
end.
Методические рекомендации к задачам №13-15
. Нормализация данных
Главная цель нормализации базы данных - устранение избыточности и
дублирования информации.
Нормализация – это формальный метод анализа отношений на основе их
первичного ключа и существующих функциональных зависимостей.
Отношение – таблица, состоящая из столбцов и строк.
Атрибут – именованный столбец отношения.
Функциональная зависимость – связь между атрибутами отношения [6].
Пример нормализации базы данных
Пусть данные о продажах представлены накладными.
Клиент
Иванов
Петров
ОАО «Рога и копыта»
Продажи
Накладная №237 от 06.09.2011 г.
Товар
Количество
Хлеб
2
Молоко
3
Хвосты
25
Цена
24,50 р.
30,00 р.
2,00 р.
Сумма
49,00 р.
90,00 р.
50,00 р.
ЗАО «111»
Сидоров
Молоко
Хлеб
1
3
30,00 р.
24,50 р.
30,00 р.
73,50 р.
I нормальная форма
Процесс выравнивания.
Для каждого значения должно быть единственное соответствующее значение
из неповторяющихся групп [6].
Продажи
Клиент
Накладная
№
237
237
237
Дата
06.09.2011 г.
06.09.2011 г.
06.09.2011 г.
237
237
06.09.2011 г.
06.09.2011 г.
Иванов
Петров
ОАО «Рога и
копыта»
ЗАО «111»
Сидоров
Товар
Кол-во
Цена
Сумма
Хлеб
Молоко
Хвосты
2
3
25
24,50 р.
30,00 р.
2,00 р.
49,00 р.
90,00 р.
50,00 р.
Молоко
Хлеб
1
3
30,00 р.
24,50 р.
30,00 р.
73,50 р.
Повторяющиеся группы изымаются и помещаются в отдельные отношения с
копией первичного ключа исходного отношения.
Код продажи
1
Клиент
Накладная №
237
Товар
Иванов
Петров
ОАО «Рога и
копыта»
ЗАО «111»
Сидоров
Дата
Дата
06.09.2011 г.
Продажи
Количество
Цена
Сумма
Хлеб
Молоко
Хвосты
2
3
25
24,50 р.
30,00 р.
2,00 р.
49,00 р.
90,00 р.
50,00 р.
Код
продажи
1
1
1
Молоко
Хлеб
1
3
30,00 р.
24,50 р.
30,00 р.
73,50 р.
1
1
II нормальная форма
Вторая нормальная форма требует, чтобы отношение находилось в
первой нормальной форме и неключевые атрибуты отношений зависели от
первичного ключа в целом (полная зависимость), но не от его части
(частичная зависимость) [6].
Код
клиента
1
2
3
4
5
Клиенты
Клиент
Иванов
Петров
ОАО «Рога и копыта»
ЗАО «111»
Сидоров
Код
клиента
1
2
Код
товара
1
2
Код
товара
1
2
3
Продажи
Количеств
Сумма
о
2
24,50 р.
3
30,00 р.
Товары
Товар
Хлеб
Молоко
Хвосты
Цена
24,50 р.
30,00 р.
2,00 р.
Код продажи
1
1
3
4
5
3
2
1
25
1
3
2,00 р.
30,00 р.
24,50 р.
1
1
1
III нормальная форма
Чтобы отношение находилось в третьей нормальной форме,
необходимо, чтобы неключевые атрибуты в нем не зависели от других
неключевых атрибутов, а зависели только от первичного ключа [6].
Код
клиента
Клиенты
Клиент
Код
товара
Товары
Товар
Цена
1
Иванов
1
Хлеб
24,50 р.
2
3
Петров
ОАО «Рога и копыта»
2
3
Молоко
Хвосты
30,00 р.
2,00 р.
4
5
ЗАО «111»
Сидоров
Код
клиента
Код товара
Продажи
Количество
Код продажи
1
2
1
2
2
3
1
1
3
4
3
2
25
1
1
1
5
1
3
1
Методические рекомендации к задачам №16-21
Команда отбора данных
Общий вид:
SELECT ПОЛЕ1, ПОЛЕ2,..., ПОЛЕn, FROM ТАБЛИЦА WHERE
УСЛОВИЕ
Если условие не указано, выбираются все записи из таблицы.
Исходная таблица:
ZARP
FIO
SUMMA
ИВАНОВ
ПЕТРОВ
СИДОРОВ
1000
2000
3000
В результате выполнения команды:
SELECT FIO FROM ZARP
Набор данных примет вид:
НД
FIO
ИВАНОВ
ПЕТРОВ
СИДОРОВ
*- позволяет выбрать все поля таблицы.
В результате выполнения команды:
SELECT * FROM ZARP
Набор данных примет вид:
НД
FIO
ИВАНОВ
ПЕТРОВ
СИДОРОВ
SUMMA
1000
2000
3000
Примеры использования условия
Операции отношения >, <, =, >=, <=, <>.
Логические операции AND, OR, NOT.
Операции отношения имеют более высокий приоритет, чем операции
отношения.
Исходная таблица:
ZARP
FIO
ИВАНОВ
ПЕТРОВ
SUMMA
1000
2000
СИДОРОВ
3000
В результате выполнения команды:
SELECT * FROM ZARP WHERE SUMMA>1500
Набор данных примет вид:
НД
FIO
ПЕТРОВ
СИДОРОВ
SUMMA
2000
3000
В результате выполнения команды:
SELECT SUMMA FROM ZARP WHERE FIO=’ ИВАНОВ’
Набор данных примет вид:
НД
SUMMA
1000
Сортировка записей в наборе данных
Общий вид команды:
SELECT ПОЛЕ1, ПОЛЕ2,..., ПОЛЕn, FROM ТАБЛИЦА ORDER BY
ПОЛЕm, ПОЛЕq,...
Исходная таблица:
ZARP
FIO
SUMMA
ИВАНОВ
ПЕТРОВ
СИДОРОВ
ПЕТРОВ
1000
2000
3000
1500
В результате выполнения команды:
SELECT * FROM ZARP ORDER BY FIO
Набор данных примет вид:
НД
FIO
ИВАНОВ
ПЕТРОВ
ПЕТРОВ
СИДОРОВ
SUMMA
1000
2000
1500
3000
Если сортировка производится по нескольким полям, то строки сортируются
сначала по значению первого поля, а затем по второму.
В результате выполнения команды:
SELECT * FROM ZARP ORDER BY FIO, SUMMA
Набор данных примет вид:
НД
FIO
ИВАНОВ
ПЕТРОВ
ПЕТРОВ
СИДОРОВ
SUMMA
1000
1500
2000
3000
Если после имени поля сортировки указано ключевое слово DESC, то
сортировка выполняется в обратной последовательности (только для этого
поля).
В результате выполнения команды:
SELECT * FROM ZARP ORDER BY FIO DESC, SUMMA DESC
Набор данных примет вид:
НД
FIO
СИДОРОВ
ПЕТРОВ
ПЕТРОВ
ИВАНОВ
SUMMA
3000
2000
1500
1000
В результате выполнения команды:
SELECT * FROM ZARP ORDER BY FIO DESC, SUMMA
Набор данных примет вид:
НД
FIO
СИДОРОВ
ПЕТРОВ
ПЕТРОВ
ИВАНОВ
SUMMA
3000
1500
2000
1000
Вычисляемые поля
Общий вид:
Выражение AS поле
Исходная таблица:
ZARP
FIO
ИВАНОВ
ПЕТРОВ
СИДОРОВ
SUMMA
1000
2000
3000
В результате выполнения команды:
SELECT FIO, SUMMA, SUMMA/100*20 AS NALOG FROM ZARP
Набор данных примет вид:
НД
FIO
ИВАНОВ
ПЕТРОВ
СИДОРОВ
SUMMA
1000
2000
3000
NALOG
200
400
600
Вычисляемые поля не могут быть использованы при вычислении других
вычисляемых полей.
SELECT FIO, SUMMA, SUMMA/100*20 AS NALOG, SUMMA-NALOG AS
SUMIT FROM ZARP
SELECT FIO, SUMMA, SUMMA/100*20 AS NALOG, SUMMASUMMA/100*20 AS SUMIT FROM ZARP
НД
FIO
ИВАНОВ
ПЕТРОВ
СИДОРОВ
SUMMA
1000
2000
3000
NALOG
200
400
600
SUMIT
800
1600
2400
Методические рекомендации к задачам №22-25
Команды двоичной арифметики
МНЕМОКОД
mov DST SRC
xchg OPND1, OPND2
Add DST, SRC
Adc OST, SRC
inc OPND
Sub DST, SRC
Sbb DST, SRC
Dec OPND
Neg OPND
rcl DST, CONT
OSZAPC
----------xxxxxx
xxxxxx
xxxxxxxxxxx
xxxxxx
xxxxxxxxxxx
x----x
ДЕЙСТВИЕ
пересылка OST<-SRC
обмен OST<-SRC
сложение QST<-DST+SRC
сложение с переносом DST<-OST+SRC+CP
увеличить на единицу OPND<-OPND+1
вычитание OST<-OST SRC
вычитание с заемом OST<-OST SRC CF
уменьшение на единицу OPND<-OPND-1
Изменение знака OPND<-0-OPND
циклический сдвиг влево через CF
rcr DST, CONT
rol DST, CONT
ror DST, CONT
sal OST, CONT
sar DST, CONT
shl DST, CONT
Shr DST, CONT
x----x
x----x
x----x
xxxuxx
xxxuxx
xxxuxx
xxxuxx
циклический сдвиг вправо через CF
циклический сдвиг влево
циклический сдвиг вправо
арифметический сдвиг влево
арифметический сдвиг вправо
логический сдвиг влево
логический сдвиг вправо
Режимы адресации
Обозначения: R - регистр, V - переменная, С - константа.
НАЗВАНИЕ
РЕГИСТРОВАЯ
ПРЯМАЯ
ОБОЗНАЧЕНИЕ
СОДЕРЖАНИЕ
ПРИМЕР
R
операнд находится mov AX, SI переслать
в регистре
содержимое регистра
SI в регистр АХ
НЕПОСРЕДСТВЕННАЯ С
непосредственным mov AX, 093Ah
операнд константа занести константу
присутствует в
093Ah в регистр АХ
команде
ПРЯМАЯ
V + С или V - С
исполнительный mov ВХ, WW+2
адрес операнда
переслать в ВХ слово
присутствует в
памяти, отстоящее от
команде
переменной с именем
WW на 2 байта
КОСВЕННАЯ
[R] где R-ВР, ВХ, SI, регистр содержит mov [ВХ], CL
РЕГИСТРОВАЯ
DI
адрес операнда
переслать
содержимое регистра
CL по адресу
находящемуся в
регистре ВХ
КОСВЕННАЯ
V[R], C[R],
адрес операнда
mov М[8Х], CL
РЕГИСТРОВАЯ
[R+V], [R+C],
вычисляется как
переслать
ОТНОСИТЕЛЬНАЯV[R], [R] C]
сумма
содержимое регистра
где R содержимого
CL по адресу
SI, DL (ИНДЕКСНАЯ) регистра и
отстоящему от
ВХ, ВР (БАЗОВАЯ)
смещения
переменной М на 8К
байт
ИНДЕКСНО-БАЗОВАВ [BR][IR] V[BR][IR]
[BR][IR]C где
IR - SI, DI,
BR – ВХ, ВР
адрес операнда
вычисляется как
сумма
содержимых
базового и
индексного
регистров и
возможного
смещения
mov [BX][SI]3, AL
переслать
содержимое регистра
AL по адресу сумме
регистров BХ SI и
константы 3
Замечание. Для всех режимов адресации при формировании физического
адреса используется сегментный регистр OS, за исключением случаев, когда
в качестве базового регистра выступает регистр ВР, в этом случае
используется сегментный регистр SS.
Пример решения задачи
Дана формула: Х = ЗА + (В + 5)/2 - С - 1 .
А, В, С, Х - целые знаковые числа, занимающие слово. Написать программу,
реализующую данную формулу. Распишем формулу по отдельным
операциям:
АХ<-А
АХ<- 2*(АХ)
АХ<- (АХ) + А
ВХ<- В
ВХ<- 5 + (ВХ)
ВХ<- (ВХ)/2
АХ<- (ВХ) + (АХ)
АХ<- (АХ) - С
АХ<- (АХ) - 1
Х <- (АХ)
значение А в регистр АХ
2А в АХ
ЗА в АХ
В в ВХ
В+5 в ВХ
(В+5)/2 в ВХ
ЗА+<В+5)/2 в АХ
ЗА+(В+5)/2-С в АХ
ЗА+(В+5)/2-С-1 в АХ
ЗА+(В+5)/2-С-1 в Х
Текст программы:
model SMALL
stack 100h
dataseg
A
dw
10
В
dw
20
С
dw
5
X
dw
?
codeseg
startupcode
mov
AX,А
sal
AX,1
add
AX,А
mov
ВХ,В
add
ВХ,5
sar
ВХ,1
add
АХ,ВХ
sub
АХ,С
dec
АХ
mov
X, АХ
;Конец работы
QUIT:
exitcode 0
end
;значение А в регистр АХ
;2A в АД
;ЗА в AX
;В в ВХ
;В+5 в 8Х
;(В+5)/2 в ВХ
;ЗА+(В+5)/2 в АХ
;ЗА+(В+5)/2-С в АХ
;ЗА+(В+5)/2-С-1 в АХ
;ЗА+(В*5)/2-С-1 в Х
Программирование разветвляющихся вычислений на языке ассемблера
связано с использованием команд условного перехода. Каждая из этих
команд проверяет некоторый код условия или их комбинацию, и в случае
выполнения условия выполняет переход по указанному адресу. При
невыполнении условия управление передается следующей команде
программы.
Для выработки кода условия можно воспользоваться командами сmр,
test. Кроме того, коды условия вырабатываются арифметическими и
логическими командами.
Для организации циклических вычислений можно также использовать
команды условного перехода, однако в случае организации цикла по
счетчику удобнее воспользоваться командами цикла loop.
Одно из важнейших применений циклов - обработка массивов. В языке
ассемблера существует возможность описывать только одномерные массивы.
Для этого используют директивы описания данных db, dw, dd и др. При
выполнении цикла часто требуется при каждом новом повторении
обращаться к следующему элементу массива. Фактически это означает
необходимость увеличения адреса текущего элемента. Очевидно, это можно
сделать, если для обращения к элементу массива применять индексный или
базовый режим адресации.
Важным моментом при программировании циклов является проверка
условия окончания цикла. Есть несколько возможных вариантов организации
такой проверки. Если число повторений заранее известно, то можно в одном
из регистров (лучше в СХ) вести счетчик повторений, тогда условием
окончания будет достижение счетчиком заданного значения. Иногда вместо
счетчика удобнее использовать значение адреса обрабатываемого элемента
массива, в этом случае за условие окончания следует принять выход адреса
за пределы массива.
Следует очень внимательно относиться к выбору конкретного значения
счетчика или адреса, при котором заканчивается цикл. Практика
программирования показывает, что одним из самых распространенных типов
ошибок в программах является выполнение на одно повторение цикла
больше или меньше, чем нужно.
Пример решения задачи
Дан массив из десяти слов, содержащих целые числа. Требуется
найти максимальное значение. Текст программы:
Model SMALL
stack 100h
dataseg
MAX
dw
7
MASS
dw
10h,20h,30h,5h,40h,15h,20h,70h,35h,34h
codeseg
startupcode
lea
BX, MASS ;Загрузить адрес массива
mov
СХ, 10
;Установить счетчик
mov
AX, [BX]
аккумулятор
ВЕG:
cmp
[ВХ], АХ
массива с макс.
jl
N0
mov
АХ, [ВХ]
NО:
add
ВХ, 2
loop
BEG
mov
MAX, AX
;Конец работы
QUIT:
exitcode 0
end
;Первый элемент пассива в
;Сравнить текучий элемент
;он меньше
;он больше
;Следующий элемент массива
Download