Файл: Методическое пособие 2013 Корректор Осипова Е. А.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 25.10.2023

Просмотров: 177

Скачиваний: 4

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ
УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ
Кафедра компьютерных систем в управлении
и проектировании (КСУП)
Е.А. Потапова
èêéÉêÄååàêéÇÄçàÖ
Учебное
методическое
пособие
2013

Корректор: Осипова Е.А.
Потапова Е.А.
Программирование: учебное методическое пособие. — Томск:
Факультет дистанционного обучения, ТУСУР, 2013. — 88 с.
© Потапова Е.А., 2013
© Факультет дистанционного обучения, ТУСУР, 2013

3
ОГЛАВЛЕНИЕ
Контроль обучения ............................................................................................. 4
Лабораторная работа № 1................................................................................... 5
Лабораторная работа № 2................................................................................. 31
Лабораторная работа № 3................................................................................. 50
Лабораторная работа № 4................................................................................. 61
Требования к оформлению отчета .................................................................. 84
Список литературы ........................................................................................... 85
Приложение А Пример оформления титульного листа................................ 86
Приложение Б Пример оформления содержания.......................................... 87
Приложение В Пример оформления блок-схемы алгоритма....................... 88

4
КОНТРОЛЬ
ОБУЧЕНИЯ
В рамках изучения дисциплины «Программирование» предполагает- ся выполнение лабораторных работ.
Каждое контрольное задание в составе лабораторных работ состоит из нескольких задач, требующих разработки программ на Паскале (можно использовать PascalABC). Использование Delphi не допускается. Разрабо- танные и отлаженные программы (обязательно сопровождающиеся ком-
ментариями в тексте), а также отчет по каждой лабораторной работе студент по мере освоения соответствующих разделов языка программиро- вания отправляет на проверку. По результатам проверки работ студенту отправляется рецензия, в которой преподавателем приводится описание ошибок программ (в случае их наличия).
Выбор варианта лабораторных работ осуществляется по общим пра- вилам с использованием следующей формулы:
V = (N*K) div 100, где V — искомый номер варианта,
N — общее количество вариантов, div — целочисленное деление (после деления дробная часть отбра- сывается), при V = 0 выбирается максимальный вариант,
K — значение 2-х последних цифр пароля.


5
ЛАБОРАТОРНАЯ
РАБОТА

1
Лабораторная работа № 1 посвящена созданию программ с исполь- зованием простых управляющих структур: условного оператора, цикла. В задании используются простые типы данных (нет необходимости исполь-
зовать массивы). Поэтому программы, написанные с использованием массивов, не засчитываются. Кроме того, программы должны быть разра- ботаны в рамках структурного программирования. В частности, запреща- ется использовать операторы перехода и метки.
Задание состоит из двух задач. Решение первой задачи предусматри- вает использование простых типов данных, а решение второй задачи — строкового типа данных. В ходе выполнения лабораторной работы необ- ходимо составить программы на языке Паскаль. В некоторых программах полезно определить вспомогательные функции или процедуры. Во всех за- дачах строки вводятся пользователем с клавиатуры.
Многие задачи лабораторной работы № 1 имеют вид: «Дана после- довательность из n (действительных) целых чисел. Определить (вычис- лить) …» или «Даны натуральное n и вещественные числа a
1
, a
2
, ..., a n
. Оп- ределить (вычислить) …» и т.п. Во всех этих задачах не требуется хранения исходных последовательностей значений. Вводится n, затем в цикле, работающем n раз, осуществляется пошаговый ввод чисел, и опре- деленным образом постепенно вычисляется необходимый результат.
Примеры
решения
задач
Простые типы данных
Задача 1.1. Вычислить: y = sin1 + sin1.1 + sin1.2 + ... + sin2.
Анализируя данную формулу, видим, что каждое слагаемое данной суммы можно рассчитать по формуле sin(1 + 0.1 * i), где i изменяется от 0 до 10. Поэтому для решения данной задачи можно составить следующий алгоритм.
Переменные: i — параметр цикла; y — сумма.
Алгоритм решения задачи:
1.
Обнуляем начальное значение переменной y
− строка 6, в которой будем накапливать сумму.
2.
Организуем цикл для определения суммы (параметр данного цик- ла должен измениться от 0 до 10) .
3.
В данном цикле определяем очередное слагаемое по формуле и добавляем это слагаемое в сумму (строка 7).
4.
Выводим результат на экран (строка 8).

6 1) var y : real;
2) i : integer;
3) Begin
4) writeln('Полученное значение расчета формулы ',
5)
'y=sin1+sin1.1+sin1.2+ ... +sin2 = ');
6) y:=0;
7) for i:=0 to 10 do y:=y+sin(1+0.1*i);
8) writeln(y);
9) end.
Задача 1.2. Вычислить: y = 1*3*5* ... *(2n–1), n>0;
var y : real; i, n : integer; begin writeln('Введите количество чисел'); readln(n); y:=1; for i:=1 to n do y:=y*(2*i–1); writeln('Полученное значение y= ', y) end.
Задача 1.3. Дано натуральное число N. Разложить его на простые
множители.
Переменные: n
− исследуемое число; i, j
− переменные циклов; f
− вспомогательный флаг.
Алгоритм решения задачи:
1. Вводим значение переменной n. Так как пользователь может случай- но ввести отрицательное число, то необходимо дать ему возможность для по- вторного ввода значения переменной n. Поэтому организуем цикл (строки
3—6 текста программы). Лучше использовать цикл с постпроверкой условия
(Repeat…Until). Тело цикла составляют два оператора: оператор вывода на экран приглашения для ввода значения переменной n (строка 4) и оператор чтения с клавиатуры — для непосредственного ввода значения переменной n
(строка 5). Данный цикл будет выполняться до тех пор, пока пользователь не введет любое положительное число (строка 6).
2. Выводим на экран значение переменной n и начинаем формиро- вать ответ. Ответ будет представлен в следующем виде (например, в каче- стве значения переменной n ввели 8): 8 = 1*2*2*2. Так как единица является


7
простым множителем для любого числа, то выводим ее на экран (строка 7). В результате выполнения данной строки на экране появится: 8 = 1.
3. Вспомогательной переменной f присваиваем значение false. Дан- ная переменная нам будет необходима для определения, были ли вообще найдены простые множители у заданного числа n. Запоминаем исходное значение переменной n в переменной j (строка 8).
4. В цикле по переменной i начинаем порождение натуральных чи- сел, не превосходящих середину заданного числа n, для определения дели- телей данного числа n (строка 9). Данный цикл начали с 2, т.к. единицу мы уже учли (шаг 2 данного алгоритма). Так как в цикле For можно использо- вать только целые переменные, поэтому воспользовались оператором цело- численного деления на 2 (n div 2). В данном цикле выполняем следующее.
Определяем, является ли очередное i делителем числа n (в качестве n в данном цикле используем j). Для этого определяем остаток от деления j на i. Если остаток равен 0 (строка 10), т.е. число i является делителем j, то определяем, сколько таких делителей, уменьшая число n (строки 11—18).
Переменной f присваиваем значение true (строка 12) — это означает, что у заданного числа n есть делители. Организуем цикл, пока остаток от деле- ния j на i равен 0 (строка 13). В данном цикле выводим делитель на экран
(строка 15) и уменьшаем заданное число, деля его целочисленно на дели- тель (строка 16). Повторяем цикл.
После завершения этого цикла возвращаемся на цикл For (строка 9), изменяем i и повторяем те же действия для нового делителя.
5. Если у числа нет делителей (оно является простым), то данное число можно разложить только на 1 и само на себя. Вспомогательная пе- ременная f и определяет, были ли делители у числа n. Если значение пере- менной f осталось false, то делителей не было, поэтому выводим само это число (строка 19).
1) var i, n, j : integer; f: boolean;
2) begin
3) repeat
4) write('Введите натуральное число N= ');
5) readln(n);
6) until n>0;
7) write (N:6, '=1');
8) f:=false; j:=n;
9) for i:=2 to n div 2 do
10) if j mod i = 0 then
11) begin
12) f:=true;
{цикл определет, сколько таких множителей i в нашем числе n}
13) while j mod i=0 do
14) begin

8 15) write('*', i);
16) j:=j div i;
17) end;
18) end;
{f определяет, были ли найдены простые множители, большие единицы}
19) if not f then writeln('*', n);
20) writeln
21) end.
Задача 1.4. Даны натуральное n и последовательность a
1
, a
2
,…,a
n
вещественных чисел. Найдите знакочередующую сумму S = a
1

a
2
+ a
3


+ (
−1)
n+1
a
n
.
Переменные: n — количество чисел; a — очередное число; p — булевский признак знака слагаемого; i — переменная цикла;
S — знакочередующая сумма чисел.
Алгоритм решения задачи:
1)
вводим длину последовательности n и устанавливаем начальное значение S;
2)
булевская переменная p первоначально истинна, она будет указы- вать на знак слагаемого в сумме;
3)
последовательно считываем числа, и если p = true, то прибавляем его к сумме S, иначе отнимаем;
4)
на каждом шаге цикла значение p меняем на противоположное;
5)
выводим результат. var n, i : integer; a, S : real; p: boolean; begin repeat write('Введите длину последовательности n='); readln(n); until n>0; p:= true;
S:=0; for i:=1 to n do begin write('Введите a=');


9
readln(a); if p then S:=S+a else S:=S–a; p:= not p end; writeln('Знакочередующая сумма чисел S= ', S); end.
Задача 1.5. Найти сумму первых n членов ряда y = 1 + x/2 + x
2
/3 +
+ x
3
/4+..., при |x|<1.
Переменные: n — количество членов ряда; x — переменная ряда; z — вспомогательная переменная; i — переменная цикла; y — сумма ряда.
Алгоритм решения задачи:
1) вводим количество членов ряда n и переменную x;
2) в цикле порождаем очередной член ряда и прибавляем его к сумме y;
3) выводим результат. var x, y, z : real; n, i : integer; begin repeat writeln('Введите переменную ряда x, |x|<1, x='); readln(x); write('Введите число членов ряда n='); readln(n); until (abs(x)<1) and (n>0); y:=1; z:=1; for i:=2 to n do begin z:=z*x; y:=y+z/i; end; writeln('Сумма первых n членов ряда y =', y); end.
Задача 1.6. Вводится последовательность из N целых чисел. Найти
сумму всех отрицательных чисел.
Переменные: n — количество чисел;

10
x — очередное число; i — переменная цикла; sum — сумма отрицательных чисел.
Алгоритм решения задачи:
1)
вводим длину последовательности n и устанавливаем начальное значение sum;
2)
последовательно считываем числа, и если число отрицательное, то прибавляем его к сумме sum;
3)
в зависимости от значения sum выводим результат. var n, x, sum, i : integer; begin repeat write('Введите длину последовательности n='); readln(n); until n>0; sum:=0; for i:=1 to n do begin write('Введите x='); readln(x); if x<0 then sum:=sum+x; end; if sum=0 then writeln('Отрицательных чисел нет') else writeln('Сумма отрицательных чисел sum= ', sum); end.
Задача 1.7. Вводится последовательность из N целых чисел. Найти
наибольшее число.
Переменные: n — количество чисел; x — очередное число; i — переменная цикла; max — наибольшее число.
Алгоритм решения задачи:
1)
вводим длину последовательности n и устанавливаем начальное значение max по первому числу;
2)
последовательно считываем числа, и если очередное число x больше max, то изменяем значение max := x;
3)
выводим результат.

11
var n, x, max, i : integer; begin repeat write('Введите длину последовательности n='); readln(n); until n>0; write('Введите x='); readln(x); max:=x; for i:=2 to n do begin write('Введите x='); readln(x); if (x>max) then max:=x; end; writeln('Наибольшее из чисел max=', max); end.
Задача 1.8. Вводится последовательность целых чисел, 0 — конец
последовательности. Найти два наименьших числа.
Переменные: x — очередное число; min1 — первое наименьшее число; min2 — второе наименьшее число (min2>=min1).
Алгоритм решения задачи:
1)
устанавливаем начальные значения min1 и min2 по двум первым числам;
2)
последовательно считываем числа, и если очередное число x меньше или равно min1 (min13)
если x попадает в интервал от min1 до min2, то изменяем только min2;
4)
выводим результат. var x,min1,min2:integer; begin write('Введите x='); readln(x); min1:=x; write('Введите x='); readln(x); min2:=x ;


12
{min1<=min2} repeat if x<=min1 then begin min2:=min1; min1:=x; end else if (min1Задача 1.9. Вводится последовательность ненулевых чисел, 0 — ко-
нец последовательности. Определить, является ли последовательность
возрастающей.
Переменные: old — предыдущее число; new — рассматриваемое число; f — флаг.
Решение данной задачи строится от противного. Математически для того, чтобы последовательность была возрастающей, для каждого очередного элемента new и предыдущего old должно выполняться условие new > old.
Любое нарушение данного условия приводит к тому, что последователь- ность не может быть возрастающей.
Алгоритм решения задачи:
1)
вводим два первых числа как old и new, задаем начальное значение флага f;
2)
в цикле ищем нарушение свойства членов возрастающей последо- вательности;
3)
переприсваиваем значение old:=new и вводим новое — new;
4)
в зависимости от флага выводим результат. var old, new : real; f : boolean; begin write('Введите x='); readln(old); write('Введите x='); readln(new);

13
f:=true; repeat if new<=old then f:=false; old:=new; write('Введите x='); readln(new); until new=0; if f then writeln( 'Последовательность возрастающая') else writeln( 'Последовательность не является возрастающей'); end.
Задача 1.10. Даны натуральное n и последовательность веществен-
ных чисел a
1
, a
2
,…, a
n
. Сколько отрицательных чисел в начале последова-
тельности (до первого неотрицательного)?
Переменные: k — счетчик; i — переменная цикла; n — количество членов последовательности; a — очередной член последовательности; p — признак отрицательного числа в начале последовательности.
Алгоритм решения задачи:
1)
вводим длину последовательности, задаем начальное значение счетчика k;
2)
устанавливаем признак отрицательного числа p=true;
3)
в цикле вводим очередной член последовательности;
4)
если это отрицательное число и до этого неотрицательных чисел не было, то увеличиваем значение счетчика на единицу;
5)
в противном случае, если член последовательности неотрицателен, то полагаем p=false;
6)
в зависимости от k выводим результат. var a: real; p: boolean; k,n : integer; begin repeat write('Введите длину последовательности n='); readln(n); until n>0; k:=0; p:=true; for i:=1 to n do begin writeln('Введите число');

14
readln(a); if (a<0) and p then k:=k+1else if a>=0 then p :=false end; if k=0 then writeln('отрицательных чисел в начале нет') else writeln('последовательность начинается с ', k, ' чисел') end.
Задача 1.11. Дан прямоугольный бильярдный стол со сторонами А и
В, где А, В — натуральные числа (бильярд Льюиса Кэрролла). Из угловой
лузы вылетает шар под углом 45 градусов к боковым стенкам, ударяется
о борт, отскакивает, ударяется еще раз и т.д., пока не вылетит через
одну из угловых луз. Рассчитать количество отрезков в ломаной траек-
тории шара. Считать угол падения равным углу отражения.
Данная задача решается с помощью стандартных функций выделе- ния целой части от деления y на x (y div x) и выделения остатка y mod x.
При прохождении шаром прямоугольного стола и отражении его от боко- вых сторон происходит увеличение числа отрезков траектории на два, а обратный путь вычисляется как y:=a–x+y mod x, где y — обратный путь для шара, a — длинная сторона стола, x — короткая сторона стола.
Переменные: а) в функции bill: x, y — два натуральных числа (формальные параметры); k — вспомогательная переменная (локальная переменная); a — длинная сторона стола (глобальная переменная); б) в основной программе: a, b — два натуральных числа (глобальные переменные).
Алгоритм решения задачи:
1)
создаем описание функции bill;
2)
вводим два натуральных числа a и b (не кратные друг другу);
3)
вызываем функцию bill для определения количества отрезков;
4)
завершаем работу программы. var a, b : integer; function bill(y,x:integer):integer; var k:integer; begin k:=0; while y mod x <>0 do begin