Считать текст из файла и вывести количество повторений букв - C (СИ)
Формулировка задачи:
Программа считывает текст из файла и выводит количество повторений букв, при этом приравнивая заглавные к прописным, затем выводит аски код текста.Работает только со строкой. Переделать так, чтобы могла работать с несколькими строками.Заранее спасибо.
#include <stdio.h> #include <string.h> #include <conio.h> #define maxsize 100 main() { char s[maxsize],simvol, freq[256]; int i, k, len; FILE *lw11; lw11=fopen("C:\\1.txt", "rw"); fgets(s,256,lw11); fclose(lw11); printf("Text:%s\n\n",s); strupr(s);//перевод в прописные len=strlen(s);//длина строки memset(freq, 0, sizeof(freq));//заполняем массив частоты нулями for(i = 0; s[i]!='\0'; i++) if(s[i]!=' ' && s[i]!='\n')//игнорируем пробелы и энтеры freq[s[i]]++; for(i = 0; i < sizeof(freq); i++) if(freq[i]) printf("%c %d\n", i, freq[i]); printf("\nCode:"); for(k=0;k<len;k++) if(s[k]!=' ')//игнорируем пробелы printf(" %d",((int)s[k])); getch(); return 0; }
Решение задачи: «Считать текст из файла и вывести количество повторений букв»
textual
Листинг программы
#include <stdio.h> #include <string.h> #include <locale.h> int main( int argc, char ** argv ) { setlocale( LC_ALL, "ru_RU.UTF-8" ); #define FILE_NAME_SIZE 256 char file_name[ FILE_NAME_SIZE ]; if( argc > 1 ) strncpy( file_name, argv[ 1 ], FILE_NAME_SIZE ); else { fputs( "Введите имя файла\n> ", stdout ); fgets( file_name, FILE_NAME_SIZE, stdin ); size_t len = strlen( file_name ); if( len == 0 || --len == 0 ) return 1; file_name[ len ] = 0; } FILE * fd = fopen( file_name, "rb" ); if( !fd ) { perror( file_name ); return 1; } // сюда читаем участок файла #define STR_BUFF_SIZE 4096 char str_buff[ STR_BUFF_SIZE ]; // статистика по количеству символов #define STATS_SIZE 256 unsigned stats[ STATS_SIZE ] = { 0 }; // то, что мы вывели на экран в этой (экранной) строке #define SCREEN_BUFF_SIZE 17 char screen_buff[ SCREEN_BUFF_SIZE ]; size_t screen_chars = 0; size_t file_pos = 0; //while( fgets( str_buff, STR_BUFF_SIZE, fd ) ) while( !feof( fd ) && !ferror( fd ) && fread( str_buff, 1, STR_BUFF_SIZE, fd ) ) { char * ptr = str_buff; for( ; *ptr; ptr++ ) { // выводим смещение от начала файла if( !screen_chars ) { printf( ".% 0.8X: ", file_pos ); file_pos += SCREEN_BUFF_SIZE - 1; } // переводим в верхний регистр (условие задачи) if( isprint( *ptr ) ) *ptr = toupper( *ptr ); // при чтении русского текста из UTF-8 файла // почему-то в char читаются 4 байта // первые три заполняются 0xFF. обрезаем их // но почему - вопрос интересный stats[ *ptr & 0x000000ff ]++; // или такое происходит при выводе printf printf( "% 0.2X ", *ptr & 0x000000ff ); // если это непечатаемый символ или пробел, // выводим его как точку screen_buff[ screen_chars++ ] = ( !isprint( *ptr ) || isspace( *ptr ) ) ? '.' : *ptr; screen_buff[ screen_chars + 1 ] = 0; // если мы вывели два слова (16 байт) из файла, // выводим эти байты в читабельном виде if( screen_chars == SCREEN_BUFF_SIZE - 1 ) { printf( "| %s\n", screen_buff ); screen_chars = 0; } } } fclose( fd ); // выводим последнюю строку и заголовок раздела статистики while( ++screen_chars < SCREEN_BUFF_SIZE ) printf( " " ); printf( "| %s\n\nСтатистика:\nКод Смв Част Гистограмма\n", screen_buff ); size_t i = 0; // ищем максимальное количество вхождений символов (для гистограммы) size_t max_stat = 0; for( ; i < STATS_SIZE; i++ ) { if( stats[ i ] > max_stat ) max_stat = stats[i]; } // выводим статистику for( i = 0 ; i < STATS_SIZE; i++ ) { if( stats[ i ] ) { printf( "% 0.2X %c %4d |", i, ( isprint( i ) && !isspace( i ) ) ? i : ' ', stats[i] ); // рисуем гистограмму size_t u = 0; for( ; u < ( 61.0 / max_stat * stats[ i ] ); u++ ) putchar( '-' ); // дорисовываем оставшееся место пробелами while( ++u <= 61 ) putchar( ' ' ); // в конце гистограммы рисуем правую границу puts( "|" ); } } return 0; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д