воскресенье, 5 января 2014 г.

Упражнение 1.14.

Напишите программу, печатающую гистограммы частот встречаемости вводимых символов.

Стандартная таблица символов ASCII

Горизонтальные полосы
$ vim ex_1_14.c
#include <stdio.h>

int main(void)
{
    int ascii[128];     /* коды ASCII таблицы от 0 до 127 */
    int c = 0;
    int i, j;

    for (i = 0; i < 128; ++i)   /* заполняем массив нолями */
        ascii[i] = 0;

    while ((c = getchar()) != EOF)
    {
        if (c < 128)    /* только стандартная таблица ASCII */
            ++ascii[c]; /* прирост гистрограммы */
    }

    /* Печать гистрограммы частот встречаемости вводимых символов */

    /* Учитывать будем только символы, которые можно ввести
     * с клавиатуры, кроме BS (backspace - клавиша <Enter>)
     * TAB (horizontal tab) и т.д.,
     * тоесть, символы которые имеют коды в диапазоне [32; 127]*/
    for (i = 32; i < 127; ++i)
    {
        if (ascii[i] > 0)       /* был ли символ введен хоть раз*/
        {
            printf("\"");
            putchar(i); /* вывод символов - параметров гистрограммы */
            printf("\": ");

            /* печать гистрограммы */
            for (j = 1; j <= ascii[i]; ++j)
                printf("*");
            printf("\n");
        }
    }

    return 0;
}


$ cc -g -O0 -Wall -o a.out ex_1_14.c
$ ./a.out
GtflYT$%089712@@AAAhhhhhKLM NATR BSd P@$$w0Rd TeST 12345&*()_+===    12~~~||\\
<Ctrl>+<D>
" ": *********
"$": ***
"%": *
"&": *
"(": *
")": *
"*": *
"+": *
"0": **
"1": ***
"2": ***
"3": *
"4": *
"5": *
"7": *
"8": *
"9": *
"=": ***
"@": ***
"A": ****
"B": *
"G": *
"K": *
"L": *
"M": *
"N": *
"P": *
"R": **
"S": **
"T": ****
"Y": *
"\": **
"_": *
"d": **
"e": *
"f": *
"h": *****
"l": *
"t": *
"w": *
"|": **
"~": ***

Вертикальные полосы.
$ vim ex_1_14_3.c
#include <stdio.h>

int main(void)
{
    int ascii[128];
    int c = 0;
    int i, j;
    int max = 0;        /* "вершина" гистрограммы */

    for (i = 0; i < 128; ++i)
        ascii[i] = 0;

    while ((c = getchar()) != EOF)
    {
        if (c < 128)    
            ++ascii[c];

        if (ascii[c] > max)
            max = ascii[c];
    }
    
    for (i = max; i >= 1; --i)
    {
        for(j = 32; j <= 127; ++j)
        {
            if (i > ascii[j])
                printf(" ");
            else
                    printf("*");
        }
        printf("\n");
    }

    for (i = 32; i < 128; ++i)
        putchar(i);

    printf("\n");

    return 0;
}
$ cc -g -O0 -Wall -o a.out ex_1_14_3.c
$ ./a.out
 GtflYT$%089712@@AAAhhhhhKLM NATR BSd P@$$w0Rd TeST 12345&*()_+===    12~~~||\\
*
*
*
*
*                                                                       *
*                                *                  *                   *
*   *            **          *  **                  *                   *                     *
*   *           ***          *  **                ***       *       *   *                   * *
*   *** ****    ****** ***   *  ***    *   **** * ***    *  *  *    *** *   *       *  *    * *
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}

Примечание!
1. В программе печати вертикальной гистрограммы частот печатаются все символы из таблицы ASCII. А надо, чтобы выводились только те, которые вводились (ascii[i] > 0);
2. В основе гистрограммы (в ее параметрах) не печатается символ '~' (тильда).

1 комментарий:

  1. попробовал убрать лишние пробелы, для начала неплохо вышло)


    main()
    {
    int ascii[128];
    int c = 0;
    int i, j;
    int max = 0;

    for(i=0;i<128;++i)
    ascii[i]=0;
    while((c=getchar()) !=EOF)
    {
    if (c<128)
    ++ascii[c];
    if (ascii[c]>max)
    max=ascii[c];
    }
    for (i=max;i>=1;--i)
    {
    for (j=32;j<127;++j)
    {
    if (ascii[j]<1)
    printf("");
    else
    if(i>ascii[j])
    printf(" ");
    else
    printf("*");
    }
    printf("\n");
    }
    for(i=32;i<128;++i)
    {
    if (ascii[i]>=1)
    putchar(i);
    else
    putchar(0);
    }
    printf("\n");
    }

    ОтветитьУдалить