- •ОСНОВЫ АЛГОРИТМИЗАЦИИ И ПРОГРАММИРОВАНИЯ
- •Требования к оформлению лабораторных работ
- •1. ОСНОВЫ АЛГОРИТМИЗАЦИИ И ПРОГРАММИРОВАНИЯ
- •13.1 План разработки алгоритмов и программ
- •Таблица 1.1 Результат ручной прокрутки после первого этапа
- •Таблица 1.2 Результат ручной прокрутки после первого этапа
- •Таблица 1.3 Итог выполнения ручной прокрутки
- •13.2 Перевод алгоритма в Паскаль-программу
- •13.3 Использование готовых алгоритмов при решении задач
- •Подсчет элементов, обладающих заданным свойством
- •Поиск максимального и минимального элементов
- •Поиск элементов, обладающих заданным свойством
- •Задача 1. Подсчет ненулевых элементов
- •Задача 2. Подсчет элементов, абсолютная величина которых больше 7
- •Задача 3. Поиск элемента равного 7
- •Задача 5. Найти количество элементов массива больших среднего арифметического этих элементов
- •Задача 6. Поиск максимального элемента и подсчет частоты его появления в массиве
- •Задача 7. Поиск нулевого элемента
- •Задача 8. Поиск отрицательного числа с конца массива
- •13.4 Стандартная обработка двумерных массивов
- •Двумерный массив и его части
- •Индексы элементов двумерного массива
- •Индексы строки и столбца двумерного массива
- •Индексы диагоналей двумерного массива
- •Перенос простейших алгоритмов на двумерные массивы
- •13.5 Отладка и тестирование программ
- •2. СОЗДАНИЕ КОНСОЛЬНЫХ ПРИЛОЖЕНИЙ СРЕДСТВАМИ DELPHI 7.0
- •13.1 Создание консольного приложения средствами Delphi
- •13.2 Структура программы в Delphi
- •Таблица 2.1
- •13.3 Введение в типы данных Delphi
- •13.4 Венгерская нотация
- •13.5 Отладка и тестирование программ средствами среды Delphi 7
- •3. ЛАБОРАТОРНАЯ РАБОТА №1 «ЛИНЕЙНЫЕ ПРОГРАММЫ»
- •13.1 Пояснения и примеры к лабораторной работе
- •13.2 Задания к лабораторной работе №1:
- •4. ЛАБОРАТОРНАЯ РАБОТА №2 «АЛГОРИТМЫ С ВЕТВЛЕНИЯМИ»
- •13.3 Пояснения и примеры к лабораторной работе
- •13.2 Реализация алгоритмов с ветвлениями средствами C#
- •13.3 Задания к лабораторной работе №2
- •5. ЛАБОРАТОРНАЯ РАБОТА №3 «ОПЕРАТОР ВЫБОРА»
- •13.1 Пояснения и примеры к лабораторной работе
- •13.2 Реализация оператора выбора в языке C#
- •13.3 Задания к лабораторной работе №3
- •6. ЛАБОРАТОРНАЯ РАБОТА №4 «ЦИКЛИЧЕСКИЕ АЛГОРИТМЫ»
- •13.1 Основные разновидности циклов
- •Цикл с постусловием
- •Цикл с предусловием
- •Цикл с параметром
- •Программное прерывание выполнения циклов
- •13.2 Примеры решения задач с использованием операторов цикла
- •Проверка корректности введенных данных
- •Решение задач с использованием диапазонов чисел
- •Решение задач полным перебором
- •Пояснения к задачам 18, 23, 24, 25:
- •13.3 Задания к лабораторной работе №4
- •7. ЛАБОРАТОРНАЯ РАБОТА №5 «РЯДЫ И ПОСЛЕДОВАТЕЛЬНОСТИ»
- •13.1 Примеры решения задач
- •Вычисление суммы n-первых членов ряда
- •Вычисление суммы n-первых членов последовательности, удовлетворяющих условию
- •Нахождение наименьшего номера члена последовательности, для которого выполняется некоторое условие
- •13.2 Задания к лабораторной работе №5
- •8. ЛАБОРАТОРНАЯ РАБОТА №6 «ТАБУЛИРОВАНИЕ ФУНКЦИЙ»
- •13.1 Пример решения задачи на табулирование функции
- •8.1.2 Организация перенаправления ввода-вывода средствами C#
- •13.2 Задания к лабораторной работе №6
- •9. ЛАБОРАТОРНАЯ РАБОТА №7 «ПОДПРОГРАММЫ»
- •13.1 Задания к лабораторной работе №7
- •13.2 Задания к лабораторной работе №8
- •13.1 Примеры и пояснения к лабораторной работе
- •13.2 Задания к лабораторной работе №9
- •Задания к лабораторной работе №10
- •13.1 Примеры работы со строками
- •Пример 13.2 Удалить из строки символ, указанный пользователем.
- •Пример 13.3 Удалить из строки лишних пробелов (пробелы в начале и в конце строки, между словами также должен быть один пробел).
- •Пример 13.4 Определить количество слов в заданном тексте.
- •13.2 Задания к лабораторной работе №11
- •13.1 Задания к лабораторной работе №12
- •13.1 Пояснения к работе
- •13.1 Задания к лабораторной работе №13
- •13.1 Пояснения к лабораторной работе №14
- •Формирование файла случайных чисел
- •Анализ файла случайных чисел
- •13.2 Задания к лабораторной работе №14
- •13.1 Примеры решения задач с использованием текстовых файлов
- •13.2 Задания к лабораторной работе №15
- •13.1 Задания к лабораторной работе №16
- •13.1 Задания к лабораторной работе №17
- •13.2 Задания к лабораторной работе №18
- •13.1 Задания к лабораторной работе №19
- •ПРИЛОЖЕНИЕ А
- •ПРИЛОЖЕНИЕ Б
- •СПИСОК РЕКОМЕНДУЕМОЙ ЛИТЕРАТУРЫ
- •ОГЛАВЛЕНИЕ
навливаем в 0.
Важно обратить внимание на то, что третья строка написана со сдвигом вправо на 2 позиции относительно предыдущей строки. Так отмечают, что эта строка существует не сама по себе, а является продолжением предыдущей.
If a[i]=5 then s:=s+1; Если A[i] равно 5, то увеличить значение S на 1. Более подробно это можно прочитать следующим образом: если 1-й элемент массива А равен 5, то новое значение переменной S надо сформировать, сложив старое значение S с 1.
Возвращаемся к задаче об отличниках: если очередной ученик имеет оценку 5, то его надо посчитать. Но ведь увеличение на 1 — это и есть подсчет.
Вопрос: как подсчитать количество троечников? s:=0;
for i:=l to 10 do
if a[i]=3 then s:=s+1;
Как подсчитать количество хорошистов и отличников? s:=0;
for i:=1 to 10 do
if a[i]>=4 then s:=s+1;
В операторе IF можно писать и более сложные условия, используя слова AND (и), OR (или) и скобки.
Например, пусть A[i] — массив оценок по информатике, a B[i] — массив оценок по математике. Как подсчитать количество учеников, которые имеют оценку 5 и по информатике и по математике?
s:=8;
for i:=1 to 10 do
if (a[i]=5) and (b[i]=5) then s:=s+1;
Как подсчитать количество учеников, которые имеют оценку 5 хотя бы по одному из этих предметов?
s:=0;
for i:=1 to 10 do
if (a[i]=5) or (b[i]=5) then s:=s+1;
Теперь вы можете решить любую задачу, в которой нужно подсчитать количество элементов в одномерном массиве, обладающих каким-то свойством, причем алгоритм будет работать для одномерных массивов любой размерности, нужно лишь изменить границы изменения параметра в цикле For. Таким образом, вы убедились, что знание одного алгоритма позволяет вам решить ряд задач, отличающихся только входными данными.
Поиск максимального и минимального элементов
Пусть одномерный массив А[i] содержит числа — рост 10 учеников в сантиметрах. Требуется найти рост самого высокого из учеников.
12
s:=a[1]; |
//Поиск |
for i:=2 to 10 do |
//максимального элемента |
if a[i]>s then s:=a[i]; |
|
По обыкновению, рассмотрим задачу построчно.
s:=a[1]; Сначала в переменной S запоминаем рост первого ученика. for i:=2 to 10 do Для всех остальных учеников от 2-го до 10-го необ-
ходимо проделать следующие действия:
if a[i]>s then s:=a[i]; Если рост текущего (1-го) ученика больше, чем тот, что мы помним в переменной S, то в S надо занести это большее значение.
Таким образом, когда эта процедура будет проделана для всех учеников, в переменной S окажется значение, соответствующее максимальному из всех, которые были введены в массив А.
Другим вариантом решения подобной задачи будет следующий: for i:=1 to 10 do
if (i=1) or (a[i]>s) then s:=a[i];
В этом алгоритме нет необходимости задавать начальное значение переменной S, эту роль играет условие if (i=1) or (a[i]>s). Условие (i=1) выполняется всего один раз, после чего s будет равно a[1], на всех остальных шагах эта часть условия будет ложна, и будет проверяться лишь условие
(a[i]>s).
Для нахождения минимального элемента (то есть роста самого маленького ученика) нужно вместо знака > (больше) поставить знак < (меньше) в операторе IF. Тогда получим:
s:=a[1]; |
//Поиск |
for i:=2 to 10 do |
//минимального элемента |
if a[i]<s then s:=a[i]; |
|
Если, например, в задаче требуется найти разность наибольшего и наименьшего элементов, что тогда делать?
Завести разные переменные для максимального и минимального элемен-
тов:
max:=a[1]; |
do |
//Поиск |
|
for |
i:=2 to 10 |
//максимального элемента |
|
|
if a[i]>max then max:=a[i]; |
||
min:=a[1]; |
do |
//Поиск |
|
for |
i:=2 to 10 |
//минимального элемента |
if a[i]<min then min:=a[i]; s:=max-min;
Одновременный поиск максимального и минимального элементов в одномерном массиве можно было записать немного короче:
max:=a[1]; min:=a[1];
13
for i:=2 to 10 do begin
if a[i]>max then max:=a[i]; if a[i]<min then min:=a[i];
end; s:=max-min;
В данном случае, когда внутри оператора FOR мы хотим выполнить 2 (или более) оператора IF, либо других каких-либо операторов, необходимо использовать так называемые операторные скобки BEGIN END. Такую последовательность операторов BEGIN оператор 1; оператор 2; -…; END; принято называть составным оператором.
Поиск элементов, обладающих заданным свойством
Пусть у нас массив Aсодержит оценки по информатике 10 учеников. Требуется выяснить, имеется ли среди них хоть один ученик, имеющий тройку.
i:=1; |
//Поиск элементов |
while (i<=10) and (a[i]<>3) do i:=i+1; |
//равных данному (3) |
if i>10 |
|
then writeln('3 нет ') |
|
else writeln('первая 3 имеет индекс ',i);
Рассмотрим алгоритм построчно:
i:=1; I присваиваем значение 1.I - переменная, в которой хранится номер текущего элемента массива А.
while (i<=10) and (a[i]<>3) do i:=i+1; Буквально это читается так: Пока (i<=10) и (a[i]<>3) делать i:=i+l.
А применительно к нашей задаче:
Пока (массив не кончился) и (текущий элемент в массиве не тот, что мы ищем) (то есть элемент не обладает нужным нам свойством) делать - взять следующий элемент.
Из этого оператора пока программа может выйти одним из двух способов:
-в процессе прибавления 1 к I (взятия следующих элементов) так и не нашлось нужного нам элемента;
-нужный элемент нашелся при некотором I.
if i >10 then writeln ('3 нет ') else writeln ('первая 3 имеет индекс ',i);
Как раз по причине двух вариантов следом за пока и стоит оператор IF (если), анализирующий, как именно он закончился, и выдающий нам соответствующее сообщение.
Отметим, что основное достоинство такого способа обработки массива заключается в том, что поиск будет прекращен сразу, как только нужный элемент будет найден.
14
Конечно, можно было воспользоваться алгоритмом подсчета элементов, обладающих заданным свойством:
S:=0;
for 1:=1 to 10 do
if a[i]=3 then s:=s+1; if s=0
then writeln ('троечников нет') else writeln ('троечник есть');
У такого варианта есть ряд минусов:
-будет осуществляться проход по всему массиву даже в случае что A[1]=3, что приведет к снижению производительности программы, представьте, что у вас в массиве несколько тысяч данных;
-нам не удастся выяснить, кто именно — троечник, то есть каков номер элемента, равного 3.
Далее приведен ряд алгоритмов работы с одномерными массивами без дополнительного описания.
Задача 1. Подсчет ненулевых элементов s:=0;
for i: =1 to 10 do
if а[i]<>0 then inc(s); writeln(s);
Задача 2. Подсчет элементов, абсолютная величина которых больше 7 s:=0;
for i:=1 to 10 do
if abs(a[i])>7 then inc(s); writeln(s);
Задача 3. Поиск элемента равного 7 i:=1;
while (i<=10) and (a[i]<>7) do i:=i+1;
if i>10 then writeln('нет') else writeln('да');
Задача 4. Попарно сравнить два массива и определить количество эле-
ментов когда a[i]>b[i], a[i]=b[i] и a[i]<b[i] s1:=0; s2:=0; s3:=0;
for i:=1 to 10 do begin
if a[i]>b[i] then inc(s1); if a[i]=b[i] then inc(s2); if a[i]<b[i] then inc(s3);
end;
15