Слайд 2
Программирование
на алгоритмическом языке. Часть II
Тема 1. Обработка
массивов
Слайд 3
Реверс массива
Задача: переставить элементы массива в обратном порядке.
Алгоритм:
поменять
местами A[1] и A[N], A[2] и A[N-1], …
Псевдокод:
нц для
i от 1 до N
| поменять местами A[i] и A[N+1-i]
кц
сумма индексов N+1
div(N,2)
Слайд 4
Как переставить элементы?
2
3
1
Задача: поменять местами содержимое двух чашек.
Задача:
поменять местами
содержимое двух ячеек памяти.
4
6
?
4
6
4
x
y
c
c:= x
x:= y
y:= c
x:=
y
y:= x
3
2
1
Слайд 5
Программа
алг Реверс
нач
цел i, c, N = 10
целтаб A[1:N]
| здесь нужно заполнить массив
| здесь
нужно вывести результат
кон
нц для i от 1 до div(N,2)
c:= A[i]
A[i]:= A[N+1-i]
A[N+1-i]:= c;
кц
Слайд 6
Задания
«3»: Заполнить массив из 10 элементов случайными числами
в интервале [-10..10] и сделать реверс всех элементов, кроме
первого.
Пример:
Исходный массив:
4 -5 3 10 -4 -6 8 -10 1 0
Результат:
4 0 1 -10 8 -6 -4 10 3 -5
«4»: Заполнить массив из 10 элементов случайными числами в интервале [-10..10] и сделать реверс отдельно для 1-ой и 2-ой половин массива.
Пример:
Исходный массив:
4 -5 3 10 -4 -6 8 -10 1 0
Результат:
-4 10 3 -5 4 0 1 -10 8 -6
Слайд 7
Задания
«5»: Заполнить массив из 12 элементов случайными числами
в интервале [-12..12] и выполнить реверс для каждой трети
массива.
Пример:
Исходный массив:
4 -5 3 10 -4 -6 8 -10 1 0 5 7
Результат:
10 3 -5 4 -10 8 -6 -4 7 5 0 1
Слайд 8
Циклический сдвиг
Задача: сдвинуть элементы массива влево на 1
ячейку, первый элемент становится на место последнего.
Алгоритм:
A[1]:=A[2]; A[2]:=A[3];… A[N-1]:=A[N];
нц
для i от 1 до N-1
A[i]:= A[i+1]
кц
почему не N?
Слайд 9
Программа
алг Циклический сдвиг влево
нач
цел i, c, N
= 10
целтаб A[1:N]
| здесь нужно заполнить массив
| здесь нужно вывести результат
кон
c:= A[1]
нц для i от 1 до N-1
A[i]:= A[i+1]
кц
A[N]:= c;
Слайд 10
Задания
«3»: Заполнить массив из 10 элементов случайными числами
в интервале [-10..10] и выполнить циклический сдвиг влево без
первого элемента.
Пример:
Исходный массив:
4 -5 3 10 -4 -6 8 -10 1 0
Результат:
4 0 -5 3 10 -4 -6 8 -10 1
«4»: Заполнить массив из 10 элементов случайными числами в интервале [-10..10] и выполнить циклический сдвиг ВПРАВО.
Пример:
Исходный массив:
4 -5 3 10 -4 -6 8 -10 1 0
Результат:
0 4 -5 3 10 -4 -6 8 -10 1
Слайд 11
Задания
«5»: Заполнить массив из 12 элементов случайными числами
в интервале [-12..12] и выполнить циклический сдвиг ВПРАВО на
4 элемента.
Пример:
Исходный массив:
4 -5 3 10 -4 -6 8 -10 1 0 5 7
Результат:
1 0 5 7 4 -5 3 10 -4 -6 8 -10
Слайд 12
Выбор нужных элементов
Задача – найти в массиве элементы,
удовлетворяющие некоторому условию (например, отрицательные), и скопировать их в
другой массив.
Примитивное решение:
цел i, N = 5
целтаб A[1:N], B[1:N]
| здесь заполнить массив A
нц для i от 1 до N
если A[i] < 0 то
B[i]:= A[i]
все
кц
A
B
Слайд 13
Выбор нужных элементов
Решение: ввести счетчик найденных элементов count,
очередной элемент ставится на место B[count].
цел i, N =
5, count = 0
целтаб A[1:N], B[1:N]
| здесь заполнить массив A
нц для i от 1 до N
если A[i]< 0 то
count:= count + 1
B[ ]:= A[i]
все
кц
A
B
count
Слайд 14
Как вывести массив B?
Примитивное решение:
вывод "Выбранные элементы:", нс
нц
для i от 1 до N
вывод B[i], "
"
кц
Правильное решение:
вывод "Выбранные элементы:", нс
нц для i от 1 до
вывод B[i], " "
кц
count
Слайд 15
Задания
«3»: Заполнить массив случайными числами в интервале
[-10,10]
и записать в другой массив все положительные числа.
Пример:
Исходный массив:
0 -5 3 7 -8
Положительные числа:
3 7
«4»: Заполнить массив случайными числами в интервале [20,100] и записать в другой массив все числа, которые оканчиваются на 0.
Пример:
Исходный массив:
40 57 30 71 84
Заканчиваются на 0:
40 30
Слайд 16
Задания
«5»: Заполнить массив случайными числами и выделить в
другой массив все числа, которые встречаются более
одного раза.
Пример:
Исходный массив:
4 1 2 1 11 2 34
Результат:
1 2
Слайд 17
Программирование
на алгоритмическом языке. Часть II
Тема 2. Сортировка
массивов
Слайд 18
Сортировка
Сортировка – это расстановка элементов массива в заданном
порядке (по возрастанию, убыванию, последней цифре, сумме делителей, …).
Задача: переставить элементы массива в порядке возрастания.
Алгоритмы сортировки:
простые и понятные, но медленно работающие для больших массивов
метод пузырька
метод выбора
сложные, но быстрые
(«быстрая сортировка» и др.)
сложность O(N2)
Слайд 19
Метод пузырька
Идея – пузырек воздуха в стакане воды
поднимается со дна вверх.
Для массивов – самый маленький
(«легкий» элемент перемещается вверх («всплывает»).
начиная снизу, сравниваем два соседних элемента; если они стоят «неправильно», меняем их местами
за 1 проход по массиву один элемент (самый маленький) становится на свое место
1-ый проход
2-ой проход
3-ий проход
Для сортировки массива из N элементов нужен
N-1 проход (достаточно поставить на свои места N-1 элементов).
Слайд 20
Программа
1-ый проход:
сравниваются пары
A[N-1] и A[N], A[N-2]
и A[N-1], ..., A[1] и A[2]
A[j] и A[j+1]
2-ой
проход
нц для j от N-1 до 2 шаг -1
если A[j] > A[j+1] то
c:=A[j]; A[j]:=A[j+1]; A[j+1]:=c
все
кц
2
нц для j от N-1 до 1 шаг -1
если A[j] > A[j+1] то
c:=A[j]; A[j]:=A[j+1]; A[j+1]:=c
все
кц
1
i-ый проход
нц для j от N-1 до i шаг -1
...
i
Слайд 21
Программа
алг Сортировка
нач
цел N = 5, i, j,
c
целтаб A[1:N]
| здесь нужно заполнить массив
| здесь нужно вывести полученный массив
кон
нц для i от 1 до N-1
нц для j от N-1 до i шаг -1
если A[j] > A[j+1] то
c:=A[j]; A[j]:=A[j+1]; A[j+1]:=c
все
кц
кц
i
элементы выше A[i] уже поставлены
Слайд 22
Задания
«3»: Заполнить массив из 10 элементов случайными числами
в интервале [-10..10] и отсортировать его по убыванию.
Пример:
Исходный массив:
4 5 -8 3 -7 -5 3 1 0 9
Результат:
9 5 4 3 3 1 0 -5 -7 -8
«4»: Заполнить массив из 10 элементов случайными числами в интервале [0..100] и отсортировать его по последней цифре.
Пример:
Исходный массив:
14 25 13 30 76 58 32 11 41 97
Результат:
30 11 41 32 13 14 25 76 97 58
Слайд 23
Задания
«5»: Заполнить массив из 10 элементов случайными числами
в интервале [0..100] и отсортировать первую половину по возрастанию,
а вторую – по убыванию.
Пример:
Исходный массив:
14 25 13 30 76 58 32 11 41 97
Результат:
13 14 25 30 76 97 58 41 32 11
Слайд 24
Метод выбора
Идея:
найти минимальный элемент и поставить на первое
место (поменять местами с A[1])
из оставшихся найти минимальный элемент
и поставить на второе место (поменять местами с A[2]), и т.д.
Слайд 25
Метод выбора
нц для i от 1 до N-1
nMin:= i
нц для j от i+1 до
N
если A[j] < A[nMin] то nMin:= j все
кц
если nMin <> i то
c:= A[i]
A[i]:= A[nMin]
A[nMin]:= c
все
кц
N-1
N
нужно N-1 проходов
поиск минимального от A[i] до A[N]
если нужно, переставляем
i+1
i
Слайд 26
Задания
«3»: Заполнить массив из 10 элементов случайными числами
в интервале [0..99] и отсортировать его по убыванию последней
цифры.
Пример:
Исходный массив:
14 25 13 12 76 58 21 87 10 98
Результат:
98 58 87 76 25 14 13 12 21 10
«4»: Заполнить массив из 10 элементов случайными числами в интервале [0..99] и отсортировать его по возрастанию суммы цифр (подсказка: их всего две).
Пример:
Исходный массив:
14 25 13 12 76 58 21 87 10 98
Результат:
10 21 12 13 14 25 76 58 87 98
Слайд 27
Задания
«5»: Заполнить массив из 10 элементов случайными числами
в интервале [0..100] и отсортировать первую половину по возрастанию,
а вторую – по убыванию.
Пример:
Исходный массив:
14 25 13 30 76 58 32 11 41 97
Результат:
13 14 25 30 76 97 58 41 32 11
Слайд 28
«Быстрая сортировка» (Quick Sort)
Идея – более эффективно переставлять
элементы, расположенные дальше друг от друга.
div(N,2)
2 шаг: переставить
элементы так:
при сортировке элементы не покидают « свою область»!
1 шаг: выбрать некоторый элемент массива X
3 шаг: так же отсортировать две получившиеся области
Разделяй и властвуй (англ. divide and conquer)
Слайд 29
«Быстрая сортировка» (Quick Sort)
Медиана – такое значение X,
что слева и справа от него в отсортированном массиве
стоит одинаковое число элементов (для этого надо отсортировать массив…).
Разделение:
выбрать средний элемент массива (X=67)
установить L:= 1, R:= N
увеличивая L, найти первый элемент A[L], который >= X (должен стоять справа)
уменьшая R, найти первый элемент A[R], который <= X (должен стоять слева)
если L <= R, поменять местами A[L] и A[R] и перейти к п. 3
Слайд 30
«Быстрая сортировка» (Quick Sort)
Слайд 31
«Быстрая сортировка» (Quick Sort)
алг qSort(аргрез целтаб A[1:5], арг
цел iStart, iEnd)
нач
цел L, R, c, X
если
iStart >= iEnd то выход все
L:= iStart; R:= iEnd;
X:= A[div(L+R,2)]
qSort(A, iStart, R)
qSort(A, L, iEnd)
кон
ограничение рекурсии
сортируем две части:
рекурсия!
нц пока L <= R
нц пока A[L] < X; L:= L+1 кц
нц пока A[R] > X; R:= R-1 кц
кц
если L <= R то
c:= A[L]; A[L]:= A[R]; A[R]:= c
L:= L+1; R:= R-1
все
разделение
обмен
двигаемся дальше
Слайд 32
«Быстрая сортировка» (Quick Sort)
алг Сортировка Quick Sort
нач
цел
N = 5, i
целтаб A[1:N]
| заполнить массив
и вывести на экран
qSort(A, 1, N) | сортировка
| вывести отсортированный массив
кон
алг qSort(аргрез целтаб A[1:5], арг цел iStart, iEnd)
нач
...
кон
Вызов:
qSort(N, A, 1, N)
для массивов любого размера
Слайд 33
Количество перестановок
(случайные данные)
Слайд 34
Задания
«3»: Заполнить массив из 10 элементов случайными числами
в интервале [-50..50] и отсортировать его с помощью алгоритма
быстрой сортировки.
«4»: Заполнить массив из 10 элементов случайными числами в интервале [-50..50] и отсортировать его по убыванию с помощью алгоритма быстрой сортировки.
«5»: Заполнить массив из 500 элементов случайными числами в интервале [0..100]. Отсортировать его по возрастанию двумя способами – методом «пузырька» и методом «быстрой сортировки» . Вывести на экран число перестановок элементов массива в том и в другом случае. Массив выводить на экран не нужно.
Слайд 35
Программирование
на алгоритмическом языке. Часть II
Тема 3. Двоичный
поиск
Слайд 36
Поиск в массиве
Задача – найти в массиве элемент,
равный X, или установить, что его нет.
Решение: для
произвольного массива: линейный поиск (перебор)
недостаток: низкая скорость
Как ускорить? – заранее подготовить массив для поиска
как именно подготовить?
как использовать «подготовленный массив»?
Слайд 37
Линейный поиск
i:= 1
нц пока A[i] X
i:=
i + 1
кц
если i
i, "]=", X
иначе вывод "Нет такого"
все
i – номер нужного
элемента в массиве
i<=N и A[i]<>X
Слайд 38
Двоичный поиск
X = 7
X < 8
8
4
X > 4
6
X
> 6
Выбрать средний элемент A[c] и сравнить с X.
Если
X = A[c], нашли (выход).
Если X < A[c], искать дальше в первой половине.
Если X > A[c], искать дальше во второй половине.
Слайд 39
Двоичный поиск
L:= 1; R:= N; nX:= 0
если
nX > 0
то вывод "A[", nX, "]=",
X
иначе вывод "Не нашли"
все
нц пока R >= L
c:= div(R+L, 2);
если X < A[c] то R:= c – 1 все
если X > A[c] то L:= c + 1 все
кц
номер среднего элемента
если X = A[c]
то nX:= c; выход
все
нашли
выйти из цикла
сдвигаем границы
Слайд 41
Задания
«3»: Написать программу, которая сортирует массив по возрастанию
и ищет в нем элемент, равный X (это число
вводится с клавиатуры). Использовать двоичный поиск.
«4»: Написать программу, которая сортирует массив ПО УБЫВАНИЮ и ищет в нем элемент, равный X (это число вводится с клавиатуры). Использовать двоичный поиск.
«5»: Написать программу, которая считает среднее число шагов в двоичном поиске для массива из 32 элементов в интервале [0,100]. Для поиска использовать 1000 случайных чисел в этом же интервале.
Слайд 42
Программирование
на алгоритмическом языке. Часть II
Тема 4. Символьные
строки
Слайд 43
Задачи на обработку строк
Задача: с клавиатуры вводится число
N, обозначающее количество футболистов команды «Шайба», а затем –
N строк, в каждой из которых – информация об одном футболисте таком формате:
<Фамилия> <Имя> <год рождения> <голы>
Все данные разделяются одним пробелом. Нужно подсчитать, сколько футболистов, родившихся в период с 1988 по1990 год, не забили мячей вообще.
Алгоритм (для каждой строки):
выделить год (year) и количество голов (goal)
если 1988 <= year <=1990 и goal = 0,
то увеличить счётчик
Слайд 44
Программа
использовать Строки
алг Футболисты
нач
цел N, i, p,
year, goal, count=0
лит s
ввод N
нц для
i от 1 до N
ввод s
| разобрать строку, выделить год и голы
если year >= 1988 и year <= 1990 и goal = 0
то count:=count+1
все
кц
вывод count
кон
год
голы
счётчик
Слайд 45
Разбор строки
Пропуск фамилии:
p:= найти(" ", s)
s:= s[p+1:длин(s)]
Пропуск имени:
Ввод
года рождения:
p:= найти(" ", s)
year:= лит_в_цел(s[1:p-1],OK)
s:= s[p+1:длин(s)]
Ввод числа голов:
Иванов
Вася 1998 5
p
Вася 1998 5
p:= найти(" ", s)
s:= s[p+1:длин(s)]
Вася 1998 5
p
1998 5
p
1998 5
5
goal:= лит_в_цел(s,OK)
лог OK
1998 5
Слайд 46
Разбор строки
Если фамилия нужна:
p:= найти(" ", s)
fam:= s[1:p-1]
s:=
s[p+1:длин(s)]
лит fam
Иванов Вася 1998 5
p
Иванов
Вася 1998 5
Если нужны ВСЕ
фамилии:
p:= найти(" ", s)
fam[i]:= s[1:p-1]
s:= s[p+1:длин(s)]
литтаб fam[1:N]
Слайд 47
Задания
«3»: Вывести фамилии всех футболистов, которые забили больше
двух голов.
Пример:
Иванов Василий
Семёнов Кузьма
«4»: Вывести
фамилию и имя футболиста, забившего наибольшее число голов, и количество забитых им голов.
Пример:
Иванов Василий 25
Информация о футболистах вводится так же, как и для приведенной задачи (сначала N, потом N строк с данными).
Слайд 48
Задания
«5»: Вывести в алфавитном порядке фамилии и имена
всех футболистов, которые забили хотя бы один гол. В
списке не более 100 футболистов.
Пример:
Васильев Иван
Иванов Василий
Кутузов Михаил
Пупкин Василий
Слайд 49
Рекурсивный перебор
Задача: Алфавит языка племени «тумба-юмба» состоит из
букв Ы, Ц, Щ и О. Вывести на экран
все слова из К букв, которые можно составить в этом языке, и подсчитать их количество. Число K вводится с клавиатуры.
1
K
в каждой ячейке может быть любая из 4-х букв
4 варианта
4 варианта
4 варианта
4 варианта
Количество вариантов:
Слайд 50
Рекурсивный перебор
1
K
Рекурсия: Решения задачи для слов из К
букв сводится к 4-м задачам для слов из K-1
букв.
1
K
1
K
1
K
перебрать все варианты
перебрать все варианты
перебрать все варианты
перебрать все варианты
Слайд 51
Процедура
алг Рек(цел p)
нач
если p > K то
вывод s, нс
count:= count
+ 1
выход
все
кон
1
K
p
s
p+1
рекурсивные вызовы
Глобальные переменные:
лит s
цел count, K
если p > K то
вывод s, нс
count:= count + 1
выход
все
s[p]:= "Ы"; Рек(p+1)
s[p]:= "Ц"; Рек(p+1)
s[p]:= "Щ"; Рек(p+1)
s[p]:= "О"; Рек(p+1)
окончание рекурсии
Слайд 52
Основная программа
лит s, цел count = 0, K
алг
Рекурсивный перебор
нач
вывод "Введите длину слов: "
ввод
K
s:= ""
нц K раз s:= s + " " кц
Рек(1)
вывод "Всего ", count, " слов"
кон
s:= ""
нц K раз s:= s + " " кц
строка из K пробелов
глобальные переменные
алг Рек(цел p)
нач
...
кон
Слайд 53
Процедура (много букв)
алг Рек(цел p)
нач
если p >
K то
вывод s, нс
count:= count + 1
выход
все
кон
лит syms="ЫЦЩО", цел i
нц для i от 1 до длин(syms)
s[p]:= syms[i]; Рек(p+1)
кц
локальные переменные
все буквы
цикл по всем буквам
Слайд 54
Задания
Алфавит языка племени «тумба-юмба» состоит из букв Ы,
Ц, Щ и О. Число K вводится с клавиатуры.
«3»:
Вывести на экран все слова из К букв, в которых первая буква – Ы, и подсчитать их количество.
«4»: Вывести на экран все слова из К букв, в которых буква Ы встречается более 1 раза, и подсчитать их количество.
«5»: Вывести на экран все слова из К букв, в которых есть одинаковые буквы, стоящие рядом (например, ЫЩЩО), и подсчитать их количество.
Слайд 55
Программирование
на алгоритмическом языке. Часть II
Тема 5. Матрицы
Слайд 56
Операции с матрицами
Задача 1. Вывести на экран главную
диагональ квадратной матрицы из N строк и N столбцов.
A[1,N]
A[2,2]
A[3,3]
A[N,N]
нц
для i от 1 до N
вывод A[i,i], " "
кц
Задача 2. Вывести на экран вторую диагональ.
A[N,1]
A[N-1,2]
A[2,N-1]
нц для i от 1 до N
вывод A[i, ], " "
кц
N+1-i
сумма номеров строки и столбца N+1
A[1,1]
Слайд 57
Операции с матрицами
Задача 3. Найти сумму элементов, стоящих
на главной диагонали и ниже ее.
строка 1: A[1,1]
строка 2:
A[2,1]+A[2,2]
...
строка N: A[N,1]+A[N,2]+...+A[N,N]
S:= 0;
нц для i от 1 до N
кц
нц для j от 1 до i
S:= S + A[i,j]
кц
складываем нужные элементы строки i
цикл по всем строкам
i
Слайд 58
Операции с матрицами
Задача 4. Перестановка строк или столбцов.
В матрице из N строк и M столбцов переставить
2-ую и 4-ую строки.
2
4
j
A[2,j]
A[4,j]
нц для j от 1 до M
c:= A[2,j]
A[2,j]:= A[4,j]
A[4,j]:= c
кц
Задача 5. К третьему столбцу добавить шестой.
нц для i от 1 до N
A[i,3]:= A[i,3] + A[i,6]
кц
Слайд 59
Задания
Заполнить матрицу из 7 строк и 7 столбцов
случайными числами в интервале [10,90] и вывести ее на
экран. Заполнить элементы, отмеченные зеленым фоном, числами 99, и вывести полученную матрицу на экран.
«3»: «4»: «5»:
Слайд 60
Программирование
на алгоритмическом языке. Часть II
Тема 6. Файлы
Слайд 61
Файлы
Файл – это данные на диске, имеющие имя.
Файлы
только
текст без оформления,
не содержат управляющих символов (с кодами
32)
ACSII (1 байт на символ)
UNICODE (>1 байта на символ)
*.txt, *.log,
*.htm, *.html
могут содержать любые символы кодовой таблицы
*.doc, *.exe,
*.bmp, *.jpg,
*.wav, *.mp3,
*.avi, *.mpg
Текстовые
Двоичные
Каталоги
(папки)
Слайд 62
Работа с файлами: принцип сэндвича
I этап. открыть файл:
сделать
его активным,
приготовить к работе
связать переменную F с
файлом
F:= открыть на чтение("in.txt")
II этап: работа с файлом
цел F
III этап: закрыть файл
закрыть(F)
Фввод F, a, b | ввести a и b
F:= открыть на запись("out.txt")
Фвывод F, a, b, нс | вывести a и b
Слайд 63
Работа с файлами
Особенности:
имя файла упоминается только при открытии
файла, работа с файлом – через файловую переменную
файл, который
открывается на чтение, должен существовать
если файл, который открывается на запись, существует, старое содержимое уничтожается
данные записываются в файл в текстовом виде
при завершении программы все файлы закрываются автоматически
после закрытия файла переменную F можно использовать еще раз для работы с другим файлом
Слайд 64
Последовательный доступ
при открытии файла курсор устанавливается в начало
чтение
выполняется с той позиции, где стоит курсор
после чтения курсор
сдвигается на первый непрочитанный символ
12 5 45 67 56●
12 5 45 67 56●
F:= открыть на чтение("qq.txt")
Фввод F, x
конец файла
Слайд 65
Последовательный доступ
как вернуться назад и начать с начала?
не
открывая файл заново
начать чтение ( F )
закрыть (
F )
F:= открыть на чтение ( "qq.txt" )
Слайд 66
Пример
Задача: в файле input.txt записаны числа (в столбик),
сколько их – неизвестно. Записать в файл output.txt их
сумму.
Алгоритм:
Открыть файл input.txt для чтения.
S := 0
Если чисел не осталось, перейти к шагу 7.
Прочитать очередное число в переменную x.
S := S + x
Перейти к шагу 3.
Закрыть файл input.txt.
Открыть файл output.txt для записи.
Записать в файл значение S.
Закрыть файл output.txt.
цикл «пока есть данные»
Слайд 67
Программа: чтение данных из файла
использовать Файлы П
алг Сумма
чисел
нач
цел F, S, x
F:= открыть на чтение("input.txt")
S:= 0
нц пока не конец файла( F )
Фввод F, x
S:= S + x
кц
закрыть( F )
| здесь нужно записать результат в файл
кон
логическая функция, возвращает да, если достигнут конец файла
Слайд 68
Программа: запись результата в файл
F:= открыть на запись("output.txt")
Фвывод
F, S
закрыть( F )
Особенности:
файл, который открывается на запись, не
обязательно должен существовать
старое содержимое файла уничтожается
Слайд 69
Задания
В файле input.txt записаны числа, сколько их –
неизвестно.
«3»: Найти сумму всех чётных чисел и записать
её в файл output.txt.
«4»: Найти минимальное и максимальное из всех чисел и записать их в файл output.txt.
«5»: Найти длину самой длинной цепочки одинаковых чисел, идущих подряд, и записать её в файл output.txt.
Слайд 70
Обработка массивов
Задача: в файле input.txt записаны числа (в
столбик), сколько их – неизвестно, но не более 100.
Переставить их в порядке возрастания и записать в файл output.txt.
Проблемы:
для сортировки надо удерживать в памяти все числа сразу (нужен массив!);
сколько чисел – неизвестно.
Решение:
выделяем в памяти массив из 100 элементов;
записываем прочитанные числа в массив и считаем их с помощью переменной N;
сортируем первые N элементов массива;
записываем их в файл.
Слайд 71
Программа: чтение данных в массив
использовать Файлы П
алг Сортировка
нач
цел F, MAX = 100, N = 0, i,
j, c
целтаб A[1:MAX]
F:= открыть на чтение("input.txt")
нц пока не конец файла(F) и N < MAX
N:= N + 1
Фввод F, A[N]
кц
закрыть(F)
| отсортировать первые N элементов
| вывести полученный массив
кон
цикл заканчивается, если достигнут конец файла или прочитали 100 чисел
Слайд 72
Программа: вывод массива в файл
F:= открыть на запись("output.txt")
нц
для i от 1 до N
Фвывод F, A[i],
нс
кц
закрыть(F)
зачем?
Слайд 73
Задания
В файле input.txt записаны числа (в столбик), известно,
что их не более 100.
«3»: Отсортировать массив по
убыванию и записать его в файл output.txt.
«4»: Отсортировать массив по убыванию последней цифры и записать его в файл output.txt.
«5»: Отсортировать массив по возрастанию суммы цифр и записать его в файл output.txt.
Слайд 74
Обработка текстовых данных
Задача: в файле input.txt записаны строки,
в которых есть слово-паразит «короче». Очистить текст от мусора
и записать в файл output.txt.
Файл input.txt :
Мама, короче, мыла, короче, раму.
Декан, короче, пропил, короче, бутан.
А роза, короче, упала на лапу, короче, Азора.
Каждый, короче, охотник желает, короче, знать, где ...
Результат - файл output.txt :
Мама мыла раму.
Декан пропил бутан.
А роза упала на лапу Азора.
Каждый охотник желает знать, где сидит фазан.
Слайд 75
Обработка текстовых данных
Алгоритм:
Прочитать строку из файла.
Удалить
все сочетания ", короче,".
Записать строку в другой файл.
Перейти к шагу 1.
Особенность:
надо одновременно держать открытыми два файла: один в режиме чтения, второй – в режиме записи.
пока не кончились данные
Слайд 76
Работа с двумя файлами одновременно
использовать Строки
использовать Файлы П
алг
Обработка строк
нач
цел fIn, fOut
fIn:= открыть на чтение("input.txt")
fOut:= открыть на запись("output.txt")
| обработка файла
закрыть(fIn)
закрыть(fOut)
кон
Слайд 77
Цикл обработки файла
нц пока не конец файла(fIn)
Фввод
fIn, s
| обработка строки s
Фвывод fOut,
s, нс
кц
Слайд 78
Обработка одной строки
нц пока да
p:= найти(", короче,",
s)
если p < 1 то выход все
s:=
s[1:p-1] + s[p+9:длин(s)]
кц
бесконечный цикл
выход из цикла
удалить 9 символов
s
p
p+9
1
длин(s)
Слайд 79
Задания
В файле input.txt записаны строки, сколько их –
неизвестно.
«3»: Заменить все слова «короче» на «в общем»
и записать результат в файл output.txt.
«4»: Вывести в файл output.txt только те строки, в которых есть слово «пароход». В этих строках заменить все слова «короче» на «в общем».
«5»: Вывести в файл output.txt только те строки, в которых больше 5 слов (слова могут быть разделены несколькими пробелами).
Слайд 80
Сортировка списков
Задача: в файле list.txt записаны фамилии и
имена пользователей сайта (не более 100). Вывести их в
алфавитном порядке в файл sort.txt.
Файл list.txt :
Федоров Иван
Иванов Федор
Анисимов Никита
Никитин Николай
Результат – файл sort.txt :
Анисимов Никита
Иванов Федор
Никитин Николай
Федоров Иван
Слайд 81
Сортировка списков
Алгоритм:
прочитать строки из файла в массив
строк, подсчитать их в переменной N
отсортировать первые N строк
массива по алфавиту
вывести первые N строк массива в файл
Объявление массива (с запасом):
цел MAX = 100
литтаб s[1:MAX]
Слайд 82
Сортировка списков
Ввод массива строк из файла:
f:= открыть
на чтение("list.txt")
N:= 0
нц пока не конец файла(f)
N:= N
+ 1
Фввод f, s[N]
кц
закрыть(f)
цел f, N
Вывод первых N строк массива в файл:
f:= открыть на запись("sort.txt")
нц для i от 1 до N
Фвывод f, s[i], нс
кц
закрыть(f)
Слайд 83
Сортировка списков
Сортировка первых N элементов массива:
нц для
i от 1 до N-1
nMin:= i
нц для
j от i+1 до N
если s[j] < s[nMin] то nMin:= j все
кц
если i <> nMin то
c:= s[i]
s[i]:= s[nMin]
s[nMin]:= c
все
кц
цел i, j, nMin
лит c
Слайд 84
Сортировка списков
Как сравниваются строки:
||
||
||
||
?
s1
s2
Кодовая таблица:
Win
UNICODE
245
226
код("х") >
код("в")
"х" > "в"
"Пароход" > "Паровоз"
Слайд 85
Сортировка списков
Как сравниваются строки:
||
||
||
?
s1
s2
"х" > ¤
"Пароход" >
"Пар"
Слайд 86
Сортировка списков
Работа с отдельной строкой массива:
литтаб s[1:MAX]
лит
c | вспомогательная строка
нц для i от 1
до N
с:= s[i]
| работаем со строкой c, меняем ее
s[i]:= c
кц
Слайд 87
Задания
«3»: Добавить к списку нумерацию:
1) Анисимов
Никита
2) Иванов Федор
«4»: Выполнить задачу на «3»
и сократить имя до первой буквы:
1) Анисимов Н.
2) Иванов Ф.
«5»: Выполнить задачу на «4», но при выводе начинать с имени:
1) Н. Анисимов
2) Ф. Иванов
Слайд 88
Списки с числовыми данными
Задача: в файле marks.txt записаны
фамилии и имена школьников и баллы, полученные ими на
экзамене (0-100). В файле не более 100 строк. Вывести в файл best.txt список тех, кто получил более 75 баллов.
Файл marks.txt :
Федоров Иван 78
Иванов Федор 63
Анисимов Никита 90
Никитин Николай 55
Результат – файл best.txt :
Федоров Иван 78
Анисимов Никита 90
Слайд 89
Работа с двумя файлами одновременно
использовать Файлы П
использовать Строки
алг
Отметки на экзамене
нач
цел fIn, fOut
fIn:= открыть на
чтение("marks.txt")
fOut:= открыть на запись("best.txt")
| обработка строк из файла
закрыть(fIn)
закрыть(fOut)
кон
Слайд 90
Цикл обработки файла
цел ball
нц пока не конец файла(fIn)
Фввод fIn, s
| обработка строки s
| ball:= результат на экзамене
если ball > 75 то
Фвывод fOut, s, нс
все
кц
Слайд 91
Преобразования «строка»-«число»
Из строки в число:
s:= "123"
N:= лит_в_цел(s, OK)
Слайд 92
Обработка строки
n:= найти(" ", s) | n:=
7
фамилия:= s[1:n-1] | фамилия:= "Пупкин"
s:= удалить(s, 1, n)
| s:= "Вася 82"
n:= найти(" ", s) | n:= 5
имя:= s[1:n-1] | имя:= "Вася"
s:= удалить(s, 1, n) | s:= "82"
ball:= лит_в_цел(s, OK) | ball:= 82
цел n
лит s, фамилия, имя
лог ОK
s:
n
1
n
1
Слайд 93
Обработка строки
n:= найти(" ", s) | n:=
7
фамилия:= s[1:n-1] | фамилия:= "Пупкин"
s:= удалить(s, 1, n)
| s:= "Вася 82"
n:= найти(" ", s) | n:= 5
имя:= s[1:n-1] | имя:= "Вася"
s:= удалить(s, 1, n) | s:= "82"
ball:= лит_в_цел(s, OK) | ball:= 82
если ball > 75 то
Фвывод fOut, s, нс
все
Слайд 94
Задания
«3»: Добавить к списку нумерацию:
1) Федоров
Иван 78
2) Анисимов Никита 90
«4»: Выполнить задачу на «3»
и сократить имя до первой буквы:
1) Федоров И. 78
2) Анисимов Н. 90
«5»: Выполнить задачу на «4», но отсортировать список по алфавиту.
1) Анисимов Н. 90
2) Федоров И. 78
«6»: Выполнить задачу на «4», но отсортировать список по убыванию отметки (балла).