Страницы

Translate

воскресенье, 7 июля 2013 г.

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

Упражнение 1.13. Напишите программу, печатающую гистограммы длин
вводимых слов. Гистограмму легко рисовать горизонтальными полосами.


#include <stdio.h>
#include <ctype.h>

int main()
{
    int c, i, j, nc;
    i=j=nc=0;
    int dig[17];
    
    for(i=0; i<17; i++)//заполняем массив нулями
        dig[i] = 0;
    while((c=getchar()) != EOF)
    {
        nc++;
        if(c==' ' || c=='\n' || c=='\t' || ispunct(c))
        {
            dig[nc-1]++;
            nc=0;
        }
    }
    for(i=1; i<17; i++) //печатаем гистограмму частот
    {
        if(i<10)
            printf(" %d  ", i);
        else
            printf("%d  ", i);
        for(j=dig[i]; j>0; j--)
            printf("*");
        printf("\n");
    }   
    printf("\n");
    return 0;
}


Результат:




















Рисование вертикальными полосами - более трудная задача.


#include <stdio.h>
#include <ctype.h>

int main()
{
    int c, i, j, nc, max;
    i=j=nc=0;
    max=0;//максимальное количество слов одного размера
    int dig[17];
    
    for(i=0; i<17; i++)
        dig[i] = 0;
    while((c=getchar()) != EOF)
    {
        nc++;//количество символов в слове
        if(c==' ' || c=='\n' || c=='\t' || ispunct(c))
        {
            dig[nc-1]++;
            if(dig[nc-1]>max)
                max=dig[nc-1];
            nc=0;
        }
    }
    for(i=1; i<17; i++)//печатаем цифры(количество букв в слове)
        printf("%d ", i);
    printf("\n");
    for(i=max; i>0; i--)//печать вертикальной гистогаммы
    {
        for(j=1; j<17; j++)
        {
            if(dig[j]!=0)
            {
                if(j<=10)       //если букв в слове больше 10 
                {                  //добавляем пробелы
                    printf("* ");//для выравнивания гистограммы
                    dig[j]--;
                }
                else
                {
                    printf(" * ");
                    dig[j]--;
                }
            }
            else
            {
                if(j<=10)
                    printf("  ");
                else
                    printf("   ");
            }
        }
        printf("\n");
    }
    printf("\n");
    return 0;
}


Результат:





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

  1. #include

    #define IN 1
    #define OUT 0

    // горитзонтальная гистограмма
    void horisontal(int len, int *arr)
    {
    for (int i = 0; i < len; i++){
    if( arr[i] > 0 ){
    printf("%d ", arr[i]);
    for (int j = 0; j < arr[i]; j++){
    printf("*");
    }
    printf("\n");
    }
    }

    }
    // Вертикальная гистограмма
    void vertical(int len, int max, int *arr)
    {
    int arr2[len];
    for (int i = 0; i < len; i++){
    arr2[i] = arr[i];
    }
    for (int i = 0; i < len; i++){
    printf("%d ", arr[i]);
    }
    printf("\n");
    for (int i = max; i > 0; i--){
    for (int j = 0; j < len; j++){
    if (arr2[j] != 0){
    if (arr[j] < 10){
    printf("* ");
    arr2[j]--;
    } else {
    printf(" * ");
    arr2[j]--;
    }
    } else {
    if (arr[j] < 10){
    printf(" ");
    } else {
    printf(" ");
    }
    }
    }
    printf("\n");
    }
    printf("\n");
    }

    int main()
    {
    int wordsl[15];
    int c, i, state, words, lw, max;

    words = lw = max = 0;
    for (i = 0; i < 15; i++){
    wordsl[i] = 0;
    }

    i = 0;
    while ((c = getchar()) != EOF){
    if (c == ' ' || c == '\n' || c == '\t'){
    if (lw > max){
    max = lw;
    }
    wordsl[i] = lw;
    i++;
    state = OUT;
    lw = 0;
    } else if (state == OUT){
    state = IN;
    lw++;
    } else {
    lw++;
    }

    }

    vertical(15, max, wordsl);
    }

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