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();
}

и её выдача для её собственного файла:

Таблица частот символов в файле C++

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

Рейтинг@Mail.ru

вверх гостевая; E-mail
Hosted by uCoz