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();
}
и её выдача для её собственного файла:

Символы или коды выделены красным, количество печатается обычным серым.
|
|