Практикоориентированные задачи к государственному экзамену по направлению 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 ;Первый элемент пассива в ;Сравнить текучий элемент ;он меньше ;он больше ;Следующий элемент массива