- •Предисловие
- •Знакомство с языком C
- •Структура программы
- •Пример простой программы
- •Более сложный пример
- •Контрольные вопросы
- •Основные понятия, объявление переменных, типы данных
- •Объявление переменных
- •Примеры описаний переменных:
- •Основные типы данных
- •Производные типы.
- •Контрольные вопросы
- •Ввод/вывод с помощью функций printf() и scanf().
- •Модификаторы спецификаций преобразования используемые в функции printf()
- •Применение функции scanf()
- •Контрольные вопросы
- •Операции
- •Простейшие арифметические операции
- •Операция присваивания
- •Использование в выражениях операндов разных типов
- •Операции преобразования типов
- •Дополнительные арифметические операции
- •Дополнительные операции присваивания
- •Операции отношения
- •Логические операции
- •Приоритеты операций
- •Таблица 3. Таблица приоритетов рассмотренных выше операций
- •Контрольные вопросы
- •Операторы
- •Оператор-выражение
- •Ветвление
- •Условный оператор
- •Оператор switch
- •Оператор break
- •Циклы
- •Цикл while
- •Цикл do…while
- •Цикл for
- •Другие операторы
- •Оператор continue
- •Оператор goto
- •Оператор вызова функции
- •Контрольные вопросы
- •Обработка числовых последовательностей
- •Последовательная обработка
- •Обработка числовых последовательностей
- •Примеры
- •Контрольные вопросы
- •Последовательная обработка символьных данных
- •Символьные данные
- •Последовательная обработка символов
- •Функции getchar( ) и putchar( )
- •Контрольные вопросы
- •Обработка массивов
- •Массивы
- •Объявление массива
- •Использование и обработка массивов
- •Примеры
- •Контрольные вопросы
- •Указатели и динамические массивы
- •Указатели
- •Динамическое выделение памяти
- •Статические и динамические массивы
- •Контрольные вопросы
- •Подпрограммы
- •Описание подпрограмм
- •Параметры подпрограмм
- •Область действия переменных
- •Примеры
- •Контрольные вопросы
- •Рекурсивные функции
- •Понятие рекурсивной функции
- •Контрольные вопросы
- •Символьные строки и функции обработки строк
- •Посимвольная обработка строк
- •Пример программы
- •Контрольные вопросы
- •Структуры
- •Тип данных структура
- •Контрольные вопросы
- •Работа с файлами
- •Примеры
- •Контрольные вопросы
- •Массивы и функции как параметры
- •Указатели на функции
- •Массивы и указатели
- •Указатели и двумерные массивы
- •Пример
- •Технологии программирования
- •Структурное программирование
- •Модульное программирование
- •Объектно-ориентированное программирование
- •Компонентное программирование
- •Структурная декомпозиция задачи и разработка алгоритмов и программ методами сверху вниз и снизу вверх
- •Контрольные вопросы
- •Модульное программирование
- •Работа с графикой на языке C и модуль graphics.h
- •Типы видео мониторов и их режимы
- •Инициализация графики
- •Система координат
- •Основные графические функции
- •Функции рисования
- •Функции изменения параметров рисования
- •Шаблоны линий
- •Шаблоны закраски
- •Задание на расчетно-графическую работу
- •Порядок выполнения работы
- •Задание
- •Задание для вариантов 1-11
- •Задание для вариантов 12-20
- •Задание для вариантов 21-40
- •Пример исходных данных для вариантов 12-16
- •Задание для вариантов 41-60
- •Варианты индивидуальных заданий
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •Вариант 6
- •Вариант 7
- •Вариант 8
- •Вариант 9
- •Вариант 10
- •Вариант 11
- •Вариант 12
- •Вариант 13
- •Вариант 14
- •Вариант 15
- •Вариант 16
- •Вариант 17
- •Вариант 18
- •Вариант 19
- •Вариант 20
- •Вариант 21
- •Вариант 22
- •Вариант 23
- •Вариант 24
- •Вариант 25
- •Вариант 26
- •Вариант 27
- •Вариант 28
- •Вариант 29
- •Вариант 30
- •Вариант 31
- •Вариант 32
- •Вариант33
- •Вариант 34
- •Вариант 35
- •Вариант 36
- •Вариант 37
- •Вариант 38
- •Вариант 39
- •Вариант 40
- •Вариант 41
- •Вариант 42
- •Вариант 43
- •Вариант 44
- •Вариант 45
- •Вариант 46
- •Вариант 47
- •Вариант 48
- •Вариант 49
- •Вариант 50
- •Вариант 51
- •Вариант 52
- •Вариант 53
- •Вариант 54
- •Вариант 55
- •Вариант 56
- •Вариант 57
- •Вариант 58
- •Вариант 59
- •Вариант 60
- •Задания на курсовую работу
- •Требования к курсовой работе
- •Этапы разработки программ
- •Содержание отчета по курсовой работе
- •Задания к курсовой работе
- •Литература
- •Функции консольного ввода/вывода
- •Функции обработки строк
- •Функции преобразования данных
Обработка числовых последовательностей
Последовательная обработка
Вряде задач применяется последовательная обработка данных, если:
1.необходимо вводить и обрабатывать последовательность элементов исходных данных в том порядке, в каком она размещена в файле на внешнем носителе;
2.каждый элемент последовательности используется не более одного
раза.
Такие задачи называют (однопроходной) последовательной обработкой данных. В этом случае не требуется хранения сразу всех элементов. Достаточно иметь одну переменную, содержащую текущий (очередной) элемент входной последовательности.
Внекоторых случаях используются несколько текущих элементов (например, два-три соседних).
Элементами данных последовательности могут быть:
-числа;
-символы, строки;
-записи файла и др.
Последовательность исходных данных может задаваться:
1.с указанием количества элементов;
2.с признаком конца последовательности;
3.обрабатываться до конца входного файла.
Обработка числовых последовательностей
22.Числовая последовательность задается с указанием количества вводимых чисел:
n, A1 , A2 , ..., An .
53
На языке С процесс обработки можно записать с помощью оператора цикла while или лучше оператора цикла for:
а)
scanf("%d", &n); i=1;
while (i<=n)
{
scanf ("%f", &a);
/* обработка a */
. . .
i++;
}
б)
scanf ("%d", &n); for (i=1; i<=n; i++)
{
scanf ("%f", &a); /* обработка a */
. . .
}
В этих фрагментах предполагается, что переменная a вещественного типа (float), поэтому указан формат %f. Если же последовательность состоит из целых чисел типа int, то следует выбрать формат %d.
Обработка очередного числа может иметь линейную структуру (состоять из нескольких последовательно выполняемых операторов) или структуру ветвления, которая программируется с помощью оператора if.
23.Последовательность задается в виде
A1 , A2 , ... , An , W
(n заранее неизвестно, W - признак конца последовательности), тогда процесс обработки в общем виде можно представить одной из двух схем, представленных на рис. 5.2.
Фрагменты программ на языке С, соответствующие этим схемам: а)
scanf ("%f", &a); do
{/* обработка a */
. . .
scanf ("%f", &a);
54
}
while (a!=W);
б)
scanf ("%f", &a); while (a!=W)
{/* обработка a */
. . .
scanf ("%f", &a);
}
W - символическая константа, которая должна быть определена с помощью директивы #define. Если а принимает целые значения, формат в операторе ввода нужно поменять на %d.
24.Входная последовательность A1, A2, ... , An продолжается до конца входного файла, n - неизвестное заранее количество элементов (n >=0), признак конца отсутствует.
Ввод A;
While (не конец входного файла)
{Обработка A;
Ввод A;
}
Конец файла при вводе с клавиатуры задается комбинацией клавиш
Ctrl-Z и Enter.
В программе на языке С конец входного файла можно обнаружить после попытки ввода данных за пределами файла.
Например, значением функции scanf() является количество фактически введенных элементов. Если не удалось ввести ни одного элемента, значение функции равно константе EOF, определенной в файле stdio.h как число -1.
Иногда в языке C можно обойтись одной операцией ввода A, поместив ее внутри условия цикла.
while (ввод A и A != W)
Обработка A;
или
while (ввод A и не конец входного файла) Обработка A;
55
Фрагмент программы на С:
while (scanf(“%f”, &A) != EOF)
{/* обработка A */
. . .
}
Примеры
Задача 1. Даны целые числа n, A1 ,A2 , ... ,An . Вычислить сумму тех чисел последовательности, которые удовлетворяют условию |Ai | < i2.
Тесты для проверки программы:
|
№ |
|
n |
Исходная последовательность |
|
Ожидаемый результат |
|
|||
|
п/п |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
|
6 |
|
1 -2 3 16 -5 40 |
|
|
сумма=-4 |
|
|
|
2 |
|
4 |
|
-1 5 10 -20 |
|
|
сумма=0 |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
Программа: |
|
|
|
|
|
|||
|
|
#include <stdio.h> |
|
|
|
|
|
|||
|
|
#include <math.h> |
|
|
|
|
|
|||
|
|
main() |
|
|
|
|
|
|
||
|
|
{ |
int |
n; |
/* количество чисел |
*/ |
|
|||
|
|
|
|
|||||||
|
|
|
int |
a, |
/* очередное число |
*/ |
|
|||
|
|
|
|
|
s=0, |
/* сумма |
|
|
*/ |
|
|
|
|
|
|
i; |
/* порядковый номер числа в |
||||
последовательностити */ |
|
|
|
|
|
|||||
|
|
|
printf ("\nВведите количество чисел: "); |
|||||||
|
|
|
scanf ("%d", &n); |
|
последовательность:\n"); |
|||||
|
|
|
printf ("Введите числовую |
|||||||
|
|
|
for (i=1; i<=n; i++) |
|
|
|
|
|||
|
|
{ |
scanf ("%d", &a); |
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
if (abs(a) < i*i) s=s+a;
}
printf ("сумма=%d\n", s); return 0;
}
Результаты тестирования программы:
Введите |
количество чисел: 6 |
||
Введите |
числовую |
последовательность: |
|
1 -2 |
3 16 |
-5 |
40 |
сумма=-4 |
|
|
|
Введите |
количество чисел: 4 |
||
Введите |
числовую |
последовательность: |
56
-1 5 10 -20
сумма=0
Задача 2. Дана последовательность чисел в виде A1, A2, ... , An, W. (W=0). Определить сумму и среднее арифметическое значение элементов A1,
A2, ... , An. |
|
Тест. Вход: |
2 3.5 1.5 5 0 |
Выход: |
Сумма = 12.00 |
|
Среднее арифметическое = 3.00 |
Используем алгоритм, представленный на рис. 5.2 б, для определения суммы элементов числовой последовательности. Для вычисления среднего арифметического значения последовательности необходимо подсчитать не только сумму, но и количество элементов.
Программа:
#include <stdio.h> |
0 |
/* признак конца |
|
||
#define |
W |
|
|||
последовательности */ |
|
|
|
||
main( ) |
|
|
|
|
|
{ |
a, |
|
|
/* текущее число |
|
float |
|
|
|
||
*/ |
s = 0; |
|
/* |
сумма чисел |
*/ |
|
|
||||
int n = 0; |
|
/* |
количество чисел |
*/ |
printf("\n Введите последовательность чисел, заканчивающуюся нулем\n");
scanf ("%f", &a); while (a != W)
{ s += a; n++;
scanf("%f", &a);
}
if (n != 0)
{printf ("Сумма = %.2f\n", s);
printf ("Среднее арифметическое = %.2f\n ", s/n);
}
else printf ("Пустая последовательность"); return 0;
}
Результаты тестирования программы:
Введите последовательность |
чисел, заканчивающуюся нулем |
|||
2 |
3.5 |
1.5 |
5 |
0 |
57
Сумма = 12.00
Среднее арифметическое = 3.00
Введите последовательность чисел, заканчивающуюся нулем
0
Пустая последовательность
Задача 3. Дана числовая последовательность. Конец ввода данных отмечается нажатием клавиш Ctrl – Z (конец файла). Определить наибольшее число последовательности.
Тесты:
№ |
|
Исходная последовательность |
Ожидаемый результат |
||
п/п |
|
|
|
|
|
|
|
|
|
|
|
1 |
|
1 |
-2 |
16.5 -5.3 40 |
Максимум = 40 |
2 |
|
-1 |
15.5 |
10 |
Максимум = 15.5 |
3 |
|
5 |
-7 |
2.5 |
Максимум = 5 |
Используем алгоритм 5.3. для обработки последовательности. Используем следующие переменные:
а– текущий элемент последовательности,
max – максимум просмотренной части последовательности.
Для нахождения максимума используем следующий метод. Начальное значение max равно первому члену последовательности. На каждом шаге цикла вводим одно очередное число и, если оно оказывается больше max, то переменной max присваивается это число.
Программа:
/* |
Определение максимального элемента |
*/ |
|
/* |
числовой последовательности |
*/ |
|
#include <stdio.h> |
|
|
|
main( ) |
/* Текущее число, текущий максимум |
||
{ |
float a, max; |
||
|
*/ |
/* Количество введенных чисел |
|
|
int k; |
*/ |
|
|
printf ("\nВведите последовательность чисел\n"); |
числа |
|
k = scanf("%f", &max); |
/* ввод 1-го |
|
*/ |
|
пуста\n"); |
if (k < 1) printf ("\nВходная последовательность |
||
else |
|
|
{while (scanf("%f", &x) != EOF )
if (x > max) max = x; printf ("\nМаксимум= %f\n", max);
}
58
return 0;
} |
|
|
|
|
|
|
|
|
|
|
Задача 4. Задана числовая последовательность, содержащая не менее |
||||||||
двух |
элементов. |
Определить, |
является |
ли |
последовательность |
||||
знакочередующейся. |
|
|
|
|
|
|
|
||
|
Тест 1. |
Вход: |
-5 |
3.1 |
-2 |
1 -7 |
|
|
|
|
Выход: |
Знаки чередуются. |
|
|
|
|
|||
|
Тест 2. |
Вход: |
-5 |
3.1 |
-2 |
-1 7 |
|
|
|
|
Выход: |
Знаки не чередуются. |
|
|
|
Используем алгоритм 5.3. для обработки последовательности. Но одного текущего элемента последовательности недостаточно, будем сохранять два соседних текущих элемента:
аpred – предыдущий элемент последовательности,
а– текущий элемент последовательности.
При обработке последовательности необходимо искать нарушение чередования знаков (например, по значению произведения двух соседних элементов). Используем дополнительную переменную flag:
flag = 1 – последовательность знакочередующаяся, 0 – нет, инициализация: flag =1.
Программа:
#include <stdio.h> |
|
|
||
main( ) |
apred, a; |
/* предыдущее и текущее числа |
||
{ |
float |
|||
|
int |
*/ |
|
/* признак знакочередования |
|
flag = 1; |
|
||
|
*/ |
|
|
/* flag=1- знаки чередуются, 0 – |
нет |
*/ |
|
|
|
|
|
|
||
printf ("\nВведите последовательность чисел\n"); |
||||
scanf("%f", &apred); |
|
|
||
|
while( scanf("%f", &a)>0) |
|||
|
{ if (apred * a >= 0) flag = 0; |
|||
|
} |
apred = a; |
|
|
|
|
printf ("Знаки чередуются."); |
||
|
if (flag) |
|||
|
else |
printf ("Знаки не чередуются."); |
||
} |
|
return 0; |
|
|
|
|
|
|
59