Слайд 2КГТУ (КАИ), кафедра АСОИУ
Последовательная обработка данных
Задача 4.1. Задана непустая числовая последовательность.
Определить, является ли последовательность знакочередующейся.
Тест1. Вход: -5 3.1 -2 1 -7
Выход: Знаки чередуются.
Тест2. Вход: -5 3.1 2 -1 7
Выход: Знаки не чередуются.
Используем алгоритм 3.3. для обработки последовательности.
Слайд 3КГТУ (КАИ), кафедра АСОИУ
Последовательная обработка данных
Одного текущего элемента последовательности недостаточно, будем
сохранять два соседних элемента:
xpred – предыдущий элемент последовательности,
x – текущий элемент последовательности.
При обработке последовательности необходимо искать нарушение знакочередования.
Используем дополнительную переменную
flag – признак знакочередования.
flag = 1 - знаки чередуются, 0 – нет,
инициализация: flag =1.
Слайд 4КГТУ (КАИ), кафедра АСОИУ
Последовательная обработка данных
/* Программа 4.1. Знакочередование последовательности чисел
*/
#include
void main(void)
{ float xpred, x; /* предыдущее и текущее числа */
int flag = 1; /* flag = 1 - знаки чередуются, 0 - нет */
scanf("%f", &xpred) ;
while( scanf("%f", &x)>0)
{ if (xpred * x >= 0) flag = 0;
xpred = x;
}
if (flag) printf ("\n Знаки чередуются. ");
else printf ("\n Знаки не чередуются. ");
}
Слайд 5КГТУ (КАИ), кафедра АСОИУ
Введение в программирование
ПОСЛЕДОВАТЕЛЬНАЯ
ОБРАБОТКА СИМВОЛОВ
Слайд 6КГТУ (КАИ), кафедра АСОИУ
Последовательная обработка символов
Значением символьного типа является одиночный символ.
В
языке C символьные данные рассматриваются как разновидность целых чисел. Числовым значением символа является его код.
В языке C над символами разрешаются не только операции присваивания и сравнения, но и арифметические операции.
В международном стандарте ASCII код символа обычно занимает один байт, но иногда и два байта (в международном коде UNICODE).
Слайд 7КГТУ (КАИ), кафедра АСОИУ
Последовательная обработка символов
Примеры символьных констант:
‘*’ ‘a’ ‘5’ ‘n’
Специальные (управляющие) символьные константы:
'\n' Новая
строка (new line),
'\t' '\v' Табуляция горизонтальная, вертикальная,
'\b' Возврат на шаг (backspace),
'\\' - \ (обратный слэш), '\'' - ‘ (апостроф), '\"' - " (кавычка),
'\0' Нулевой символ (байт с нулевым кодом).
Объявление символьных переменных
char <имя> [,<имя>]…; или int <имя> [,<имя>]…; Например:
char s, sim = ‘Z’, c;
Слайд 8КГТУ (КАИ), кафедра АСОИУ
Последовательная обработка символов
Кодировка цифровых символов:
'0' = 48
'1'
= '0' + 1 = 49
'2' = '0' + 2 = 50
. . .
'9' = '0' + 9 = 57
Отсюда соотношения:
Код цифры = '0' + Значение цифры
Значение цифры = Код цифры - '0'
Условие
"значение символьной переменой s является цифрой"
на языке C запишется так:
s >= '0' && s <= '9'
Слайд 9КГТУ (КАИ), кафедра АСОИУ
Последовательная обработка символов
Коды заглавных латинских букв возрастают по алфавиту:
'A'
< 'B' < ... < 'Z' ,
Коды строчных латинских букв возрастают:
'a' < 'b' < ... < 'z'.
Условие
"значение символьной переменой s является латинской буквой"
можно записать так:
(s>='A' && s<='Z') || (s>='a' && s<='z')
Слайд 10КГТУ (КАИ), кафедра АСОИУ
Последовательная обработка символов
char s; ( или int s; )
Ввод
символа из стандартного входного файла (клавиатуры) в переменную s:
scanf ("%с", &s);
можно заменить присваиванием
s = getchar ();
Функция getchar() вводит очередной символ из стандартного входного файла и возвращает в виде значения код этого символа.
Слайд 11КГТУ (КАИ), кафедра АСОИУ
Последовательная обработка символов
Ввод символа часто пишется внутри условия в
операторах if, while, do-while и for.
Например, цикл ввода символов до конца файла
Ввод s;
while(s!= конец файла)
{ Обработка s;
Ввод s;
}
может иметь вид
while ((s=getchar()) != EOF)
Обработка s;
Слайд 12КГТУ (КАИ), кафедра АСОИУ
Последовательная обработка символов
Символическая константа EOF - код конца
файла (после нажатия клавиш Ctrl-Z или Ctrl-z, затем Enter).
Вывод символа s в стандартный выходной файл (на экран)
printf ("%c", s);
эквивалентен оператору
putchar (s);
Стандартный входной и выходной файлы, вместо клавиатуры и экрана, можно переадресовать на любой файл магнитного диска.
Слайд 13КГТУ (КАИ), кафедра АСОИУ
Коды символов
Задача 4.2. Вывести коды введенных с клавиатуры символов.
Последовательность завершается нажатием клавиши Esc.
Тест. Вход: Kazan 2007
Выход: K=82, a=97, z=122, a=97, n= 110, =32, 2=50, 0=48, 0=48, 7=55, ⭠ = 27
Слайд 14КГТУ (КАИ), кафедра АСОИУ
Коды символов
/* Программа 4.2. Коды символов */
#include
#include
main()
{
int sim;
printf("\n Введи текст, завершив клавишей Esc\n");
do
{ sim=getch(); putchar(sim);
printf("=%d, ",sim);
} while( sim!=27);
puts(" Нажми любую клавишу"); getch();
return 0;
}
Слайд 15КГТУ (КАИ), кафедра АСОИУ
Последовательная обработка символов
Подсчет строк, слов и символов
Задача 4.3.
Составить программу подсчета во входном тексте количества строк, слов и символов.
Словом считается любая последовательность символов, не содержащая пробелов, символов табуляции и новой строки. Строка заканчивается символом новой строки.
Тест. Вход:
Если друг оказался вдруг
И не друг, и не враг, а так.
Выход:
Строк: 2, слов: 12, символов: 53.
Количество символов считаем сразу после ввода, количество строк – по количеству символов ‘\n’, а количество слов – при вводе символа не разделителя, перед которым был разделитель. Используем для этого флаг разделителя.
Слайд 16КГТУ (КАИ), кафедра АСОИУ
Пояснения к программе
switch (переключить) - оператор переключателя для организации
многовариантного ветвления.
switch (выражение)
{ [ case цел-конст-выраж: [оператор...]]...
[ default: оператор...]
[ case цел-конст-выраж: [оператор...]]...
}
case (случай) - вариант ветвления, можно пометить целой или символьной константой (или константным выражением).
Вычисляется значение выражения. Переключатель осуществляет переход к одному из вариантов case, константное выражение которого совпадает с вычисленным значением, или к метке default (умолчание), если не совпадает ни с одной из констант вариантов ветвления.
Каждый вариант обычно заканчивается оператором break.
Слайд 17КГТУ (КАИ), кафедра АСОИУ
Последовательная обработка символов
/* Программа 4.3. Подсчет строк, слов и
символов */
/* текст ::= символ… */
/* символ ::= разделитель | символ-слова */
/* разделитель ::= пробел | новая-строка | табуляция */
/* | конец-файла */
/* символ-слова - любой символ, кроме разделителей */
#include
#define DA 1
#define NET 0
void main ()
{ int sim; /* Текущий символ (int для EOF) */
int kstr, ksl, ksim; /* Кол-во строк, слов и символов */ int razdel; /* Флаг символа - разделитель */
razdel = DA; /* 1-й символ текста - начальный */