[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Программирование: Разработка и отладка программ


Пример программы для работы с символами

/*
Эта программа предназначена для демонстрации применения функций
"классификации и преобразования символов". Для получения символов
применяются функции getchar и putchar из библиотеки stdio.
  

Задачи программы:

- Считать ввод из stdin 

- Проверить, что все символы - печатаемые
  символы ascii

- Преобразовать все прописные символы строчные

- Удалить лишние пробелы

- Выдать статистику по типам символов

Эта программа демонстрирует применение следующих
функций: 


- getchar


- putchar


- isascii (ctype)


- iscntrl (ctype)


- isspace (ctype)


- isalnum (ctype)


- isdigit (ctype)


- isalpha (ctype)


- isupper (ctype)


- islower (ctype)


- ispunct (ctype)


- tolower (conv)


- toascii ( conv)

*/
  

#include <stdio.h>  /* Стандартный ввод-вывод  */
#include <ctype.h>  /* Функции для определения типа

символов */
  

/* Различные счетчики для статистики */

int asciicnt, printcnt, punctcnt, uppercnt, lowercnt,  

digcnt, alnumcnt, cntrlcnt, spacecnt, totcnt, nonprntcnt, linecnt, tabcnt ;
  

main()
{
  

int ch ; /* Обрабатываемый символ */
char c , class_conv() ;
  

asciicnt=printcnt=punctcnt=uppercnt=lowercnt=digcnt==0;
cntrlcnt=spacecnt=totcnt=nonprntcnt=linecnt=tabcnt=0;
alnumcnt=0;
 

while ( (ch =getchar()) != EOF )
{
 

totcnt++;
c = class_conv(ch) ;
putchar(c);
 

}
printf("Введено %d\n строк", linecnt);
printf(" Распределение символов по категориям:\n");
printf(" TOTAL  ASCII  CNTRL   PUNCT   ALNUM  DIGITS UPPER

LOWER   SPACE   TABCNT\n");
 

printf("%5d %5d %5d %5d %5d %5d %5d %5d %5d %5d\n",totcnt,

asciicnt, cntrlcnt, punctcnt, alnumcnt, digcnt, uppercnt,lowercnt, spacecnt, tabcnt );
 

}
 

char class_conv(ch)
char ch;
{
 

if (isascii(ch)) {
 

asciicnt++;
if ( iscntrl(ch) && ! isspace(ch)) {
 

nonprntcnt++ ;
cntrlcnt++ ;
return(' ');
 

}
else if ( isalnum(ch)) {
 

alnumcnt++;
if (isdigit(ch)){

digcnt++;
return(ch);

}
else if (isalpha(ch)){

if ( isupper(ch) ){

uppercnt++ ;
return(tolower(ch));

}
else if ( islower(ch) ){

lowercnt++;
return(ch);

}
else {

/*
Невозможная ситуация - символ алфавита
должен быть либо строчным, либо прописным.
*/ 

fprintf(stderr,"Ошибка классификации %c \n",ch);
return(NULL);

}

}
else if (ispunct(ch) ){

punctcnt++;
return(ch);

}
else if ( isspace(ch) ){

spacecnt++;
if ( ch == '\n' ){
linecnt++;
return(ch);

}
while ( (ch == '\t' ) || ( ch == ' ' ) ) {
if ( ch == '\t' ) tabcnt ++ ;
else if ( ch == ' ' ) spacecnt++ ;
totcnt++;
ch = getchar();

}
ungetc(ch,stdin);
totcnt--;
return(' ');

}
else {

/*
Невозможная ситуация - любой символ принадлежит одному из классов.
*/
fprintf(stderr,"Ошибка классификации %c \n",ch);
return (NULL);
}

}
else
{

fprintf(stdout,"Обнаружен не-ASCII символ\n");
return(toascii(ch));

}

}


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]