МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ
ГОУВПО
«ВОРОНЕЖСКАЯ ГОСУДАРСТВЕННАЯ ТЕХНОЛОГИЧЕСКАЯ АКАДЕМИЯ»
КАФЕДРА ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ,
МОДЕЛИРОВАНИЯ И УПРАВЛЕНИЯ

Технология программирования
Методические указания по выполнению
Для студентов, обучающихся по направлению
230200 – "Информационные системы "
специальности 230201
ФБО
Воронеж 2011
УДК 681.3.06
Технология программирования [Текст] : метод. указания по выполнению контрольной работы / Воронеж. гос. технол. акад.; сост.
, , C. В. Чикунов. – Воронеж : ВГТА, 2011. – 20 с.
Методические указания разработаны в соответствии с требованиями ГОС ВПО подготовки выпускников по направлению 230200– "Информационные системы", Предназначены для закрепления теоретических знаний дисциплин цикла ЕН. В указаниях приведена методика выполнения каждого задания и справочный материал.
Библиогр.: 4 назв.
Составители: доцент ,
профессор Ю. В. БУГАЕВ, доцент C. В. ЧИКУНОВ
Научный редактор профессор Г. В. АБРАМОВ
Рецензент профессор В. Е. МЕЖОВ
(Воронежская государственная лесотехническая академия)
Печатается по решению
редакционно-издательского совета
Воронежской государственной технологической академии
Ó ,
,
, 2011
Ó ГОУВПО “Воронежская
государственная
технологическая
академия”, 2011
Оригинал-макет данного издания является собственностью Воронежской государственной технологической академии, его репродуцирование (воспроизведение) любым способом без согласия академии запрещается.
Цель работы – ознакомление с методическими указаниями по выполнению контрольной работы курса «Информатика» по теме: «Работа с процедурами и функциями» [1-4] и «Формальные и фактические параметры» [1-4].
Порядок выполнения
1. Получите у преподавателя номер задания и изучите его.
2. Ознакомьтесь с методическими указаниями по выполнению и оформлению каждого из заданий контрольной работы.
3. Выполните работу на листе формата А4. Работа должна быть подписана – следует указать фамилию и инициалы, а также номер группы.
4. Сдайте работу преподавателю для проверки.
Методические указания
Задание № 1
Первое задание имеет основной целью произведение декомпозиции. Под декомпозицией здесь понимается разбиение задачи на несколько более простых подзадач, оформление которых производится в виде процедур и функций.
Часто некоторую последовательность операторов требуется выполнить в нескольких местах программы. Чтобы не тратить время и не загромождать программу многократным повторением этих операторов целесообразно оформить их как самостоятельный программный модуль со своим именем. Тогда вместо этой последовательности операторов можно будет просто обратиться к соответствующему программному модулю, указав в своей программе (мы будем называть ее теперь головной программой) его имя.
Программные модули (подпрограммы) могут быть двух типов: процедуры и функции. Структура их приведена в таблице.\
Структура процедур и функций Таблица
Раздел | Ключевое слово раздела |
1. Заголовок | PROCEDURE или FUNCTION |
2. Объявление констант | CONST |
3. Объявление меток | LABEL |
4. Объявление типов | TYPE |
5. Объявление переменных | VAR |
6. Процедуры, функции | |
7. Основное тело | begin.. end; |
Как видно из таблицы, структура процедур и функций аналогична структуре головной программы. Отличие лишь в заголовке и в том, что программный модуль заканчивается ’;’, а не точкой, как головная программа.
Обращение к функции, определенной, происходит аналогично обращению ко встроенным функциям Pascal’я. Например, при обращении ко встроенной функции синуса, указывается имя функции, а за ним в скобках аргумент: sin(y). Обращение к процедуре аналогично. Однако, есть отличие между процедурой и функцией. Вызов функции обычно производится в выражении (арифметическом или логическом), а вызов процедуры является самостоятельным оператором Pascal.
При выполнении декомпозиции обычно решается вопрос –оформить модуль как функцию или как процедуру. В принципе любую подпрограмму можно оформить и в виде процедуры и в виде функции. Но есть случаи, когда выбор предопределен. Если целью подпрограммы является вычисление какого либо одного значения, то целесообразно оформлять ее в виде функции, в ходе выполнения которой это значение присваивается имени функции. Наличие такого присвоения имени функции обязательно.
Если же цель выполнения подпрограммы не связана с вычислением, например, вывод на экран массива, или наоборот, вычисление ряда значений, например, заполнение матрицы, то следует оформить подпрограмму в виде процедуры.
В неявных случаях выбор в пользу функции или процедуры делается согласно предпочтениям программиста.
Рассмотрим логику выполнения следующего примера.
Вычислить сумму ряда:
11+22+33-…+99.
В данном задании каждое слагаемое есть целая степень некоторого целого числа. Оформление возведения в степень в виде отдельной подпрограммы оптимальнее всего оформить в виде функции. Тип функции следует выбрать Real, дабы избежать переполнения.
В общем случае ab =a*a*…*a, т. е. ab есть произведение b одинаковых сомножителей (a)
Const n = 9;
Var i: byte;
S: real;
{Функция, вычисляющая аb}
Function step (a, b:byte):real;
Var P: real;
I: byte;
Begin
For I := 1 to b do
P := P*a;
Step :=P;
End;
Begin
S :=0;
For i:= 1 to n do
S:= S+ step (i, i);
Writeln (‘ сумма ряда: ‘, S:10:0);
End.
Следует обратить внимание, что в процедуре/функции следует использовать только локальные переменные, описанные в ней же. Исключение - случаи, когда согласно логике задачи использование глобальных переменных. В данном примере переменная цикла описана и в головной программе и в функции step. Следует избегать использования в таком качестве глобальной переменной дабы избежать наведенных ошибок.
Примечание.
Строго говоря, в задании требуется возвести аа, а не ab. Но для повышения функциональности функции, она решена в общем виде. Это оправдано тем, что нет какого-либо усложнения алгоритма, а всего лишь незначительно увеличено количество формальных параметров функции, а именно, вместо одного параметра (а) передается 2 параметра (а, b).
Задание № 2
Для его выполнения задания надо в качестве формальных параметров использовать массивы. Следует помнить, что при описании формального параметра в заголовке процедуры/функции следует указать его имя и тип. Причем, для обозначение типа надо использовать либо ключевое слово языка (real, Char…), либо имя пользовательского типа, присвоенного в разделе type.
Рассмотрим выполнение примера.
Заполнить случайными числами 3 массива a, b, c. Найти общее количество элементов, кратных 7 для всех 3-х массивов.
Очевидно, что надо сначала разработать структуру программы. С каждым из массивов следует проделать следующие действия:
1. Заполнение случайными числами.
2. Печать заполненного массива.
3. Подсчет количества элементов, кратных 7.
Т. е. следует написать 3 подпрограммы для каждого из этих действий. В качестве параметра будет передаваться один из массивов.
Const n = 10
Туре Мas= array [1..n] of Integer;
Var a, b,c : Мas;
{Процедура заполнения }
Procedure Zap ( Var d: Мas)
Var I: byte;
Begin
For I := 1 to n do
D[i] := random(100)
End;
{Процедура печати массива }
Procedure Wiw (d: Мas);
Var I: byte;
Begin
For I := 1 to n do
Write(D[i]:5);
Writeln;
End;
{Функция подсчета элементов, кратных 7 }
Function Кl_7 (d: Мas):byte;
Var kl: byte;
I: byte;
Begin
kl:=0;
For I := 1 to b do
If D[i]mod 7 = 0 then inc(kl);
Кl_7 :=kl; {имени функции присваивается значение}
End;
Begin
Zap(a); Wiw (a ); {заполнение и печать массива а}
Zap(b); Wiw (b ); {заполнение и печать массива b}
Zap(c); Wiw (c ); {заполнение и печать массива c}
Writeln( ‘ Всего элементов, кратных 7 : ‘, Кl_7 (a)+
Кl_7 (b)+ Кl_7 (c) );
End.
Внимание! В процедуре заполнения Zap массив нельзя передать как параметр - значение, поскольку в этом случае в головную программу не будут переданы изменения, произведенные в массиве при его заполнении. Поэтому в заголовке процедуры параметр-переменная, на что указывает ключевое слово Var:
Procedure Zap ( Var d: Мas)
Задание № 3
При вызове процедуры/функции значения фактических параметров для параметров значений просто копируются в системный стек. Все манипуляции проводятся именно с их копиями. А при окончании работы процедуры/функции, измененные значения просто удаляются из стека и никакого влияния на сам фактический параметр не оказывают.
В случае же параметров –переменных в системный стек при вызове процедуры/функции заносятся не копии значений, а адреса самих фактических значений. Поэтому работа проводится с самими фактическими параметрами, обращение к которым производится по адресам и поэтому все изменения проводятся над самими фактическими параметрами, и они после окончания работы процедуры остаются измененными.
Пример выполнения задания № 3.
Var c, d : integer;
Procedure P (x, y : integer)
begin y:=x+1 end;
Procedure Q (x : integer; var y : integer)
begin y:=x+1 end;
Procedure R (var x, y : integer)
begin y:=x+1 end;
begin
· c:=1; d:=4; P(c+2* d); writeln (d);
· c:=1; d:=4; Q(c+2* d); writeln (d);
· c:=1; d:=4; R(c+2* d); writeln (d);
· c:=1; d:=4; R(c, d); writeln (d);
В процедуре P используются формальные параметры – значения, следовательно, не зависимо от содержимого процедуры, фактический параметр d не изменится (он останется равным 4).
В процедуре Q формальный параметр y – параметр-переменная, он при выполнении процедуры изменяет свое значение, становится равным x+1. При этом x получает значение c+2*d=1+2*4=9. Подставляем значение 9 в выражение: x+1 = 9+1= 10. Это и есть итоговое значение d по возвращении в головную программу.
В процедуре R формальные параметры – переменные, следовательно фактическим параметром не может быть выражение. В этом случае имеет место синтаксическая ошибка. При 2-м вызове процедуры R формальные параметры x и y изначально получают значения c и d, т. е. 1 и 4 соответственно. Параметр y при выполнении процедуры изменяется y:=x+1=1+1=2.
Итак ответом на задание 4 будет:
4,
10,
синтаксическая ошибка,
2.
Задания
Вариант 1.
1. Вычислить значение Y=еA +еB для вещественных переменных А и В. Вычисление еX оформить в виде функции, используя ее разложение в ряд Тейлора в окрестности точки Х=0:
.
Имя функции выбрать отличным от имени стандартной функции ЕХР.
2. Ввести с терминала 3 массива a, b, c. Найти скалярные произведения:
(ab); (cb); (ca)
3. Определить, что будет выведено на печать в каждом из 4-х вариантов:
Var c, d : integer;
Procedure P (x, y : integer)
begin y:=x+1 end;
Procedure Q (x : integer; var y : integer)
begin y:=x+1 end;
Procedure R (var x, y : integer)
begin y:=x+1 end;
· c:=-2; d:=4; P(c*d, d); writeln (d);
· c:=-2; d:=4; Q(c*d, d); writeln (d);
· c:=-2; d:=4; R(c*d, d); writeln (d);
· c:=-2; d:=4; R(c, d); writeln (d);
Вариант 2.
1. Вычислить значение Y=cos(AX+B)*cos(AX-B) для вещественных переменных А, X, В. Вычисление функции cos(z) оформить в виде функции, используя ее разложение в ряд Маклорена:
.
Имя функции выбрать отличным от имени стандартной функции COS.
2. Заполнить случайными числами 3 матрицы размерностью (n*n). Найти среднеарифметическое для положительных чисел каждой из них.
3. Определить, что будет выведено на печать в каждом из 4-х вариантов:
Var c, d : integer;
Procedure P (x, y : integer)
begin y:=x+1 end;
Procedure Q (x : integer; var y : integer)
begin y:=x+1 end;
Procedure R (var x, y : integer)
begin y:=x+1 end;
· c:=5; d:=4; P(c-d, d); writeln (d);
· c:=5; d:=4; Q(c-d, d); writeln (d);
· c:=5; d:=4; R(c-d, d); writeln (d);
· c:=5; d:=4; R(c, d); writeln (d);
Вариант 3
1. Вычислить значение Y=sin(AX+B)*(1+sin2(AX-B)) для вещественных переменных А, X, В. Вычисление функции SIN оформить в виде функции” используя ее разложение в ряд Маклорена:
![]()
Имя функции выбрать отличным от имени стандартной функции SIN.
2. Заполнить случайными числами 3 массива a, b, c. Найти дисперсию каждого массива. Дисперсия массива x из N элементов рассчитывается по формуле
![]()
где М – среднеарифметическое элементов массива x.
3. Определить, что будет выведено на печать в каждом из 4-х вариантов:
Var c, d : integer;
Procedure P (x, y : integer)
begin y:=x+1 end;
Procedure Q (x : integer; var y : integer)
begin y:=x+1 end;
Procedure R (var x, y : integer)
begin y:=x+1 end;
· c:=3; d:=0; P(c+d, d); writeln (d);
· c:=3; d:=0; Q(c+d, d); writeln (d);
· c:=3; d:=0; R(c+d, d); writeln (d);
· c:=3; d:=0; R(c, d); writeln (d);
Вариант 4.
1. Ввести с терминала два значения величины А, а также n и m. Вычислить
,
и
.
2. Заполнить случайными числами 3 массива a, b, c. Найти общее количество нулевых элементов для всех 3-х массивов.
3. Определить, что будет выведено на печать в каждом из 4-х вариантов:
Var c, d : integer;
Procedure P (x, y : integer)
begin y:=x+1 end;
Procedure Q (x : integer; var y : integer)
begin y:=x+1 end;
Procedure R (var x, y : integer)
begin y:=x+1 end;
· c:=1; d:=4; P(2*c+d, d); writeln (d);
· c:=1; d:=4; Q(2*c+d, d); writeln (d);
· c:=1; d:=4; R(2*c+d, d); writeln (d);
· c:=1; d:=4; R(c, d); writeln (d);
Вариант 5.
1. По заданным значениям массивов X, Y вычислить :

2. Ввести с терминала матрицу А размерностью (n*n). Найти сумму элементов любой строки, номер которой будет введен с терминала.
3. Определить, что будет выведено на печать в каждом из 4-х вариантов:
Var c, d : integer;
Procedure P (x, y : integer)
begin y:=x+1 end;
Procedure Q (x : integer; var y : integer)
begin y:=x+1 end;
Procedure R (var x, y : integer)
begin y:=x+1 end;
· c:=1; d:=2; P(c+3*d); writeln (d);
· c:=1; d:=2; Q(c+3*d); writeln (d);
· c:=1; d:=2; R(c+3*d); writeln (d);
· c:=1; d:=2; R(c, d); writeln (d);
Вариант 6.
1. Ввести массив А(5)=( 2.0 , 0, 0.6664, 0, 0.4150) и использовать его для вычисления ln x по формуле
![]()
.
2. Заполнить случайными числами 3 матрицы размерностью (n*n). Найти в каждой из них строку, с наибольшей суммой.
3. Определить, что будет выведено на печать в каждом из 4-х вариантов:
Var c, d : integer;
Procedure P (x, y : integer)
begin y:=x+1 end;
Procedure Q (x : integer; var y : integer)
begin y:=x+1 end;
Procedure R (var x, y : integer)
begin y:=x+1 end;
· c:=15: d:=4; P(c+d, d); writeln (d);
· c:=15; d:=4; Q(c+d, d); writeln (d);
· c:=15; d:=4; R(c+d, d); writeln (d);
· c:=15; d:=4; R(c, d); writeln (d);
Вариант 7.
1. Для треугольника ввести длины сторон и посчитать длины всех его медиан, определяя длину медианы по формуле
.
2. Заполнить случайными числами 3 массива a, b, c. Найти произведение элементов с четными индексами для каждого массива..
3. Определить, что будет выведено на печать в каждом из 4-х вариантов:
Var c, d : integer;
Procedure P (x, y : integer)
begin y:=x+1 end;
Procedure Q (x : integer; var y : integer)
begin y:=x+1 end;
Procedure R (var x, y : integer)
begin y:=x+1 end;
· c:=6; d:=4; P(d*c+d, d); writeln (d);
· c:=6; d:=4; Q(d*c+d, d); writeln (d);
· c:=6; d:=4; R(d*c+d, d); writeln (d);
· c:=6; d:=4; R(c, d); writeln (d);
Вариант 8.
1. Написать функцию для вычисления
и вычислить S(n) для n от 12 до 24 с шагом 4.
2. Заполнить случайными числами 3 массива a, b, c. Найти общее количество четных элементов для всех 3-х массивов.
3. Определить, что будет выведено на печать в каждом из 4-х вариантов:
Var c, d : integer;
Procedure P (x, y : integer)
begin y:=x+1 end;
Procedure Q (x : integer; var y : integer)
begin y:=x+1 end;
Procedure R (var x, y : integer)
begin y:=x+1 end;
· c:=5; d:=4; P(5*c+d, d); writeln (d);
· c:=5; d:=4; Q(5*c+d, d); writeln (d);
· c:=5; d:=4; R(5*c+d, d); writeln (d);
· c:=5; d:=4; R(c, d); writeln (d);
Вариант 9.
1. Написать функцию для вычисления
и вычислить S(n) для n от 1 до 5 с шагом 1.
2. Заполнить случайными числами 3 массива a, b, c. Найти общее количество элементов, кратных 4, для всех 3-х массивов.
3. Определить, что будет выведено на печать в каждом из 4-х вариантов:
Var c, d : integer;
Procedure P (x, y : integer)
begin y:=x+1 end;
Procedure Q (x : integer; var y : integer)
begin y:=x+1 end;
Procedure R (var x, y : integer)
begin y:=x+1 end;
· c:=-5; d:=4; P(c+d, d); writeln (d);
· c:=-5; d:=4; Q(c+d, d); writeln (d);
· c:=-5; d:=4; R(c+d, d); writeln (d);
· c:=-5; d:=4; R(c, d); writeln (d);
Вариант 10.
1. Написать функцию для определения n при котором сумма ряда будет вычислена с точностью 10-3
![]()
2. Заполнить случайными числами 3 массива a, b, c. Найти сумму отрицательных элементов для всех 3-х массивов.
3. Определить, что будет выведено на печать в каждом из 4-х вариантов:
Var c, d : integer;
Procedure P (x, y : integer)
begin y:=x+1 end;
Procedure Q (x : integer; var y : integer)
begin y:=x+1 end;
Procedure R (var x, y : integer)
begin y:=x+1 end;
· c:=1; d:=4; P(c+5*d, d); writeln (d);
· c:=1; d:=4; Q(c+5*d, d); writeln (d);
· c:=1; d:=4; R(c+5*d, d); writeln (d);
· c:=1; d:=4; R(c, d); writeln (d);
Вариант 11.
1. Написать функцию для определения n при котором сумма ряда будет вычислена с точностью 10-3
![]()
2. Заполнить случайными числами 3 массива a, b, c. Найти среднеарифметическое элементов для всех 3-х массивов.
3. Определить, что будет выведено на печать в каждом из 4-х вариантов:
Var c, d : integer;
Procedure P (x, y : integer)
begin y:=x+1 end;
Procedure Q (x : integer; var y : integer)
begin y:=x+1 end;
Procedure R (var x, y : integer)
begin y:=x+1 end;
· c:=11; d:=4; P(c-d, d); writeln (d);
· c:=11; d:=4; Q(c-d, d); writeln (d);
· c:=11; d:=4; R(c-d, d); writeln (d);
· c:=11; d:=4; R(c, d); writeln (d);
Библиографический список
1. Попов, В. Б. Тurbo Pascal для школьников [Текст] /
. – М. : Финансы и статистика, 2004. – 525 с.
2. Епанешников, А. М. Программирование в среде Turbo-Pascal 7.0. [Текст] / , . М. : Диалог МИФИ, 2003. – 288 с.
3. Культин, Н. В. Tupbo-Pascal в задачах и примерах [Текст] / . – СПб. : БХВ Санкт - Петербург, 2005. –156 с.
4. Марченко, А. И. Программирование в среде Turbo-Pascal 7.0. [Текст] / , . – Киев : ВЕК+, М.: Бином Универсал, 2008. – 496 с.
Учебное издание
Технология программирования
Методические указания по выполнению
контрольной работы
Для студентов, обучающихся по направлениям
230200 – "Информационные системы " и
дневной формы обучения
Составители : МЕДВЕДКОВА Ирина Евгеньевна
БУГАЕВ Юрий Владимирович
ЧИКУНОВ Сергей Владимирович
Подписано в печатьФормат 60´84 1/16.
Усл. печ. л. 1,4. Тираж 50 экз. Заказ С -
ГОУВПО “Воронежская государственная технологическая академия”
(ГОУВПО “ВГТА”)
Отдел полиграфии ГОУВПО “ВГТА”
Адрес академии и отдела полиграфии :
Воронеж, пр. Революции, 19


