Скачать презентацию 1 Программирование на языке Си 62 Массивы Скачать презентацию 1 Программирование на языке Си 62 Массивы

10-8Cb_Си-II.ppt

  • Количество слайдов: 142

1 Программирование на языке Си § 62. Массивы § 63. Алгоритмы обработки массивов § 1 Программирование на языке Си § 62. Массивы § 63. Алгоритмы обработки массивов § 64. Сортировка § 65. Двоичный поиск § 66. Символьные строки § 67. Матрицы § 68. Работа с файлами К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

2 Программирование на языке Си § 62. Массивы К. Ю. Поляков, Е. А. Ерёмин, 2 Программирование на языке Си § 62. Массивы К. Ю. Поляков, Е. А. Ерёмин, 2013 http: //kpolyakov. spb. ru

3 Алгоритмизация и программирование, язык Си, 10 класс Что такое массив? ? Как ввести 3 Алгоритмизация и программирование, язык Си, 10 класс Что такое массив? ? Как ввести 10000 переменных? Массив – это группа переменных одного типа, расположенных в памяти рядом (в соседних ячейках) и имеющих общее имя. Каждая ячейка в массиве имеет уникальный номер (индекс). Надо: • выделять память • записывать данные в нужную ячейку • читать данные из ячейки К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

4 Алгоритмизация и программирование, язык Си, 10 класс Выделение памяти (объявление) ! Массив = 4 Алгоритмизация и программирование, язык Си, 10 класс Выделение памяти (объявление) ! Массив = таблица! число элементов int A[5]; double V[8]; bool L[10]; char S[80]; ! Элементы нумеруются с нуля! A[0], A[1], A[2], A[3], A[4] размер через константу const int N = 10; int A[N]; К. Ю. Поляков, Е. А. Ерёмин, 2014 ? Зачем? http: //kpolyakov. spb. ru

5 Алгоритмизация и программирование, язык Си, 10 класс Обращение к элементу массива A массив 5 Алгоритмизация и программирование, язык Си, 10 класс Обращение к элементу массива A массив 0 НОМЕР элемента массива (ИНДЕКС) 1 5 10 A[0] A[1] 2 2 15 15 3 4 20 25 ЗНАЧЕНИЕ A[2] A[3] элемента массива A[4] НОМЕР (ИНДЕКС) элемента массива: 2 A[2] ЗНАЧЕНИЕ элемента массива: 15 К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

6 Алгоритмизация и программирование, язык Си, 10 класс Как обработать все элементы массива? Объявление: 6 Алгоритмизация и программирование, язык Си, 10 класс Как обработать все элементы массива? Объявление: const int N = 5; int A[N]; Обработка: // обработать A[0] // обработать A[1] // обработать A[2] // обработать A[3] // обработать A[4] ? 1) если N велико (1000, 1000000)? 2) при изменении N программа не должна меняться! К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

7 Алгоритмизация и программирование, язык Си, 10 класс Как обработать все элементы массива? Обработка 7 Алгоритмизация и программирование, язык Си, 10 класс Как обработать все элементы массива? Обработка с переменной: i = 0; // обработать A[i] i ++; // обработать A[i] i ++; К. Ю. Поляков, Е. А. Ерёмин, 2014 Обработка в цикле: i = 0; while ( i < N ) { // обработать A[i] i ++; } Цикл с переменной: for( i = 0; i < N; i++ ) { // обработать A[i] } http: //kpolyakov. spb. ru

Алгоритмизация и программирование, язык Си, 10 класс 8 Заполнение массива main() { const int Алгоритмизация и программирование, язык Си, 10 класс 8 Заполнение массива main() { const int N = 10; int A[N]; int i; for ( i = 0; i < N; i++ ) A[i] = i*i; } ? Чему равен A[9]? К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

9 Алгоритмизация и программирование, язык Си, 10 класс Ввод с клавиатуры и вывод на 9 Алгоритмизация и программирование, язык Си, 10 класс Ввод с клавиатуры и вывод на экран Объявление: const int N = 10; int A[N]; Ввод с клавиатуры: for ( i = 0; i < N; i++ ) { printf ( "A[%d]=", i ); scanf ( "%d", &A[i] ); } A[1] = 5 A[2] = 12 A[3] = 34 A[4] = 56 A[5] = 13 Вывод на экран: printf( "Массив A: n" ); for ( i = 0; i < N; i++ ) printf ( "%d ", A[i] ); ? Зачем пробел? К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

10 Алгоритмизация и программирование, язык Си, 10 класс Заполнение случайными числами Задача. Заполнить массив 10 Алгоритмизация и программирование, язык Си, 10 класс Заполнение случайными числами Задача. Заполнить массив (псевдо)случайными целыми числами в диапазоне от 20 до 100. int irand ( int a, int b ) { return a + rand()% (b - a + 1); } for ( i = 0; i < N; i++ ) { A[i] = irand ( 20, 100 ); printf ( "%d ", A[i] ); } К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

11 Алгоритмизация и программирование, язык Си, 10 класс Перебор элементов Общая схема: for ( 11 Алгоритмизация и программирование, язык Си, 10 класс Перебор элементов Общая схема: for ( i = 0; i < N; i++ ) { . . . // сделать что-то с A[i] } Подсчёт нужных элементов: Задача. В массиве записаны данные о росте баскетболистов. Сколько из них имеет рост больше 180 см, но меньше 190 см? count = 0; for ( i = 0; i < N; i++ ) if ( 180 < A[i] && A[i] < 190 ) count ++; К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

12 Алгоритмизация и программирование, язык Си, 10 класс Перебор элементов Среднее арифметическое: int count, 12 Алгоритмизация и программирование, язык Си, 10 класс Перебор элементов Среднее арифметическое: int count, sum; count = 0; sum = 0; for ( i = 0; i < N; i++ ) if ( 180 < A[i] && A[i] < 190 ) { count ++; sum += A[i]; } printf( "%f", (float)sum / count ); ? Зачем float? К. Ю. Поляков, Е. А. Ерёмин, 2014 среднее арифметическое http: //kpolyakov. spb. ru

13 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : Заполните массив случайными 13 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : Заполните массив случайными числами в интервале [0, 100] и найдите среднее арифметическое его значений. Пример: Массив: 1 2 3 4 5 Среднее арифметическое 3. 000 «B» : Заполните массив случайными числами в интервале [0, 100] и подсчитайте отдельно среднее значение всех элементов, которые <50, и среднее значение всех элементов, которые ≥ 50. Пример: Массив: 3 2 52 4 60 Ср. арифм. элементов [0, 50): 3. 000 Ср. арифм. элементов [50, 100]: 56. 000 К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

14 Алгоритмизация и программирование, язык Си, 10 класс Задачи «C» : Заполните массив из 14 Алгоритмизация и программирование, язык Си, 10 класс Задачи «C» : Заполните массив из N элементов случайными числами в интервале [1, N] так, чтобы в массив обязательно вошли все числа от 1 до N (постройте случайную перестановку). Пример: Массив: 3 2 1 4 5 К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

15 Программирование на языке Си § 63. Алгоритмы обработки массивов К. Ю. Поляков, Е. 15 Программирование на языке Си § 63. Алгоритмы обработки массивов К. Ю. Поляков, Е. А. Ерёмин, 2013 http: //kpolyakov. spb. ru

16 Алгоритмизация и программирование, язык Си, 10 класс Поиск в массиве Найти элемент, равный 16 Алгоритмизация и программирование, язык Си, 10 класс Поиск в массиве Найти элемент, равный X: i = 0; while ( A[i] != X ) Что плохо? i ++; printf ( "A[%d]=%d", i, X ); ? i = 0; i < N while ( i < N && A[i] != X ) i ++; Что если такого нет? if ( i < N ) printf ( "A[%d]=%d", i, X ); else printf ( "Не нашли!" ); ? К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

Алгоритмизация и программирование, язык Си, 10 класс 17 Поиск в массиве Вариант с досрочным Алгоритмизация и программирование, язык Си, 10 класс 17 Поиск в массиве Вариант с досрочным выходом: n. X = -1; for ( i = 0; i < N; i++ ) if ( A[i] == X ) { n. X = i; досрочный break; выход из } цикла if ( n. X >= 0 ) printf ( "A[%d]=%d", n. X, X ); else printf ( "Не нашли!" ); К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

Алгоритмизация и программирование, язык Си, 10 класс 18 Задачи «A» : Заполните массив случайными Алгоритмизация и программирование, язык Си, 10 класс 18 Задачи «A» : Заполните массив случайными числами в интервале [0, 5]. Введите число X и найдите все значения, равные X. Пример: Массив: 1 2 3 1 2 Что ищем: 2 Нашли: A[2]=2, A[5]=2 Пример: Массив: 1 2 3 1 2 Что ищем: 6 Ничего не нашли. К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

Алгоритмизация и программирование, язык Си, 10 класс 19 Задачи «B» : Заполните массив случайными Алгоритмизация и программирование, язык Си, 10 класс 19 Задачи «B» : Заполните массив случайными числами в интервале [0, 5]. Определить, есть ли в нем элементы с одинаковыми значениями, стоящие рядом. Пример: Массив: 1 2 3 3 2 1 Есть: 3 Пример: Массив: 1 2 3 4 2 1 Нет К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

20 Алгоритмизация и программирование, язык Си, 10 класс Задачи «C» : Заполните массив случайными 20 Алгоритмизация и программирование, язык Си, 10 класс Задачи «C» : Заполните массив случайными числами. Определить, есть ли в нем элементы с одинаковыми значениями, не обязательно стоящие рядом. Пример: Массив: 3 2 1 3 2 5 Есть: 3, 2 Пример: Массив: 3 2 1 4 0 5 Нет К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

21 Алгоритмизация и программирование, язык Си, 10 класс Максимальный элемент M = A[0]; for 21 Алгоритмизация и программирование, язык Си, 10 класс Максимальный элемент M = A[0]; for ( i = 1; i < N; i++ ) if ( A[i]> M ) M = A[i]; printf ( "%d", M ); ? Как найти его номер? M = A[0]; n. Max = 0; for ( i = 1; i < N; i++ ) if ( A[i] > M ) { Что можно улучшить? M = A[i]; n. Max = i; } printf ( "A[%d]=%d", n. Max, M ); ? К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

22 Алгоритмизация и программирование, язык Си, 10 класс Максимальный элемент и его номер ! 22 Алгоритмизация и программирование, язык Си, 10 класс Максимальный элемент и его номер ! По номеру элемента можно найти значение! n. Max = 0; for ( i = 1; i < N; i++ ) A[n. Max] if ( A[i] > A[n. Max] ) n. Max = i; A[n. Max] printf ( "A[%d]=%d", n. Max, A[n. Max] ); К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

23 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : Заполнить массив случайными 23 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : Заполнить массив случайными числами и найти минимальный и максимальный элементы массива и их номера. Пример: Массив: 1 2 3 4 5 Минимальный элемент: A[1]=1 Максимальный элемент: A[5]=5 «B» : Заполнить массив случайными числами и найти два максимальных элемента массива и их номера. Пример: Массив: 5 5 3 4 1 Максимальный элемент: A[1]=5 Второй максимум: A[2]=5 К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

24 Алгоритмизация и программирование, язык Си, 10 класс Задачи «C» : Введите массив с 24 Алгоритмизация и программирование, язык Си, 10 класс Задачи «C» : Введите массив с клавиатуры и найдите (за один проход) количество элементов, имеющих максимальное значение. Пример: Массив: 3 4 5 5 3 4 5 Максимальное значение 5 Количество элементов 3 К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

25 Алгоритмизация и программирование, язык Си, 10 класс Реверс массива 0 1 2 3 25 Алгоритмизация и программирование, язык Си, 10 класс Реверс массива 0 1 2 3 N-4 N-3 N-2 N-1 7 12 5 8 18 34 40 23 0 1 2 3 N-4 N-3 N-2 N-1 23 40 34 18 8 5 12 7 «Простое» решение: остановиться на середине! for( i = 0; i < N ; i++ ) N/2 { // поменять местами A[i] и A[N+1 -i] } ? Что плохо? К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

Алгоритмизация и программирование, язык Си, 10 класс 26 Реверс массива for ( i = Алгоритмизация и программирование, язык Си, 10 класс 26 Реверс массива for ( i = 0; i < (N/2); i++ ) { c = A[i]; A[i] = A[N-1 -i]; A[N-1 -i] = c; } ? *Как обойтись без переменной c? К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

27 Алгоритмизация и программирование, язык Си, 10 класс Циклический сдвиг элементов 0 1 2 27 Алгоритмизация и программирование, язык Си, 10 класс Циклический сдвиг элементов 0 1 2 3 N-4 N-3 N-2 N-1 7 12 5 8 18 34 40 23 0 1 2 3 N-4 N-3 N-2 N-1 12 5 8 15 34 40 23 7 «Простое» решение: ? Почему не до N-1? c = A[0]; for ( i = 0; i < N-1; i++ ) Что плохо? A[i] = A[i+1]; A[N-1] = c; ? К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

28 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : Заполнить массив случайными 28 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : Заполнить массив случайными числами и выполнить циклический сдвиг элементов массива вправо на 1 элемент. Пример: Массив: 1 2 3 4 5 6 Результат: 6 1 2 3 4 5 «B» : Массив имеет четное число элементов. Заполнить массив случайными числами и выполнить реверс отдельно в первой половине и второй половине. Пример: Массив: 1 2 3 4 5 6 Результат: 3 2 1 6 5 4 К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

29 Алгоритмизация и программирование, язык Си, 10 класс Задачи «C» : Заполнить массив случайными 29 Алгоритмизация и программирование, язык Си, 10 класс Задачи «C» : Заполнить массив случайными числами в интервале [100, 100] и переставить элементы так, чтобы все положительные элементы стояли в начала массива, а все отрицательные и нули – в конце. Вычислите количество положительных элементов. Пример: Массив: 20 -90 15 -34 10 0 Результат: 20 15 10 -90 -34 0 Количество положительных элементов: 3 К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

30 Алгоритмизация и программирование, язык Си, 10 класс Отбор нужных элементов Задача. Отобрать элементы 30 Алгоритмизация и программирование, язык Си, 10 класс Отбор нужных элементов Задача. Отобрать элементы массива A, удовлетворяющие некоторому условию, в массив B. «Простое» решение: сделать для i от 0 до N-1 если условие выполняется для A[i] то B[i]: = A[i] Что плохо? ? 0 1 2 3 4 5 A 12 3 34 11 23 46 B 12 ? 34 ? ? 46 К. Ю. Поляков, Е. А. Ерёмин, 2014 выбрать чётные элементы http: //kpolyakov. spb. ru

31 Алгоритмизация и программирование, язык Си, 10 класс Отбор нужных элементов 0 1 2 31 Алгоритмизация и программирование, язык Си, 10 класс Отбор нужных элементов 0 1 2 3 4 5 A 12 3 34 11 23 46 B 12 34 46 ? ? ? выбрать чётные элементы ? Если A и B – один и count = 0; тот же массив? for ( i = 0; i < N; i++ ) if ( A[i] % 2 == 0 ) { Как вывести на экран? B[count] = A[i]; count ++; } for ( i = 0; i < count ; i++ ) count printf ( "%d ", B[i] ); ? К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

32 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : Заполнить массив случайными 32 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : Заполнить массив случайными числами в интервале [-10, 10] и отобрать в другой массив все чётные отрицательные числа. Пример: Массив А: -5 6 7 -4 -6 8 -8 Массив B: -4 -6 -8 «B» : Заполнить массив случайными числами в интервале [0, 100] и отобрать в другой массив все простые числа. Используйте логическую функцию, которая определяет, является ли переданное ей число простым. Пример: Массив А: 12 13 85 96 47 Массив B: 13 47 К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

33 Алгоритмизация и программирование, язык Си, 10 класс Задачи «C» : Заполнить массив случайными 33 Алгоритмизация и программирование, язык Си, 10 класс Задачи «C» : Заполнить массив случайными числами и отобрать в другой массив все числа Фибоначчи. Используйте логическую функцию, которая определяет, является ли переданное ей числом Фибоначчи. Пример: Массив А: 12 13 85 34 47 Массив B: 13 34 К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

34 Программирование на языке Си § 64. Сортировка К. Ю. Поляков, Е. А. Ерёмин, 34 Программирование на языке Си § 64. Сортировка К. Ю. Поляков, Е. А. Ерёмин, 2013 http: //kpolyakov. spb. ru

35 Алгоритмизация и программирование, язык Си, 10 класс Что такое сортировка? Сортировка – это 35 Алгоритмизация и программирование, язык Си, 10 класс Что такое сортировка? Сортировка – это расстановка элементов массива в заданном порядке. …по возрастанию, убыванию, последней цифре, сумме делителей, по алфавиту, … Алгоритмы: • простые и понятные, но неэффективные для больших массивов время работы ▫ метод пузырька ▫ метод выбора • сложные, но эффективные ▫ «быстрая сортировка» (Quick. Sort) N ▫ сортировка «кучей» (Heap. Sort) ▫ сортировка слиянием (Merge. Sort) ▫ пирамидальная сортировка К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

36 Алгоритмизация и программирование, язык Си, 10 класс Метод пузырька (сортировка обменами) Идея: пузырек 36 Алгоритмизация и программирование, язык Си, 10 класс Метод пузырька (сортировка обменами) Идея: пузырек воздуха в стакане воды поднимается со дна вверх. Для массивов – самый маленький ( «легкий» элемент перемещается вверх ( «всплывает» ). 1 -й проход: 4 4 1 5 5 5 1 4 2 2 1 5 5 1 1 2 2 2 3 3 3 К. Ю. Поляков, Е. А. Ерёмин, 2014 • сравниваем два соседних элемента; если они стоят «неправильно» , меняем их местами • за 1 проход по массиву один элемент (самый маленький) становится на свое место http: //kpolyakov. spb. ru

37 Алгоритмизация и программирование, язык Си, 10 класс Метод пузырька 2 -й проход: 3 37 Алгоритмизация и программирование, язык Си, 10 класс Метод пузырька 2 -й проход: 3 -й проход: 4 -й проход: 1 1 1 1 1 4 4 4 2 2 2 5 5 2 4 4 4 3 3 3 2 2 5 5 5 3 4 4 4 3 3 3 5 5 ! Для сортировки массива из N элементов нужен N-1 проход (достаточно поставить на свои места N-1 элементов). К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

38 Алгоритмизация и программирование, язык Си, 10 класс Метод пузырька 1 -й проход: сделать 38 Алгоритмизация и программирование, язык Си, 10 класс Метод пузырька 1 -й проход: сделать для j от N-2 до 0 шаг -1 если A[j+1]< A[j] то // поменять местами A[j] и A[j+1] единственное отличие! 2 -й проход: 1 сделать для j от N-2 до 1 шаг -1 если A[j+1]< A[j] то // поменять местами A[j] и A[j+1] К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

39 Алгоритмизация и программирование, язык Си, 10 класс Метод пузырька for ( i = 39 Алгоритмизация и программирование, язык Си, 10 класс Метод пузырька for ( i = 0; i < N-1; i++ ) for ( j = N-2; j >= i ; j-- ) i if ( A[j] > A[j+1] ) { // поменять местами A[j] и A[j+1] } ? Как написать метод «камня» ? ? Как сделать рекурсивный вариант? К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

40 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : Напишите программу, в 40 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : Напишите программу, в которой сортировка выполняется «методом камня» – самый «тяжёлый» элемент опускается в конец массива. «B» : Напишите вариант метода пузырька, который заканчивает работу, если на очередном шаге внешнего цикла не было перестановок. «С» : Напишите программу, которая сортирует массив по убыванию суммы цифр числа. Используйте функцию, которая определяет сумму цифр числа. К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

41 Алгоритмизация и программирование, язык Си, 10 класс Метод выбора (минимального элемента) Идея: найти 41 Алгоритмизация и программирование, язык Си, 10 класс Метод выбора (минимального элемента) Идея: найти минимальный элемент и поставить его на первое место. сделать для i от 0 до N-2 // найти номер n. Min минимального // элемента из A[i]. . A[N] если i != n. Min то // поменять местами A[i] и A[n. Min] К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

42 Алгоритмизация и программирование, язык Си, 10 класс Метод выбора (минимального элемента) for ( 42 Алгоритмизация и программирование, язык Си, 10 класс Метод выбора (минимального элемента) for ( i = 0; i < N-1; i++ ) { n. Min = i; for ( j = i+1; j < N; j++ ) if ( A[j] < A[n. Min] ) n. Min = j; if ( i != n. Min ) { // поменять местами A[i] и A[n. Min] } } ? Как поменять местами два значения? К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

43 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : Массив содержит четное 43 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : Массив содержит четное количество элементов. Напишите программу, которая сортирует первую половину массива по возрастанию, а вторую – по убыванию. Каждый элемент должен остаться в «своей» половине. Пример: Массив: 5 3 4 2 1 6 3 2 После сортировки: 2 3 4 5 6 3 2 1 К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

44 Алгоритмизация и программирование, язык Си, 10 класс Задачи «B» : Напишите программу, которая 44 Алгоритмизация и программирование, язык Си, 10 класс Задачи «B» : Напишите программу, которая сортирует массив и находит количество различных чисел в нем. Пример: Массив: 5 3 4 2 1 6 3 2 4 После сортировки: 1 2 2 3 3 4 4 5 6 Различных чисел: 5 «C» : Напишите программу, которая сравнивает число перестановок элементов при использовании сортировки «пузырьком» и методом выбора. Проверьте ее на разных массивах, содержащих 1000 случайных элементов, вычислите среднее число перестановок для каждого метода. К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

45 Алгоритмизация и программирование, язык Си, 10 класс Быстрая сортировка (Quick. Sort) Идея: выгоднее 45 Алгоритмизация и программирование, язык Си, 10 класс Быстрая сортировка (Quick. Sort) Идея: выгоднее переставлять элементы, который находятся дальше друг от друга. 6 4 3 2 1 1 5 4 3 2 6 1 2 4 3 5 6 1 Ч. Э. Хоар 5 2 3 4 5 6 ! Для массива из N элементов нужно всего N/2 обменов! К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

46 Алгоритмизация и программирование, язык Си, 10 класс Быстрая сортировка Шаг 1: выбрать некоторый 46 Алгоритмизация и программирование, язык Си, 10 класс Быстрая сортировка Шаг 1: выбрать некоторый элемент массива X Шаг 2: переставить элементы так: A[i] <= X A[i] >= X при сортировке элементы не покидают « свою область» ! Шаг 3: так же отсортировать две получившиеся области Разделяй и властвуй (англ. divide and conquer) 78 6 82 67 ? 55 44 34 Как лучше выбрать X? Медиана – такое значение X, что слева и справа от него в отсортированном массиве стоит одинаковое число элементов (для этого надо отсортировать массив…). К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

47 Алгоритмизация и программирование, язык Си, 10 класс Быстрая сортировка Разделение: 1) выбрать средний 47 Алгоритмизация и программирование, язык Си, 10 класс Быстрая сортировка Разделение: 1) выбрать средний элемент массива (X=67) 78 6 82 67 55 44 34 2) установить L = 1, R = N 3) увеличивая L, найти первый элемент A[L], который >= X (должен стоять справа) 4) уменьшая R, найти первый элемент A[R], который <= X (должен стоять слева) 5) если L<=R то поменять местами A[L] и A[R] и перейти к п. 3 иначе стоп. К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

48 Алгоритмизация и программирование, язык Си, 10 класс Быстрая сортировка 78 L 6 82 48 Алгоритмизация и программирование, язык Си, 10 класс Быстрая сортировка 78 L 6 82 67 55 44 34 R 34 6 82 L 67 55 44 R 78 34 6 44 67 L 55 R 82 78 34 6 44 55 R 67 L 82 78 ! L > R : разделение закончено! К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

Алгоритмизация и программирование, язык Си, 10 класс 49 Быстрая сортировка Основная программа: глобальные const Алгоритмизация и программирование, язык Си, 10 класс 49 Быстрая сортировка Основная программа: глобальные const int N = 7; данные int A[N]; . . . main() { // заполнить массив q. Sort( 0, N-1 ); // сортировка // вывести результат } процедура сортировки К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

50 Алгоритмизация и программирование, язык Си, 10 класс Быстрая сортировка void q. Sort( int 50 Алгоритмизация и программирование, язык Си, 10 класс Быстрая сортировка void q. Sort( int n. Start, int n. End ) { int L, R, c, X; if ( n. Start >= n. End ) return; // готово L = n. Start; R = n. End; X = A[(L+R)/2]; // или X = A[irand(L, R)]; while ( L <= R ) { // разделение while ( A[L] < X ) L ++; while ( A[R] > X ) R --; if ( L <= R ) { c = A[L]; A[L] = A[R]; A[R] = c; L ++; R --; Что плохо? } } q. Sort ( n. Start, R ); // рекурсивные вызовы q. Sort ( L, n. End ); } ? К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

51 Алгоритмизация и программирование, язык Си, 10 класс Быстрая сортировка Передача массива через параметр: 51 Алгоритмизация и программирование, язык Си, 10 класс Быстрая сортировка Передача массива через параметр: int A[], void q. Sort( int A[], int n. Start, int n. End ) { . . . A, q. Sort ( A, n. Start, R ); A, q. Sort ( A, L, n. End ); } main() { // заполнить массив A, q. Sort( A, 0, N-1 ); // сортировка // вывести результат } К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

52 Алгоритмизация и программирование, язык Си, 10 класс Быстрая сортировка Сортировка массива случайных значений: 52 Алгоритмизация и программирование, язык Си, 10 класс Быстрая сортировка Сортировка массива случайных значений: N метод пузырька метод выбора быстрая сортировка 1000 0, 24 с 0, 12 с 0, 004 с 5000 5, 3 с 2, 9 с 0, 024 с 15000 45 с 34 с 0, 068 с К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

53 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : Массив содержит четное 53 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : Массив содержит четное количество элементов. Напишите программу, которая сортирует по возрастанию отдельно элементы первой и второй половин массива. Каждый элемент должен остаться в «своей» половине. Используйте алгоритм быстрой сортировки. Пример: Массив: 5 3 4 2 1 6 3 2 После сортировки: 2 3 4 5 6 3 2 1 К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

54 Алгоритмизация и программирование, язык Си, 10 класс Задачи «B» : Напишите программу, которая 54 Алгоритмизация и программирование, язык Си, 10 класс Задачи «B» : Напишите программу, которая сортирует массив и находит количество различных чисел в нем. Используйте алгоритм быстрой сортировки. Пример: Массив: 5 3 4 2 1 6 3 2 4 После сортировки: 1 2 2 3 3 4 4 5 6 Различных чисел: 5 К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

55 Алгоритмизация и программирование, язык Си, 10 класс Задачи «C» : Напишите программу, которая 55 Алгоритмизация и программирование, язык Си, 10 класс Задачи «C» : Напишите программу, которая сравнивает число перестановок элементов при использовании сортировки «пузырьком» , методом выбора и алгоритма быстрой сортировки. Проверьте ее на разных массивах, содержащих 1000 случайных элементов, вычислите среднее число перестановок для каждого метода. «D» : Попробуйте построить массив из 10 элементов, на котором алгоритм быстрой сортировки показывает худшую эффективность (наибольшее число перестановок). Сравните это количество перестановок с эффективностью метода пузырька (для того же массива). К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

56 Программирование на языке Си § 65. Двоичный поиск К. Ю. Поляков, Е. А. 56 Программирование на языке Си § 65. Двоичный поиск К. Ю. Поляков, Е. А. Ерёмин, 2013 http: //kpolyakov. spb. ru

57 Алгоритмизация и программирование, язык Си, 10 класс Двоичный поиск 1 1 1 2 57 Алгоритмизация и программирование, язык Си, 10 класс Двоичный поиск 1 1 1 2 2 2 3 X=7 3 3 4 4 5 5 4 5 X>4 X>6 6 6 7 1. Выбрать средний элемент A[c] и сравнить с X. 2. Если X = A[c], то нашли (стоп). 3. Если X < A[c], искать дальше в первой половине. 4. Если X > A[c], искать дальше во второй половине. К. Ю. Поляков, Е. А. Ерёмин, 2014 7 7 8 8 8 9 X<8 6 9 9 10 10 10 11 11 11 12 12 12 13 13 13 14 14 14 15 15 15 16 16 16 http: //kpolyakov. spb. ru

58 Алгоритмизация и программирование, язык Си, 10 класс Двоичный поиск X = 44 A[0] 58 Алгоритмизация и программирование, язык Си, 10 класс Двоичный поиск X = 44 A[0] 6 L 34 6 34 L 6 34 44 55 с 55 67 67 78 78 82 с 6 44 A[N-1] A[N] 82 R R 44 55 с R 44 L 55 67 78 82 R ! L = R-1 : поиск завершен! К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

59 Алгоритмизация и программирование, язык Си, 10 класс Двоичный поиск int X, L, R, 59 Алгоритмизация и программирование, язык Си, 10 класс Двоичный поиск int X, L, R, c; L = 0; R = N; // начальный отрезок while ( L < R-1 ) { c = (L+R) / 2; // нашли середину if ( X < A[c] ) // сжатие отрезка R = c; else L = c; } if ( A[L] == X ) printf ( "A[%d]=%d", L, X ); else printf ( "Не нашли!" ); К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

60 Алгоритмизация и программирование, язык Си, 10 класс Двоичный поиск Число сравнений: N линейный 60 Алгоритмизация и программирование, язык Си, 10 класс Двоичный поиск Число сравнений: N линейный поиск двоичный поиск 2 2 2 16 16 5 1024 11 1048576 21 § скорость выше, чем при линейном поиске § нужна предварительная сортировка ? Когда нужно применять? К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

61 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : Заполнить массив случайными 61 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : Заполнить массив случайными числами и отсортировать его. Ввести число X. Используя двоичный поиск, определить, есть ли в массиве число, равное X. Подсчитать количество сравнений. Пример: Массив: 1 4 7 3 9 2 4 5 2 После сортировки: 1 2 2 3 4 4 5 7 9 Введите число X: 2 Число 2 найдено. Количество сравнений: 2 К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

62 Алгоритмизация и программирование, язык Си, 10 класс Задачи «B» : Заполнить массив случайными 62 Алгоритмизация и программирование, язык Си, 10 класс Задачи «B» : Заполнить массив случайными числами и отсортировать его. Ввести число X. Используя двоичный поиск, определить, сколько чисел, равных X, находится в массиве. Пример: Массив: 1 4 7 3 9 2 4 5 2 После сортировки: 1 2 2 3 4 4 5 7 9 Введите число X: 4 Число 4 встречается 2 раз(а). Пример: Массив: 1 4 7 3 9 2 4 5 2 После сортировки: 1 2 2 3 4 4 5 7 9 Введите число X: 14 Число 14 не встречается. К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

63 Алгоритмизация и программирование, язык Си, 10 класс Задачи «C» : Заполнить массив случайными 63 Алгоритмизация и программирование, язык Си, 10 класс Задачи «C» : Заполнить массив случайными числами и ввести число и отсортировать его. Ввести число X. Используя двоичный поиск, определить, есть ли в массиве число, равное X. Если такого числа нет, вывести число, ближайшее к X. Пример: Массив: 1 4 7 3 9 2 4 5 2 После сортировки: 1 2 2 3 4 4 5 12 19 Введите число X: 12 Число 12 найдено. Пример: Массив: 1 4 7 3 9 2 4 5 2 После сортировки: 1 2 2 3 4 4 5 12 19 Введите число X: 11 Число 11 не найдено. Ближайшее число 12. К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

64 Программирование на языке Си § 66. Символьные строки К. Ю. Поляков, Е. А. 64 Программирование на языке Си § 66. Символьные строки К. Ю. Поляков, Е. А. Ерёмин, 2013 http: //kpolyakov. spb. ru

65 Алгоритмизация и программирование, язык Си, 10 класс Зачем нужны символьные строки? char s[10]; 65 Алгоритмизация и программирование, язык Си, 10 класс Зачем нужны символьные строки? char s[10]; // массив символов § элементы массива – отдельные объекты § сложно работать со строками переменной длины Хочется: • строка – единый объект • длина строки может меняться во время работы программы К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

66 Алгоритмизация и программирование, язык Си, 10 класс Как хранится символьная строка? char s[10]; 66 Алгоритмизация и программирование, язык Си, 10 класс Как хранится символьная строка? char s[10]; s[2] s[3] признак окончания строки: символ с кодом 0 9 0 П р и в е т ! ? ? рабочая часть s[0] s[1] ! Символ '' имеет код 0 символ '0' имеет код 48 Символьная строка – это последовательность символов, которая заканчивается символом ''. К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

67 Алгоритмизация и программирование, язык Си, 10 класс Символьные строки Начальное значение: char s[10] 67 Алгоритмизация и программирование, язык Си, 10 класс Символьные строки Начальное значение: char s[10] = "Привет!"; char s[] = "Привет!"; Вывод на экран: размер вычисляется автоматически printf ( "%s", s ); puts ( s ); ? А если массив? К. Ю. Поляков, Е. А. Ерёмин, 2014 с переходом на новую строку http: //kpolyakov. spb. ru

68 Алгоритмизация и программирование, язык Си, 10 класс Символьные строки Ввод с клавиатуры: только 68 Алгоритмизация и программирование, язык Си, 10 класс Символьные строки Ввод с клавиатуры: только до пробела! scanf ( "%s", s ); gets ( s ); до перевода строки (Enter) Отдельный символ: s[4] = 'a'; Длина строки: #include int n; . . . n = strlen(s); К. Ю. Поляков, Е. А. Ерёмин, 2014 библиотека для работы со строками string length – длина строки http: //kpolyakov. spb. ru

69 Алгоритмизация и программирование, язык Си, 10 класс Символьные строки Задача: заменить в строке 69 Алгоритмизация и программирование, язык Си, 10 класс Символьные строки Задача: заменить в строке все буквы 'а' на буквы 'б'. #include #include main() { char s[80]; int i; printf ( "Введите строку" ); gets ( s ); for ( i = 0; i < strlen(s); i++ ) if ( s[i] == 'а' ) s[i] = 'б'; puts ( s ); } К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

70 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : Ввести с клавиатуры 70 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : Ввести с клавиатуры символьную строку и заменить в ней все буквы «а» на «б» и все буквы «б» на «а» (заглавные на заглавные, строчные на строчные). Пример: Введите строку: аабб. ААББсс. СС Результат: ббаа. ББААсс. СС К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

71 Алгоритмизация и программирование, язык Си, 10 класс Задачи «B» : Ввести с клавиатуры 71 Алгоритмизация и программирование, язык Си, 10 класс Задачи «B» : Ввести с клавиатуры символьную строку и определить, сколько в ней слов. Словом считается последовательности непробельных символов, отделенная с двух сторон пробелами (или стоящая с краю строки). Слова могут быть разделены несколькими пробелами, в начале и в конце строки тоже могут быть пробелы. Пример: Введите строку: Вася пошел гулять Найдено слов: 3 К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

72 Алгоритмизация и программирование, язык Си, 10 класс Задачи «C» : Ввести с клавиатуры 72 Алгоритмизация и программирование, язык Си, 10 класс Задачи «C» : Ввести с клавиатуры символьную строку и найдите самое длинное слово и его длину. Словом считается последовательности непробельных символов, отделенная с двух сторон пробелами (или стоящая с краю строки). Слова могут быть разделены несколькими пробелами, в начале и в конце строки тоже могут быть пробелы. Пример: Введите строку: Вася пошел гулять Самое длинное слово: гулять, длина 6 К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

73 Алгоритмизация и программирование, язык Си, 10 класс Операции со строками Объединение (конкатенация): char 73 Алгоритмизация и программирование, язык Си, 10 класс Операции со строками Объединение (конкатенация): char s[80]= "Привет", s 1[]="Вася!"; strcat( s, ", "); // s = "Привет, " strcat( s, s 1 ); // s = "Привет, Вася!" string concatenation – «сцепление» строк ! Вторая строка прицепляется в конец первой! К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

74 Алгоритмизация и программирование, язык Си, 10 класс Операции со строками Копирование строки: char 74 Алгоритмизация и программирование, язык Си, 10 класс Операции со строками Копирование строки: char s[80], s 1[]="Привет"; strcpy( s, "Вася!"); // s 1 = "Вася!" strcpy( s, s 1 ); // s = s 1 = "Вася!" куда откуда string copy – копировать строку ! Вторая строка копируется на место первой! ? Какие могут быть проблемы? К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

75 Алгоритмизация и программирование, язык Си, 10 класс Операции со строками Копирование строки со 75 Алгоритмизация и программирование, язык Си, 10 класс Операции со строками Копирование строки со смещением: адрес символа s[5]: &s[5] или s+5 s совпадает с &s[0] ? Хватит ли места? char s[80] = "Прошёл поезд. "; strcpy ( &s[7] , "пароход. " ); Прошел пароход. char s[80] = "Прошёл поезд. ", s 1[] = "Привет, Вася. "; strcpy ( s+7, s 1+8 ); ? Что получим? К. Ю. Поляков, Е. А. Ерёмин, 2014 Прошел Вася. http: //kpolyakov. spb. ru

76 Алгоритмизация и программирование, язык Си, 10 класс Операции со строками ? Как удалить 76 Алгоритмизация и программирование, язык Си, 10 класс Операции со строками ? Как удалить часть строки? Удаление: char s[] = "0123456789"; strcpy ( s+2, s+6 ); куда 0 2 откуда 6 9 0 1 2 3 8 9 7 8 9 6 7 4 5 6 ? Можно ли так «раздвинуть» строку? К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

77 Алгоритмизация и программирование, язык Си, 10 класс Операции со строками Копирование n символов: 77 Алгоритмизация и программирование, язык Си, 10 класс Операции со строками Копирование n символов: char s[] = "Мухтар, ко мне!", Цезарь s 1[] = "Цезарь живет у нас дома. "; strncpy ( s, s 1, 6 ); сколько символов ! Не добавляет символ конца строки! char s[] = "Вчера Мурзик вернулся. ", Васька s 1[]= "Кота зовут Васька. "; strncpy ( s+6, s 1+11, 6 ); К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

78 Алгоритмизация и программирование, язык Си, 10 класс Операции со строками Выделение подстроки: Задача: 78 Алгоритмизация и программирование, язык Си, 10 класс Операции со строками Выделение подстроки: Задача: выделить 4 символа строки s, начиная с s[2], в новую строку s 1. char s[] = "0123456789", s 1[20]; strncpy ( s 1, s+2, 4 ); s 1[4] = ''; с какого символа символ конца строки добавляем вручную» К. Ю. Поляков, Е. А. Ерёмин, 2014 сколько символов s 1 = "2345" http: //kpolyakov. spb. ru

79 Алгоритмизация и программирование, язык Си, 10 класс Операции со строками Вставка фрагмента в 79 Алгоритмизация и программирование, язык Си, 10 класс Операции со строками Вставка фрагмента в середину строки: "Иван Васильевич меняет профессию. " ! Сдвиг вправо в строке не работает! s+4 char s[80]="Иван меняет профессию. ", s 1[30]; // буфер strcpy ( s 1, s+4 ); strcpy ( s+4, " Васильевич" ); strcat ( s, s 1 ); s: "Иван меняет профессию. " Васильевич"меняет профессию. " s 1: " меняет профессию. " К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

80 Алгоритмизация и программирование, язык Си, 10 класс Поиск в строках ! Функции поиска 80 Алгоритмизация и программирование, язык Си, 10 класс Поиск в строках ! Функции поиска возвращают адрес памяти! Указатель – это переменная. в которую можно записать адрес памяти. char *p; // указатель на символ // может хранить адрес // любого символа char s[] = "Здесь был Вася. "; char *p; содержимое ячейки p = &s[2]; printf( "%c", *p ); // е *p = 'э'; // s[2] = 'э' К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

81 Алгоритмизация и программирование, язык Си, 10 класс Поиск символа в строке char s[] 81 Алгоритмизация и программирование, язык Си, 10 класс Поиск символа в строке char s[] = "Здесь был Вася. "; где что char *p; p = strchr ( s, 'с' ); искать в строке (string) символ (character) нулевой указатель ! strrchr – поиск с конца строки! if ( p != NULL ) printf("Номер символа 'c': %dn", p-s ); 3 else printf("Символ не найден. n" ); К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

82 Алгоритмизация и программирование, язык Си, 10 класс Поиск подстроки char s[] = 82 Алгоритмизация и программирование, язык Си, 10 класс Поиск подстроки char s[] = "Здесь был Вася. "; где что char *p; p = strstr ( s, "Вася" ); искать в строке (string) строку (string) нулевой указатель if ( p != NULL ) printf("Слово начинаетя с s[%d]n", p-s ); 10 else printf("Слово не найдено. n" ); К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

83 Алгоритмизация и программирование, язык Си, 10 класс Пример обработки строк Задача: Ввести имя, 83 Алгоритмизация и программирование, язык Си, 10 класс Пример обработки строк Задача: Ввести имя, отчество и фамилию. Преобразовать их к формату «фамилия-инициалы» . Пример: Введите имя, отчество и фамилию: Василий Алибабаевич Хрюндиков Результат: Хрюндиков В. А. Алибабаевич Хрюндиков Алгоритм: • найти первый пробел и выделить имя Хрюндиков • удалить имя с пробелом из основной строки • найти первый пробел и выделить отчество • удалить отчество с пробелом из основной строки • «сцепить» фамилию, первые буквы имени и фамилии, точки, пробелы… Хрюндиков В. А. К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

84 Алгоритмизация и программирование, язык Си, 10 класс Пример обработки строк main() заготовки для 84 Алгоритмизация и программирование, язык Си, 10 класс Пример обработки строк main() заготовки для инициалов { char s[80], name[] = ". ", name 2[] = ". "; char *p; printf("Введите имя, отчество и фамилию: "); gets ( s ); name[0] = s[0]; // первая буква имени p = strchr ( s, ' ' ); // найти пробел strcpy ( s, p+1 ); // стереть имя name 2[0] = s[0]; // первая буква отчества p = strchr ( s, ' ' ); // найти пробел strcpy ( s, p+1 ); // осталась фамилия strcat ( s, " " ); // добавить пробел strcat ( s, name ); // прицепить имя strcat ( s, name 2 ); // прицепить отчество puts ( s ); } К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

85 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : Ввести с клавиатуры 85 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : Ввести с клавиатуры в одну строку фамилию, имя и отчество, разделив их пробелом. Вывести фамилию и инициалы. Пример: Введите фамилию, имя и отчество: Иванов Петр Семёнович П. С. Иванов К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

86 Алгоритмизация и программирование, язык Си, 10 класс Задачи «B» : Ввести адрес файла 86 Алгоритмизация и программирование, язык Си, 10 класс Задачи «B» : Ввести адрес файла и «разобрать» его на части, разделенные знаком '/'. Каждую часть вывести в отдельной строке. Пример: Введите адрес файла: C: /Фото/2013/Поход/vasya. jpg C: Фото 2013 Поход vasya. jpg К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

87 Алгоритмизация и программирование, язык Си, 10 класс Задачи «C» : Напишите программу, которая 87 Алгоритмизация и программирование, язык Си, 10 класс Задачи «C» : Напишите программу, которая заменяет во всей строке одну последовательность символов на другую. Пример: Введите строку: (X > 0) and (Y < X) and (Z > Y) and (Z <> 5) Что меняем: and Чем заменить: & Результат (X > 0) & (Y < X) & (Z > Y) & (Z <> 5) К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

88 Алгоритмизация и программирование, язык Си, 10 класс Преобразования «строка» – «число» Из строки 88 Алгоритмизация и программирование, язык Си, 10 класс Преобразования «строка» – «число» Из строки в число: #include char s[] = "123"; int N; N = atoi ( s ); // N = 123 « 12 x 3» 12 char s[] = "123. 456"; float X; X = atof ( s ); // X = 123. 456 К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

89 Алгоритмизация и программирование, язык Си, 10 класс Преобразования «строка» – «число» Из числа 89 Алгоритмизация и программирование, язык Си, 10 класс Преобразования «строка» – «число» Из числа в строку: char s[80]; int N = 123; float X = 123. 456; sprintf(s, "%d", N); // s = "123" sprintf(s, "%e", X); // s = "1. 234560 E+002" sprintf(s, "%10. 3 f", X); // s = " 123. 456" ! sprintf – вывод в строку, а не на экран! К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

90 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : Напишите программу, которая 90 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : Напишите программу, которая вычисляет сумму трех чисел, введенную в форме символьной строки. Все числа целые. Пример: Введите выражение: 12+3+45 Ответ: 60 «B» : Напишите программу, которая вычисляет выражение, состоящее из трех чисел и двух знаков (допускаются только знаки «+» или «–» ). Выражение вводится как символьная строка, все числа целые. Пример: Введите выражение: 12 -3+45 Ответ: 54 К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

91 Алгоритмизация и программирование, язык Си, 10 класс Задачи «C» : Напишите программу, которая 91 Алгоритмизация и программирование, язык Си, 10 класс Задачи «C» : Напишите программу, которая вычисляет выражение, состоящее из трех чисел и двух знаков (допускаются знаки «+» , «–» , «*» и «/» ). Выражение вводится как символьная строка, все числа целые. Операция «/» выполняется как целочисленное деление. Пример: Введите выражение: 12*3+45 Ответ: 81 К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

92 Алгоритмизация и программирование, язык Си, 10 класс Задачи «D» : Напишите программу, которая 92 Алгоритмизация и программирование, язык Си, 10 класс Задачи «D» : Напишите программу, которая вычисляет выражение, состоящее из трех чисел и двух знаков (допускаются знаки «+» , «–» , «*» и «/» ) и круглых скобок. Выражение вводится как символьная строка, все числа целые. Операция «/» выполняется как целочисленное деление (div). Пример: Введите выражение: 2*(3+45)+4 Ответ: 100 К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

93 Алгоритмизация и программирование, язык Си, 10 класс Строки в процедурах и функциях Задача: 93 Алгоритмизация и программирование, язык Си, 10 класс Строки в процедурах и функциях Задача: построить процедуру, которая заменяет в строке s все вхождения слова-образца w. Old на слово-замену w. New. пока // слово w. Old есть в строке s // удалить слово w. Old из строки // вставить на это место слово w. New ? Что плохо? w. Old: '12' w. New: 'A 12 B' К. Ю. Поляков, Е. А. Ерёмин, 2014 зацикливание http: //kpolyakov. spb. ru

94 Алгоритмизация и программирование, язык Си, 10 класс Замена всех экземпляров подстроки w. New 94 Алгоритмизация и программирование, язык Си, 10 класс Замена всех экземпляров подстроки w. New w. Old а) res s s б) res w. New в) res s г) res s К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

95 Алгоритмизация и программирование, язык Си, 10 класс Замена всех экземпляров подстроки main() { 95 Алгоритмизация и программирование, язык Си, 10 класс Замена всех экземпляров подстроки main() { char s[80] = "12. 12"; replace. All ( s, "12", "A 12 B" ); puts ( s ); } рабочая строка s "12. 12" "" К. Ю. Поляков, Е. А. Ерёмин, 2014 результат res "" "A 12 B" http: //kpolyakov. spb. ru

96 Алгоритмизация и программирование, язык Си, 10 класс Использование указателей w. New а) res 96 Алгоритмизация и программирование, язык Си, 10 класс Использование указателей w. New а) res p. Res p. S p. Res p w. Old s p. S s б) res p. Res w. New p. S s в) res p. Res г) res К. Ю. Поляков, Е. А. Ерёмин, 2014 p. S s http: //kpolyakov. spb. ru

97 Алгоритмизация и программирование, язык Си, 10 класс Замена всех экземпляров подстроки void replace. 97 Алгоритмизация и программирование, язык Си, 10 класс Замена всех экземпляров подстроки void replace. All(char s[], char w. Old[], char w. New[]) { длины строк int len. Old, len. New; указатели char *p, *p. S, *p. Res; char res[200]; // строка-результат len. Old = strlen(w. Old); начальные len. New = strlen(w. New); установки res[0] = ''; p. S = s; p. Res = res; while( strlen(p. S) > 0 ) { // пока строка не пуста p = strstr ( p. S, w. Old ); if( p == NULL ) { // прицепить хвост и выйти } if( p > p. S ) { // скопировать часть до образца } strcpy ( p. Res, w. New ); добавить p. Res += len. New; передвинуть слово-замену p. S += len. Old; указатели } strcpy ( s, res ); // записать результат в s } К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

98 Алгоритмизация и программирование, язык Си, 10 класс Замена всех экземпляров подстроки Если образец 98 Алгоритмизация и программирование, язык Си, 10 класс Замена всех экземпляров подстроки Если образец не найден: p = strstr ( p. S, w. Old ); if ( p == NULL ) прицепить «хвост» { strcat ( res, s ); break; выйти из цикла } Если перед образцом что-то есть: длина блока перед образцом if ( p > p. S ) { p-p. S strncpy ( p. Res, p. S, p-p. S ); p. Res += p-p. S; передвинуть p. S = p; указатели } К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

Алгоритмизация и программирование, язык Си, 10 класс 99 Задачи «A» : Напишите процедуру, которая Алгоритмизация и программирование, язык Си, 10 класс 99 Задачи «A» : Напишите процедуру, которая отсекает всю часть строки после первого слова. Пример: Введите строку: Однажды в студёную зимнюю пору. . . Первое слово: Однажды К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

100 Алгоритмизация и программирование, язык Си, 10 класс Задачи «B» : Напишите процедуру, которая 100 Алгоритмизация и программирование, язык Си, 10 класс Задачи «B» : Напишите процедуру, которая заменяет расширение файла на заданное новое расширение. Пример: Введите имя файла: qq Введите новое расширение: tmp Результат: qq. tmp Пример: Введите имя файла: qq. exe Введите новое расширение: tmp Результат: qq. tmp Пример: Введите имя файла: qq. work. xml Введите новое расширение: tmp Результат: qq. work. tmp К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

Алгоритмизация и программирование, язык Си, 10 класс 101 Задачи «C» : Напишите процедуру, которая Алгоритмизация и программирование, язык Си, 10 класс 101 Задачи «C» : Напишите процедуру, которая заменяет во всей строке все римские числа на соответствующие десятичные числа. Пример: Введите строку: В MMXIII году в школе CXXIII состоялся очередной выпуск XI классов. Результат: В 2013 году в школе 123 состоялся очередной выпуск 11 классов. К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

102 Алгоритмизация и программирование, язык Си, 10 класс Рекурсивный перебор Задача. В алфавите языке 102 Алгоритмизация и программирование, язык Си, 10 класс Рекурсивный перебор Задача. В алфавите языке племени «тумба-юмба» четыре буквы: «Ы» , «Ш» , «Ч» и «О» . Нужно вывести на экран все слова, состоящие из L букв, которые можно построить из букв этого алфавита. перебор L-1 символов Ы ? ? ? Ш ? ? ? Ч ? ? ? 0 ? ? задача для слов длины К сведена к задаче для слов длины L-1! ? К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

Алгоритмизация и программирование, язык Си, 10 класс 103 Рекурсивный перебор L символов w[0]='Ы'; // Алгоритмизация и программирование, язык Си, 10 класс 103 Рекурсивный перебор L символов w[0]='Ы'; // перебор последних L-1 символов w[0]='Ш'; // перебор последних L-1 символов w[0]='Ч'; // перебор последних L-1 символов w[0]='О'; // перебор последних L-1 символов К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

104 Алгоритмизация и программирование, язык Си, 10 класс Рекурсивный перебор void Tumba. Words( char 104 Алгоритмизация и программирование, язык Си, 10 класс Рекурсивный перебор void Tumba. Words( char A[], char w[], int N ) { алфавит слово уже установлено int i; if ( N == strlen(w) ) { когда все символы puts ( w ); уже установлены return; } for ( i = 1; i < strlen(A); i++ ) { w[N] = A[i]; по всем символам Tumba. Words ( A, w, N+1 ); } алфавита } main() любая строка { длины L char word[] = ". . . "; Tumba. Words ( "ЫШЧО", word, 0 ); } К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

105 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : В алфавите языке 105 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : В алфавите языке племени «тумба-юмба» четыре буквы: «Ы» , «Ш» , «Ч» и «О» . Нужно вывести на экран все возможные слова, состоящие из K букв, в которых вторая буква «Ы» . Подсчитайте количество таких слов. «B» : В алфавите языке племени «тумба-юмба» четыре буквы: «Ы» , «Ш» , «Ч» и «О» . Нужно вывести на экран все возможные слова, состоящие из K букв, в которых есть по крайней мере две одинаковые буквы, стоящие рядом. Подсчитайте количество таких слов. Программа не должна строить другие слова, не соответствующие условию. К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

Алгоритмизация и программирование, язык Си, 10 класс 106 Задачи «C» : В алфавите языке Алгоритмизация и программирование, язык Си, 10 класс 106 Задачи «C» : В алфавите языке племени «тумба-юмба» четыре буквы: «Ы» , «Ш» , «Ч» и «О» . Нужно вывести на экран все возможные слова, состоящие из K букв, в которых есть по крайней мере две одинаковые буквы, не обязательно стоящие рядом. Программа не должна строить другие слова, не соответствующие условию. К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

107 Алгоритмизация и программирование, язык Си, 10 класс Сравнение строк Пар ? парк Сравнение 107 Алгоритмизация и программирование, язык Си, 10 класс Сравнение строк Пар ? парк Сравнение по кодам символов: CP-1251 UNCODE 0 48 48 1 49 49 . . 8 56 56 9 57 57 CP-1251 UNCODE A 65 65 B 66 66 . . Y 89 89 Z 90 90 CP-1251 UNCODE a 97 97 b 98 98 . . y 121 z 122 К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

108 Алгоритмизация и программирование, язык Си, 10 класс Сравнение строк А Б CP-1251 192 108 Алгоритмизация и программирование, язык Си, 10 класс Сравнение строк А Б CP-1251 192 193 UNCODE 1040 1041 . . Ё 168 1025 . . Ю Я 222 223 1070 1071 а б CP-1251 224 225 UNCODE 1072 1073 . . ё 184 1105 . . ю я 254 255 1102 1103 5 STEAM < Steam < steam < ПАР < Пар < п. Ар < парк К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

Алгоритмизация и программирование, язык Си, 10 класс 109 Сортировка строк main() { массив строк Алгоритмизация и программирование, язык Си, 10 класс 109 Сортировка строк main() { массив строк const int N = 10; char s 1[80], S[N][80]; int i, j; printf ( "Введите строки: n" ); for ( i = 0; i < N; i ++ ) for ( i = 0; i < N-1; i ++ ) gets ( S[i] ); for ( j = N-2; j >= i; j -- ) . . . if( strcmp(S[j], S[j+1])> 0 ) { printf ( "После сортировки: n" ); strcpy (s 1, S[j]); for ( i = 0; i < N; i ++ ) strcpy (S[j], S[j+1]); puts ( S[i] ); strcpy (S[j+1], s 1); } } К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

Алгоритмизация и программирование, язык Си, 10 класс 110 Задачи «A» : Вводится 5 строк, Алгоритмизация и программирование, язык Си, 10 класс 110 Задачи «A» : Вводится 5 строк, в которых сначала записан порядковый номер строки с точкой, а затем – слово. Вывести слова в алфавитном порядке. Пример: Введите 5 строк: 1. тепловоз 2. арбуз 3. бурундук 4. кефир 5. урядник Список слов в алфавитном порядке: арбуз, бурундук, кефир, тепловоз, урядник К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

Алгоритмизация и программирование, язык Си, 10 класс 111 Задачи «B» : Вводится несколько строк Алгоритмизация и программирование, язык Си, 10 класс 111 Задачи «B» : Вводится несколько строк (не более 20), в которых сначала записан порядковый номер строки с точкой, а затем – слово. Ввод заканчивается пустой строкой. Вывести введённые слова в алфавитном порядке. Пример: Введите слова: 1. тепловоз 2. арбуз Список слов в алфавитном порядке: арбуз, тепловоз К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

Алгоритмизация и программирование, язык Си, 10 класс 112 Задачи «C» : Вводится несколько строк Алгоритмизация и программирование, язык Си, 10 класс 112 Задачи «C» : Вводится несколько строк (не более 20), в которых сначала записаны инициалы и фамилии работников фирмы. Ввод заканчивается пустой строкой. Отсортировать строки в алфавитном порядке по фамилии. Пример: Введите ФИО: А. Г. Урядников Б. В. Тепловозов В. Д. Арбузов Список в алфавитном порядке: В. Д. Арбузов Б. В. Тепловозов А. Г. Урядников К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

113 Программирование на языке Си § 67. Матрицы К. Ю. Поляков, Е. А. Ерёмин, 113 Программирование на языке Си § 67. Матрицы К. Ю. Поляков, Е. А. Ерёмин, 2013 http: //kpolyakov. spb. ru

114 Алгоритмизация и программирование, язык Си, 10 класс Что такое матрица? нет знака нолик 114 Алгоритмизация и программирование, язык Си, 10 класс Что такое матрица? нет знака нолик 1 2 0 -1 0 1 крестик 1 -1 0 1 строка 1, столбец 2 2 0 0 1 -1 ? Как закодировать? Матрица — это прямоугольная таблица, составленная из элементов одного типа (чисел, строк и т. д. ). Каждый элемент матрицы имеет два индекса – номера строки и столбца. К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

115 Алгоритмизация и программирование, язык Си, 10 класс Объявление матриц const int N = 115 Алгоритмизация и программирование, язык Си, 10 класс Объявление матриц const int N = 3, M = 4; int A[N][M]; double X[10][12]; bool L[N][2]; строки столбцы ! Нумерация строк и столбцов с нуля! ? Если удобна нумерация с 1? К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

116 Алгоритмизация и программирование, язык Си, 10 класс Простые алгоритмы Заполнение случайными числами: for 116 Алгоритмизация и программирование, язык Си, 10 класс Простые алгоритмы Заполнение случайными числами: for ( i = 0; i < N; i++ ) { for ( j = 0; j < M; j++ ) { A[i][j] = irand(20, 80); printf ( "%3 d", A[i][j] ); } printf ( "n" ); Вложенный цикл! } ! Суммирование: sum = 0; for ( i = 0; i < N; i++ ) for ( j = 0; j < M; j++ ) sum += A[i][j]; К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

117 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : Напишите программу, которая 117 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : Напишите программу, которая заполняет квадратную матрицу случайными числами в интервале [10, 99], и находит максимальный и минимальный элементы в матрице и их индексы. Пример: Матрица А: 12 14 67 45 32 87 45 63 69 45 14 11 40 12 35 15 Максимальный элемент A[2, 2]=87 Минимальный элемент A[3, 4]=11 К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

118 Алгоритмизация и программирование, язык Си, 10 класс Задачи «B» : Яркости пикселей рисунка 118 Алгоритмизация и программирование, язык Си, 10 класс Задачи «B» : Яркости пикселей рисунка закодированы числами от 0 до 255 в виде матрицы. Преобразовать рисунок в черно-белый по следующему алгоритму: 1) вычислить среднюю яркость пикселей по всему рисунку 2) все пиксели, яркость которых меньше средней, сделать черными (записать код 0), а остальные – белыми (код 255) Пример: Матрица А: 12 14 67 45 32 87 45 63 69 45 14 11 40 12 35 15 Средняя яркость 37. 88 Результат: 0 0 255 255 0 0 0 К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

119 Алгоритмизация и программирование, язык Си, 10 класс Задачи «С» : Заполните матрицу, содержащую 119 Алгоритмизация и программирование, язык Си, 10 класс Задачи «С» : Заполните матрицу, содержащую N строк и M столбцов, натуральными числами по спирали и змейкой, как на рисунках: К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

Алгоритмизация и программирование, язык Си, 10 класс 120 Перебор элементов матрицы Главная диагональ: for Алгоритмизация и программирование, язык Си, 10 класс 120 Перебор элементов матрицы Главная диагональ: for ( i = 0; i < N; i++ ) { // работаем с A[i][i] } Побочная диагональ: for ( i = 0; i < N; i++ ){ // работаем с A[i][N-1 -i] } Главная диагональ и под ней: for ( i = 0; i < N; i++ ) for ( j = 0; j <= i ; j++ ) { // работаем с A[i][j] } К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

121 Алгоритмизация и программирование, язык Си, 10 класс Перестановка строк 2 -я и 4 121 Алгоритмизация и программирование, язык Си, 10 класс Перестановка строк 2 -я и 4 -я строки: for ( j = 0; j < M; j++ ) { c = A[2][j]; A[2][j]= A[4][j]; A[4][j]= c; } К. Ю. Поляков, Е. А. Ерёмин, 2014 0 1 2 3 4 5 http: //kpolyakov. spb. ru

Алгоритмизация и программирование, язык Си, 10 класс 122 Задачи «A» : Напишите программу, которая Алгоритмизация и программирование, язык Си, 10 класс 122 Задачи «A» : Напишите программу, которая заполняет квадратную матрицу случайными числами в интервале [10, 99], а затем записывает нули во все элементы выше главной диагонали. Алгоритм не должен изменяться при изменении размеров матрицы. Пример: Матрица А: 12 14 67 45 32 87 45 63 69 45 14 30 40 12 35 65 Результат: 12 0 0 0 32 87 0 0 69 45 14 0 40 12 35 65 К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

Алгоритмизация и программирование, язык Си, 10 класс 123 Задачи «B» : Пиксели рисунка закодированы Алгоритмизация и программирование, язык Си, 10 класс 123 Задачи «B» : Пиксели рисунка закодированы числами (обозначающими цвет) в виде матрицы, содержащей N строк и M столбцов. Выполните отражение рисунка сверху вниз: 1 2 3 7 8 9 4 5 6 7 8 9 1 2 3 «С» : Пиксели рисунка закодированы числами (обозначающими цвет) в виде матрицы, содержащей N строк и M столбцов. Выполните поворот рисунка вправо на 90 градусов: 1 2 3 7 4 1 4 5 6 8 5 2 7 8 9 9 6 3 К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

124 Программирование на языке Си § 68. Работа с файлами К. Ю. Поляков, Е. 124 Программирование на языке Си § 68. Работа с файлами К. Ю. Поляков, Е. А. Ерёмин, 2013 http: //kpolyakov. spb. ru

125 Алгоритмизация и программирование, язык Си, 10 класс Как работать с файлами? файлы текстовые 125 Алгоритмизация и программирование, язык Си, 10 класс Как работать с файлами? файлы текстовые «plain text» : • текст, разбитый на строки; • из специальных символов только символы перехода на новую строку К. Ю. Поляков, Е. А. Ерёмин, 2014 двоичные • любые символы • рисунки, звуки, видео, … http: //kpolyakov. spb. ru

126 Алгоритмизация и программирование, язык Си, 10 класс Принцип сэндвича хлеб начинка хлеб открыть 126 Алгоритмизация и программирование, язык Си, 10 класс Принцип сэндвича хлеб начинка хлеб открыть файл работа с файлом закрыть файловые переменныеуказатели FILE *Fin, *Fout; Fin = fopen ( "input. txt", "r" ); Fout = fopen ( "output. txt", "w" ); // здесь работаем с файлами fclose (Fin); "r" - чтение fclose (Fout); "w" – запись "a" – добавление К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

127 Алгоритмизация и программирование, язык Си, 10 класс Обработка ошибок ! В случае неудачи 127 Алгоритмизация и программирование, язык Си, 10 класс Обработка ошибок ! В случае неудачи fopen возвращает NULL! FILE *F; F = fopen ( "input. txt", "r" ); if ( F ) if ( F != NULL ) { // здесь работаем с файлом } else printf("Открыть файл не удалось. "); ? Когда такое может быть? К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

128 Алгоритмизация и программирование, язык Си, 10 класс Ввод данных int a, b; FILE 128 Алгоритмизация и программирование, язык Си, 10 класс Ввод данных int a, b; FILE *Fin; Fin = fopen("input. txt", "r"); fscanf( Fin, "%d%d", &a, &b ); fclose(Fin); Переход к началу открытого файла: fclose(Fin); Fin = fopen("input. txt", "r"); Определение конца файла: eof = end of file, конец файла if ( feof(Fin) ) printf("Данные кончились"); К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

129 Алгоритмизация и программирование, язык Си, 10 класс Вывод данных в файл int a 129 Алгоритмизация и программирование, язык Си, 10 класс Вывод данных в файл int a = 1, b = 2; FILE *Fout; Fout = fopen("output. txt", "w"); fprintf ( Fout, "%d+%d=%d", a, b, a+b ); fclose(Fout); К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

130 Алгоритмизация и программирование, язык Си, 10 класс Чтение неизвестного количества данных Задача. В 130 Алгоритмизация и программирование, язык Си, 10 класс Чтение неизвестного количества данных Задача. В файле записано в столбик неизвестное количество чисел. Найти их сумму. пока не конец файла // прочитать число из файла // добавить его к сумме int n, S, x; S = 0; fscanf возвращает количество while( 1 ) прочитанных данных! { n = fscanf ( Fin, "%d", &x ); if ( n < 1 ) break; S = S + x; при неудачном чтении } выход из цикла ! К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

131 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : Напишите программу, которая 131 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : Напишите программу, которая находит среднее арифметическое всех чисел, записанных в файле в столбик, и выводит результат в другой файл. «B» : Напишите программу, которая находит минимальное и максимальное среди чётных положительных чисел, записанных в файле, и выводит результат в другой файл. Учтите, что таких чисел может вообще не быть. «C» : В файле в столбик записаны целые числа, сколько их – неизвестно. Напишите программу, которая определяет длину самой длинной цепочки идущих подряд одинаковых чисел и выводит результат в другой файл. К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

132 Алгоритмизация и программирование, язык Си, 10 класс Обработка массивов Задача. В файле записано 132 Алгоритмизация и программирование, язык Си, 10 класс Обработка массивов Задача. В файле записано не более 100 целых чисел. Вывести в другой текстовый файл те же числа, отсортированные в порядке возрастания. ? В чем отличие от предыдущей задачи? ! Для сортировки нужно удерживать все элементы в памяти одновременно. const int MAX = 100; int A[MAX]; К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

Алгоритмизация и программирование, язык Си, 10 класс 133 Обработка массивов Ввод массива: N = Алгоритмизация и программирование, язык Си, 10 класс 133 Обработка массивов Ввод массива: N = 0; while ( N < MAX ) Зачем? { r = fscanf ( Fin, "%d", &A[N] ); if ( r < 1 ) break; N ++; } ? К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

Алгоритмизация и программирование, язык Си, 10 класс 134 Обработка массивов Вывод результата: Fout = Алгоритмизация и программирование, язык Си, 10 класс 134 Обработка массивов Вывод результата: Fout = fopen ( "output. txt", "w" ); for ( i = 0; i < N ; i++ ) N fprintf ( Fout, "%dn", A[i] ); fclose ( Fout ); К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

135 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : В файле записано 135 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : В файле записано не более 100 чисел. Отсортировать их по возрастанию последней цифры и записать в другой файл. «B» : В файле записано не более 100 чисел. Отсортировать их по возрастанию суммы цифр и записать в другой файл. Используйте функцию, которая вычисляет сумму цифр числа. «C» : В двух файлах записаны отсортированные по возрастанию массивы неизвестной длины. Объединить их и записать результат в третий файл. Полученный массив также должен быть отсортирован по возрастанию. К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

136 Алгоритмизация и программирование, язык Си, 10 класс Обработка строк Задача. В файле записано 136 Алгоритмизация и программирование, язык Си, 10 класс Обработка строк Задача. В файле записано данные о собаках: в каждой строчке кличка собаки, ее возраст и порода: Мухтар 4 немецкая овчарка Вывести в другой файл сведения о собаках, которым меньше 5 лет. пока не конец файла(Fin) // прочитать строку из файла Fin // разобрать строку – выделить возраст если возраст < 5 то // записать строку в файл Fout К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

137 Алгоритмизация и программирование, язык Си, 10 класс Чтение строк из файла Чтение одной 137 Алгоритмизация и программирование, язык Си, 10 класс Чтение строк из файла Чтение одной строки: char s[80]; строка файл char *p; p = fgets( s, 80, Fin ); размер ! При неудаче fgets вернет NULL! Чтение всех строк: while ( fgets(s, 80, Fin) ) { // обработать строку s } К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

138 Алгоритмизация и программирование, язык Си, 10 класс Обработка строк Разбор строки: // найти 138 Алгоритмизация и программирование, язык Си, 10 класс Обработка строк Разбор строки: // найти в строке пробел // удалить из строки кличку с первым пробелом // найти в строке пробел // выделить возраст перед пробелом // преобразовать возраст в числовой вид char s[80], *p; p+1 int age; Мухтар 4 немецкая овчарка . . . p = strchr ( s, ' ' ); sscanf ( p+1, "%d", &age ); не влияет! чтение из строки строка (адрес) К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

139 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : В файле записаны 139 Алгоритмизация и программирование, язык Си, 10 класс Задачи «A» : В файле записаны данные о результатах сдачи экзамена. Каждая строка содержит фамилию, имя и количество баллов, разделенные пробелами: <Фамилия> <Имя> <Количество баллов> Вывести в другой файл фамилии и имена тех учеников, которые получили больше 80 баллов. «B» : В предыдущей задаче добавить к полученному списку нумерацию, сократить имя до одной буквы и поставить перед фамилией: П. Иванов И. Петров. . . К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

Алгоритмизация и программирование, язык Си, 10 класс 140 Задачи «C» : В файле записаны Алгоритмизация и программирование, язык Си, 10 класс 140 Задачи «C» : В файле записаны данные о результатах сдачи экзамена. Каждая строка содержит фамилию, имя и количество баллов, разделенные пробелами: <Фамилия> <Имя> <Количество баллов> Вывести в другой файл данные учеников, которые получили больше 80 баллов. Список должен быть отсортирован по убыванию балла. Формат выходных данных: П. Иванов 98 И. Петров 96. . . К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

141 Алгоритмизация и программирование, язык Си, 10 класс Конец фильма ПОЛЯКОВ Константин Юрьевич д. 141 Алгоритмизация и программирование, язык Си, 10 класс Конец фильма ПОЛЯКОВ Константин Юрьевич д. т. н. , учитель информатики ГБОУ СОШ № 163, г. Санкт-Петербург kpolyakov@mail. ru ЕРЕМИН Евгений Александрович к. ф. -м. н. , доцент кафедры мультимедийной дидактики и ИТО ПГГПУ, г. Пермь eremin@pspu. ac. ru К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru

Алгоритмизация и программирование, язык Си, 10 класс 142 Источники иллюстраций 1. 2. 3. www. Алгоритмизация и программирование, язык Си, 10 класс 142 Источники иллюстраций 1. 2. 3. www. mcdonalds. com иллюстрации художников издательства «Бином» авторские материалы К. Ю. Поляков, Е. А. Ерёмин, 2014 http: //kpolyakov. spb. ru