Pers.narod.ru. Алгоритмы. Строим частотную таблицу символов на C++ |
C++ типизирован не так строго как Паксаль, к счастью, код вида
char c='1'; int code=c-'0';
имеет вполне определённый смысл - вычитая из символа с
, содержащего код цифры '1
' (он равен
49
во всех кодировках) код нуля (который равен 48
), мы получаем то, что вправе ожидать - целочисленное значение code=1
.
Обратное преобразование - цифры в символ - так же легко выполнить кодом вида
int code=9; char c=code+'0';
Значение c
будет равно '9
' или 57
.
Именно на этом нехитром приёме построены всевозможные реализации преобразования строки в число и числа в строку, которые так часто встречаются в учебниках по Си. Задача построения частотной таблицы ASCII-кодов тоже очень распространена и решается с таким же характерным для Си "смешиванием" символьных и целочисленных данных:
Вот программка ascii.cpp
, большую часть которой, впрочем, занимает форматирование консольного ввода/вывода, такое как
печать ASCII-кодов вместо непечатаемых в консоли символов:
#include <stdio.h> #include <conio.h> #include <stdlib.h> void main () { static char ascii[256]; char name[80]; FILE *fp; int i; char c; textmode (C4350); textcolor (7); clrscr(); printf ("\nИмя файла (короткое)? "); fflush(stdin); scanf("%s",name); fp=fopen (name,"rt"); if (fp==NULL) { printf ("\nCan't open file %s\nPress Enter to EXIT",name); fflush (stdin); getchar(); exit (1); } while (!feof(fp)) { fread (&c,1,1,fp); ascii[c]++; } fclose (fp); textcolor (LIGHTRED); for (i=0; i<256; i++) { if (i==0 || i>6 && i<14 || i==255) cprintf ("%02d",i); else cprintf ("%c",i); printf (" %d",ascii[i]); printf (i%8==7?"\n":"\t"); } printf ("\nPress Enter to EXIT"); fflush (stdin); getchar(); }
и её выдача для её собственного файла:
Символы или коды выделены красным, количество печатается обычным серым.
гостевая; E-mail |