Подсчет строк, слов и символов

Лекция 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; Мы поможем в написании вашей работы!

Поделиться с друзьями:




Мы поможем в написании ваших работ!