Подсчет строк, слов и символов
Лекция 6. Последовательная обработка символов
Последовательная обработка числовых и символьных данных.
Последовательная обработка символов
Значением символьного типа является одиночный символ. В языке C символьные данные рассматриваются как разновидность целых чисел. Числовым значением символа является его код.
В языке C над символами разрешаются не только операции присваивания и сравнения, но и арифметические операции.
Обычно в персональных компьютерах для символов используется американский стандартный код ASCII, ставший и международным стандартом. В ASCII каждый символ занимает один байт, этого достаточно для кодирования 256 различных кодов. Есть кодировки, в которых символ занимает два байта, например, международный код UNICODE.
Примеры символьных констант:
‘*’ ‘a’ ‘5’ ‘n’
Специальные (управляющие) символьные константы:
'\n' новая строка (new line),
'\t' '\v' табуляция горизонтальная, вертикальная,
'\b' возврат на шаг (backspace),
'\\' - \ (обратный слэш), '\'' - ‘ (апостроф), '\"' - " (кавычка),
'\0' нулевой символ (байт с нулевым кодом).
Объявление символьных переменных имеет вид:
char <имя> [,<имя>]…; или int <имя> [,<имя>]…;
Например: char s, sim = ‘Z’, c;
Кодировка цифровых символов (символ и его числовой код):
|
|
'0' = 48
'1' = '0' + 1 = 49
'2' = '0' + 2 = 50
. . .
'9' = '0' + 9 = 57
Отсюда соотношения:
Код цифры = '0' + Значение цифры
Значение цифры = Код цифры - '0'
Условие "значение символьной переменой s является цифрой" на языке C запишется так:
s >= '0' && s <= '9‘
Коды заглавных латинских букв возрастают по алфавиту (но не обязательно подряд):
'A' < 'B' < ... < 'Z' ,
Коды строчных латинских букв возрастают (но также не обязательно подряд):
'a' < 'b' < ... < 'z'.
В кодировке символов ASCII условие "значение символьной переменой s является латинской буквой" можно записать так:
(s>='A' && s<='Z') || (s>='a' && s<='z')
Русские буквы (символы кириллицы) имеются не во всех кодировках и не всегда кодируются по алфавиту.
Ввод и вывод символов
Объявим символьную переменную:
char s; (или int s; )
Ввод символа из стандартного входного файла (клавиатуры) в переменную s:
cin>>s;
можно заменить присваиванием
s = getchar ();
Функция getchar() вводит очередной символ из стандартного входного файла и возвращает в виде значения код этого символа.
Ввод символа часто пишется внутри условия в операторах if, while, do-while и for.
Например, цикл ввода символов до конца файла
Ввод s;
while(s!= конец файла)
{ Обработка s;
|
|
Ввод s;
}
может иметь вид
while ((s=getchar()) != EOF)
Обработка s;
Символическая константа EOF - код конца файла (после нажатия клавиш Ctrl-Z или Ctrl-z, затем Enter). Ее определение зависит от реализации и находится в файле stdio.h. Сравнение s с EOF правильно выполнится во всех реализациях языка C, если s объявлена как int.
Вывод символа s в стандартный выходной файл (на экран)
cout<<s;
можно заменить эквивалентным оператором
putchar (s);
Стандартный входной и выходной файлы, вместо клавиатуры и экрана, можно переадресовать на любой файл магнитного диска.
Задача 8. Вывести коды введенных с клавиатуры символов. Последовательность символов завершается нажатием клавиши Esc.
Тест. Вход: Kazan 2007 <Esc>
Выход:
K=82, a=97, z=122, a=97, n= 110, =32, 2=50, 0=48, 0=48, 7=55, ! = 27
/* Программа 8 . Коды символов */
#include <iostream>
#include<stdio.h>
#include<conio.h>
using namespace std;
int main()
{ int sim;
cout<<"\n BBEDITE TEKST DO Esc\n";
do
{ sim=getch(); putchar(sim);
cout<<"="<<sim;
}
while( sim!=27);
//puts("Нажми любую клавишу");
getch();
return 0;
}
Пояснения к программе.
1. Очередной символ вводится вызовом функции
sim=getch(); // ввод без эхо вывода на экран.
Объявление функции getch() содержится в заголовочном файле <conio.h>.
|
|
2. Вызовы функций putchar() и printf() выводят символ:
putchar(sim); // вывод в виде символа
cout<<"="<<sim; // вывод числового кода символа
3. Функция puts() выводит строку.
Задача 9. Подсчет количества слов в заданном тексте.
Тест.
Вход:
Если друг оказался вдруг и не друг, и не враг, а так.
Выход: Количество слов = 12.
/* Программа 9. Подсчет слов */
/* текст ::= символ… */
/* символ ::= разделитель | символ-слова */
/* разделитель ::= пробел | конец-файла */
/* символ-слова - любой символ, кроме разделителей*/
#include <stdio.h>
void main ()
{ int psim,sim; /*Предыдущий и текущий символ (int для EOF) */
int ksl; /* Кол-во слов */
ksl = 0;
psim=‘ ‘; /*фиктивный символ */
while ((sim = getchar()) != EOF)
{ if (psim==‘ ‘ && sim!=‘ ‘)
ksl++;
psim=sim;
}
cout<<"Слов:\n"<< ksl<<” “<< ksim;
}
Подсчет строк, слов и символов
Задача 10. Составить программу подсчета во входном тексте количества строк, слов и символов.
Словом считается любая последовательность символов, не содержащая пробелов, символов табуляции и новой строки. Строка заканчивается символом новой строки.
|
|
Тест. Вход:
Если друг оказался вдруг
И не друг, и не враг, а так.
Выход:
Строк: 2, слов: 12, символов: 53.
Количество символов считаем сразу после ввода, количество строк – по количеству символов ‘\n’, а количество слов – при вводе символа не разделителя, перед которым был разделитель. Для этого используем флаг разделителя.
Для организации многовариантного ветвления удобен оператор switch (переключить) - оператор переключатель.
Оператор switch имеет вид:
switch (выражение)
{ [ case цел-конст-выраж: [оператор...]]...
[ default: оператор...]
[ case цел-конст-выраж: [оператор...]]...
}
Вычисляется значение выражения. Переключатель осуществляет переход к одному из вариантов case, константное выражение которого совпадает с вычисленным значением, или к метке default (умолчание), если не совпадает ни с одной из констант вариантов ветвления.
Ключевое слово case (случай) - вариант ветвления, можно пометить целой или символьной константой (или константным выражением). Каждый вариант обычно заканчивается оператором break.
/* Программа 10. Подсчет строк, слов и символов */
/* символ ::= разделитель | символ-слова */
/* разделитель ::= пробел | новая-строка | табуляция */
/* | конец-файла */
/* символ-слова - любой символ, кроме разделителей */
#include <stdio.h>
#define DA 1
#define NET 0
void main ()
{ int sim; /* Текущий символ (int для EOF) */
int kstr, ksl, ksim; /* Кол-во строк, слов и символов */
int razdel; /* Символ - разделитель */
razdel = DA; /* 1-й символ текста - начальный */
kstr = ksl = ksim = 0;
while ((sim = getchar()) != EOF)
{
ksim++; /* подсчет символов */
switch (sim)
{case '\n':
kstr++; /* подсчет строк */
razdel = DA; break; /* Эту строчку можно убрать! */
case ' ':
case '\t':
razdel = DA; break;
default: /* Символ слова не разделитель */
if (razdel) /* Предыдущий символ - разделитель */
{ razdel = NET; ksl++; } /* подсчет слов */
}
}
cout<<"Строк:”<< kstr <<” слов: “<<ksl<<” символов \n"<<ksim;
}
Дата добавления: 2018-09-23; просмотров: 175; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!