Считать текст из файла и вывести количество повторений букв - 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;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.2 из 5
Похожие ответы