Разделы презентаций


Программирование на языке Си

Содержание

Программирование на языке Си§ 62. Массивы

Слайды и текст этой презентации

Слайд 1Программирование на языке Си
§ 62. Массивы
§ 63. Алгоритмы обработки массивов
§

64. Сортировка
§ 65. Двоичный поиск
§ 66. Символьные строки
§ 67. Матрицы
§

68. Работа с файлами
Программирование на языке Си§ 62. Массивы§ 63. Алгоритмы обработки массивов§ 64. Сортировка§ 65. Двоичный поиск§ 66. Символьные

Слайд 2Программирование на языке Си
§ 62. Массивы

Программирование на языке Си§ 62. Массивы

Слайд 3Что такое массив?
Массив – это группа переменных одного типа, расположенных

в памяти рядом (в соседних ячейках) и имеющих общее имя.

Каждая ячейка в массиве имеет уникальный номер (индекс).

Надо:

выделять память
записывать данные в нужную ячейку
читать данные из ячейки

Что такое массив?Массив – это группа переменных одного типа, расположенных в памяти рядом (в соседних ячейках) и

Слайд 4Выделение памяти (объявление)
int A[5];
double V[8];
bool L[10];
char S[80];
число элементов
const int N

= 10;
int A[N];
размер через константу
A[0], A[1], A[2], A[3], A[4]

Выделение памяти (объявление)int A[5];double V[8];bool L[10];char S[80];число элементовconst int N = 10;int A[N]; размер через константуA[0], A[1],

Слайд 5Обращение к элементу массива
A
массив
2
15
НОМЕР элемента массива
(ИНДЕКС)
A[0]
A[1]
A[2]
A[3]
A[4]
ЗНАЧЕНИЕ элемента массива
A[2]
НОМЕР (ИНДЕКС) элемента

массива: 2
ЗНАЧЕНИЕ элемента массива: 15

Обращение к элементу массиваAмассив215НОМЕР  элемента массива(ИНДЕКС)A[0]A[1]A[2]A[3]A[4]ЗНАЧЕНИЕ элемента массиваA[2]НОМЕР (ИНДЕКС)  элемента массива: 2ЗНАЧЕНИЕ  элемента массива:

Слайд 6Как обработать все элементы массива?
Объявление:



Обработка:
const int N = 5;
int A[N];
//

обработать A[0]
// обработать A[1]
// обработать A[2]
// обработать A[3]
// обработать A[4]

Как обработать все элементы массива?Объявление:Обработка:const int N = 5;int A[N];// обработать A[0]// обработать A[1]// обработать A[2]// обработать

Слайд 7Как обработать все элементы массива?
Обработка с переменной:
i = 0;
// обработать

A[i]
i ++;
// обработать A[i]
i ++;
// обработать A[i]
i ++;
// обработать

A[i]
i ++;
// обработать A[i]

i ++;

Обработка в цикле:

i = 0;
while ( i < N )
{
// обработать A[i]
i ++;
}

Цикл с переменной:

for( i = 0; i < N; i++ )
{
// обработать A[i]
}

Как обработать все элементы массива?Обработка с переменной:i = 0;// обработать A[i]i ++;// обработать A[i]i ++;// обработать A[i]i

Слайд 8Заполнение массива
main()
{
const int N = 10;
int A[N];
int

i;
for ( i = 0; i < N; i++

)
A[i] = i*i;
}
Заполнение массиваmain(){ const int N = 10; int A[N]; int i; for ( i = 0; i

Слайд 9Ввод с клавиатуры и вывод на экран
Объявление:



Ввод с клавиатуры:
Вывод на

экран:
const int N = 10;
int A[N];
for ( i = 0;

i < N; i++ )
{
printf ( "A[%d]=", i );
scanf ( "%d", &A[i] );
}

A[0] =
A[1] =
A[2] =
A[3] =
A[4] =

5
12
34
56
13

printf( "Массив A:\n" );
for ( i = 0; i < N; i++ )
printf ( "%d ", A[i] );

Ввод с клавиатуры и вывод на экранОбъявление:Ввод с клавиатуры:Вывод на экран:const int N = 10;int A[N];for (

Слайд 10Заполнение случайными числами
for ( i = 0; i < N;

i++ )
{
A[i] = irand ( 20, 100

);
printf ( "%d ", A[i] );
}

Задача. Заполнить массив (псевдо)случайными целыми числами в диапазоне от 20 до 100.

int irand ( int a, int b )
{
return a + rand()% (b - a + 1);
}

Заполнение случайными числамиfor ( i = 0; i < N; i++ )  { A[i] = irand

Слайд 11Перебор элементов
Общая схема:
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 ++;

Перебор элементовОбщая схема:for ( i = 0; i < N; i++ ) { ... // сделать что-то

Слайд 12Перебор элементов
Среднее арифметическое:
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 );

среднее арифметическое

Перебор элементовСреднее арифметическое:int count, sum;count = 0;sum = 0;for ( i = 0; i < N; i++

Слайд 13Задачи
«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

Задачи«A»: Заполните массив случайными числами в интервале [0,100] и найдите среднее арифметическое его значений. Пример:Массив:1 2 3

Слайд 14Задачи
«C»: Заполните массив из N элементов случайными числами в интервале

[1,N] так, чтобы в массив обязательно вошли все числа от

1 до N (постройте случайную перестановку).
Пример:
Массив:
3 2 1 4 5
Задачи«C»: Заполните массив из N элементов случайными числами в интервале [1,N] так, чтобы в массив обязательно вошли

Слайд 15Программирование на языке Си
§ 63. Алгоритмы обработки массивов

Программирование на языке Си§ 63. Алгоритмы обработки массивов

Слайд 16Поиск в массиве
Найти элемент, равный X:
i = 0;
while ( A[i]

!= X )
i ++;
printf ( "A[%d]=%d", i, X );
i

= 0;
while ( i < N && A[i] != X )
i ++;
if ( i < N )
printf ( "A[%d]=%d", i, X );
else
printf ( "Не нашли!" );

i < N

Поиск в массивеНайти элемент, равный X:i = 0;while ( A[i] != X ) i ++;printf (

Слайд 17Поиск в массиве
nX = -1;
for ( i = 0; i

< N; i++ )
if ( A[i] == X )


{
nX = i;
break;
}
if ( nX >= 0 )
printf ( "A[%d]=%d", nX, X );
else
printf ( "Не нашли!" );

Вариант с досрочным выходом:

break;

досрочный выход из цикла

Поиск в массивеnX = -1;for ( i = 0; i < N; i++ ) if ( A[i]

Слайд 18Задачи
«A»: Заполните массив случайными числами в интервале [0,5]. Введите число

X и найдите все значения, равные X.
Пример:
Массив:
1 2 3

1 2
Что ищем:
2
Нашли: A[2]=2, A[5]=2
Пример:
Массив:
1 2 3 1 2
Что ищем:
6
Ничего не нашли.
Задачи«A»: Заполните массив случайными числами в интервале [0,5]. Введите число X и найдите все значения, равные X.

Слайд 19Задачи
«B»: Заполните массив случайными числами в интервале [0,5]. Определить, есть

ли в нем элементы с одинаковыми значениями, стоящие рядом.
Пример:
Массив:
1

2 3 3 2 1
Есть: 3
Пример:
Массив:
1 2 3 4 2 1
Нет
Задачи«B»: Заполните массив случайными числами в интервале [0,5]. Определить, есть ли в нем элементы с одинаковыми значениями,

Слайд 20Задачи
«C»: Заполните массив случайными числами. Определить, есть ли в нем

элементы с одинаковыми значениями, не обязательно стоящие рядом.
Пример:
Массив:
3 2 1

3 2 5
Есть: 3, 2
Пример:
Массив:
3 2 1 4 0 5
Нет
Задачи«C»: Заполните массив случайными числами. Определить, есть ли в нем элементы с одинаковыми значениями, не обязательно стоящие

Слайд 21Максимальный элемент
M = A[0];
for ( i = 1; i

N; i++ )
if ( A[i]> M )

M = A[i];
printf ( "%d", M );
Максимальный элементM = A[0];for ( i = 1; i < N; i++ ) if ( A[i]> M

Слайд 22Максимальный элемент и его номер

Максимальный элемент и его номер

Слайд 23Задачи
«A»: Заполнить массив случайными числами и найти минимальный и максимальный

элементы массива и их номера.
Пример:
Массив:
1 2 3 4 5
Минимальный

элемент: A[1]=1
Максимальный элемент: A[5]=5

«B»: Заполнить массив случайными числами и найти два максимальных элемента массива и их номера.
Пример:
Массив:
5 5 3 4 1
Максимальный элемент: A[1]=5
Второй максимум: A[2]=5

Задачи«A»: Заполнить массив случайными числами и найти минимальный и максимальный элементы массива и их номера. Пример:Массив:1 2

Слайд 24Задачи
«C»: Введите массив с клавиатуры и найдите (за один проход)

количество элементов, имеющих максимальное значение.
Пример:
Массив:
3 4 5 5 3

4 5
Максимальное значение 5
Количество элементов 3
Задачи«C»: Введите массив с клавиатуры и найдите (за один проход) количество элементов, имеющих максимальное значение. Пример:Массив:3 4

Слайд 25Реверс массива
«Простое» решение:
for( i = 0; i < N ;

i++ )
{
// поменять местами A[i] и A[N-1-i]
}


N/2

остановиться на середине!

Реверс массива«Простое» решение:for( i = 0; i < N ; i++ ) { // поменять местами A[i]

Слайд 26Реверс массива
for ( i = 0; i < (N/2); i++

)
{
c = A[i];
A[i] = A[N-1-i];
A[N-1-i]

= c;
}
Реверс массиваfor ( i = 0; i < (N/2); i++ )  { c = A[i]; A[i]

Слайд 27Циклический сдвиг элементов
«Простое» решение:
c = A[0];
for ( i = 0;

i < N-1; i++ )
A[i] = A[i+1];
A[N-1] =

c;
Циклический сдвиг элементов«Простое» решение:c = A[0];for ( i = 0; i < N-1; i++ )  A[i]

Слайд 28Задачи
«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

Задачи«A»: Заполнить массив случайными числами и выполнить циклический сдвиг элементов массива вправо на 1 элемент. Пример:Массив:1 2

Слайд 29Задачи
«C»: Заполнить массив случайными числами в интервале [-100,100] и переставить

элементы так, чтобы все положительные элементы стояли в начала массива,

а все отрицательные и нули – в конце. Вычислите количество положительных элементов.
Пример:
Массив:
20 -90 15 -34 10 0
Результат:
20 15 10 -90 -34 0
Количество положительных элементов: 3
Задачи«C»: Заполнить массив случайными числами в интервале [-100,100] и переставить элементы так, чтобы все положительные элементы стояли

Слайд 30Отбор нужных элементов
«Простое» решение:
Задача. Отобрать элементы массива A, удовлетворяющие некоторому

условию, в массив B.
сделать для i от 0 до N-1

если условие выполняется для A[i] то
B[i]:= A[i]

A

B

выбрать чётные элементы

Отбор нужных элементов«Простое» решение:Задача. Отобрать элементы массива A, удовлетворяющие некоторому условию, в массив B.сделать для i от

Слайд 31Отбор нужных элементов
A
B
выбрать чётные элементы
count = 0;
for ( i =

0; i < N; i++ )
if ( A[i] %

2 == 0 )
{
B[count] = A[i];
count ++;
}

B[count] = A[i];

Отбор нужных элементовABвыбрать чётные элементыcount = 0;for ( i = 0; i < N; i++ ) if

Слайд 32Задачи
«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

Задачи«A»: Заполнить массив случайными числами в интервале  [-10,10] и отобрать в другой массив все чётные отрицательные

Слайд 33Задачи
«C»: Заполнить массив случайными числами и отобрать в другой массив

все числа Фибоначчи. Используйте логическую функцию, которая определяет, является ли

переданное ей число числом Фибоначчи.
Пример:
Массив А:
12 13 85 34 47
Массив B:
13 34
Задачи«C»: Заполнить массив случайными числами и отобрать в другой массив все числа Фибоначчи. Используйте логическую функцию, которая

Слайд 34Программирование на языке Си
§ 64. Сортировка

Программирование на языке Си§ 64. Сортировка

Слайд 35Что такое сортировка?
Сортировка – это расстановка элементов массива в заданном

порядке.
…по возрастанию, убыванию, последней цифре, сумме делителей, по алфавиту, …
Алгоритмы:
простые

и понятные, но неэффективные для больших массивов
метод пузырька
метод выбора
сложные, но эффективные
«быстрая сортировка» (QuickSort)
сортировка «кучей» (HeapSort)
сортировка слиянием (MergeSort)
пирамидальная сортировка
Что такое сортировка?Сортировка – это расстановка элементов массива в заданном порядке.…по возрастанию, убыванию, последней цифре, сумме делителей,

Слайд 36Метод пузырька (сортировка обменами)
Идея: пузырек воздуха в стакане воды поднимается

со дна вверх.
Для массивов – самый маленький («легкий» элемент

перемещается вверх («всплывает»).

сравниваем два соседних элемента; если они стоят «неправильно», меняем их местами
за 1 проход по массиву один элемент (самый маленький) становится на свое место

1-й проход:

Метод пузырька (сортировка обменами)Идея: пузырек воздуха в стакане воды поднимается со дна вверх. Для массивов – самый

Слайд 37Метод пузырька
2-й проход:
3-й проход:
4-й проход:

Метод пузырька2-й проход:3-й проход:4-й проход:

Слайд 38Метод пузырька
1-й проход:
сделать для j от N-2 до 0 шаг

-1
если A[j+1]< A[j] то
// поменять местами A[j]

и A[j+1]

2-й проход:

сделать для j от N-2 до 1 шаг -1
если A[j+1]< A[j] то
// поменять местами A[j] и A[j+1]

1

единственное отличие!

Метод пузырька1-й проход:сделать для j от N-2 до 0 шаг -1 если A[j+1]< A[j] то  //

Слайд 39Метод пузырька
for ( i = 0; i < N-1; i++

)
for ( j = N-2; j >= i ;

j-- )
if ( A[j] > A[j+1] )
{
// поменять местами A[j] и A[j+1]
}

i

Метод пузырькаfor ( i = 0; i < N-1; i++ ) for ( j = N-2; j

Слайд 40Задачи
«A»: Напишите программу, в которой сортировка выполняется «методом камня» –

самый «тяжёлый» элемент опускается в конец массива.
«B»: Напишите вариант метода

пузырька, который заканчивает работу, если на очередном шаге внешнего цикла не было перестановок.

«С»: Напишите программу, которая сортирует массив по убыванию суммы цифр числа. Используйте функцию, которая определяет сумму цифр числа.

Задачи«A»: Напишите программу, в которой сортировка выполняется «методом камня» – самый «тяжёлый» элемент опускается в конец массива.«B»:

Слайд 41Метод выбора (минимального элемента)
Идея: найти минимальный элемент и поставить его

на первое место.
сделать для i от 0 до N-2


// найти номер nMin минимального // элемента из A[i]..A[N]
если i != nMin то
// поменять местами A[i] и A[nMin]
Метод выбора (минимального элемента)Идея: найти минимальный элемент и поставить его на первое место. сделать для i от

Слайд 42Метод выбора (минимального элемента)
for ( i = 0; i

N-1; i++ )
{
nMin = i;
for (

j = i+1; j < N; j++ )
if ( A[j] < A[nMin] )
nMin = j;
if ( i != nMin )
{
// поменять местами A[i] и A[nMin]
}
}

nMin = i;
for ( j = i+1; j < N; j++ )
if ( A[j] < A[nMin] )
nMin = j;

Метод выбора (минимального элемента)for ( i = 0; i < N-1; i++ )  { nMin =

Слайд 43Задачи
«A»: Массив содержит четное количество элементов. Напишите программу, которая сортирует

первую половину массива по возрастанию, а вторую – по убыванию.

Каждый элемент должен остаться в «своей» половине.
Пример:
Массив:
5 3 4 2 1 6 3 2
После сортировки:
2 3 4 5 6 3 2 1
Задачи«A»: Массив содержит четное количество элементов. Напишите программу, которая сортирует первую половину массива по возрастанию, а вторую

Слайд 44Задачи
«B»: Напишите программу, которая сортирует массив и находит количество различных

чисел в нем.
Пример:
Массив:
5 3 4 2 1 6 3

2 4
После сортировки:
1 2 2 3 3 4 4 5 6
Различных чисел: 5

«C»: Напишите программу, которая сравнивает число перестановок элементов при использовании сортировки «пузырьком» и методом выбора. Проверьте ее на разных массивах, содержащих 1000 случайных элементов, вычислите среднее число перестановок для каждого метода.

Задачи«B»: Напишите программу, которая сортирует массив и находит количество различных чисел в нем. Пример:Массив:5 3 4 2

Слайд 45Быстрая сортировка (QuickSort)
Идея: выгоднее переставлять элементы, который находятся дальше друг

от друга.

Быстрая сортировка (QuickSort)Идея: выгоднее переставлять элементы, который находятся дальше друг от друга.

Слайд 46Быстрая сортировка
Шаг 2: переставить элементы так:

при сортировке элементы

не покидают « свою область»!
Шаг 1: выбрать некоторый элемент массива

X

Шаг 3: так же отсортировать две получившиеся области

Разделяй и властвуй (англ. divide and conquer)

Медиана – такое значение X, что слева и справа от него в отсортированном массиве стоит одинаковое число элементов (для этого надо отсортировать массив…).

Быстрая сортировкаШаг 2: переставить элементы так:   при сортировке элементы не покидают « свою область»!Шаг 1:

Слайд 47Быстрая сортировка
Разделение:
выбрать средний элемент массива (X=67)


установить L = 1,

R = N
увеличивая L, найти первый элемент A[L], который >=

X (должен стоять справа)
уменьшая R, найти первый элемент A[R], который <= X (должен стоять слева)
если L<=R то поменять местами A[L] и A[R] и перейти к п. 3 иначе стоп.
Быстрая сортировкаРазделение: выбрать средний элемент массива (X=67)установить L = 1, R = Nувеличивая L, найти первый элемент

Слайд 48Быстрая сортировка

Быстрая сортировка

Слайд 49Быстрая сортировка
const int N = 7;
int A[N];
...
main()
{
// заполнить массив


qSort( 0, N-1 ); // сортировка
// вывести

результат
}

Основная программа:

глобальные данные

процедура сортировки

Быстрая сортировкаconst int N = 7;int A[N];...main(){ // заполнить массив  qSort( 0, N-1 ); // сортировка

Слайд 50Быстрая сортировка
void qSort( int nStart, int nEnd )
{
int L,

R, c, X;
if ( nStart >= nEnd ) return;

// готово
L = nStart; R = nEnd;
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 --;
}
}
qSort ( nStart, R ); // рекурсивные вызовы
qSort ( L, nEnd );
}
Быстрая сортировкаvoid qSort( int nStart, int nEnd ){ int L, R, c, X; if ( nStart >=

Слайд 51Быстрая сортировка
void qSort( int A[], int nStart,

int nEnd

)
{
...
qSort ( A, nStart, R );
qSort ( A, L, nEnd );
}

Передача массива через параметр:

A,

A,

int A[],

main()
{ // заполнить массив
qSort( A, 0, N-1 ); // сортировка
// вывести результат
}

A,

Быстрая сортировкаvoid qSort( int A[], int nStart,

Слайд 52Быстрая сортировка
Сортировка массива случайных значений:

Быстрая сортировкаСортировка массива случайных значений:

Слайд 53Задачи
«A»: Массив содержит четное количество элементов. Напишите программу, которая сортирует

по возрастанию отдельно элементы первой и второй половин массива. Каждый

элемент должен остаться в «своей» половине. Используйте алгоритм быстрой сортировки.
Пример:
Массив:
5 3 4 2 1 6 3 2
После сортировки:
2 3 4 5 6 3 2 1
Задачи«A»: Массив содержит четное количество элементов. Напишите программу, которая сортирует по возрастанию отдельно элементы первой и второй

Слайд 54Задачи
«B»: Напишите программу, которая сортирует массив и находит количество различных

чисел в нем. Используйте алгоритм быстрой сортировки.
Пример:
Массив:
5 3 4 2

1 6 3 2 4
После сортировки:
1 2 2 3 3 4 4 5 6
Различных чисел: 5
Задачи«B»: Напишите программу, которая сортирует массив и находит количество различных чисел в нем. Используйте алгоритм быстрой сортировки.Пример:Массив:5

Слайд 55Задачи
«C»: Напишите программу, которая сравнивает число перестановок элементов при использовании

сортировки «пузырьком», методом выбора и алгоритма быстрой сортировки. Проверьте ее

на разных массивах, содержащих 1000 случайных элементов, вычислите среднее число перестановок для каждого метода.

«D»: Попробуйте построить массив из 10 элементов, на котором алгоритм быстрой сортировки показывает худшую эффективность (наибольшее число перестановок). Сравните это количество перестановок с эффективностью метода пузырька (для того же массива).

Задачи«C»: Напишите программу, которая сравнивает число перестановок элементов при использовании сортировки «пузырьком», методом выбора и алгоритма быстрой

Слайд 56Программирование на языке Си
§ 65. Двоичный поиск

Программирование на языке Си§ 65. Двоичный поиск

Слайд 57Двоичный поиск
X = 7
X < 8
8
4
X > 4
6
X > 6
Выбрать

средний элемент A[c] и сравнить с X.
Если X = A[c],

то нашли (стоп).
Если X < A[c], искать дальше в первой половине.
Если X > A[c], искать дальше во второй половине.
Двоичный поискX = 7X < 884X > 46X > 6Выбрать средний элемент A[c] и сравнить с X.Если

Слайд 58Двоичный поиск
X = 44

Двоичный поискX = 44

Слайд 59Двоичный поиск
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 ( "Не нашли!" );
Двоичный поискint X, L, R, c;L = 0; R = N;   // начальный отрезокwhile (

Слайд 60Двоичный поиск
скорость выше, чем при линейном поиске
нужна предварительная сортировка
Число сравнений:

Двоичный поискскорость выше, чем при линейном поискенужна предварительная сортировкаЧисло сравнений:

Слайд 61Задачи
«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
Задачи«A»: Заполнить массив случайными числами и отсортировать его. Ввести число X. Используя двоичный поиск, определить, есть ли

Слайд 62Задачи
«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 не встречается.
Задачи«B»: Заполнить массив случайными числами и отсортировать его. Ввести число X. Используя двоичный поиск, определить, сколько чисел,

Слайд 63Задачи
«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.
Задачи«C»: Заполнить массив случайными числами и ввести число и отсортировать его. Ввести число X. Используя двоичный поиск,

Слайд 64Программирование на языке Си
§ 66. Символьные строки

Программирование на языке Си§ 66. Символьные строки

Слайд 65Зачем нужны символьные строки?
char s[10]; // массив символов
элементы массива –

отдельные объекты
сложно работать со строками переменной длины
Хочется:
строка – единый объект
длина

строки может меняться во время работы программы
Зачем нужны символьные строки?char s[10]; // массив символовэлементы массива – отдельные объектысложно работать со строками переменной длиныХочется:строка

Слайд 66Как хранится символьная строка?
рабочая часть
s[0]
s[1]
s[2]
s[3]
char s[10];
признак окончания строки: символ с

кодом 0
Символьная строка – это последовательность символов, которая заканчивается символом

'\0'.
Как хранится символьная строка?рабочая частьs[0]s[1]s[2]s[3]char s[10];признак окончания строки: символ с кодом 0Символьная строка – это последовательность символов,

Слайд 67Символьные строки
Начальное значение:
char s[10] = "Привет!";
Вывод на экран:
printf ( "%s",

s );
char s[] = "Привет!";
размер вычисляется автоматически
puts ( s );
с

переходом на новую строку
Символьные строкиНачальное значение:char s[10] =

Слайд 68Символьные строки
Ввод с клавиатуры:
scanf ( "%s", s );
Отдельный символ:
s[4] =

'a';
Длина строки:
#include
только до пробела!
gets ( s );
до перевода строки

(Enter)

int n;
...
n = strlen(s);

библиотека для работы со строками

string length – длина строки

Символьные строкиВвод с клавиатуры:scanf (

Слайд 69Символьные строки
#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 );
}

Задача: заменить в строке все буквы 'а' на буквы 'б'.

Символьные строки#include #include main(){ char s[80];  int i; printf (

Слайд 70Задачи
«A»: Ввести с клавиатуры символьную строку и заменить в ней

все буквы «а» на «б» и все буквы «б» на

«а» (заглавные на заглавные, строчные на строчные).
Пример:
Введите строку:
ааббААББссСС
Результат:
ббааББААссСС
Задачи«A»: Ввести с клавиатуры символьную строку и заменить в ней все буквы «а» на «б» и все

Слайд 71Задачи
«B»: Ввести с клавиатуры символьную строку и определить, сколько в

ней слов. Словом считается последовательности непробельных символов, отделенная с двух

сторон пробелами (или стоящая с краю строки). Слова могут быть разделены несколькими пробелами, в начале и в конце строки тоже могут быть пробелы.
Пример:
Введите строку:
Вася пошел гулять
Найдено слов: 3
Задачи«B»: Ввести с клавиатуры символьную строку и определить, сколько в ней слов. Словом считается последовательности непробельных символов,

Слайд 72Задачи
«C»: Ввести с клавиатуры символьную строку и найдите самое длинное

слово и его длину. Словом считается последовательности непробельных символов, отделенная

с двух сторон пробелами (или стоящая с краю строки). Слова могут быть разделены несколькими пробелами, в начале и в конце строки тоже могут быть пробелы.
Пример:
Введите строку:
Вася пошел гулять
Самое длинное слово: гулять, длина 6
Задачи«C»: Ввести с клавиатуры символьную строку и найдите самое длинное слово и его длину. Словом считается последовательности

Слайд 73Операции со строками
Объединение (конкатенация):
char s[80]= "Привет",
s1[]="Вася!";
strcat( s,

", "); // s = "Привет, "
strcat( s, s1 );

// s = "Привет, Вася!"

string concatenation – «сцепление» строк

Операции со строкамиОбъединение (конкатенация):char s[80]=

Слайд 74Операции со строками
Копирование строки:
char s[80], s1[]="Привет";
strcpy( s, "Вася!"); // s1

= "Вася!"
strcpy( s, s1 ); // s = s1

= "Вася!"

string copy – копировать строку

откуда

куда


Слайд 75Операции со строками
Копирование строки со смещением:
char s[80] = "Прошёл поезд.";
strcpy

( &s[7] , "пароход." );
адрес символа s[5]: &s[5] или s+5
Прошел

пароход.

s совпадает с &s[0]

char s[80] = "Прошёл поезд.",
s1[] = "Привет, Вася.";
strcpy ( s+7, s1+8 );

Прошел Вася.

Операции со строкамиКопирование строки со смещением:char s[80] =

Слайд 76Операции со строками
Удаление:
char s[] = "0123456789";
strcpy ( s+2, s+6 );
6
7
8
9
\0
откуда
куда

Операции со строкамиУдаление:char s[] =

Слайд 77Операции со строками
Копирование n символов:
char s[] = "Мухтар, ко мне!",

s1[] = "Цезарь живет у нас дома.";
strncpy (

s, s1, 6 );

сколько символов

char s[] = "Вчера Мурзик вернулся.",
s1[]= "Кота зовут Васька.";
strncpy ( s+6, s1+11, 6 );

Васька

Цезарь

Операции со строкамиКопирование n символов:char s[] =

Слайд 78Операции со строками
Выделение подстроки:
char s[] = "0123456789", s1[20];
strncpy ( s1,

s+2, 4 );
s1[4] = '\0';
с какого символа
сколько символов
Задача: выделить 4

символа строки s, начиная с s[2], в новую строку s1.

символ конца строки добавляем вручную»

s1 = "2345"

Операции со строкамиВыделение подстроки:char s[] =

Слайд 79Операции со строками
Вставка фрагмента в середину строки:
char s[80]="Иван меняет профессию.",


s1[30]; // буфер
strcpy ( s1, s+4 );


strcpy ( s+4, " Васильевич" );
strcat ( s, s1 );

"Иван

меняет профессию."

Васильевич

s+4

"Иван

меняет профессию."

s1:

s:

" меняет профессию."

Васильевич

"

меняет профессию."

Операции со строкамиВставка фрагмента в середину строки:char s[80]=

Слайд 80Поиск в строках
Указатель – это переменная. в которую можно записать

адрес памяти.
char *p; // указатель на символ

// может хранить адрес // любого символа

char s[] = "Здесь был Вася.";
char *p;
p = &s[2];
printf( "%c", *p ); // е
*p = 'э'; // s[2] = 'э'

содержимое ячейки

Поиск в строкахУказатель – это переменная. в которую можно записать адрес памяти.char *p; // указатель на символ

Слайд 81Поиск символа в строке
char s[] = "Здесь был Вася.";
char *p;
p

= strchr ( s, 'с' );
где
что
искать в строке (string) символ

(character)

if ( p != NULL )
printf("Номер символа 'c':%d\n",
p-s );
else
printf("Символ не найден.\n" );

нулевой указатель

3


Слайд 82Поиск подстроки
char s[] = "Здесь был Вася.";
char *p;
p = strstr

( s, "Вася" );
где
что
искать в строке (string) строку (string)
if (

p != NULL )
printf("Слово начинаетя с s[%d]\n",
p-s );
else
printf("Слово не найдено.\n" );

нулевой указатель

10

Поиск подстрокиchar s[] =

Слайд 83Пример обработки строк
Задача: Ввести имя, отчество и фамилию. Преобразовать их

к формату «фамилия-инициалы».
Пример:
Введите имя, отчество и фамилию:

Василий Алибабаевич Хрюндиков
Результат:
Хрюндиков В.А.

Алгоритм:
найти первый пробел и выделить имя
удалить имя с пробелом из основной строки
найти первый пробел и выделить отчество
удалить отчество с пробелом из основной строки
«сцепить» фамилию, первые буквы имени и фамилии, точки, пробелы…

Алибабаевич Хрюндиков

Хрюндиков

Хрюндиков В.А.

Пример обработки строкЗадача: Ввести имя, отчество и фамилию. Преобразовать их к формату «фамилия-инициалы».  Пример:	 Введите имя,

Слайд 84Пример обработки строк
main()
{
char s[80], name[] = " .", name2[]

= " .";
char *p;
printf("Введите имя, отчество и

фамилию: ");
gets ( s );
name[0] = s[0]; // первая буква имени
p = strchr ( s, ' ' ); // найти пробел
strcpy ( s, p+1 ); // стереть имя
name2[0] = s[0]; // первая буква отчества
p = strchr ( s, ' ' ); // найти пробел
strcpy ( s, p+1 ); // осталась фамилия
strcat ( s, " " ); // добавить пробел
strcat ( s, name ); // прицепить имя
strcat ( s, name2 ); // прицепить отчество
puts ( s );
}

Слайд 85Задачи
«A»: Ввести с клавиатуры в одну строку фамилию, имя и

отчество, разделив их пробелом. Вывести фамилию и инициалы.
Пример:
Введите фамилию, имя

и отчество:
Иванов Петр Семёнович
П.С. Иванов
Задачи«A»: Ввести с клавиатуры в одну строку фамилию, имя и отчество, разделив их пробелом. Вывести фамилию и

Слайд 86Задачи
«B»: Ввести адрес файла и «разобрать» его на части, разделенные

знаком '/'. Каждую часть вывести в отдельной строке.
Пример:
Введите адрес файла:
C:/Фото/2013/Поход/vasya.jpg
C:
Фото
2013
Поход
vasya.jpg

Задачи«B»: Ввести адрес файла и «разобрать» его на части, разделенные знаком '/'. Каждую часть вывести в отдельной

Слайд 87Задачи
«C»: Напишите программу, которая заменяет во всей строке одну последовательность

символов на другую.
Пример:
Введите строку:
(X > 0) and (Y < X)

and (Z > Y) and (Z <> 5)
Что меняем: and
Чем заменить: &
Результат
(X > 0) & (Y < X) & (Z > Y) & (Z <> 5)
Задачи«C»: Напишите программу, которая заменяет во всей строке одну последовательность символов на другую.Пример:Введите строку:(X > 0) and

Слайд 88Преобразования «строка» – «число»
Из строки в число:
#include
char s[]

= "123";
int N;
N = atoi ( s ); //

N = 123

char s[] = "123.456";
float X;
X = atof ( s ); // X = 123.456

«12x3»  12

Преобразования «строка» – «число» Из строки в число:#include char s[] =

Слайд 89Преобразования «строка» – «число»
Из числа в строку:
char s[80];
int N

= 123;
float X = 123.456;
sprintf(s, "%d", N); // s

= "123"
sprintf(s, "%e", X); // s = "1.234560E+002"
sprintf(s, "%10.3f", X);// s = " 123.456"

Преобразования «строка» – «число» Из числа в строку:char s[80];int N = 123;float X = 123.456; sprintf(s,

Слайд 90Задачи
«A»: Напишите программу, которая вычисляет сумму трех чисел, введенную в

форме символьной строки. Все числа целые.
Пример:
Введите выражение:
12+3+45
Ответ: 60
«B»: Напишите программу,

которая вычисляет выражение, состоящее из трех чисел и двух знаков (допускаются только знаки «+» или «–»). Выражение вводится как символьная строка, все числа целые.
Пример:
Введите выражение:
12-3+45
Ответ: 54
Задачи«A»: Напишите программу, которая вычисляет сумму трех чисел, введенную в форме символьной строки. Все числа целые.Пример:Введите выражение:12+3+45Ответ:

Слайд 91Задачи
«C»: Напишите программу, которая вычисляет выражение, состоящее из трех чисел

и двух знаков (допускаются знаки «+», «–», «*» и «/»).

Выражение вводится как символьная строка, все числа целые. Операция «/» выполняется как целочисленное деление.
Пример:
Введите выражение:
12*3+45
Ответ: 81
Задачи«C»: Напишите программу, которая вычисляет выражение, состоящее из трех чисел и двух знаков (допускаются знаки «+», «–»,

Слайд 92Задачи
«D»: Напишите программу, которая вычисляет выражение, состоящее из трех чисел

и двух знаков (допускаются знаки «+», «–», «*» и «/»)

и круглых скобок. Выражение вводится как символьная строка, все числа целые. Операция «/» выполняется как целочисленное деление (div).
Пример:
Введите выражение:
2*(3+45)+4
Ответ: 100
Задачи«D»: Напишите программу, которая вычисляет выражение, состоящее из трех чисел и двух знаков (допускаются знаки «+», «–»,

Слайд 93Строки в процедурах и функциях
Задача: построить процедуру, которая заменяет в

строке s все вхождения слова-образца wOld на слово-замену wNew.
пока //

слово wOld есть в строке s
// удалить слово wOld из строки
// вставить на это место слово wNew

wOld: '12'
wNew: 'A12B'

зацикливание

Строки в процедурах и функцияхЗадача: построить процедуру, которая заменяет в строке s все вхождения слова-образца wOld на

Слайд 94Замена всех экземпляров подстроки

Замена всех экземпляров подстроки

Слайд 95Замена всех экземпляров подстроки
main()
{
char s[80] = "12.12.12";
replaceAll (

s, "12", "A12B" );
puts ( s );
}

Замена всех экземпляров подстрокиmain(){ char s[80] =

Слайд 96Использование указателей
pRes
pS
p
pRes
pS
pRes
pS
pRes
pS

Использование указателейpRespSppRespSpRespSpRespS

Слайд 97Замена всех экземпляров подстроки
void replaceAll(char s[], char wOld[], char wNew[])
{

int lenOld, lenNew;
char *p, *pS, *pRes;
char res[200]; //

строка-результат
lenOld = strlen(wOld);
lenNew = strlen(wNew);
res[0] = '\0'; pS = s; pRes = res;
while( strlen(pS) > 0 ) { // пока строка не пуста
p = strstr ( pS, wOld );
if( p == NULL ) { // прицепить хвост и выйти }
if( p > pS ) { // скопировать часть до образца }
strcpy ( pRes, wNew );
pRes += lenNew;
pS += lenOld;
}
strcpy ( s, res ); // записать результат в s
}

длины строк

начальные установки

добавить слово-замену

указатели

передвинуть указатели

Замена всех экземпляров подстрокиvoid replaceAll(char s[], char wOld[], char wNew[]){ int lenOld, lenNew; char *p, *pS, *pRes;

Слайд 98Замена всех экземпляров подстроки
p = strstr ( pS, wOld );


if ( p == NULL )
{
strcat (

res, s );
break;
}

if ( p > pS ) {
strncpy ( pRes, pS, p-pS );
pRes += p-pS;
pS = p;
}

Если образец не найден:

Если перед образцом что-то есть:

длина блока перед образцом

прицепить «хвост»

выйти из цикла

p-pS

передвинуть указатели

Замена всех экземпляров подстрокиp = strstr ( pS, wOld ); if ( p == NULL )

Слайд 99Задачи
«A»: Напишите процедуру, которая отсекает всю часть строки после первого

слова.
Пример:
Введите строку: Однажды в студёную зимнюю пору...
Первое слово: Однажды

Задачи«A»: Напишите процедуру, которая отсекает всю часть строки после первого слова.Пример:Введите строку: Однажды в студёную зимнюю пору...Первое

Слайд 100Задачи
«B»: Напишите процедуру, которая заменяет расширение файла на заданное новое

расширение.
Пример:
Введите имя файла: qq
Введите новое расширение: tmp
Результат: qq.tmp
Пример:
Введите имя

файла: qq.exe
Введите новое расширение: tmp
Результат: qq.tmp
Пример:
Введите имя файла: qq.work.xml
Введите новое расширение: tmp
Результат: qq.work.tmp

Задачи«B»: Напишите процедуру, которая заменяет расширение файла на заданное новое расширение. Пример:Введите имя файла: qqВведите новое расширение:

Слайд 101Задачи
«C»: Напишите процедуру, которая заменяет во всей строке все римские

числа на соответствующие десятичные числа.
Пример:
Введите строку:
В MMXIII году в

школе CXXIII состоялся очередной выпуск XI классов.
Результат:
В 2013 году в школе 123 состоялся очередной выпуск 11 классов.
Задачи«C»: Напишите процедуру, которая заменяет во всей строке все римские числа на соответствующие десятичные числа. Пример:Введите строку:В

Слайд 102Рекурсивный перебор
Задача. В алфавите языка племени «тумба-юмба» четыре буквы: «Ы»,

«Ш», «Ч» и «О». Нужно вывести на экран все слова,

состоящие из L букв, которые можно построить из букв этого алфавита.

перебор L-1 символов

задача для слов длины К сведена к задаче для слов длины L-1!

Рекурсивный переборЗадача. В алфавите языка племени «тумба-юмба» четыре буквы: «Ы», «Ш», «Ч» и «О». Нужно вывести на

Слайд 103Рекурсивный перебор
перебор L символов
w[0]='Ы';
// перебор последних L-1

символов
w[0]='Ш';
// перебор последних L-1 символов
w[0]='Ч';

// перебор последних L-1 символов
w[0]='О';
// перебор последних L-1 символов
Рекурсивный переборперебор L символов w[0]='Ы';  // перебор последних L-1 символов w[0]='Ш';  // перебор последних L-1

Слайд 104Рекурсивный перебор
main()
{
char word[] = "...";
TumbaWords ( "ЫШЧО", word,

0 );
}
void TumbaWords( 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];
TumbaWords ( A, w, N+1 );
}
}

уже установлено

когда все символы уже установлены

по всем символам алфавита

алфавит

слово

любая строка длины L

Рекурсивный переборmain(){ char word[] =

Слайд 105Задачи
«A»: В алфавите языке племени «тумба-юмба» четыре буквы: «Ы», «Ш»,

«Ч» и «О». Нужно вывести на экран все возможные слова,

состоящие из K букв, в которых вторая буква «Ы». Подсчитайте количество таких слов.

«B»: В алфавите языке племени «тумба-юмба» четыре буквы: «Ы», «Ш», «Ч» и «О». Нужно вывести на экран все возможные слова, состоящие из K букв, в которых есть по крайней мере две одинаковые буквы, стоящие рядом. Подсчитайте количество таких слов. Программа не должна строить другие слова, не соответствующие условию.

Задачи«A»: В алфавите языке племени «тумба-юмба» четыре буквы: «Ы», «Ш», «Ч» и «О». Нужно вывести на экран

Слайд 106Задачи
«C»: В алфавите языке племени «тумба-юмба» четыре буквы: «Ы», «Ш»,

«Ч» и «О». Нужно вывести на экран все возможные слова,

состоящие из K букв, в которых есть по крайней мере две одинаковые буквы, не обязательно стоящие рядом. Программа не должна строить другие слова, не соответствующие условию.
Задачи«C»: В алфавите языке племени «тумба-юмба» четыре буквы: «Ы», «Ш», «Ч» и «О». Нужно вывести на экран

Слайд 107Сравнение строк
Сравнение по кодам символов:

Сравнение строкСравнение по кодам символов:

Слайд 108Сравнение строк
5STEAM 

Сравнение строк5STEAM 

Слайд 109Сортировка строк
main()
{
const int N = 10;
char s1[80], S[N][80];

int i, j;
printf ( "Введите строки: \n" );
for

( i = 0; i < N; i ++ )
gets ( S[i] );
...
printf ( "После сортировки: \n" );
for ( i = 0; i < N; i ++ )
puts ( S[i] );
}

for ( i = 0; i < N-1; i ++ )
for ( j = N-2; j >= i; j -- )
if( strcmp(S[j],S[j+1])> 0 )
{
strcpy (s1, S[j]);
strcpy (S[j], S[j+1]);
strcpy (S[j+1], s1);
}

массив строк


Слайд 110Задачи
«A»: Вводится 5 строк, в которых сначала записан порядковый номер

строки с точкой, а затем – слово. Вывести слова в

алфавитном порядке.
Пример:
Введите 5 строк:
1. тепловоз
2. арбуз
3. бурундук
4. кефир
5. урядник
Список слов в алфавитном порядке:
арбуз, бурундук, кефир, тепловоз, урядник
Задачи«A»: Вводится 5 строк, в которых сначала записан порядковый номер строки с точкой, а затем – слово.

Слайд 111Задачи
«B»: Вводится несколько строк (не более 20), в которых сначала

записан порядковый номер строки с точкой, а затем – слово.

Ввод заканчивается пустой строкой. Вывести введённые слова в алфавитном порядке.
Пример:
Введите слова:
1. тепловоз
2. арбуз
 
Список слов в алфавитном порядке:
арбуз, тепловоз
Задачи«B»: Вводится несколько строк (не более 20), в которых сначала записан порядковый номер строки с точкой, а

Слайд 112Задачи
«C»: Вводится несколько строк (не более 20), в которых сначала

записаны инициалы и фамилии работников фирмы. Ввод заканчивается пустой строкой.

Отсортировать строки в алфавитном порядке по фамилии.
Пример:
Введите ФИО:
А.Г. Урядников
Б.В. Тепловозов
В.Д. Арбузов
 
Список в алфавитном порядке:
В.Д. Арбузов
Б.В. Тепловозов
А.Г. Урядников
Задачи«C»: Вводится несколько строк (не более 20), в которых сначала записаны инициалы и фамилии работников фирмы. Ввод

Слайд 113Программирование на языке Си
§ 67. Матрицы

Программирование на языке Си§ 67. Матрицы

Слайд 114Что такое матрица?
Матрица — это прямоугольная таблица, составленная из элементов

одного типа (чисел, строк и т.д.). Каждый элемент матрицы имеет

два индекса – номера строки и столбца.

нет знака

нолик

крестик

строка 1, столбец 2

Что такое матрица?Матрица — это прямоугольная таблица, составленная из элементов одного типа (чисел, строк и т.д.). Каждый

Слайд 115Объявление матриц
const int N = 3, M = 4;
int A[N][M];
double

X[10][12];
bool L[N][2];
строки
столбцы
строки
столбцы

Объявление матрицconst int N = 3, M = 4;int A[N][M];double X[10][12];bool L[N][2];строкистолбцыстрокистолбцы

Слайд 116Простые алгоритмы
Заполнение случайными числами:
for ( i = 0; i

N; i++ ) {
for ( j = 0; j

< M; j++ ) {
A[i][j] = irand(20, 80);
printf ( "%3d", A[i][j] );
}
printf ( "\n" );
}

Суммирование:

sum = 0;
for ( i = 0; i < N; i++ )
for ( j = 0; j < M; j++ )
sum += A[i][j];

Простые алгоритмыЗаполнение случайными числами:for ( i = 0; i < N; i++ ) { for ( j

Слайд 117Задачи
«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
Задачи«A»: Напишите программу, которая заполняет квадратную матрицу случайными числами в интервале [10,99], и находит максимальный и минимальный

Слайд 118Задачи
«B»: Яркости пикселей рисунка закодированы числами от 0 до 255

в виде матрицы. Преобразовать рисунок в черно-белый по следующему алгоритму:
вычислить

среднюю яркость пикселей по всему рисунку
все пиксели, яркость которых меньше средней, сделать черными (записать код 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 255 255 255
255 255 0 0
255 0 0 0
Задачи«B»: Яркости пикселей рисунка закодированы числами от 0 до 255 в виде матрицы. Преобразовать рисунок в черно-белый

Слайд 119Задачи
«С»: Заполните матрицу, содержащую N строк и M столбцов, натуральными

числами по спирали и змейкой, как на рисунках:

Задачи«С»: Заполните матрицу, содержащую N строк и M столбцов, натуральными числами по спирали и змейкой, как на

Слайд 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]
}

Перебор элементов матрицыГлавная диагональ:for ( i = 0; i < N; i++ ) { // работаем с

Слайд 121Перестановка строк
2-я и 4-я строки:
for ( j = 0; j

< M; j++ )
{
c = A[2][j];
A[2][j]=

A[4][j];
A[4][j]= c;
}
Перестановка строк2-я и 4-я строки:for ( j = 0; j < M; j++ )  { c

Слайд 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
Задачи«A»: Напишите программу, которая заполняет квадратную матрицу случайными числами в интервале [10,99], а затем записывает нули во

Слайд 123Задачи
«B»: Пиксели рисунка закодированы числами (обозначающими цвет) в виде матрицы,

содержащей N строк и M столбцов. Выполните отражение рисунка сверху

вниз:

«С»: Пиксели рисунка закодированы числами (обозначающими цвет) в виде матрицы, содержащей N строк и M столбцов. Выполните поворот рисунка вправо на 90 градусов:

Задачи«B»: Пиксели рисунка закодированы числами (обозначающими цвет) в виде матрицы, содержащей N строк и M столбцов. Выполните

Слайд 124Программирование на языке Си
§ 68. Работа с файлами

Программирование на языке Си§ 68. Работа с файлами

Слайд 125Как работать с файлами?
файлы
текстовые
двоичные
«plain text»:
текст, разбитый на строки;
из специальных

символов только символы перехода на новую строку
любые символы
рисунки, звуки, видео,


Как работать с файлами?файлытекстовыедвоичные«plain text»: текст, разбитый на строки;из специальных символов только символы перехода на новую строкулюбые

Слайд 126Принцип сэндвича
хлеб
хлеб
начинка
FILE *Fin, *Fout;
Fin = fopen ( "input.txt",

"r" );
Fout = fopen ( "output.txt", "w" );
// здесь

работаем с файлами
fclose (Fin);
fclose (Fout);

файловые переменные-указатели

"r" - чтение
"w" – запись
"a" – добавление

Принцип сэндвичахлебхлебначинкаFILE *Fin, *Fout;  Fin = fopen (

Слайд 127Обработка ошибок
FILE *F;
F = fopen ( "input.txt", "r"

);
if ( F )
{
// здесь работаем с

файлом
}
else
printf("Открыть файл не удалось.");

if ( F != NULL )

Обработка ошибокFILE *F;  F = fopen (

Слайд 128Ввод данных
int a, b;
FILE *Fin;
Fin = fopen("input.txt", "r");

fclose(Fin);
fclose(Fin);
Fin

= fopen("input.txt", "r");
fscanf( Fin, "%d%d", &a, &b );
Переход к началу

открытого файла:

if ( feof(Fin) )
printf("Данные кончились");

Определение конца файла:

eof = end of file, конец файла


Слайд 129Вывод данных в файл
int a = 1, b = 2;
FILE

*Fout;
Fout = fopen("output.txt", "w");

fclose(Fout);
fprintf ( Fout, "%d+%d=%d", a, b, a+b

);
Вывод данных в файлint a = 1, b = 2;FILE *Fout;Fout = fopen(

Слайд 130Чтение неизвестного количества данных
пока не конец файла
// прочитать число

из файла
// добавить его к сумме
Задача. В файле записано

в столбик неизвестное количество чисел. Найти их сумму.

int n, S, x;
S = 0;
while( 1 )
{
n = fscanf ( Fin, "%d", &x );
if ( n < 1 ) break;
S = S + x;
}

при неудачном чтении выход из цикла

Чтение неизвестного количества данныхпока не конец файла // прочитать число из файла // добавить его к суммеЗадача.

Слайд 131Задачи
«A»: Напишите программу, которая находит среднее арифметическое всех чисел, записанных

в файле в столбик, и выводит результат в другой файл.

«B»:

Напишите программу, которая находит минимальное и максимальное среди чётных положительных чисел, записанных в файле, и выводит результат в другой файл. Учтите, что таких чисел может вообще не быть.

«C»: В файле в столбик записаны целые числа, сколько их – неизвестно. Напишите программу, которая определяет длину самой длинной цепочки идущих подряд одинаковых чисел и выводит результат в другой файл.

Задачи«A»: Напишите программу, которая находит среднее арифметическое всех чисел, записанных в файле в столбик, и выводит результат

Слайд 132Обработка массивов
Задача. В файле записано не более 100 целых чисел.

Вывести в другой текстовый файл те же числа, отсортированные в

порядке возрастания.

const int MAX = 100;
int A[MAX];

Обработка массивовЗадача. В файле записано не более 100 целых чисел. Вывести в другой текстовый файл те же

Слайд 133Обработка массивов
Ввод массива:
N = 0;
while ( N

MAX )
{
r = fscanf ( Fin, "%d", &A[N]

);
if ( r < 1 ) break;
N ++;
}
Обработка массивовВвод массива:N = 0;  while ( N < MAX ) { r = fscanf (

Слайд 134Обработка массивов
Вывод результата:
Fout = fopen ( "output.txt", "w" );
for (

i = 0; i < N ; i++ )
fprintf

( Fout, "%d\n", A[i] );
fclose ( Fout );

N

Обработка массивовВывод результата:Fout = fopen (

Слайд 135Задачи
«A»: В файле записано не более 100 чисел. Отсортировать их

по возрастанию последней цифры и записать в другой файл.

«B»: В

файле записано не более 100 чисел. Отсортировать их по возрастанию суммы цифр и записать в другой файл. Используйте функцию, которая вычисляет сумму цифр числа.

«C»: В двух файлах записаны отсортированные по возрастанию массивы неизвестной длины. Объединить их и записать результат в третий файл. Полученный массив также должен быть отсортирован по возрастанию.

Задачи«A»: В файле записано не более 100 чисел. Отсортировать их по возрастанию последней цифры и записать в

Слайд 136Обработка строк
Задача. В файле записано данные о собаках: в каждой

строчке кличка собаки, ее возраст и порода:
Мухтар 4 немецкая овчарка


Вывести в другой файл сведения о собаках, которым меньше 5 лет.

пока не конец файла(Fin)
// прочитать строку из файла Fin
// разобрать строку – выделить возраст
если возраст < 5 то
// записать строку в файл Fout

Обработка строкЗадача. В файле записано данные о собаках: в каждой строчке кличка собаки, ее возраст и порода:Мухтар

Слайд 137Чтение строк из файла
while ( fgets(s, 80, Fin) )
{

// обработать строку s
}
Чтение одной строки:
char s[80];
char *p;
p =

fgets( s, 80, Fin );

строка

размер

файл

Чтение всех строк:

Чтение строк из файлаwhile ( fgets(s, 80, Fin) ) { // обработать строку s }Чтение одной строки:char

Слайд 138Обработка строк
// найти в строке пробел
// удалить из строки кличку

с первым пробелом
// найти в строке пробел
// выделить возраст перед

пробелом
// преобразовать возраст в числовой вид

Разбор строки:

char s[80], *p;
int age;
...
p = strchr ( s, ' ' );
sscanf ( p+1, "%d", &age );

чтение из строки

строка (адрес)

Мухтар 4 немецкая овчарка

p+1

не влияет!

Обработка строк// найти в строке пробел// удалить из строки кличку с первым пробелом// найти в строке пробел//

Слайд 139Задачи
«A»: В файле записаны данные о результатах сдачи экзамена. Каждая

строка содержит фамилию, имя и количество баллов, разделенные пробелами:

<Количество баллов>
Вывести в другой файл фамилии и имена тех учеников, которые получили больше 80 баллов.

«B»: В предыдущей задаче добавить к полученному списку нумерацию, сократить имя до одной буквы и поставить перед фамилией:
П. Иванов
И. Петров
...
Задачи«A»: В файле записаны данные о результатах сдачи экзамена. Каждая строка содержит фамилию, имя и количество баллов,

Слайд 140Задачи
«C»: В файле записаны данные о результатах сдачи экзамена. Каждая

строка содержит фамилию, имя и количество баллов, разделенные пробелами:

<Количество баллов>
Вывести в другой файл данные учеников, которые получили больше 80 баллов. Список должен быть отсортирован по убыванию балла. Формат выходных данных:
П. Иванов 98
И. Петров 96
...
Задачи«C»: В файле записаны данные о результатах сдачи экзамена. Каждая строка содержит фамилию, имя и количество баллов,

Слайд 141Конец фильма
ПОЛЯКОВ Константин Юрьевич
д.т.н., учитель информатики
ГБОУ СОШ № 163, г.

Санкт-Петербург
kpolyakov@mail.ru
ЕРЕМИН Евгений Александрович
к.ф.-м.н., доцент кафедры мультимедийной дидактики и ИТО

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

Слайд 142Источники иллюстраций
www.mcdonalds.com
иллюстрации художников издательства «Бином»
авторские материалы

Источники иллюстрацийwww.mcdonalds.com иллюстрации художников издательства «Бином»авторские материалы

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика