- •Введение
- •1. ТИПЫ ДАННЫХ И ОПЕРАТОРЫ
- •1.1. Переменные и базовые типы данных
- •1.2. Операции и выражения
- •1.3. Символические константы
- •1.5. Несколько слов о функции main()
- •2. ВВОД И ВЫВОД В СИ
- •2.2. Форматный ввод-вывод
- •3. ЦИКЛЫ И ОПЕРАТОРЫ СРАВНЕНИЯ
- •3.1. Условный оператор
- •3.2. Оператор выбора switch
- •3.3. Операторы цикла
- •3.4. Операторы break и continue
- •3.5. Примеры
- •3.6. Вычисление значений элементарных функций
- •3.7. Задачи
- •4. ОБРАБОТКА ПОСЛЕДОВАТЕЛЬНОСТЕЙ
- •4.1. Примеры
- •4.2. Задачи
- •5. ОДНОМЕРНЫЕ МАССИВЫ
- •5.1. Начальные сведения о массивах
- •5.2. Примеры работы с массивами
- •5.3. Задачи
- •6. МНОГОМЕРНЫЕ МАССИВЫ
- •6.1. Определение и инициализация двумерных массивов
- •6.2. Примеры с двумерными массивами
- •6.3. Задачи
- •7. УКАЗАТЕЛИ И МАССИВЫ
- •7.1. Указатели и адреса
- •7.2. Указатели и аргументы функций
- •7.3. Указатели и массивы
- •7.4. Операции с указателями
- •7.5. Указатели с типом void
- •7.6. Модификатор const
- •7.7. Массивы переменного размера
- •7.8. Массивы указателей
- •7.9. Двумерные массивы переменного размера
- •8. СИМВОЛЫ И СТРОКИ
- •8.1. Представление символьной информации в ЭВМ
- •8.2. Библиотека обработки символов
- •8.3. Строки в языке Си
- •8.4. Функции обработки строк
- •8.5. Функции преобразования строк
- •8.6. Примеры работы со строками
- •8.7. Разбиение строки на лексемы
- •8.8. Задачи
- •9. СТРУКТУРЫ
- •9.1. Основные сведения о структурах
- •9.2. Объединения
- •10. ДИРЕКТИВЫ ПРЕПРОЦЕССОРА
- •10.1. Директива #include
- •10.2. Директива #define
- •10.3. Директива #undef
- •10.4. Условная компиляция
- •11. ФУНКЦИИ
- •11.1. Основные сведения о функциях
- •11.2. Прототипы функций
- •11.3. Классы памяти
- •11.4. Указатели на функции
- •11.5. Рекурсия
- •11.6. Примеры с использованием рекурсии
- •11.7. Метод «разделяй и властвуй»
- •11.8. Задачи на применение рекурсии
- •12. РАБОТА С БИТАМИ ПАМЯТИ
- •12.1. Битовые операции
- •12.2. Примеры с использованием битовых операций
- •12.3. Задачи
- •13. РАБОТА С ФАЙЛАМИ
- •13.1. Файлы и потоки
- •13.2. Текстовые файлы
- •13.3. Двоичные файлы
- •13.4. Шифрование файлов
- •13.5. Задачи на текстовые файлы
- •13.6. Задачи на двоичные файлы
- •14. СТРУКТУРЫ ДАННЫХ
- •14.1. Односвязные списки
- •14.2. Примеры работы с односвязными списками
- •14.3. Задачи на односвязные списки
- •14.4. Стеки, очереди
- •14.5. Задачи на стеки и очереди
- •14.6. Двусвязные списки
- •14.7. Задачи на двусвязные списки
- •14.8. Бинарные деревья
- •14.9. Примеры с использованием бинарных деревьев
- •14.10. Задачи на бинарные деревья
- •Приложение 1. АЛГОРИТМЫ ПОИСКА
- •1. Линейный поиск
- •2. Поиск с барьером
- •3. Двоичный поиск
- •Приложение 2. АЛГОРИТМЫ СОРТИРОВКИ
- •Несколько слов о сложности алгоритмов
- •1. Метод прямого выбора
- •2. Метод прямого включения
- •3. Пузырьковая сортировка
- •4. Шейкерная сортировка
- •5. Быстрая сортировка
- •6. Сортировка подсчетом
- •Приложение 3. СОРТИРОВКА ИНДЕКСОВ И УКАЗАТЕЛЕЙ
- •1. Сортировка индексов на основе метода прямого выбора
- •2. Сортировка индексов на основе пузырьковой сортировки
- •3. Сортировка индексов на основе быстрой сортировки
- •4. Сортировка двумерных массивов
- •5. Сортировка строк
- •Приложение 4. СОРТИРОВКА ФАЙЛОВ И СПИСКОВ
- •1. Сортировка двоичных файлов
- •2. Сортировка линейных списков
- •Приложение 5. СОРТИРОВКА С УСЛОВИЕМ
- •1. Сортировка с условием на базе пузырьковой сортировки
- •2. Сортировка с условием на базе быстрой сортировки
- •3. Сортировка с условием двоичных файлов
- •4. Сортировка с условием линейного списка на базе пузырьковой сортировки
- •5. Сортировка с условием линейного списка на базе быстрой сортировки
- •ЛИТЕРАТУРА
4. ОБРАБОТКА ПОСЛЕДОВАТЕЛЬНОСТЕЙ
Последовательность данных не всегда нужно сохранять в памяти. Последовательность можно обрабатывать по мере поступления ее элементов: при чтении файла, при вводе некоторых данных
склавиатуры и т.д.
Вданном разделе рассматриваются задачи, в которых элементы числовой последовательности по одному вводятся с клавиатуры. Признаком завершения числовой последовательности будем считать число 0, которое не является ее элементом.
4.1. Примеры
Пример 1. Подсчитать количество минимальных элементов последовательности действительных чисел.
#include <stdio.h> |
|
|
int main( ) |
|
|
{ |
|
|
double a, |
/* значение текущего элемента последовательности */ |
|
min; |
/* минимальный элемент последовательности |
*/ |
int n = 0; |
/* количество минимальных элементов |
*/ |
printf("a = "); |
|
|
scanf("%lf", &a); |
|
|
min = a; |
/* начальное значение минимального элемента |
*/ |
while (a != 0)
{
if (a == min) n++;
else
if (a < min)
{
/* если введенный элемент оказался меньше всех предыдущих */ /* элементов последовательности, тогда переопределяем min и n */ min = a;
n = 1;
48
}
printf("a = "); scanf("%lf", &a);
}
printf("n = %d\n", n); return 0;
}
Пример 2. В последовательности целых чисел найти максимальное количество положительных элементов, идущих подряд.
В программе ниже в качестве начального значения переменной max (максимальное количество подряд идущих положительных элементов) берется значение 0, так как максимум ищется среди неотрицательных элементов. Если же требуется найти минимум или максимум среди всех элементов некоторого конечного множества, элементами которого являются произвольные числа, то ни в коем случае нельзя в качестве начального значения для min и max брать излюбленное начинающими программистами число 0. Для этого случая имеется масса подходов, например в качестве начального значения можно взять произвольный элемент рассматриваемого множества.
#include <stdio.h> |
|
|
int main( ) |
|
|
{ |
|
|
int a, |
/* значение текущего элемента последовательности |
*/ |
n, |
/* количество подряд идущих положительных элементов */ |
|
max; /* макс. количество подряд идущих полож. элементов |
*/ |
|
max = 0; /* начальное значение максимума */ |
|
printf("a = "); scanf("%d", &a); while (a != 0)
{
n=0;
/* считаем количество подряд идущих положительных элементов */ while (a > 0)
{
49
n++; printf("a = ");
scanf("%d", &a);
}
if (n > max) max = n;
/* пробегаем все подряд идущие отрицательные элементы */ while (a < 0)
{
printf("a = "); scanf("%d", &a);
}
}
printf("max = %d\n", max); return 0;
}
Наглядность применения именно вложенных циклов, которые пробегают целые серии элементов, обладающих тем или иным свойством, как в предыдущем примере, показывают следующие примеры.
Пример 3. Пусть имеется последовательность целых чисел. Требуется вывести длины всех серий подряд идущих положительных и подряд идущих отрицательных элементов.
/* вариант с вложенными циклами */ |
/* вариант без вложенных циклов */ |
#include <stdio.h> |
#include <stdio.h> |
int main( ) |
int main( ) |
{ |
{ |
int a, n; |
int a, n_plus, n_minus; |
n = 0; |
n_minus = n_plus = 0; |
printf("a = "); |
printf("a = "); |
scanf("%d", &a); |
scanf("%d", &a); |
while (a != 0) |
while (a != 0) |
{ |
{ |
while (a > 0) |
if (a > 0) |
50
{ |
{ |
n++; |
n_plus++; |
printf("a = "); |
if (n_minus > 0) |
scanf("%d", &a); |
{ |
} |
printf("-: %d\n", n_minus); |
if (n > 0) |
n_minus = 0; |
{ |
} |
printf("+: %d\n", n); |
} |
n = 0; |
else |
} |
{ |
while (a < 0) |
n_minus++; |
{ |
if (n_plus > 0) |
n++; |
{ |
printf("a = "); |
printf("+: %d\n", n_plus); |
scanf("%d", &a); |
n_plus = 0; |
} |
} |
if (n > 0) |
} |
{ |
printf("a = "); |
printf("-: %d\n", n); |
scanf("%d", &a); |
n = 0; |
} |
} |
/*после цикла нужна еще одна проверка*/ |
} |
if (n_minus > 0) |
return 0; |
printf("-: %d\n", n_minus); |
} |
if (n_plus > 0) |
|
printf("+: %d\n", n_plus); |
|
return 0; |
|
} |
Пример 4. В последовательности целых чисел найти длины участков строгой монотонности. Например, в последовательности 1, 2, 3, 2, 2 имеются два участка строгой монотонности, а именно 1,
2, 3 и 3, 2.
#include <stdio.h> int main( )
{
int a, /* значение предыдущего элемента последовательности */
51
b, |
/* значение текущего элемента последовательности |
*/ |
n; |
/* длина участка строгой монотонности |
*/ |
printf("a = "); scanf("%d", &a); if (a != 0)
{
n = 1; printf("b = ");
scanf("%d", &b); while (b != 0)
{
/* участок монотонного возрастания */ while (b != 0 && b > a)
{
n++; a = b;
printf("b = "); scanf("%d", &b);
}
if (n > 1)
{
printf ("n = %d\n", n); n = 1;
}
/* участок монотонного убывания */ while (b != 0 && b < a)
{
n++; a = b;
printf("b = "); scanf("%d", &b);
}
if (n > 1)
{
printf ("n = %d\n", n); n = 1;
}
52