End - Северо-Кавказский горно

реклама
ОСНОВЫ ПРОГРАММИРОВАНИЯ
Методические указания к лабораторным работам
Для студентов, обучающихся по направлению подготовки
230100.62 – «Информатика и вычислительная техника»,
Составитель А. А. Будаева
Владикавказ 2015
0
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
"СЕВЕРО-КАВКАЗСКИЙ ГОРНО-МЕТАЛЛУРГИЧЕСКИЙ ИНСТИТУТ
(ГОСУДАРСТВЕННЫЙ ТЕХНОЛОГИЧЕСКИЙ УНИВЕРСИТЕТ)"
Кафедра Автоматизированной обработки информации
ОСНОВЫ ПРОГРАММИРОВАНИЯ
Методические указания к лабораторным работам
Для студентов, обучающихся по направлению подготовки
230100.62 – «Информатика и вычислительная техника»
Составитель А. А. Будаева
Допущено
редакционно-издательским советом
Северо-Кавказского горно-металлургического института
(государственного технологического университета).
Протокол заседания РИСа № 1 от 17.01.2014 г.
Владикавказ 2015
1
УДК 004.432.2
ББК 32.973.26-0.08.1
Б90
Рецензент
кандидат технических наук,
доцент Северо-Кавказского горно-металлургического института
(государственного технологического университета)
Даурова А. А.
Б90
Основы программирования: Методические указания к лабораторным работам.
Для студентов, обучающихся по направлению подготовки 230100.62 – "Информатика и вычислительная техника" / Сост. А. А. Будаева; Северо-Кавказский горнометаллургический институт (государственный технологический университет). –
Владикавказ: Северо-Кавказский горно-металлургический институт (государственный технологический университет). Изд-во «Терек», 2015. – 86 с.
Методические указания содержат описание лабораторных работ, соответствующих рабочей программе по дисциплине «Основы программирования» для
студентов направления подготовки «Информатика и вычислительная техника»
230100.62.
В методических указаниях на примерах рассматриваются средства языка
Delphi, используемые в рамках структурной парадигмы: строки, записи, множества, файлы, подпрограммы, динамические структуры данных и т.д. По каждой
работе приведено 20 вариантов заданий. Методические указания способствуют
практическому освоению всех этапов разработки программы для эффективного
решения поставленной задачи на ПЭВМ, начиная от анализа условия задачи и заканчивая сдачей отчета по написанной программе.
УДК 004.432.2
ББК 32.973.26-0.081
Редактор Иванченко Н. К.
Компьютерная верстка Цишук Т. С.
 Составление. ФГБОУ ВПО «Северо-Кавказский
горно-металлургический институт
(государственный технологический университет)», 2015
 Будаева А. А., составление, 2015
Подписано в печать 12.01.2015. Формат 60х84 1/16. Бумага офсетная. Гарнитура «Таймс».
Печать на ризографе. Усл. п.л. 5,0. Уч.-изд. л. 3,23. Тираж 20 экз. Заказ №
.
Северо-Кавказский горно-металлургический институт (государственный технологический
университет). Издательство «Терек».
Отпечатано в отделе оперативной полиграфии СКГМИ (ГТУ).
362021, г. Владикавказ, ул. Николаева, 44.
2
Содержание
Общие указания к выполнению лабораторных работ .......................................... 4
Лабораторная работа № 1. Алгоритмы линейной и разветвляющей
структуры ................................................................................................................ 6
Лабораторная работа № 2. Алгоритмы циклической структуры ..................... 13
Лабораторная работа № 3. Массивы ................................................................... 24
Лабораторная работа № 4. Процедуры и функции ............................................ 44
Лабораторная работа № 5. Строки, записи, множества .................................... 46
Лабораторная работа № 6. Работа с комбинированными типами данных ...... 54
Лабораторная работа № 7. Файлы ...................................................................... 64
Лабораторная работа № 8. Динамические структуры данных в Delphi .......... 73
Список рекомендуемой литературы ...................................................................... 83
Приложение. Пример оформления отчета по лабораторной работе ................... 84
3
ОБЩИЕ УКАЗАНИЯ К ВЫПОЛНЕНИЮ ЛАБОРАТОРНЫХ РАБОТ
Основная цель, которая ставиться студенту при выполнении задания
– практическое освоение всех этапов разработки надежной программы
для решения задачи на ПЭВМ, начиная от анализа условия задачи и заканчивая сдачей отчета по написанной программе. Каждая лабораторная
работа состоит из двух или трех задач и включает следующие виды работ:
1. Анализ условия задачи и выработка подхода к ее решению.
2. Пошаговая разработка алгоритма решения и его описание.
3. Обоснование алгоритма.
4. Составление блок-схемы алгоритма.
5. Выбор и обоснование представления для входных, выходных и
промежуточных данных.
6. Кодирование алгоритма, т. е. его запись на языке Delphi.
7. Выбор набора тестов, на которых будет проверяться программа.
8. Отладка программы и демонстрация правильной ее работы на
выбранном наборе тестов.
Для повышения эффективности составления алгоритма относительно больших программ применяется структурный подход к программированию. Это способствует уменьшению затрат на создание и дальнейшее
использование программ при эксплуатации.
Структурный подход к программированию состоит из трех частей:
нисходящая разработка, структурное программирование и сквозной контроль (тестирование).
При нисходящей разработке проектирование и программирование
ведутся по методу "сверху – вниз", который предусматривает сначала
определение задачи в общих чертах, а затем задача разбивается на ряд
более простых подзадач. Для каждой подзадачи составляется алгоритм
ее решения.
В структурном программировании программист мыслит как конструктор, в распоряжении которого есть некоторое (небольшое) число
вполне определенных типовых конструкций, причем заданы правила их
соединения – структуры можно сочленить друг с другом, вложить друг в
друга, либо, наоборот, разложить на составляющие. Структура – это
оператор (вполне определенный, не всякий) языка программирования,
который имеет один вход и один выход. Подготовка к каждой лабораторной работе производится во внеаудиторное время. Выполнив лабораторную работу, студент оформляет отчет, который состоит из следующих разделов:
1. Тема и цель работы.
4
2. Условия задания.
3. Этапы решения задачи.
 Математическая модель задачи;
 Блок схема алгоритма.
4. Текст программы и размещение исходных данных при вводе.
5. Результаты работы программы.
6. Выводы.
Особое внимание при разработке программы следует уделить построению набора тестов, на которых программа будет проверяться. Одно
из основных требований к выбранному набору тестов – это его полнота,
т. е. требование, чтобы каждая ветвь программы выполнялась хотя бы на
одном из тестов набора. При этом следует учесть возможность ввода
ошибочных данных, для которых программа должна печатать понятные
диагностические сообщения о причинах их недопустимости.
При защите отчета необходимо отвечать на контрольные вопросы и
уметь пояснять работу программы.
Примечание. Все работы выполняются в консольном режиме в среде Borland Delphi или Embarcadero Delphi
5
Лабораторная работа № 1
АЛГОРИТМЫ ЛИНЕЙНОЙ И РАЗВЕТВЛЯЮЩЕЙ СТРУКТУРЫ
Цель работы: выработать практические навыки работы с системой
Borland Delphi, научиться создавать, вводить в компьютер, выполнять и
исправлять простейшие программы на языке Delphi в режиме диалога,
познакомиться с диагностическими сообщениями компилятора об ошибках при выполнении программ, реализующих линейные алгоритмы;
научиться правильно использовать условный оператор if; научиться составлять программы решения задач на разветвляющиеся алгоритмы
Общие сведения
Линейным называется алгоритм, в котором результат получается
путем однократного выполнения заданной последовательности действий
при любых значениях исходных данных. Операторы программы выполняются последовательно, один за другим, в соответствии с их расположением в программе.
Алгоритм называется разветвляющимся, если он содержит несколько ветвей, отличающихся друг от друга содержанием вычислений. Выход вычислительного процесса на ту или иную ветвь алгоритма определяется исходными данными задачи.
Перед выполнением работы необходимо ознакомиться с правилами
записи логических выражений, операций сравнения, операторов IF,
CASE, READ, READLN, WRITE, WRITELN.[1–7]
Пример 1.1: Определить расстояние на плоскости между двумя
точками с заданными координатами M1(x1,y1) и M2(x2,y2)
Этапы решения задачи:
1. Математическая модель: расстояние на плоскости между двумя
точками M1(x1,y1) и M2(x2,y2) вычисляется по формуле
d  x1  x2    y1  y2 
2. Составим схему алгоритма (рис. 1)
2
2
6
Рис. 1. Блок-схема к задаче примера 1.1
3. Переводим блок-схему на язык Delphi.
program example1;
var x1, x2, y1, y2: integer;
d:real;
begin
writeln('Эта программа вычисляет расстояние между двумя точками на плоскости');
writeln('Введите координаты двух точек:');
write('x1= '); readln(x1);
write('y1= '); readln(y1);
write('x2= '); readln(x2);
write('y2 ='); readln(y2);
d:=sqrt(sqr(x2-x1)+sqr(y2-y1));
writeln('d= ',d);
writeln('нажмите Enter для завершения работы программы');
readln;
end.
7
Пример 1.2. Определить есть ли в заданном трехзначном числе хотя
бы две одинаковые цифры.
Этапы решения задачи:
1. Любое трехзначное число N можно представить в виде суммы:
N  a 100  b 10  c , где a – число сотен, b – число десятков и c – число
единиц. Для вычисления значений a, b, c воспользуемся следующими
a   N / 100 ,
формулами:
b   N  a 100  / 10 ,
c  N чисел
a 100 a,
 bb,
10c. и в случае, если есть совЗатем сравниваются все пары
падения, на экран выдается сообщение «ДА», иначе «НЕТ»
2. Составим схему алгоритма (рис.2).
Рис. 2. Блок-схема к задаче примера 1.2
8
3. Программа
program example2;
var a, b, c, N: integer;
begin
writeln('Эта программа определяет, есть ли в трехзначном числе
одинаковые цифры');
writeln('Введите число N:'); readln(N);
a := N div 100;
b := (N – a*100)div 10;
c := N – a*100 – b*10;
if (a=b)or (b=c)or(a=c) then writeln(‘ДА’) else writeln(‘НЕТ’);
writeln('нажмите Enter для завершения работы программы');
readln;
end.
Задания
Вариант 1
1. Вычислить: z  2 sin 3  2 cos2 5  2 
2. Вычислите длину окружности, площадь круга и объём шара одного и того же заданного радиуса.
Вариант 2
sin 3 2
 2 ln  2
cos 
2. Вычислите периметр и площадь прямоугольного треугольника
по длинам двух его катетов.
1. Вычислить: z  1  e 2 
Вариант 3
sin 2  sin 5  sin 3
cos   1  2 sin 2 2
2. По координатам трёх вершин некоторого треугольника найдите
его площадь и периметр.
1. Вычислить: z 
Вариант 4
sin 2  sin 5  sin 3
cos   cos 3  cos 5
2. Вычислите дробную часть среднего геометрического трёх заданных вещественных чисел.
Вариант 5
9
1. Вычислить: z 
1. Вычислить: z  1  1 sin 2 2  cos 2
4
2. Определите, является ли заданное целое число А нечётным двузначным числом.
Вариант 6

5
1. Вычислить: z  4 cos  cos   cos 4
2
2
2. Определите, имеется ли среди заданных целых чисел A, B, C хотя
бы одно чётное.
Вариант 7


3
 11
1. Вычислить: z  cos 2      cos 2    
4
4
8
8
2. Даны три числа. Выберите те из них, которые принадлежат заданному отрезку [ e, f ].
Вариант 8
1
1. Вычислить: z  cos 4 x  sin 2 y  sin 2 2 x  1
4
2. Определите число, полученное выписыванием в обратном порядке цифр заданного целого трёхзначного числа.
Вариант 9
2
2
1. Вычислить: z  cos   cos   sin   sin 
2. Для заданных вещественных чисел a, b и c определите, имеет ли
уравнение ax4 + bx2 + c = 0, хотя бы одно вещественное решение.
Вариант 10


sin   3 
2

1. Вычислить: z 
1  sin 3  
2. Вычислите площадь кольца, ширина которого равна Н, а отношение радиуса большей окружности к радиусу меньшей окружности равно D.
Вариант 11
1  2 sin 2 
1  sin 2
2. Определите, есть ли среди цифр заданного целого трёхзначного
числа одинаковые.
10
1. Вычислить: z 
Вариант 12
sin 4
cos 2

1  cos 4 1  cos 2
2. Заданы площади круга и квадрата. Определите, поместится ли
квадрат в круге.
1. Вычислить: z 
Вариант 13
sin   cos2   
cos   sin 2   
2. Два прямоугольника заданы длинами сторон. Определите, можно
ли первый прямоугольник целиком разместить во втором.
1. Вычислить: z 
Вариант 14
1
3
cos   sin  3
4
1. Вычислить: z 
1
cos   sin 3 2
4
2. Заданы координаты двух точек. Определите, лежат ли они на одной окружности с центром в начале координат.
2
Вариант 15
1. Вычислить: z 
2b  2 b 2  4
b2  4  b  2
2. Определите, лежит ли заданная точка на одной из сторон треугольника, заданного координатами своих вершин.
Вариант 16
1. Вычислить: z 
x 2  2 x  3  x  1 x 2  9
x 2  2 x  3  x  1 x 2  9
2. Значения заданных переменных a, b и c перераспределите таким
образом, что a, b, c станут, соответственно, наименьшим, средним и наибольшим значениями.
Вариант 17
1. Вычислить: z 
3m  22  24m
3 m
2
m
11
2. Идет k-ая секунда суток. Определите, сколько полных часов и
полных минут прошло к этому моменту от начала суток.
Вариант 18
a2
 a 2
a
2
 


1. Вычислить: z  
2a  2 a  2a  a  2
 2a
2. Даны координаты (как целые от 1 до 8) двух полей шахматной
доски. Определите, может ли конь за один ход перейти с одного
из этих полей на другое.
Вариант 19
1
 1  a  a2
1  a  a2 
 5  2a 2
1. Вычислить: z  
2
3
2 
2a  a 
 2a  a
2. Треугольник задан величинами своих углов (град.) и радиусом
описанной окружности. Вычислите стороны треугольника.
Вариант 20
1. Вычислить: z 
m  1


m  n  1 n
m n  nm  m 2  m
2. Определите номер квадранта, в котором находится точка с заданными координатами (x, y).
3
Контрольные вопросы
1. Каковы назначение и возможности системы Borland Delphi?
2. Как запустить программу на трансляцию и выполнение?
3. Как записываются операторы начала и конца программы?
4. Из каких разделов состоит программа на языке Pascal?
5. В какой последовательности должны быть записаны разделы
программы на языке Pascal?
6. Как записываются операторы ввода-вывода на экран в Pascal?
7. Какие команды текстового редактора вы знаете?
8. Что такое блок текста и как его выделить?
9. Какие операторы используются для программирования разветвлений?
10. Как выполняются операторы перехода?
11. Какую из функций: Sin(x), Abs(x), Trunc(x) можно заменить
условным оператором if x<0 then x := -x?
12
Лабораторная работа № 2
АЛГОРИТМЫ ЦИКЛИЧЕСКОЙ СТРУКТУРЫ
Цель работы: научиться правильно использовать различные операторы циклов; научиться составлять программы решения задач с использование циклических структур.
Общие сведения
Алгоритм называется циклическим, если он содержит многократное
выполнение одних и тех же операторов при различных значениях промежуточных данных. Число повторений этих операторов может быть
задано в явной (цикл с известным заранее числом повторений) или неявной (цикл с неизвестным заранее числом повторений) форме.
Перед выполнением работы необходимо изучить различные схемы
организации циклов и операторы FOR, WHILE, REPEAT. [1–7]
Пример 2.1. Определить, является ли заданное число простым.
Этапы решения задачи:
1. Любое число N – простое, если у него нет делителей кроме 1 и
самого этого числа. Для решения задачи необходимо проверить
есть ли все возможные делители числа N из диапазона [2, N\2].
Если делители есть – число составное, иначе простое.
2. Составим схему алгоритма (рис. 3)
3. Программа
program example1;
var N, F, i: integer;
begin
writeln('Программа определяет, является ли число простым');
writeln('Введите число N:'); readln(N);
F := 0;
For i := 2 to N div 2 do
If N mod i = 0 then F := 1;
if F = 0 then writeln(‘Простое’)
else writeln(‘Составное’);
writeln('нажмите Enter для завершения работы программы');
readln;
end.
13
Рис. 3. Блок-схема к задаче примера 2.1
Пример 2.2. Дана последовательность целых чисел, за которой следует ноль. Определить сколько раз в ней меняется знак.
Этапы решения задачи
1. Необходимо организовать ввод чисел последовательности, до тех
пор, пока не будет введен 0. При этом требуется запоминать два
последних введенных числа. Критерий изменения знака – произведение этих чисел. Если произведение положительно – знак сохранился, иначе – знак поменялся на противоположный.
2. Составим блок-схему задачи (рис.4)
14
Рис. 4. Блок-схема к задаче примера 2.2
3. Программа
Program exapmle2;
var x,y,k:integer;
begin
writeln('Эта программа определяет, сколько раз меняется знак в
заданной последовательности чисел');
write('Введите число:'); read(x);
y:=x;
15
k:=0;
while y<>0 do begin
if x*y<0 then inc(k);
y:=x;
read(y);
end;
writeln(' Знак поменялся ',k,'раз');
writeln('нажмите Enter для завершения работы программы');
readln;
end.
Пример 2.3. Вычислить с точностью eps <= |x| выражение
x x 2 x3
S 1 

  при | x | < 1. Считать, что требуемая точ2 3
4
ность достигнута, если очередное слагаемое по модулю меньше eps.
Этапы решения задачи
1. Требуется задать начальное значение суммы ряда, а затем многократно вычислять очередной член ряда и добавлять его к ранее найденной сумме. Вычисления заканчиваются, когда абсолютная величина очередного члена ряда станет меньше заданной точности.
2. Блок-схема (рис 5).
3. Программа.
program example3;
var i: integer;
x,s,z,eps: real;
begin
writeln('Эта программа определяет сумму ряда');
repeat
write('Введите переменную ряда x, |x|<1:'); readln(x);
write('Введите точность вычисления eps:'); readln(eps);
until (abs(x)<1)and (eps<1)and (eps<=x);
s := 1; z := 1; i := 2 ;
repeat
z := z*x;
s := s + z/i;
inc(i);
16
until abs(z/(i-1))<eps;
writeln(‘Искомая сумма ряда S = ’, S);
writeln('нажмите Enter для завершения работы программы');
readln;
end.
Рис. 5. Блок-схема к задаче примера 2.3
Задания
Вариант 1
1. Определить количество простых чисел на заданном отрезке [a, b].
2. Дана последовательность целых чисел, за которой следует ноль.
Определить, является ли она возрастающей.
3. Вычислить P = 1 . 2 + 2 . 3 . 4 + 3 . 4 . 5 . 6 + ...+ N . (N+1) . ... . 2N.
17
Вариант 2
1. Определить все простые двузначные числа.
2. Дана последовательность целых чисел, за которой следует ноль.
Определить, число соседств чисел с одинаковыми знаками.
3. Вычислить: P  sin x  sin x  sin x    sin x  sin x    sin x (n раз)
Вариант 3
1. Найти все делители заданного числа N.
2. Дана последовательность целых чисел, за которой следует ноль.
Определить какой из элементов, максимальный или минимальный, встречается в ней раньше.
3. Вычислить: P  sin x  sin 2 x 2    sin n x n
Вариант 4
1. Найти все двузначные числа, сумма делителей которых четное
число.
2. Дана последовательность целых чисел, за которой следует ноль.
Определить, является ли она возрастающей.
3. Вычислить y  1  3  5    2n  1, n  0
Вариант 5
1. Найти все совершенные числа из диапазона [a, b]. Если таких чисел нет, выдать соответствующее сообщение.
2. Дана последовательность из 20 целых чисел. Определить со
скольких простых чисел она начинается.
3. Не используя стандартные функции (за исключением abs), выx x2
xn

.
числить с точностью eps  0 : y  e x  1  
1! 2!
n!
Считать, что требуемая точность достигнута, если очередное слагаемое по модулю меньше eps.
Вариант 6
1. Найти количество трехзначных чисел, сумма простых делителей
которых кратна 5.
2. Дана последовательность из N целых чисел. Определить количество отрицательных четных элементов, расположенных после
первого нуля.
18
3. Не используя стандартные функции (за исключением abs), вычисx3 x5
x 2 n1
лить с точностью eps  0 : y  sh x  x     
.
2n  1!
3! 5!
Считать, что требуемая точность достигнута, если очередное слагаемое по модулю меньше eps.
Вариант 7
1. Дано натуральное число N. Разложить его на простые множители
2. Дана последовательность целых чисел, 0 – конец последовательности. Найти два наименьших числа.
3. Не используя стандартные функции (за исключением abs), вычислить
2n
x2 x4
n x
с точностью eps  0 : y  cos x  1 

    1
.
2n!
2! 4!
Считать, что требуемая точность достигнута, если очередное слагаемое по модулю меньше eps.
Вариант 8
1. Определить наибольший общий делитель двух заданных чисел M
и N.
2. Дана последовательность целых чисел, 0 – конец последовательности. Определить есть ли в ней три подряд идущих отрицательных числа.
3. Не используя стандартные функции (за исключением abs), вычислить
с точностью eps  0 : y  ln 1  x   x 
n
x 2 x3
n 1 x

    1
.
2
3
n
 | x | 1 . Считать, что требуемая точность достигнута, если очередное слагаемое по модулю меньше eps.
Вариант 9
1. Дано натуральное число N. Определить является ли оно автоморфным. Автоморфное число равно последним разрядам квадрата этого числа (52 = 25, 62 = 36, 252= 625)
2. Дана последовательность целых чисел, 0 – конец последовательности. Определить, сколько раз в последовательности меняется
знак.
3. Не используя стандартные функции (за исключением abs), вычислить
2 n 1
x3 x5
n x

с точностью eps  0 : y  arctg x  x       1
3
5
2n  1
 | x | 1 . Считать, что требуемая точность достигнута, если очередное слагаемое по модулю меньше eps.
19
Вариант 10
1. Даны натуральные числа M и N. Определить их наименьшее общее кратное.
2. Дана последовательность целых чисел, 0 – конец последовательности. Определить сумму трех наибольших чисел.
3. Не используя стандартные функции (за исключением abs), вычислить
с точностью eps  0 :
1
1
1
1
y  arth x   3  5   
  .  | x | 1 .
x 3x
2n  1x 2n1
5x
Считать, что требуемая точность достигнута, если очередное слагаемое по модулю меньше eps.
Вариант 11
1. Вычислить сумму квадратов делителей заданного двузначного
числа.
2. Дана последовательность целых чисел, 0 – конец последовательности. Определить среднее геометрическое простых элементов
последовательности.
3. Не используя стандартные функции (за исключением abs), вычислить
с точностью eps  0 :
sin x
 1n x 2n   .  | x |   .
x2 x4 x6
1



x
3!
5! 7!
2n  1x 2n 1
4. Считать, что требуемая точность достигнута, если очередное слагаемое по модулю меньше eps.
y
Вариант 12
1. Найти произведение всех простых делителей заданного числа.
2. Дана последовательность из N целых чисел. Определить количество чисел в наиболее длинной подпоследовательности из подряд
идущих нулей.
3. Не используя стандартные функции (за исключением abs), вычислить
с точностью eps  0 :


1 x
x3 x5
x 2 n 1
 2 x 


  .  | x | 1 .
2n  1 
1 x
3
5

4. Считать, что требуемая точность достигнута, если очередное слагаемое по модулю меньше eps.
y  ln
20
Вариант 13
1. Определить количество трехзначных чисел, сумма цифр которых
простое число.
2. Дана последовательность целых чисел, 0 – конец последовательности. Определить, сколько чисел больше своих соседей, т. е.
предыдущего и последующего.
3. Не используя стандартные функции (за исключением abs), вычислить
с точностью eps  0 :

x 1  1
1
1
1
 2  3  5   
  .  | x | 1 .
2 n 1
x  1  x 3x
2n  1x
5x

4. Считать, что требуемая точность достигнута, если очередное
слагаемое по модулю меньше eps.
y  ln
Вариант 14
1. Числом Армстронга называется целое n-значное число, сумма n-х
степеней цифр которого равна самому этому числу. Например,
числом Армстронга является число 407, так как 407 = 43 + 03 + 73.
Найдите все числа Армстронга для заданного n <= 10.
2. Дана последовательность из не менее двух чисел, за которой следует ноль. Вычислить сумму тех из них, порядковые номера которых – простые числа.
3. Не используя стандартные функции (за исключением abs), вычислить с точностью eps  0 :
5
2 n 1
 x  1 x  13



x  1
x  1

.
y  ln x  2







2 n 1
 x  1 3x  13 5x  15




2
n

1
x

1


 | x | 1 .Считать, что требуемая точность достигнута, если очередное слагаемое по модулю меньше eps.
Вариант 15
1. Задано целое A > 1. Найдите наименьшее целое неотрицательное
k, при котором 5k > A.
2. Дана последовательность целых чисел, за которой следует ноль.
Определить чередуются ли в ней четные и нечетные числа.
3. Не используя стандартные функции (за исключением abs), вычислить с точностью eps  0 :
y  ln x  x  1 
x  12  x  13      1n1 x  1n   .
0 x2
2
3
n
Считать, что требуемая точность достигнута, если очередное слагаемое по модулю меньше eps.
21
Вариант 16
1. Дано натуральное N. Выясните, сколько цифр оно содержит.
2. Дана последовательность целых чисел, за которой следует ноль.
Определить, содержит ли последовательность числа, являющиеся
степенями 2.
3. Не используя стандартные функции (за исключением abs), вычислить с точностью eps  0 :


x2 x4
xn
y  ln 1  x    x 


  .  1  x  1 .
2
4
n


Считать, что требуемая точность достигнута, если очередное слагаемое по модулю меньше eps.
Вариант 17
1. Даны два натуральных числа M и N – числитель и знаменатель
дроби M/N. Требуется сократить дробь, насколько это возможно.
2. Дана последовательность положительных целых чисел, за которой следует отрицательное число. Определить, сколько раз в ней
встречаются два подряд идущих простых числа.
1
1
1
3. Вычислить: P  1  2 1  2 1  2 , n  2
 2  3   n 
Вариант 18
1. Пифагоровыми называются тройки натуральных чисел a, b, с ,
удовлетворяющие условию: a2 + b2 = c2 . Например, пифагоровой
является тройка чисел 6, 8, 10. Найдите все тройки пифагоровых
чисел, не превышающих 25.
2. Дана последовательность целых чисел, за которой следует ноль.
Определить количество положительных четных чисел в конце последовательности.
3. Вычислить: y  cos1  cos2    cos39  cos 40 
Вариант 19
1. Вывести все трехзначные числа, в десятичной записи которых
нет одинаковых чисел.
2. Дана последовательность целых чисел, за которой следует ноль.
Определить среднее арифметическое простых элементов последовательности.
22
k
3. Вычислить: S 
10
 sin k n
k 1
k!

n 1
Вариант 20
1. Найти все целые корни уравнения a  x 3  b  x 2  c  x  d  0 , где
a,b,c и d – заданные целые числа, причем a  0 и d  0 (Замечание: целыми корнями могут быть только положительные и отрицательные делители коэффициента d).
2. Дана последовательность целых чисел. Определить есть ли в ней
совершенные числа (Совершенными называются числа, равные
сумме своих делителей, без самого числа. Например, совершенным является число 28 = 1 + 2 + 4 + 7 + 14; 6 = 1+2+3).
3. Вычислить: S 
n
 1 k!! где
k
k 1
1  3  5  , если n  нечетное
k!! 
2  4  6 , иначе .
Контрольные вопросы
1. Как записывается и как работает оператор FOR?
2. Для организации каких циклов применим оператор FOR?
3. В чем отличие оператора WHILE от оператора REPEAT?
4. Как программируются циклические алгоритмы с явно заданным
числом повторений цикла?
5. Как программируются циклические алгоритмы с заранее неизвестным числом повторений цикла?
6. Напишите оператор цикла, который не выполняется ни разу.
7. Напишите оператор цикла, который выполняется неограниченное число раз.
8. Замените оператор "Repeat A Until B" равносильным фрагментом
программы с оператором While.
23
Лабораторная работа № 3
МАССИВЫ
Цель работы: научиться правильно описывать различные массивы,
уметь инициализировать массивы, распечатывать содержимое массива;
научиться решать задачи на использование массивов.
Общие сведения
Массив – это структурированный тип данных, который используется для описания упорядоченной совокупности фиксированного числа
элементов одного типа, имеющих общее имя. Для обозначения элементов массива используются имя переменной-массива и индекс.
Перед выполнением работы необходимо изучить правила описания
и использования переменных типа массив, типизированных констант
типа массив [1–7].
Пример 3.1. В одномерном массиве, состоящем из n целых элементов из диапазона  10  20  , определить количество элементов между
первым, кратным 10 и предпоследним четным.
Этапы решения задачи
1. Определить, позиции первого элемента, кратного 10 и предпоследнего четного. После просмотреть все элементы, расположенные между ними. Так как порядок расположения элементов
заранее неизвестен, то каждый из этих элементов может встретиться как раньше, так и позже другого. Поэтому требуется
определять левую и правую границу просмотра массива.
2. Составим блок-схему задачи (рис.6)
24
Общая блок-схема
Детализация блока 3
Детализация блока 4
d=0
d=0
Начало
i = 1,N
1. Ввод N
да
2. Инициализация
массива
A[i]
крат. 10
нет
i = N,1
да
d =d+1
3. Определение позиции первого кратного
10 – p1
да
4. Определение позиции предпоследнего
четного – p2
d =d+1
нет
d=1
да
p1 = i
да
p1<p2
нет
d=2
p2 = i
Детализация блока 5
5. Определение левой и
правой границ просмотра массива
нет
A[i]
четное
Детализация блока 6
нет
K=0
i = L,R
6. Определение
количества элементов - K
L = p1
R = p2
7. Вывод K
L = p2
R = p1
да
Конец
Рис. 6. Блок-схема к задаче примера 3.1
25
A[i]>0
K = K +1
нет
3. Программа
Program example1;
var a:array[1..20] of integer;
i,k,d,L,R, n, p1,p2:byte;
begin
writeln('Программа определяет количество элементов > 0 между
первым кратным 10 и предпоследним четным');
write('Введите n, n<=20: ');read(n);
//Инициализация массива
// и определение позиции первого кратного 10
d:=0;
for i:=1 to n do begin
a[i]:=random(30)-10;
write(a[i]:4);
if a[i] mod 10 =0 then begin
inc(d);
if d=1 then p1:=i; end;
end;
// определение позиции предпоследнего четного
d:=0;
for i:=n downto 1 do
if not odd(a[i]) then begin
inc(d);
if d=2 then p2:=i; end;
//определение левой и правой границы просмотра
if p1<p2 then begin L := p1; R := p2; end
else begin L := p2; R := p1; end;
//определение количества положительных элементов
k:=0;
for i:=L+1 to R-1 do if a[i]>0 then inc(k);
writeln;
writeln('Кол-во полож. эл. = ', k);
writeln('Нажмите ENTER для продолжения ');
readln;
end.
Пример 3.2. Отсортировать заданный массив по возрастанию методом выбора.
Этапы решения задачи.
1. Алгоритм состоит в том, что выбирается наименьший элемент
массива и меняется местами с первым, затем рассматриваются
26
элементы, начиная со второго, и наименьший из них меняется
местами со вторым, и так далее n – 1 раз (при последнем проходе
цикла при необходимости меняются местами предпоследний и
последний элементы массива).
2. Составим блок-схему задачи
Детализация блока 3
Общая блок-схема
программы
I = 1, N-1
Начало
imin = I
1. Ввод N
J = I+1,N
2. Инициализация
массива
да
A[J] <
A[imin]
нет
3. Сортировка массива
imin = J
4. Печать отсортированного
массива
J
Temp = A[I]
A[I] = A[imin]
A[imin] = Temp
Конец
I
Рис. 7. Блок-схема задачи примера 3.2
3. Программа
program example2;
var a:array[1..20] of integer;
i,j,t,imin,n:integer;
begin
27
writeln('Программа сортирует массив по возрастанию методом выбора');
write('Введите n, n<=20: ');read(n);
//Инициализация массива
for i:=1 to n do begin
a[i]:=random(30)-10;
write(a[i]:4);
end;
//Cортировка
for i:=1 to n-1 do begin
imin := i;
for j:=i+1 to n do
if a[j]<a[imin] then imin :=j;
t := a[i];
a[i] :=a[imin];
a[imin] :=t;
end;
//Вывод отсортированного массива
writeln;
for i:=1 to n do write(a[i]:4);
writeln('Нажмите ENTER для продолжения ');
readln;
end.
Пример 3.3. В целочисленной матрице найти номера строк, в которых все элементы больше 10.
Этапы решения задачи
Решение задач на матрицы несколько отличается от одномерных
массивов, так как матрица есть массив из массивов. Важно помнить, что
инициализация начальных значений для различных данных в строках
или столбцах должна происходить непосредственно до просмотра соответствующей строки или столбца (например, сумма или произведение
элементов в каждой строке/столбце, максимальный/минимальный элемент строки/столбца и т. д.).
28
1. Для каждой строки определить переменную-признак того, все ли
элементы строки превышают значение 10. Далее в строке осуществляется поиск элементов, не удовлетворяющих условию задачи (т. е. меньших
10). Если найдено хотя бы одно такое число, то переменная-признак меняет
свое значение (например, с 0 на 1). Затем для каждой строки проверяется
значение указанной переменной, и если оно не изменилось, то в строке –
все элементы > 10.
2. Составим блок-схему задачи (рис 8)
3. Программа
Program example3;
var a: array[1..20,1..20] of integer;
i,j,n,m,Flag, T: byte;
begin
writeln('Программа находит номера строк, в которых все элементы
> 10');
write('Введите N, N<=20 '); Read(n);
write('Введите M, M<=20 '); Read(m);
randomize;
//Инициализация массива
for i:=1 to n do
for j:=1 to m do begin
a[i,j]:=random(40)-20;
if j=m then writeln(a[i,j]:4) else write(a[i,j]:4);
end;
writeln;
//поиск строк, в к-х все элементы > 10
T:=0; //признак того, есть ли такие строки в матрице
for i:=1 to n do begin
Flag := 0;//признак того, что в строке все элементы >10
for j:=1 to m do if a[i,j]<=10 then begin Flag := 1;break;end;
if Flag=0 then begin write(i:3);T:=1;end;
end;
if T = 0 then write('Таких строк нет');
writeln; writeln('Для продолжения нажмите ENTER');
readln;
end.
29
Общая блок-схема
программы
Детализация блока 3
T=0
Начало
Flag = 0
2. Инициализация
массива
да
A[I,
J] < 10
3. Поиск строк, в которых
все элементы > 10
нет
Flag = 1
J
Конец
да
Flag = 0
нет
Вывод I
T=1
I
да
T=0
Таких строк нет
Рис. 8. Блок-схема к задаче примера 3.3
Пример 3.4. Дана целочисленная матрица порядка N. Отсортировать строки матрицы по возрастанию количества элементов больших
элементов главной диагонали.
30
Этапы решения задачи
1. Для решения подобных задач требуется заводить дополнительный одномерный массив, элементами которого являются значения элементов главной диагонали. Соответственно количество элементов в таком массиве должно совпадать с количеством строк или столбцов (в зависимости от условия задачи). Далее сортировать элементы одномерного
массива и переставлять соответствующие этим элементам строки/столбцы матрицы. Для матрицы справедливы следующие условия:
I
J
J
I I<N–J+1
N
I<J
Главная
диагональ
I=N–J+1
I=J
I>J
Побочная
диагональ
I>N–J+1
N
N
N
2. Составим блок-схему задачи (рис 9)
Общая блок-схема
программы
Детализация блока 3
I = 1, N
Начало
B[I] = 0
J = 1,N
1. Ввод N
да
2. Инициализация
массива
A[I, J] <
A[I,I]
нет
B[I] =B[I] + 1
3. Поиск кол-ва элементов
в строке больших элементов главной диагонали.
Заполнение массива B
J
I
4. Сортировка массива B
и строк матрицы
5. Распечатка
матрицы
Конец
Рис. 9. Блок-схема к задаче примера 3.4
31
3. Программа
Program Example4;
var a: array[1..20,1..20] of integer;
b: array[1..20] of integer;
i,j,n, imin: byte;
temp:integer;
begin
writeln('Программа сортирует строки матрицы по возраст кол-ва эл
> эл главной диагонали');
write('Введите N, N<=20 '); Read(n);
randomize;
//Инициализация массива
for i:=1 to n do
for j:=1 to n do
a[i,j]:=random(40)-20;
writeln;
//поиск количества элементов больших элементов глав диагонали
for i:=1 to n do
begin
b[i]:=0;
for j:=1 to n do
begin
if a[i,j]>a[i,i] then inc(b[i]);
if j=n then writeln(a[i,j]:4,b[i]:8) else write(a[i,j]:4);
end;
end;
//============сортировка строк======================
for i:=1 to n-1 do
begin
imin := i;
for j:=i+1 to n do
if b[j]< b[imin] then imin :=j;
temp := b[i];
32
b[i]:=b[imin];
b[imin]:=temp;
for j:=1 to n do
begin
temp :=a[i,j];
a[i,j] := a[imin,j];
a[imin,j] :=temp;
end;
end;
writeln('Распечатка отсортированного массива ');
for i:=1 to n do
for j:=1 to n do
if j=n then writeln(a[i,j]:4, b[i]:8) else write(a[i,j]:4);
writeln;
writeln('Для продолжения нажмите ENTER');
readln;
end.
Пример 3.5. Дана целочисленная прямоугольная матрица. Удалить те
строки матрицы, в которых минимальное количество четных элементов.
Этапы решения задачи
1. Решение задачи состоит в следующем: требуется найти количество четных элементов в каждой строке и определить наименьшее из
них. Затем все строки, в которых количество четных минимально последовательно передвигать в конец матрицы (например, 1-ую такую строку
последовательно передвинуть на последнюю, 2-ю – на предпоследнюю,
и т.д.). При этом уменьшать и общее количество строк. При удалении
строки, необходимо просматривать всю матрицу заново, начиная с первой строки. Замечание: следует отметить, что физически строки не
удаляются, но в результирующей матрице они не должны отображаться.
2. Составим блок-схему задачи (рис 10)
33
Общая
блок-схема
программы
Детализация блока 4
I = 0;
Начало
нет
да
I<N
1. Ввод N, M
I =I + 1
2. Инициализация
массива A
да
3. Поиск кол-ва четных элементов в каждой строке.
Заполнение массива
Chet
нет
Chet[I] =
min_chet
K = I, N-1
J = 1,M
Определение мин
4. Удаление мин элекол-ва четных
ментов массива Chet
элементов
и строк
матрицы
Меняем K и K+1
строки
Temp = A[K,J]
A[K,J]=A[K+1,J]
A[K+1,J]=Temp
5. Распечатка
матрицы
Меняем K и K+1
элементы
Temp = Chet[K]
Chet[K]=Chet[K+1]
Chet[K+1]=Temp
Конец
J
K
Уменьшаем
кол-во строк
N = N – 1;
I=0
5. Распечатка
матрицы
Рис. 10. Блок-схема задачи примера 3.5
34
3. Программа
Program Example1;
var a: array[1..20,1..20] of integer;
chet: array[1..20] of integer;
i,j,n,m, k,min_chet: byte;
temp:integer;
begin
writeln('Программа удаляет строки, в которых наименьшее кол-во
четных.');
write('Введите N, N<=20 '); Read(n);
write('Введите M, M<=20 '); Read(m);
randomize;
//Инициализация массива
min_chet := m;//максимально возможное кол-во четных элементов в
строке
for i:=1 to n do begin
chet[i]:=0;
for j:=1 to m do begin
a[i,j]:=random(40)-20;
if not odd(a[i,j]) then inc(chet[i]);
if j=m then writeln(a[i,j]:4,chet[i]:8)
else write(a[i,j]:4);
end;
//определение миним кол-ва четных в строке
if chet[i] < min_chet then min_chet := chet[i];
end;
writeln;
//удаление строк, в которых кол-во четных = min_chet
i:=0;
while i < n do begin
inc(i);
if chet[i]=min_chet then begin
for k:=i to n-1 do begin
for j:=1 to m do begin
temp := a[k,j];
a[k,j] := a[k+1,j];
a[k+1,j] :=temp;
end;
temp :=chet[k]; chet[k]:=chet[k+1]; chet[k+1]:=temp;
end;
n:=n-1;i:=0; end;
35
end;
writeln('Распечатка результирующего массива ');
for i:=1 to n do
for j:=1 to m do
if j=m then writeln(a[i,j]:4, chet[i]:8) else write(a[i,j]:4);
writeln('Для продолжения нажмите ENTER');readln;readln;
end.
Задания
Вариант 1
1. В одномерном массиве, состоящем из n вещественных элементов,
вычислить:
1) сумму отрицательных элементов массива;
2) произведение элементов массива, расположенных между максимальным и минимальными элементами.
Упорядочить элементы массива по возрастанию.
2. Дана целочисленная прямоугольная матрица. Определить:
1) количество строк, не содержащих ни одного нулевого элемента;
2) максимальное из чисел, встречающихся в заданной матрице более
одного раза.
Вариант 2
1. В одномерном массиве, состоящем из n вещественных элементов,
вычислить:
1) сумму положительных, кратных 5 элементов массива;
2) произведение элементов массива, расположенных между максимальным кратным 10 и минимальным четным элементами.
Упорядочить элементы массива по убыванию.
2. Дана целочисленная прямоугольная матрица.
1) определить номера столбцов, в которых нет четных элементов;
2) переставить строки матрицы по возрастанию сумм положительных элементов.
Вариант 3
1. В одномерном массиве, состоящем из n целых элементов, вычислить:
1) произведение элементов массива с четными номерами;
2) сумму элементов массива, расположенных между первым и последним нулевыми элементами.
36
Преобразовать массив таким образом, чтобы сначала располагались
все положительные элементы, потом – все отрицательные (элементы, равные 0, считать положительными).
2. Дана целочисленная прямоугольная матрица:
1) произведение элементов в строках, в которых более трех положительных элементов;
2) номер строки, в которой находится самая длинная серия одинаковых элементов.
Вариант 4
1. В одномерном массиве, состоящем из n вещественных элементов,
вычислить:
1) среднее арифметическое отрицательных нечетных элементов массива;
2) сумму элементов массива, расположенных за вторым нечетным
положительным элементом.
Сжать массив, удалив из него все элементы, модуль которых не превышает 1. Новый массив не заводить.
2. Дана целочисленная прямоугольная матрица.
1) отсортировать столбцы матрицы по убыванию количества элементов меньших элементов побочной диагонали;
2) определить минимальный из максимальных элементов строк и его
положение.
Вариант 5
1. В одномерном массиве, состоящем из n вещественных элементов,
вычислить:
1) максимальный кратный 10 элемент массива и его номер;
2)сумму элементов массива, расположенных до последнего положительного элемента.
Сжать массив, удалив из него все элементы, модуль которых находится в интервале [a, b]. Новый массив не заводить.
2. Дана целочисленная квадратная матрица.
1) определите, имеется ли среди элементов, расположенных ниже ее
главной и побочной диагоналей, хотя бы одно составное двузначное
число;
2) отсортировать столбцы матрицы по убыванию количества элементов кратных 3.
Вариант 6
1. В одномерном массиве, состоящем из n вещественных элементов,
37
вычислить:
1) второй (по величине) минимальный положительный нечетный
элемент и его позицию;
2) среднее арифметическое элементов массива, расположенных за
последним максимальным по модулю элементом.
Преобразовать массив таким образом, чтобы сначала располагались
все элементы равные нулю, а потом – все остальные.
2. Дана целочисленная квадратная матрица:
1) определить положение всех седловых точек матрицы и их количество (седловая точка – это элемент матрицы, минимальный в своей строке и максимальный в своем столбце);
2) переставить строки матрицы относительно побочной диагонали.
Вариант 7
1. В одномерном массиве, состоящем из n вещественных элементов:
1) определить каких элементов больше – положительных нечетных
или отрицательных четных;
2) определить, все ли элементы массива простые числа.
Преобразовать массив таким образом, чтобы в первой его половине
располагались элементы, стоявшие в нечетных позициях, а во второй половине – элементы, стоявшие в четных позициях.
2. Дана целочисленная квадратная матрица:
1) определить произведение элементов в тех столбцах, в которых
четных элементов на один больше, чем нечетных;
2) найти такие k, что k-я строка матрицы совпадает с k-м столбцом.
Вариант 8
1. В одномерном массиве, состоящем из n вещественных элементов:
1) определить какие числа встречаются в нем более двух раз;
2) вывести на экран элементы массива, большие среднего арифметического.
Сжать массив, удалив из него все нули.
2. Дана целочисленная квадратная матрица:
1) удалить из матрицы строки, в которых все элементы четные;
2) вычислить среднее арифметическое элементов, расположенных
ниже побочной и выше главной диагоналей.
Вариант 9
1. В одномерном массиве, состоящем из n вещественных элементов:
1) определить есть ли в массиве хотя бы одно положительное меньшее минимального четного элемента;
38
2) вычислить сумму элементов массива, расположенных между последним и предпоследним нечетными элементами.
Преобразовать массив таким образом, чтобы в первой его половине
располагались элементы по возрастанию, во второй – по убыванию.
2. Дана целочисленная квадратная матрица.
1) сжать матрицу, удалив из нее те столбцы, в которых количество
отрицательных совпадает с количеством положительных;
2) определить количество строк, в которых расположены максимальные элементы матрицы.
Вариант 10
1. В одномерном массиве, состоящем из n вещественных элементов:
1) определить является ли массив палиндромом;
2) вычислить сумму модулей элементов массива, расположенных
после первого элемента, равного нулю.
Преобразовать массив таким образом, чтобы сначала располагались
элементы, кратные 5, затем 4, после 3. Остальные – в конце.
2. Дана целочисленная квадратная матрица:
1) элементы строки с четными номерами циклически сдвинуть влево
на количество элементов, равное номеру строки, а элементы нечетных строк – вправо;
2) вывести элементы матрицы, которые больше среднего арифметического всех элементов. Сохранить порядок следования элементов в
матрице.
Вариант 11
1. В одномерном массиве, состоящем из n вещественных элементов:
1) положительные элементы уменьшить вдвое, а отрицательные заменить на значения их индексов;
2) определить число соседств двух положительных чисел.
Преобразовать массив следующим образом: удалить все нечетные
элементы, остальные – упорядочить массив по возрастанию.
2. Дана целочисленная квадратная матрица:
1) Определить превышают ли все элементы выше главной диагонали, элементы, расположенные ниже ее симметрично (т.е. Aij сравнивается с Aji);
2) удалить строки матрицы, в которых есть хотя бы один нулевой
элемент.
Вариант 12
1. В одномерном массиве, состоящем из n вещественных элементов:
39
1) вывести все четные кратные 5 и 4, расположенные между максимальным и минимальным нечетными элементами;
2) вычислить сумму элементов массива и каждый элемент равный
нулю увеличить на 20.
Массив отсортировать по возрастанию модулей элементов.
2. Дана квадратная целочисленная матрица:
1) определить количество локальных минимумов матрицы (локальный минимум – элемент матрицы, строго меньший всех своих соседей);
2) найти столбец, содержащий минимальное количество положительных кратных 5 элементов.
Вариант 13
1. В одномерном массиве, состоящем из n вещественных элементов:
1) вычислить количество элементов массива, которые больше своих
соседей;
2) вычислить: S  x1 xn  x2 xn 1    xn 1 x2  xn x1 .
Преобразовать массив следующим образом: все отрицательные увеличить до нуля и отсортировать полученный массив по возрастанию.
2. Дана целочисленная квадратная матрица:
1) для каждой строки определить количество отрицательных элементов, с которых она начинается;
2) определить количество строк, отсортированных по возрастанию.
Вариант 14
1. В одномерном массиве, состоящем из n вещественных элементов:
1) поменять местами второй отрицательный с последним положительным элементами;
2) вычислить сумму квадратов всех элементов заданного массива, за
исключением элементов, кратных пяти.
Осуществить циклический сдвиг элементов массива влево на одну
позицию.
2. Дана целочисленная прямоугольная матрица.
1) найти номера строк, в которых на всех нечетных позициях стоят
нули;
2) определить количество различных элементов матрицы.
Вариант 15
1. В одномерном массиве, состоящем из n вещественных элементов:
1) заменить нулями все отрицательные элементы, предшествующие
40
первому по порядку максимальному элементу;
2) Получить массив B(n), i-й элемент которого равен среднему
арифметическому первых i элементов массива А:
a  a2    ai  .
bi  1
i
Осуществить циклический сдвиг элементов массива влево на две позиции.
2. Дана целочисленная прямоугольная матрица:
1) определить максимальное из чисел, встречающееся в ней более
одного раза;
2) вывести номера строк, в которых 0 и 1 чередуются.
Вариант 16
1. В одномерном массиве, состоящем из n целых элементов:
1) определить, имеются ли в заданном массиве три подряд идущих
элемента одного знака;
2) Найдите сумму первых из них (считая слева направо), произведение которых не превышает заданного числа М.
Осуществить циклический сдвиг элементов массива вправо на одну
позицию.
2. Дана целочисленная квадратная матрица:
1) в каждой строке определить наибольшее простое число, если в
строке нет простых чисел, выдавать соответствующее сообщение;
2) переставить элементы матрицы относительно середины по горизонтали.
Вариант 17
1. В одномерном массиве, состоящем из n целых элементов:
1) каждый положительный элемент уменьшить на его порядковый
номер (среди положительных);
2) вычислить произведение нечетных элементов, расположенных на
четных местах.
Осуществить циклический сдвиг элементов массива вправо на две
позиции.
2. Дана целочисленная квадратная матрица:
1) определить количество «особых» элементов матрицы и их количество (особым называется элемент, которых больше всех элементов
слева от него, и меньше всех элементов справа);
2) определить номер столбца, в котором наибольшее количество
четных элементов не кратных 3.
41
Вариант 18
1. В одномерном массиве, состоящем из n целых элементов:
1) вычислить среднее геометрическое чисел, кратных 5, но не кратных 4;
2) получите новый массив, в котором все элементы исходного массива встречаются только один раз.
Осуществить циклический сдвиг элементов массива вправо на k позиций.
2. Дана целочисленная квадратная матрица:
1) определить отсортированы ли столбцы матрицы по возрастанию
суммы элементов в них;
2) транспонировать заданную матрицу. Дополнительного массива не
заводить.
Вариант 19
1. В одномерном массиве, состоящем из n целых элементов:
1) определить, образует ли он возрастающую последовательность;
2) вывести те элементы массива, индексы которых являются степенями двойки (1,2,4,8,16,…).
Преобразовать элементы массива следующим образом: i-й элемент
после преобразования равен наибольшему среди первых i элементов.
2. Дана целочисленная квадратная матрица:
1) вывести на экран строку матрицы, в которой встречается
наибольшее количество нечетных элементов;
2) определить, симметрична ли матрица относительно главной диагонали.
Вариант 20
1. В одномерном массиве, состоящем из n целых элементов:
1) определить, расположены ли его четные элементы в порядке возрастания;
2) определить число соседств простого и четного элементов массива
Преобразовать массив следующим образом: положительные кратные трем числа расположить в порядке возрастания в конце массива.
2. Дана целочисленная квадратная матрица.
1) переставить ее строки и столбцы таким образом, чтобы максимальный элемент оказался в левом верхнем углу, второй максимальный – во второй строке на главной диагонали, и т. д.
2) удалить из матрицы строки, в которых все элементы положительные.
42
Контрольные вопросы
1. Каким образом определяются переменные типа массив (одномерный и двумерный)?
2. Как осуществляется доступ к отдельному элементу одномерного
и двумерного массива?
3. Каким образом выводятся элементы массива на экран?
4. Как заполнить массив случайным образом?
5. Назначение массивов.
6. Как отсортировать массив по возрастанию, убыванию?
7. Приведите пример фрагмента программы, который выводит на
экран двумерный массив в виде матрицы.
8. Сколько чисел можно записать в шестимерный массив X :
Array[0..1, 0..1, 0..1, 0..1, 0..1, 0..1] of Integer?
43
Лабораторная работа № 4
ПРОЦЕДУРЫ И ФУНКЦИИ
Цель работы: познакомиться с понятиями "процедура" и "функция"
в языке программирования Pascal, рассмотреть их сходства и различия,
закрепить практические навыки работы с Delphi на примере реализации
алгоритмов при помощи процедур и функций, научиться применять метод последовательной детализации в практическом программировании;
применять процедуры и функции при решении задач.
Общие сведения
Часто в программе обнаруживаются однотипные участки, которые
выполняют одни и те же вычисления, но с различными данными. Такие
части программы целесообразно оформлять в виде подпрограмм. В языке Delphi существует два вида подпрограмм: процедуры и функции.
Перед выполнением данной работы необходимо изучить правила
описания процедур и функций, механизм передачи параметров, ознакомиться с понятием локальной и глобальной переменной [1–7].
Пример. Найти сумму положительных элементов массива. Ввод
массива оформить в виде процедуры; а поиск суммы – в виде функции.
Этапы решения задачи
1. Алгоритм программы прост: вначале вводится общее количество
элементов в массиве, затем массив заполняется, после вычисляется сумма положительных элементов.
2. Программа
program example;
type
TArray = array[1..100] of integer;
Var v: TArray;
N:integer;
Procedure vvod_data(var m:Tarray; n:integer);
Var i:integer;
Begin
Writeln('Введите ',n,' чисел через пробел');
For i:= 1 to n do read(m[i]);
End;{of procedure vvod_data}
44
Function summ(m:TArray; n:integer):integer;
Var s,i:integer;
Begin
S:=0;
For i:= 1 to n do if m[i]>0 then s:= s+m[i];
Result := S;
End; {of function summ}
begin
write('Введите размерность массива N= '); readln(n);
vvod_Data(v,n);
writeln('Сумма= ', summ(v,n));
end.
Задания
Выполнить задания лабораторной работы «Массивы», оформив в
виде функций законченные последовательности действий. Все необходимые данные для подпрограмм должны передаваться им в качестве параметров. Использование глобальных переменных в подпрограммах не
допускается.
Контрольные вопросы
1.
2.
3.
4.
5.
6.
Для чего нужны в программе процедуры и функции?
В чем отличие между процедурой и функцией?
Чем отличаются формальные и фактические параметры?
Чем отличаются параметры-значения и параметры-переменные?
Как объявляются глобальные и локальные переменные? Каково
правило видимости этих переменных?
Почему при обращении к процедуре, аргумент, передаваемый параметру-переменной, может быть только переменной, а не константой или выражением?
45
Лабораторная работа № 5
СТРОКИ, ЗАПИСИ, МНОЖЕСТВА
Цель работы:
 познакомиться с принципами работы со строками;
 научиться выполнять элементарные действия по обработке текстовой информации при решении соответствующих задач.
Общие сведения
Переменные типа String аналогичны массивам типа Char. Их отличием является то, что число символов (длина строки) может динамически меняться в интервале от единицы до заданного верхнего значения.
Перед выполнением работы необходимо ознакомиться с правилами
описания и использования строк, допустимых операций над ними, соответствующими стандартными процедурами и функциями.
Типовые операции и действия над строками и символами
1: Операция Конкатенация. При выполнении данной операции вторая
строка/символ добавляется в конец первой. Например
x := ‘Object’;
y := ‘Pascal’;
z := x + ‘ ’ + y; // z= ‘Object Pascal’
z := y + ‘ ’ + x; // z= ‘Pascal Object’
2. Операция Сравнение. Строки сравниваются посимвольно слева направо с учетом их следования в типе Char. Например,
'abcd' > 'abcD' { 'd' > 'D' }
'abcd' > 'abc' { 'd' > '' }
'abc' < 'axxc' { 'b' < 'x' }
'abcd' = 'abcd'
3. Поиск подстроки в строке. Функция Pos. Например, требуется найти
позицию первой буквы 'A' в слове X
N = pos(‘A’, x);
4. Выделение части строки между двумя символами. Функция Copy.
Вначале определяем позицию первого символа, затем он заменяется любым другим символом, и после ищется позиция второго символа. Далее
46
выделяем часть текста между найденными позициями. Например, выделение текста между двумя пробелами выглядит следующим образом:
N1 := pos(‘ ’, S);
//Позиция первого пробела
S[N1] := ‘*’;
//заменяем первый пробел
на *
N2 := pos(‘ ’, S);
// Позиция второго пробела
S1 := copy(S, N1+1,N2–N1-1); //Часть текста между пробелами
5. Вставка текста в строку. Процедура Insert
Например, требуется в строку S вставить после первой точки слово “Истина”
N := pos(‘.’, S);
//Позиция первой точки
Insert(‘Истина’, S, N+1);
// Вставка в указанную позицию
6. Удаление части строки. Процедура Delete.
Требуется удалить в строке все вхождения слова «Старт»
N := pos(‘Старт’, S); //Позиция первого слова ‘Старт’
While N>0 do
begin
Delete(S, N, Length(‘Старт’)); //Удаление слова
N := pos(‘Старт’, S); //Позиция след. слова ‘Старт’
End;
7. Выделение слов в тексте.
Требуется вывести каждое второе слово текста S в столбик. Слова разделены пробелами.
Read(s);
//Ввод исходной строки
S := S + ‘ ’;
//Добавление пробела в конец строки, для
выделения последнего слова
L := length(S); //Определение длины исходного текста
K := 1;
//Позиция первой буквы первого слова
P := 0;
//Счетчик количества слов
For i:=1 to L do
//Цикл по всем символом текста S
If s[i]= ‘ ’ then //Если найден пробел (позиция I)
Begin
Slovo := copy(S,k,i-k); //выделяем слово с первой буквы слова K до пробела I
Inc(P);
//Увеличиваем количество найденных слов
If not Odd(P) then Writeln(Slovo); //если слово четное по порядку,
выводим его на экран
K := I + 1;// определяем позицию первой буквы следующего слова
(т. е. после пробела)
End;
47
8. Запись слов текста в массив
Вначале требуется описать массив из строк, указав максимально допустимое количество слов в тексте, например, 20. Затем выполнить все
действия, приведенные в предыдущей программе. При выделении слова,
необходимо также записывать его и в массив. Например, требуется записать все слова текста в массив и упорядочить его по возрастанию количества символов в словах.
var S, Slovo, temp: string;
a : array[1..20] of string;
j,i,imin,k,p,l:integer;
begin
writeln('Данная программа упорядочивает текст по возрастанию
количества символов в словах');
writeln('Введите строку (не более 20 слов): '); Read(s);
//Добавление пробела в конец
строки, для выделения последнего слова
L := length(S); //Определение длины исходного текста
K := 1;
//Позиция первой буквы первого слова
P := 0;
//Счетчик количества слов
For i:=1 to L do
//Цикл по всем символом текста S
If s[i]= ' ' then //Если найден пробел (позиция I)
Begin
Slovo := copy(S,k,i-k); //выделяем слово с первой буквы слова K до пробела
I
Inc(P);
//Увеличиваем количество найденных слов
a[p] :=Slovo; //Запись слова в массив на место p
K := I + 1;// определяем позицию первой буквы следующего
слова (т.е. после пробела)
End;
S := S + ' ';
//сортировка массива
for i:=1 to p-1 do // p – количество слов в тексте
begin
imin :=i;
for j:=i+1 to p do
if length(a[j])<length(a[imin]) then imin :=j;
temp := a[i];
48
a[i]:=a[imin];
a[imin]:=temp;
end;
writeln;
writeln('Отсортированный текст: ');
writeln;
for i:=1 to p do write(a[i],' ');
writeln;
writeln('Press ENTER to Continue!');
readln;
end.
Пример 1. Дан текст, слова в котором разделены пробелами. Требуется напечатать все слова с удвоенной буквой "н".
Этапы решения задачи:
1. В задаче требуется сначала разбить строку на слова: то есть организовать поиск всех пробелов строки и выделение текста между ними.
Затем в каждом найденном слове проверить наличие удвоенной «н». Если она встречается в слове, то выдать его на экран.
2. Программа
program example1;
var st, slovo:string;
i,k,p,L: integer;
flag: boolean;
begin
writeln('Введите текст'); readln(st);//исходная строка
St := St + ‘ ’;
Flag := 0;//признак того, есть ли в тексте слова с «нн»
L := length(St);
K := 1;
For i:=1 to L do
If st[i]= ‘ ’ then
Begin
Slovo := copy(St,k,i-k); //выделяем слово
If pos(‘нн’,Slovo)<>0 then //проверка есть ли в слове «нн»
Begin
Writeln(Slovo);
Flag := 1;
End;
49
K := I + 1;// определяем позицию первой буквы следующего слова
(т.е. после пробела)
End;
If Flag = 0 then Write(‘Таких слов нет’);
readln;
end.
Пример 2. Проверить сколько раз каждое слово встречается в тексте.
Этапы решения задачи
1. Алгоритм поиска числа повторений каждого слова фразы строится следующим образом: вначале выделяется первое слово фразы, затем запускается новый цикл по тексту, в котором поочередно выделяются все слова и сравниваются с первым словом. В случае совпадения увеличивается на 1 счетчик повторений искомого слова. Затем выделяется
второе слово и все повторяется и т. д.
2. Программа
program example1;
var st, slovo, slovo2:string;
I,j,k,k1,L,p: integer;
begin
writeln('Введите текст'); readln(st);//исходная строка
St := St + ‘ ’;
Flag := 0;//признак того, есть ли в тексте слова с «нн»
L := length(St);
K := 1;
For i:=1 to L do
If st[i]= ‘ ’ then
Begin
Slovo := copy(St,k,i-k); //выделяем слово
P:=0; //Число повторений слова Slovo
K1 := 1;
For j:=1 to length(st) do
If st[j] = ‘ ’ then
Begin
Slovo2 := copy(St, k1 ,j-k1);
If Slovo = Slovo2 then inc(p);
K1:=j+1;
End;
Writeln(‘Слово – ’, Slovo, ‘встретилось ’,p, ‘ раз’);
50
K := I + 1;// определяем позицию первой буквы следующего слова
(т.е. после пробела)
End;
Write(‘Нажмите Enter для выхода из программы!’);
readln;
end.
Задания
Вариант 1
1. Дан текст из слов, разделенных пробелами. Вывести на экран все
слова-палиндромы. Если таких слов нет, выдать соответствующее сообщение.
Вариант 2
1. Дан текст из слов, разделенных пробелами. В каждом слове текста замените "а" на букву "е", если "а" стоит на четном месте, и заменить
букву "б" на сочетание "ак", если "б" стоит на нечетном месте.
Вариант 3
1. Дан текст из слов, разделенных пробелами. Отредактировать заданное предложения текста, удаляя из него все слова с нечетными номерами и переворачивая слова с четными номерами. Например, HOW DO
YOU DO -> OD OD.
Вариант 4
1. Дан текст из слов, разделенных пробелами. Вывести на экран самое длинное слово фразы.
Вариант 5
1. Дан текст из слов, разделенных пробелами. Упорядочить слова
текста по алфавиту.
Вариант 6
1. Дан текст из слов, разделенных пробелами. Вывести на экран все
слова, совпадающие с последним словом фразы. Если таких слов нет,
выдать соответствующее сообщение.
Вариант 7
1. Дан текст из слов, разделенных пробелами. Вывести на экран все
слова, встречающиеся в тексте более одного раза. Если таких слов нет,
выдать соответствующее сообщение.
51
Вариант 8
1. Дан текст из слов, разделенных пробелами. Вывести на экран все
слова, в которых все буквы разные. Если таких слов нет, выдать соответствующее сообщение.
Вариант 9
1. Дан текст из слов, разделенных пробелами. Оставить в тексте по
одному экземпляру каждого слова.
Вариант 10
1. Дан текст из слов, разделенных пробелами. Составить программу
для вычеркивания из слов текста всех букв, стоящих на нечетных местах
после буквы "а".
Вариант 11
Дан текст из слов, разделенных пробелами. Получить новую строку,
в которой каждое слово фразы записано наоборот.
Вариант 12
Для запоминания числа p иногда используют "магические" фразы,
например: "это я знаю и помню прекрасно Пи многие знаки мне лишни
напрасны" или "кто и шутя и скоро пожелаетъ Пи узнать число ужъ знаетъ". Число букв в каждом слове любой из данных фраз представляет
собою некоторую цифру числа: "это" – 3, "я" – 1, "знаю" – 4 и т. д. Составить программу, которая по указанному алгоритму будет выводить на
печать число, используя любой текст.
Вариант 13
Дан текст из слов, разделенных пробелами. Определить, где расположено самое длинное слово фразы: в первой половине, во второй или
посередине.
Вариант 14
Дан текст из слов, разделенных пробелами. Удалить из текста все
слова, в которых только три различные буквы (например, дом, кара и
т.д.). Если таких слов нет, выдать соответствующее сообщение.
Вариант 15
Дан текст из слов, разделенных пробелами. Определить, сколько раз
в тексте встречается самое длинное слово.
52
Вариант 16
Дан текст из слов, разделенных пробелами. Найти самое длинное
слова фразы и проверить, можно ли из букв этого слова составить заданное слово.
Вариант 17
1. Дан текст из слов, разделенных пробелами. Упорядочить текст
по возрастанию количества букв в слове.
Вариант 18
Дан текст из слов, разделенных пробелами. Определить, отсортирован ли текст по алфавиту.
Вариант 19
Дан текст из слов, разделенных пробелами. Найти все пары слов,
одно из которых является обращением другого. Если таких слов нет, выдать соответствующее сообщение.
Вариант 20
Дан текст из слов, разделенных пробелами. Напечатать все слова,
отличные от последнего слова, предварительно преобразовав каждое из
них по следующему правилу: перенести первую букву в конец слова.
Контрольные вопросы
1. Как описываются строковые переменные?
2. Какая максимальная длина строки допустима в Pascal?
3. Какие операции допустимы над строковыми данными?
4. В чем отличие строковой переменной от массива символов?
5. Какие стандартные процедуры и функции для работы со строками вы знаете?
6. Что выведет функция Copy(x,Pos(' ',x)+1,18), если x='Сила есть –
ума не надо'?
7. Чему равно значение x[0] после присваивания x:='вопрос'?
53
Лабораторная работа № 6
РАБОТА С КОМБИНИРОВАННЫМИ ТИПАМИ ДАННЫХ
Цель работы:
 познакомиться с понятиями: "множество", "запись";
 выработать навыки работы с указанными типами в языке программирования Delphi: научиться правильно описывать типы; уметь
инициализировать переменные этих типов и выводить их на экран;
 научиться использовать эти типы при решении задач.
Общие сведения
Под множеством понимают ограниченный, неупорядоченный набор
различных элементов одного типа. В отличие от массивов к элементам
множества нет прямого доступа (по индексам этих элементов, как в массивах). Поэтому ввод-вывод множеств производится с использованием
операций объединения (при вводе) и проверки принадлежности (при выводе). Под мощностью множества понимают количество элементов, содержащихся в данном множестве.
Перед выполнением работы необходимо ознакомиться с правилами
описания и использования переменных типа множество, типизированных констант типа множество, переменных, заданных перечислением,
изучить допустимые операции над переменными этих типов [1–7].
Под записью понимается структура данных, объединяющая под одним именем данные различных типов. Записи состоят из фиксированного числа элементов, называемых полями. Поле – это переменная определенного типа. Различные поля могут иметь (в отличие от элементов массива) различный тип. Обращение к элементу записи выполняется с помощью составного имени. Первая часть составного имени – это имя записи, вторая часть – имя поля. Между именем записи и именем поля
ставится точка: ZAP.IMP, где ZAP – имя записи, IMP – имя поля.
Перед выполнением работы необходимо изучить правила описания
и использования записей, типизированных констант типа запись, оператора присоединения [1–7].
Тип-запись и тип-множество
Понятно, что данные типы относятся к структурированным, т. е. состоят из нескольких простых типов. Поэтому принцип работы с ними в
54
общем случае совпадает с типами, из которых они состоят. Например,
если в типе запись есть строковые поля – то для работы с ними используются процедуры и функции для работы со строками, если это целые
числа – то к ним применимы операции над целочисленными данными и
т. д.
Все это справедливо для всех структурированных типов. Но при
этом каждый из них имеет ряд особенностей. Рассмотрим их на примерах.
Пример 3. В структуре запись имеется информация о видеофильмах: название, режиссер, исполнитель главной роли, жанр, продолжительность. Требуется составить сводку по фильмам Спилберга, продолжительностью 100 мин.
Этапы решения задачи
1. Прежде всего необходимо создать тип, описывающий заданную
предметную область (в нашем примере – это кинофильмы). Затем описать массив из элементов созданного типа. После этого организовать
ввод данных в массив, учитывая, что доступ к полям записи осуществляется через точку (например, Films[i].Title – поле Title i-го элемента массива Films). Далее запустить цикл по всем элементам массива, сравнить
значения полей элементов с заданными условиями и в случае совпадений – вывести на экран.
2. Программа
Program Examlpe3;
type
TFilms = record
Title : string; // Название картины
Director : string; // Режиссер
Artist : string; // Исп. гл. роли
Genre : string; // Жанр
Duration : word; // Продолжительность
end;
var Films: array[1..20] of TFilms;
i,n:integer;
flag : boolean;
begin
write('Введите кол-во фильмов n,n<20: '); Readln(n);
//Ввод данных фильмотеки
for i:=1 to n do
begin
55
writeln('Film ',i);
write('Название
: '); readln(Films[i].Title);
write('Режиссер
: '); readln(Films[i].Director);
write('Исп.гл.роли
: '); readln(Films[i].Artist);
write('Жанр
: '); readln(Films[i].Genre);
write('Продолжительность : '); readln(Films[i].Duration);
writeln;
end;
Flag :=False;
//Поиск по заданным критериям
for i:=1 to n do
with Films[i] do //альтернативный доступ к полям записи
begin
if (Director = 'Spilberg') and (Duration = 100)
then begin
writeln(Title,' ',Artist, ' ', Genre);
Flag :=True;
end;
end;
if not Flag then writeln('Нет таких фильмов!');
writeln;
writeln('Press ENTER to Continue!');
readln;
end.
Пример 4. Дан текст из слов, разделенных пробелом. Вывести все гласные
буквы в алфавитном порядке, входящие в каждое нечетное слово.
Для решения данной задачи можно использовать как строковые
процедуры и функции, так и множества. Рассмотрим применение множеств для решения.
Этапы решения задачи
1. Начальные действия: выделить все слова текста и записать их в
массив. Затем описать множество всех гласных букв. После чего запустить цикл по всем буквам и для каждой гласной буквы проверить входит ли она в каждое нечетное слово (то есть слово с нечетным порядковым номером). Если да, то выводить букву на экран. Примечание, в данной задаче требуется ввести переменную-признак, определяющую, что
буква входит в каждое нечетное слово фразы и проверять отсутствие
буквы в указанных словах.
56
2.
Программа
Program Example4;
var S, Slovo: string;//исходная строка и слово фразы
a : array[1..20] of string;//массив из слов текста
k : integer; //позиция первой буквы слова
L : integer; //длина исходного текста
P : integer; //количество слов в тексте
i : integer; //вспомогательная переменная
glas : set of char; //множество всех символов
c : char;
Flag : boolean; //признак: TRUE – если гласная входит в каждое
нечетное слово
begin
writeln('Данная программа выводит все гласные, входящие в
каждое нечетное слово фразы');
writeln('Введите строку (не более 20 слов): '); Read(s);
S := S + ' '; //Добавление пробела в конец строки, для выделения
последнего слова
L := length(S); //Определение длины исходного текста
K := 1;
//Позиция первой буквы первого слова
P := 0;
//Счетчик количества слов
//======Выделение слов и запись их в массив=========
For i:=1 to L do
//Цикл по всем символом текста S
If s[i]= ' ' then //Если найден пробел (позиция I)
Begin
Slovo := copy(S,k,i-k); //выделяем слово с первой буквы слова K до пробела I
Inc(P);
//Увеличиваем количество найденных слов
a[p] :=Slovo; //Запись слова в массив на место p
K := I + 1;// определяем позицию первой буквы следующего
слова (т.е. после пробела)
End;
//===Определение гласных, входящих в каждое нечетное сло-
во==
gl := ['a','e','u','i','o','A','O','E','U','I'];
57
for c:='A' to 'z' do //цикл по всем символам
if c in gl then //если текущий символ – гласная буква
begin
Flag := True;
for i:=1 to p do //цикл по всем словам текста
//условие: если позиция i нечетная и
//
символ c не входит в слово a[i]
if odd(i) and not (c in a[i]) then Flag :=False;
if Flag then writeln(c);
end;
writeln; writeln('Press ENTER to Continue!');
readln;
end.
Задания
Вариант 1
1. Описать, используя структуру данных, запись в телефонную
книгу. Составить программу, выдающую список абонентов, имеющих
телефонный номер, начинающийся на 331.
2. Дана непустая последовательность слов из строчных русских
букв; между соседними словами – запятая, за последним словом – точка.
Напечатать в алфавитном порядке все гласные буквы, которые входят в
каждое слово.
Вариант 2
1. Описать, используя структуру данных, запись, каталог книг в
библиотеке. Составить программу, выдающую список книг В. Пикуля,
хранящихся в библиотеке.
2. Дана непустая последовательность слов из строчных русских
букв; между соседними словами – запятая, за последним словом – точка.
Напечатать в алфавитном порядке все звонкие согласные буквы, которые входят хотя бы в одно слово.
Вариант 3
1. Описать, используя структуру данных, запись, таблицу дат и событий русской истории. Составить программу, выдающую список событий 19 века.
2. Дана непустая последовательность слов из строчных русских
букв; между соседними словами – запятая, за последним словом – точка.
58
Напечатать в алфавитном порядке все глухие согласные буквы, которые
не входят хотя бы в одно слово.
Вариант 4
1. Описать, используя структуру данных запись, школьный класс
(фамилия и инициалы, дата рождения, месяц рождения, год рождения).
Составить программу, выдающую список учеников, рожденных в мае
месяце.
2. Дана непустая последовательность слов из строчных русских
букв; между соседними словами – запятая, за последним словом – точка.
Напечатать в алфавитном порядке все согласные буквы, которые не входят ни в одно слово.
Вариант 5
1. Описать, используя структуру данных, запись, записную книжку
(фамилия и инициалы, год рождения, дата рождения, месяц рождения).
Составить программу, выдающую список друзей, кому в этом году исполняется 25 лет.
2. Дана непустая последовательность слов из строчных русских
букв: между соседними словами – запятая, за последним словом – точка.
Напечатать в алфавитном порядке все согласные буквы, которые входят
только в одно слово.
Вариант 6
1. Описать, используя структуру данных, запись, выборы (фамилия
кандидата и количество набранных голосов). Всего избирателей 2000.
Составить программу, определяющую кто из делегатов прошел или
необходимо проводить повторные выборы (должно быть набрано 1/3
голосов от общего количества).
2. Дана непустая последовательность слов из строчных русских
букв: между соседними словами – запятая, за последним словом – точка.
Напечатать в алфавитном порядке все глухие согласные буквы, которые
не входят только в одно слово.
Вариант 7
1. Описать, используя структуру данных, запись, школьную
нагрузку (фамилия преподавателя, класс, часы). Составить программу,
определяющую нагрузку каждого преподавателя. Определить у какого
преподавателя самая большая нагрузка и у кого самая низкая.
2. Дана непустая последовательность слов из строчных русских
букв: между соседними словами – запятая, за последним словом – точка.
59
Напечатать в алфавитном порядке все звонкие согласные буквы, которые входят более чем в одно слово.
Вариант 8
1. После поступления в ВУЗ о студентах собрана информация: фамилия, нуждается ли в общежитии, стаж, работал ли учителем, что окончил, какой язык изучал. Составить программу, определяющую: 1) сколько человек нуждаются в общежитии; 2) списки студентов, проработавших 2 и более лет учителем.
2. Дана непустая последовательность слов из строчных русских
букв; между соседними словами – запятая, за последним словом – точка.
Напечатать в алфавитном порядке все гласные буквы, которые не входят
более чем в одно слово.
Вариант 9
1. Описать, используя структуру данных, запись, таблицу соревнований (название команды, количество набранных очков). Выбрать команду, занявшую первое место. Упорядочить список команд, в зависимости от занятого места.
2. Дана непустая последовательность слов из строчных русских
букв; между соседними словами – запятая, за последним словом – точка.
Напечатать в алфавитном порядке все звонкие согласные буквы, которые входят в каждое нечетное слово и не входят ни в одно четное слово.
Вариант 10
1. Описать, используя структуру данных, запись, вступительные
экзамены. Абитуриенты сдавали три экзамена, для поступления необходимо набрать 12 баллов. Определить списки абитуриентов, зачисленных
в институт, количество несдавших экзамены, списки абитуриентов
сдавших три экзамена на 5.
2. Дана непустая последовательность слов из строчных русских
букв; между соседними словами – запятая, за последним словом – точка.
Напечатать в алфавитном порядке все глухие согласные буквы, которые
входят в каждое нечетное слово и не входят хотя бы в одно четное слово.
Вариант 11
1. В библиотеке для каждого заказывающего книгу читателя заполняется карточка: фамилия, дата заказа, дата выдачи книги. Определить:
1) самый маленький срок, за который нашли книгу; 2) сколько заказов
было не удовлетворено; 3) кто чаще всего берет книги.
2. Подсчитать общее количество цифр и знаков '+', '-', и '*', входящих в строку s.
60
Вариант 12
1. Описать, используя структуру данных, запись, почтовую сортировку (город, улица, дом, квартира, кому, ценность). Составить программу, определяющую: 1) сколько посылок отправлено в г. Самару; 2)
сколько и куда (список городов) отправлено посылок ценностью выше
10 рублей; 3) есть ли адреса куда отправлено более 1 посылки, если есть
то сколько и кому.
2. Подсчитать количество различных (значащих) цифр в десятичной записи натурального числа n и напечатать в возрастающем порядке
все цифры, не входящие в десятичную запись натурального числа n.
Вариант 13
1. В библиотеке в читательском билете есть данные о человеке и о
книге (автор, название, дата, когда книгу брали читать). Определить, кто
брал книгу Ефремова "Таис Афинская" 15.05.06, количество книг
А. Дюма и какие есть в библиотеке, кто и какие книги брали 21.04.06.
2. Подсчитать количество знаков препинания в заданном тексте.
Вариант 14
1. В экзаменационной ведомости можно выделить сведения о ведомости (предмет, номер группы, дата экзамена), сведения о человеке (фамилия, номер зачетной книжки, оценка за экзамен). Определить сколько
человек не сдали информатику, выдать их списки: фамилия, номер группы. Определить сколько групп сдавали экзамены 11.06.06 и какие, составьте списки студентов, сдавших информатику: фамилия, номер группы, оценка.
2. Вычислить сумму тех элементов матрицы A, номера строк и
столбцов которых принадлежат соответственно непустым множествам
S1 и S2 типа Nom.
Вариант 15
1. Описать, используя структуру данных, запись, расписание
(предмет, преподаватель, номер группы, день недели, часы, аудитория).
Составить программу определяющую: 1) у каких групп совпадают аудитории на занятиях; 2) какая нагрузка у преподавателя ... на этой недели.
2. Дан текст, за которым следует точка. В алфавитном порядке
напечатать (по разу) все строчные русские гласные буквы (а,е,о,у,ы,э,
ю,я), входящие в этот текст.
61
Вариант 16
1. На олимпиаде по информатике на школьников заполнялись анкеты: фамилия, номер школы, класс, занятое место. Напечатать: 1) списки
школ, занявших призовые места; 2) какая из школ заняла больше всех
призовых мест; 3) списки учеников занявших первое место, указать их
класс.
2. Из множества целых чисел 1..20 выделить множество чисел,
кратных 6.
Вариант 17
1. Описать, используя структуру данных запись, записную книжку
(фамилия, номер телефона). Составить программу, определяющую:
1) есть ли в записной книжке сведения о знакомом с фамилией на букву
"Ф", если есть напечатать его фамилию и телефон; 2) есть ли в записной
книжке сведения о знакомом с телефоном 33-58-35, если есть напечатать
его фамилию.
2. Дан текст из цифр и строчных латинских букв, за которым следует точка. Определить, каких букв – гласных (a, e, i, o, u) или согласных
– больше в этом тексте.
Вариант 18
1. В деканате хранится информация о зимней сессии на 1 курсе
(фамилия, номер группы, оценка 1 по геометрии, оценка 2 по алгебре,
оценка 3 по информатике). Составить программу, печатающую фамилии
студентов, имеющих задолженность хотя бы по одному предмету, качество успеваемости (процент студентов, сдавших экзамены на 4 и 5),
название предмета, который был сдан лучше всего.
2. Даны целые числа от 1 до 50. Определить, сколько среди них чисел Фибоначчи и сколько чисел, первая значащая цифра в десятичной
записи которых 2 или 3. Результат поместить в множества.
Вариант 19
1. Описать, используя структуру данных, запись жителя (фамилия,
город, улица, дом, строка). Составить программу, которая печатает фамилии двух любых жителей из списка, живущих в разных городах по
одинаковому адресу.
2. type letters = set of 'a'..'z'; Описать процедуру print(A), печатающую в алфавитном порядке все элементы множества A, имеющего тип
letters.
62
Вариант 20
1. В отделе кадров студентов хранится следующая информация о
каждом студенте: фамилия, имя, отчество, пол, возраст, курс. Составить
программу, которая печатает номер курса, на котором наибольший процент мужчин, в алфавитном порядке самые распространенные мужские
и женские имена.
2. Дан текст из строчных латинских букв, за которыми следует точка. Получить множество, содержащее все буквы, входящие в текст по
одному разу, сохранив при этом их исходный порядок.
Контрольные вопросы
1. Что такое множество, как оно описывается в языке Pascal?
2. Как определить новый тип данных с использованием перечисления?
3. Как описываются типизированные константы типа множество?
4. Как осуществляется ввод-вывод значений переменных типа
множество?
5. Какие типы данных используются в качестве базовых при объявлении типа множество?
6. Какие операции определены над множествами?
7. Какие операции допустимы над переменными, заданными перечислением?
8. Чем похожи и чем отличаются множества и массивы?
9. Какое значение у выражений: а) x in [x]; б) [ ] <= [x,y,z];
в) [x]<>[x,x,x]
10. Как описываются переменные типа запись?
11. В каких случаях целесообразно использовать переменные типа
запись?
12. Из каких компонентов состоит переменная типа запись?
13. Каково назначение оператора WITH?
14. Какие операции допустимы над полями записи?
15. В чем отличие записей от массивов?
63
Лабораторная работа № 7
ФАЙЛЫ
Цель работы: познакомиться с понятием файлового типа данных
(типизированные, текстовые и нетипизированные файлы); выработать
навыки работы с файловым типом данных в языке программирования
Pascal. научиться считывать информацию из файлов, записывать информацию в файл; научиться решать задачи с использованием файлов.
Общие сведения
Файл представляет собой структурированный тип данных, содержащий последовательность компонентов одного типа и одной длины.
Число элементов в файле (длина файла) не фиксировано. Это является
основным отличием файла от массива.
Файл можно представить как ленту, у которой есть начало, а конец
не фиксирован. Элементы файла записываются на эту ленту последовательно, друг за другом с помощью некоторого устройства – указателя
файла. При чтении или записи этот указатель перемещается к следующему элементу и делает его доступным для обработки. В каждый момент доступен для чтения или записи только тот элемент файла, на который установлен указатель.
Перед выполнением данной работы необходимо изучить виды файлов, процедуры и функции работы с типизированными, текстовыми и
нетипизированными файлами, правила работы с файлами [1–7].
Пример1. Переписать из текстового файла f в файл g в обратном
порядке строки в перевернутом виде.
Этапы решения задачи
1. Будем считывать файл f построчно и, перевертывая строки, будем записывать их в массив, далее создадим файл и заполним его строками из массива, меняя порядок строк на обратный.
2. Программа
program example1;
var
f,g:TextFile;
m:array[1..100] of string;
k,i:integer;
begin
AssignFile(f,'input.dat');
64
reset(f);
k:=0;
while not eof(f) do
begin
readln(f,st);
k:=k+1;
st1:='';
for i:= 1 to length(st) do st1:= st[i]+st1;
m[k]:=st1;
end;
AssignFile(g,'output.dat');
rewrite(g);
for i:= 1 to k do writeln(g,m[i]);
end.
Пример 2. Дан файл, содержащий целые числа. Определить сколько
в нем четных чисел.
Этапы решения задачи
1. Будем считывать из файла по одному элементу и проверять, является ли он четным. Если да, то количество четных элементов увеличивается на единицу.
2. Программа.
При запуске программы на экране отображается меню из 4 пунктов:
первый пункт вызывает процедуру создания нового файла и его заполнения – Create_File; второй пункт вызывает процедуру вывода на экран
содержимого существующего файла – Print_File; третий пункт обращается к функции Count_Chet, которая возвращает количество четных элементов в заданном файле и четвертый пункт осуществляет выход из программы.
Program Example2;
type
TIntFile = file of integer;
const FileName = '1.dat';
procedure Create_File;
//Данная процедура создает новый файл и заполняет его
var N,i, element:integer;
f: TIntFile;
65
begin
AssignFile(f, FileName); //Связывание файловой переменной с
файлом, имя которого записано в FileName
Rewrite(f); //Создание файла с именем FileName
//Заполнение файла
write('Введите кол-во элементов в файле: ');readln(N);
writeln('Введите ', N,’ чисел: ');
for i:=1 to N do
begin
read(element);
Write(f, element);//запись элемента в файл
end;
CloseFile(f); //закрытие файла
end;{of procedure Create_File}
function Count_Chet:integer;
// Функция определяет количество четных элементов в файле
var element:integer;
f: TIntFile;
begin
AssignFile(f, FileName);
Reset(f); //Открытие файла для чтения и записи; окно файла
указывает на его первый элемент
Result := 0;
while not Eof(f) do //Пока не конец файла
begin
Read(f,element);//Считываем элемент из файла
//Проверка четности элемента и определение количества четных
if not odd(element) then result:=result+1;
end;
CloseFile(f);
end;{of function Count_Chet}
procedure Print_File;
//Данная процедура распечатывает существующий файл
var element:integer;
f: TIntFile;
begin
AssignFile(f, FileName);
Reset(f);
writeln;write('Ваш файл -> ');
66
while not Eof(f) do
begin
Read(f,element);
Write(element,' ');
end;
CloseFile(f);
writeln; writeln;
end; {of Print_File}
var c:byte; //Переменная определяет номер выбранного пункта
меню
begin {of Main}
Writeln('Данная программа определяет количество четных элементов в файле');
writeln;writeln;
writeln('1. Создать новый файл. ');
writeln('2. Распечатать существующий файл.');
writeln('3. Найти количество четных в файле. ');
writeln('4. Выход. ');
writeln;
//Бесконечный цикл. Выход из него только при выборе пункта 4
while true do
begin
write('Выберете пункт меню: ');
Readln(c);
case c of
1:Create_File;
2:Print_File;
3:Writeln('В файле кол-во четных элем = ',Count_Chet);
4:break;
else writeln('Введите число от 1 до 4!');
end;
end;
end.
Задания
Вариант 1
1. Дан файл f, компоненты которого являются целыми числами. Записать в файл g все четные числа файла f, а в файл h – все нечетные. Порядок следования чисел сохранить.
67
2. Даны два текстовых файла. Описать логическую функцию, проверяющую идентичны ли тексты этих файлов или нет.
Вариант 2
1. Дан файл, содержащий вещественные числа. Описать функцию,
подсчитывающую сумму отрицательных элементов в этом файле.
2. Дан текстовый файл. Описать функцию less(w1, w2), определяющую, предшествует ли слово w1 слову w2.
Вариант 3
1. Дан файл, в котором записаны цены товаров (в виде 1 руб. 50
коп.). Описать функцию, определяющую наименьшую цену, записанную
в файле.
2. Дана строка символов. Описать процедуру, которая записывает
в текстовый файл все цифры из этой строки.
Вариант 4
1. Type row = file of 0..999. Описать логическую функцию, проверяющую, упорядочены ли по возрастанию элементы непустого файла.
2. Описать процедуру line40(t), которая считывает из файла s литеры до первой точки и записывает их (без точки) в текстовый файл t,
формируя в нем строки по 40 литер (в последней строке может быть и
меньше).
Вариант 5
1. Даны два файла, содержащих целые числа. Описать процедуру
prisv(f, g: file of integer), которая файлу f присваивает содержимое файла
g.
2. Имеется внешний текстовый файл Book. Написать программу,
которая, игнорируя исходное деление этого файла на строки, переформатирует его, разбивая на строки так, чтобы каждая строка оканчивалась
точкой либо содержала ровно 60 литер, если среди них нет точки.
Вариант 6
1. Даны три файла Type letters = file of 'a'..'z'. Описать процедуру
append(f, g, h) от трех файлов типа letters, которая записывает в файл f
сначала все элементы файла g, а затем – все элементы файла h.
2. Имеется текстовый файл T. Напечатать первую из самых коротких его строк.
68
Вариант 7
1. Дан файл f, содержащий вещественные числа. Описать функцию
less(f) от непустого файла f, меньших среднего арифметического всех
элементов этого файла.
2. Пусть текстовый файл t разбит на непустые строки. Описать
функцию count(t) для подсчета числа строк, которые состоят из одинаковых литер.
Вариант 8
1. В файле записана информация о группе людей, содержащая имя
и возраст каждого из них. Описать процедуру, печатающую имена всех
людей из файла, имеющих наименьший возраст.
2. Пусть текстовый файл t разбит на непустые строки. Описать функцию count(t) для подсчета числа строк, которые начинаются с буквы d.
Вариант 9
1. Дан файл вещественных чисел f. Описать функцию incr(f), определяющую количество элементов в наиболее длинной возрастающей последовательности файла f.
2. Описать функцию, которая подсчитывает количество пустых
строк в текстовом файле t.
Вариант 10
1. Сведения об ученике состоят из его имени и фамилии и названия класса (года обучения и буквы), в котором он учится. Дан файл f,
содержащий сведения об учениках школы. Выяснить, имеются ли в
школе однофамильцы.
2. Описать функцию, которая находит максимальную длину строк
текстового файла t.
Вариант 11
1. Дан файл f, компоненты которого являются целыми числами.
Записать в файл g наибольшее значение первых пяти компонент файла f,
затем – следующих пяти компонент и т.д. Если в последней группе окажется менее пяти компонент, то последняя компонента файла g должна
быть равна наибольшей из компонент файла f, образующих последнюю
(неполную) группу.
2. Дан символьный файл f. Удалить из файла все однобуквенные
слова и лишние пробелы. Результат записать в файл g.
69
Вариант 12
1. Багаж пассажира характеризуется количеством вещей и общим
весом вещей. Дан файл f, содержащий сведения о багаже нескольких
пассажиров. Сведения о багаже каждого пассажира представляют собой
запись с двумя полями: одно поле целого типа (количество вещей) и одно – действительное (вес в килограммах). Найти число пассажиров,
имеющих более двух вещей и число пассажиров, количество вещей которых превосходит среднее число вещей.
2. Дан текстовый файл f. В файле не менее двух компонент. Определить, являются ли два первых символа файла цифрами. Если да, то
установить, является ли число, образованное этими цифрами, четным.
Вариант 13
1. Сведения об автомобиле состоят из его марки, номера и фамилии владельца. Дан файл f, содержащий сведения о нескольких автомобилях. Найти: а) фамилии владельцев и номера автомобилей данной
марки; б) количество автомобилей каждой марки. Найденные данные
записать в файл g.
2. Дан текстовый файл g. Создать новый файл f и записать в него
все слова файла g с количеством символов >4 и < 6, в которых нет повторяющихся символов. Если таких слов нет, то полностью переписать
файл g в файл f.
Вариант 14
1. Дан файл f, содержащий различные даты. Каждая дата – это
число, месяц и год. Найти: а) год с наименьшим номером; б) все весенние даты; в) самую позднюю дату. Найденные данные записать в файл g.
2. Дан текстовый файл. Описать процедуру, которая выводит все
слова, содержащиеся между самым длинным и самым коротким словом
каждой строки.
Вариант 15
1. Дан файл f, содержащий сведения о кубиках: размер каждого
кубика (длина ребра в сантиметрах), его цвет (красный, зеленый, желтый
или синий) и материал (деревянный, металлический, картонный). Найти
количество деревянных кубиков с ребром 3 см и количество металлических кубиков с ребром, большим 5 см.
2. Дан текстовый файл. Выдать на экран все симметричные строки
файла.
70
Вариант 16
1. Дан файл f, содержащий сведения о веществах: указывается
название вещества, его удельный вес и проводимость (проводник, полупроводник, изолятор). Найти удельные веса и названия всех полупроводников.
2. Дан текстовый файл f. Создать новый файл g и записать в него
построчно все слова файла f, предварительно перенеся последнюю букву
слова в начало.
Вариант 17
1. Дан файл f, содержащий сведения о книгах. Сведения о каждой
из книг – это фамилия автора, название и год издания. 1) Найти названия
книг данного автора, изданных с 1960 г. 2) Определить, имеется ли книга
с названием "Информатика". Если да, то сообщить фамилию автора и
год издания. Если таких книг несколько, то сообщить имеющиеся сведения обо всех книгах.
2. Дан текстовый файл f, содержащий программу на языке Pascal.
Проверить эту программу на соответствие числа открывающих и закрывающих круглых скобок. Считать, что каждый оператор программы занимает не более одной строки файла f.
Вариант 18
1. Дан файл f, содержащий сведения об экспортируемых товарах:
указывается наименование товара, страна, импортирующая товар, и объем поставляемой партии в штуках. Найти страны, в которые экспортируется данный товар, и общий объем его экспорта.
2. Дан текстовый файл f. Найти самое длинное слово среди слов,
вторая буква которых есть e; если слов с наибольшей длиной несколько,
то найти последнее. Если таких слов нет вообще, то сообщить об этом.
Вариант 19
1. Дан файл f, компоненты которого являются целыми числами.
Получить файл g, образованный из файла f исключением повторных
вхождений одного и того же числа.
2. Дан текстовый файл f. Записать "в перевернутом виде" строки
файла f в файл g. Порядок строк в файле g должен совпадать с порядком
исходных строк в файле f;
Вариант 20
1. Дан типизированный файл f, содержащий целые числа. Создать
новый файл g и записать в него все простые числа файла f.
71
2. Дан символьный файл f, содержащий сведения о сотрудниках
учреждения, записанные по следующему образцу: фамилия имя отчество
фамилия имя отчество ... Записать эти сведения в файле g, используя
образец: фамилия и. о. фамилия и. о. ...;
Контрольные вопросы
1. Что такое файл? Какие существуют виды файлов?
2. Какими стандартными процедурами и функциями располагает
Delphi для работы с файлами?
3. Каково должно быть содержание программы по созданию файла
и его корректировки (замена элементов, добавление элементов, удаление
элементов)?
4. Дайте определение последовательного и прямого доступа к файлам.
5. Как создать типизированный файл для хранения данных о студентах (фамилия, группа, курс)?
6. Каковы особенности работы с текстовыми файлами?
7. Как можно обратиться к последней строке текстового файла?
8. Каковы особенности работы с типизированными файлами?
9. Каковы особенности работы с нетипизированными файлами?
10. Как подсчитать число строк в текстовом файле?
72
Лабораторная работа № 8
ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ В DELPHI
Цель работы: Получить практические навыки работы с динамической памятью, построения различных динамических структур на языке
Delphi.
Общие сведения
Для работы с динамическими структурами данных используются
указатели. Указатели представляют собой специальный тип данных. Они
принимают значения, равные адресам размещения в оперативной памяти
соответствующих динамических переменных.
Списком называется структура данных, каждый элемент которой
посредством указателя связывается со следующим элементом. На самый
первый элемент (голову списка) имеется отдельный указатель.
Из определения следует, что каждый элемент списка содержит поле
данных (оно может иметь сложную структуру) и поле ссылки на следующий элемент. После ссылки последнего элемента должно содержать
пустой указатель (nil).
Число элементов связанного списка может расти или уменьшаться в
зависимости от того, сколько данных мы хотим хранить в нем. Чтобы
добавить новый элемент в список, необходимо:
1. Получить память для него;
2. Поместить туда информацию;
3. Добавить элемент в конец списка (или начало).
Элемент списка состоит из разнотипных частей (хранимая информация и указатель), и его естественно представить записью. Перед описанием самой записи описывают указатель на нее.
Стек – упорядоченный набор элементов, в котором добавление новых элементов и удаление существующих производится с одного конца,
называемого вершиной стека.
В любой момент времени доступен лишь один элемент стека –
верхний. Извлекать элементы из стека можно только в порядке, обратном их добавлению в стек (первым пришел, последним ушел).
Значением указателя, представляющего стек, является ссылка на
вершину стека, каждый элемент стека содержит поле ссылки на следующий элемент.
Перед выполнением данной работы необходимо изучить особенности организации динамических структур данных, основы работы с динамической памятью [1–7].
73
Пример. В двунаправленном списке записаны целые числа, за которыми следует ноль (ноль в список не входит). После каждого четного
числа вставить в список заданное с клавиатуры число (Примечание: добавленные элементы на четность не проверять).
Удалить последний нечетный. Если в списке нет нечетных элементов,
выдать соответствующее сообщение.
Этапы решения задачи.
1. Создать двунаправленный список: элементы в список добавляются до тех пор, пока не введен ноль.
2. Ввести число для вставки.
3. Просмотреть список от начала до конца, определить позиции
вставок и добавить требуемые элементы. Полученный список вывести на
экран.
4. Определить позицию последнего нечетного и удалить его. Если
в списке нет нечетных элементов, выдать соответствующее сообщение.
5. Программа
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
PList = ^TRList; // тип указатель на динамическую структуру
TRList = record // тип-структура
data:integer; //поле данных
next, prev: PList;// поля адреса следующего и предыдущего элементов
списка
end;
var
PB, PE, PK, PA: PList; // указатели для создания списка
x:integer; //элемент списка
a:integer; // элемент для вставки
F:0..1; //F=0 если нечетных элементов нет, иначе F=1
procedure CreateList;
//======== Создание двунаправленного списка =============
begin
74
Write('введите элемент: ');readln(x);
PB := nil;
while x<>0 do
begin
New(PA);
//если в списке элементов нет
// то добавляем первый (PB)
if PB = nil then
begin
PB := PA;
PE := PB;
PB^.prev := nil;
end
// иначе следующий (в конец – PE)
else begin
PA^.prev := PE;
PE^.next := PA;
PE := PA;
end;
// заполняем поле данных добавленного элемента
PE^.data := x;
// у последнего элемента нет следующих
PE^.next := nil;
//Вводим следующее число последовательности
readln(x);
end;
end; {of CreateList}
procedure PrintList;
//=========вывод полученного списка на экран==========
begin
writeln;writeln;
PK := PB;
while PK<>nil do
begin
x := PK^.data;
Write (x,' ');
PK := PK^.next;
end;
end; {of PrintList}
75
procedure InsertElem(a:integer);
//===========Вставка новых элементов ================
begin
//просматриваем список с начала до конца
PK := PB;
while PK<>nil do
begin
x := PK^.data;
//если элемент четный
if not odd(x) then
begin
New (PA); //создаем новый элемент
PA^.prev := PK; // для PA предыдущий равен текущему элементу
PA^.next := PK^.next; // следующим для PA будет следующий для
PK
if PK = PE then PE := PA
else PK^.next^.prev := PA; //для следующего за PK предыдущим
элементом будет
PA
PK^.next := PA; // следующим для текущего элемента будет новый
PK := PK^.next; //переходим к добавленному элементу
// требуется, чтобы его не анализировать на четность
PA^.data := a; // записываем заданное число в структуру
end;
PK := PK^.next; //переход к следующему элементу списка
end;
end; {of InsertElem}
procedure DelElem(PK : PList);
//===Удаление элемента списка, на который указывает PK =======
begin
if PK = PB then begin
PB := PB^.next;
PB^.prev := nil;
end
else if PK = PE then begin
PE := PE^.prev;
PE^.next := nil;
end
else begin
76
PK^.prev^.next := PK^.next;
PK^.next^.prev := PK^.prev;
end;
dispose(PK);
end; {of DelElem}
procedure DeleteList; //Удаление списка и очистка памяти
begin
PK := PE;
while PE <> nil do
begin
PK := PK^.prev;
dispose(PE);
PE := PK;
end;
end; {of DeleteList}
begin {of Main program}
CreateList; //Создаем список
Write('Введите число для вставки: ');Readln(a);
InsertElem(a); //Вставляем элемент после каждого четного
writeln('Результат добавления элементов:');
PrintList; //вывод полученного списка на экран
//поиск последнего нечетного элемента списка
F := 0;
PK := PE;
while PK <> nil do
begin
x := PK^.data;
if odd(x) then begin
F := 1;
break;
end;
PK := PK^.prev;
end;
{Если F = 1, то на последний нечетный элемент указывает указатель PK}
writeln; writeln;
if F = 0 then Writeln ('В списке нет нечетных элементов!')
else begin
77
DelElem(PK);
//вывод полученного списка на экран
writeln('Результат удаления элемента:');
PrintList;
end;
DeleteList;//Удаляем список и очищаем память из под него
readln; readln;
end.
Задания
Вариант 1
1. В структуру данных – стек занести из заданного файла f все четные числа. Вывести содержимое стека и определить максимальное количество подряд идущих одинаковых чисел в нем.
2. В заданном двунаправленном списке целых чисел удалить неотрицательные нечетные элементы, и после каждой «2» добавить цифру
«5».
Вариант 2
1. В структуру данных – стек занести последовательность из случайных N чисел. Определить, есть ли в стеке хотя бы два отрицательных
элемента. Все положительные элементы стека записать в файл.
2. Отсортировать элементы двусвязного списка по убыванию его
компонент и удалить каждый второй элемент.
Вариант 3
1. В структуру данных – стек занести данные об N клиентах (фамилия, адрес, количество заказов). Записать в файл данные о тех из них, у
которых более одного заказов. Определить общее количество заказов.
2. В однонаправленный список считать данные из типизированного
файла целых чисел. Вставить в список после максимального элемента
значение среднего арифметического чисел списка.
Вариант 4
1. В файле записана информация о книгах в библиотеке (название,
год издания, автор). В структуру данных стек записать данные о книгах
по информатике. Вывести содержимое стека и определить количество
книг заданного автора.
2. В двусвязном списке найти количество простых элементов и
удалить их.
78
Вариант 5
1. В структуру данных – стек занести из заданного файла f все простые. Определить какие из них являются делителями чисел, записанных
в файле.
2. Задан двусвязный список. Записать из списка данные в типизированный файл. Поменять местами максимальный и минимальный элементы списка.
Вариант 6
1. В структуру данных очередь записать математическую формулу.
Проверить соответствие открытия и закрытия скобок в формуле.
2. Дана последовательность из целых чисел, за которой следует
ноль. Создать двунаправленный список, данные в которой добавляются
таким образом, чтобы список был упорядоченным по убыванию.
Вариант 7
1. Записать формулу в структуру стек. Определить общее количество операций в формуле и количество двузначных операндов. (Примечание: каждое действие: *, /, -, + , скобки и данные между ними записываются в отдельные элементы. Например, формула: 1  3  45  2  23 ,
представляется в виде ‘1’;‘+’;‘3’;‘*’;‘(’;‘45’;‘-’;‘2’;‘*’;‘23’;‘)’, где точкой
с запятой отделяется элемент стека).
2. Описать структуру данных – кольцевой список, в которой записаны
целые числа. Записать данные структуры в файл заданное число раз.
Вариант 8
1. Записать в структуру стек данные одномерного массива. Проверить с помощью стека, симметрично ли расположены четные и нечетные
элементы массива относительно середины (Например, в массиве 2, 3, 4,
6, 5, 7, 8, 12, 9, 8 – ответ да).
2. Задан двунаправленный список. Переставить его элементы таким
образом, чтобы вначале оказался его максимальный элемент, а в конце
минимальный.
Вариант 9
1. Записать в структуру стек данные одномерного массива. Проверить с помощью стека количественное соответствие отрицательных элементов в начале и в конце массива.
2. Дан двунаправленный список, элементами которого являются
элементы матрицы. Добавить в список после элементов каждой строки
значения максимальных элементов строк.
79
Вариант 10
1. В структуру данных стек, записать последовательность положительных целых чисел, за которой следует ноль. Записать в файл все элементы последовательности, превосходящие значение максимального
четного элемента.
2. В двунаправленный список записать данные о студентах и их
оценках по информатике. Вывести и удалить всех студентов двоечников
из списка.
Вариант 11
1. В структуру данных стек, записать последовательность положительных целых чисел, за которой следует ноль. Записать в файл все элементы последовательности, превосходящие значение максимального
четного элемента.
2. В двунаправленном списке записаны данные текстового файла.
Удалить из списка все элементы, содержащие пустые строки файла.
Вариант 12
1. В структуру очередь добавить все четные числа последовательности из целых чисел, за которой следует ноль. Определить, является ли
очередь упорядоченной по возрастанию.
2. В двунаправленном списке записать все неповторяющиеся числа
из последовательности целых чисел, за которой следует ноль. Отсортировать список по возрастанию его элементов.
Вариант 13
1. В структуру очередь добавить все простые числа последовательности из целых чисел, за которой следует ноль. Определить, является ли
очередь упорядоченной по убыванию.
2. В двунаправленном списке записать все неповторяющиеся числа
из последовательности целых чисел, за которой следует ноль. Создать
новый список и записать в него количество повторений каждого элемента списка.
Вариант 14
1. В структуру очередь добавить все нечетные отрицательные элементы из целочисленного файла. Проверить содержит ли очередь два
подряд идущих одинаковых элемента.
2. В кольцевой список записать данные из последовательности целых чисел, за которой следует ноль. Вывести содержимое списка k раз.
80
Вариант 15
1. В структуру данных стек добавить все знаки препинания из текстового файла. Определить длину максимальной подпоследовательности
подряд идущих запятых в полученном стеке.
2. В двунаправленный список записать строки из текстового файла.
Отсортировать элементы списка по возрастанию длин строк, входящих в
него. Полученный список записать в новый файл.
Вариант 16
1. В структуру данных стек записать максимальные элементы каждой строки матрицы. Определить упорядочены ли они по возрастанию.
2. Дана последовательность положительных целых чисел, за которой следует отрицательное число. Записать данные последовательности
в двусвязный список. Определить минимальное количество элементов,
необходимых чтобы список стал палиндромом.
Вариант 17
1. В структуру данных очередь записать суммы положительных
элементов каждого столбца матрицы. Определить есть ли в очереди два
подряд идущих одинаковых элементы.
2. Дана последовательность положительных чисел, за которой следует ноль. Записать ее в двусвязный список. Определить количество
элементов, совпадающих со средним арифметическим элементов этой
последовательности. Удалить эти элементы из списка.
Вариант 18
1. В структуру данных очередь записать количество элементов в
каждой строке, совпадающих по модулю с максимальным элементом
матрицы. Определить упорядочена ли очередь по убыванию своих элементов.
2. Задан двунаправленный список из N целых чисел. Если в списке
встречаются два подряд идущих элемента с одинаковым знаком, один из
них удалить.
Вариант 19
1. В структуру данных стек записать среднее арифметическое элементов каждой строки матрицы. Определить максимальный и минимальный элементы стека.
2. Задан двунаправленный список из N целых чисел. Определить
встречаются ли в ней хотя бы два отрицательных числа. Если да, то вы81
вести данные, расположенные между ними, в противном случае, вывести
соответствующее сообщение.
Вариант 20
1. В структуру очередь добавить сначала все четные элементы одномерного массива, затем нечетные, а после нули. В конец очереди добавить следующую информацию: общее количество элементов массива,
затем максимальный и минимальный элементы. Распечатать содержимое
очереди.
2. Задан двунаправленный список из N положительных целых чисел. Числа, встречающиеся в списке по одному разу, удалить.
Контрольные вопросы
1. Что такое указатели? Какие значения они могут принимать? Какие операции возможны над указателями?
2. Что представляют собой динамические структуры данных? Для
чего они используются? Чем отличаются от данных статического типа?
3. Какие стандартные процедуры существуют в языке Pascal для
работы с указателями?
4. Зачем различать типы указателей?
5. Какие операции требуется выполнить для вставки и удаления
элемента списка?
6. Сколько элементов может содержать список?
7. Можно ли для построения списка обойтись одной переменной?
8. В чем сходство и отличие динамических структур данных типа
список и стек?
9. Можно ли добраться до середины или конца («дна») стека, минуя его начало («вершину»)?
10. Приведите примеры из жизни, где встречается «принцип стека».
11. Оформите в виде процедуры Push занесение в стек значения.
12. Оформите в виде процедуры Pop извлечение значения из стека.
13. Какие процедуры применимы к очереди?
14. В чем сходство и различие динамических структур данных типа
стек и очередь?
82
Список рекомендуемой литературы
1. Архангельский А. Я. Язык Pascal и основы программирования в
Delphi. Учебное пособие. М.: Бином-Пресс, 2004. 496 с.
2. Глинский Я. Н., Анохин В. Е., Ряжская В. А. Turbo Pascal 7.0 и
Delphi. Учебное пособие. СПб: ООО «ДиаСофтЮП», 2003. 208 с.
3. Моргун А. Н., Кривель И. А. Программирование на языке Паскаль. Основы обработки структур данных, М.: Вильямс, 2006. 328 с.
4. Окулов С. М. Основы программирования. М.: ЮНИМЕДИАСТАЙЛ, 2002. 453 с.
5. Павловская Т. А. Паскаль. Программирование на языке высокого
уровня. Учебник. СПб.: Изд-во «Питер», 2003. 400 с.
6. Павловская Т. А. Паскаль. Программирование на языке высокого
уровня. Практикум. СПб.: Изд-во «Питер», 2006. 320 с.
7. Фаронов В. В. Delphi. Программирование на языке высокого
уровня. Учебник для вузов. СПб.: Изд-во «Питер», 2003. 640 с.
83
Приложение
Пример оформления отчета по лабораторной работе
СЕВЕРО-КАВКАЗСКИЙ ГОРНО-МЕТАЛЛУРГИЧЕСКИЙ ИНСТИТУТ
Кафедра Автоматизированной обработки информации
ОТЧЕТ
по лабораторной работе № 3
"МАССИВЫ"
по дисциплине: Основы программирования
Выполнил:
____________________
Проверил:
____________________
Владикавказ 2015
84
1. Постановка задачи
Отсортировать заданный одномерный массив A(N) по возрастанию
методом выбора.
2. Блок-схема задачи
Общая блок-схема
программы
Детализация блока 3
I = 1, N-1
Начало
imin = I
J = I+1,N
1. Ввод N
2. Инициализация
массива
3. Сортировка массива
4. Печать
отсортированного
массива
Конец
да
A[J] <
A[imin]
нет
imin = J
J
Temp = A[I]
A[I] = A[imin]
A[imin] = Temp
I
3. Текст программы
program example2;
var a:array[1..20] of integer;
i, j, t, imin, n : integer;
begin
writeln('Программа сортирует массив по возрастанию методом выбора');
write('Введите n, n<=20: ');read(n);
//Инициализация массива
for i:=1 to n do
begin
a[i]:=random(30)-10;
85
write(a[i]:4);
end;
//Cортировка
for i:=1 to n-1 do
begin
imin := i;
for j:=i+1 to n do
if a[j]<a[imin] then imin :=j;
t := a[i];
a[i] :=a[imin];
a[imin] :=t;
end;
//Вывод отсортированного массива
writeln;
for i:=1 to n do write(a[i]:4);
writeln;
writeln('Нажмите ENTER для продолжения ');
readln;
end.
4. Контрольные примеры
Пример 1.
Входные данные:
N = 12; A[N] = {1 3 14 5 16 7 80 9 4 13 12 20}
Выходные данные: A[N] = {1 3 4 5 7 9 12 13 14 16 20 80}
Пример 2.
Входные данные:
N = 10; A[N] = {-11, 23, 55, 19, 80, -19, 43, 13, -12, 28}
Выходные данные: A[N] = {-19, -12, -11, 13, 19, 23, 28, 43, 55, 80}
86
Скачать