Выравнивание столбцов

Модератор: Модераторы разделов

Аватара пользователя
ЭЖД
Сообщения: 332
Статус: openSuSE Member
ОС: openSuSE

Выравнивание столбцов

Сообщение ЭЖД »

Нужно написать программу которая выводит гистограмму длин слов во входном потоке, с вертикальными столбцами.
Прграмма успешно написана, но вот с выравниванием столбцов возникли проблемы когда вместо символа # в столбце стоит пробел (несколькоп робелов), а за ним следует столбец с символом #. То есть длина пробела не сопоставима с длинной символа #.
Сделал выводом вместо пробелов черных #, которые сливаются с фоном. Но этот вариант не универсален.
Может как-то можно выравнять столбцы через формат в printf? У меня не получилось.
Или как можно определить цвет фона?

Код:

/* * 1.13.2.c * * Created on: 22.08.2009 * Author: egd */ #include <stdio.h> #include <stdbool.h> #define BUFF 15 int main() { int i, j, c, word = 0, words[BUFF]; bool noWord = false; for (i = 0; i < BUFF; ++i) words[i] = 0; while ((c = getchar()) != EOF) { if (c == ' ' || c == '\n' || c == '\t') noWord = true; else ++word; if (word > BUFF) word = BUFF; if (noWord) { ++words[word-1]; word = 0; noWord = false; } } for (i = 1; i <= BUFF; ++i) if (i >= 10) printf("%2d ", i); else printf("%d ", i); printf("\b\n"); for (i = 0; i < BUFF; ++i) { for (j = 0; j < BUFF ; ++j) if (words[j] >= i) if (j >= 10) printf(" # "); else printf("# "); else if (j >= 10) printf(" \033[30m#\033[0m "); else printf("\033[30m#\033[0m "); printf("\n"); } return 0; }
«Когда истинный гений появляется в этом низком мире, его можно узнать по тому знаку, что все глупцы объединяются против него»
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Выравнивание столбцов

Сообщение drBatty »

ЭЖД писал(а):
23.08.2009 15:31
Может как-то можно выравнять столбцы через формат в printf? У меня не получилось.
нужен моноширный шрифт.
странно, что в вашем терминале не такой.
с обычными шрифтами решения нету (ну я во всяком случае не представляю)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
newsrc
Сообщения: 314
ОС: Slackware

Re: Выравнивание столбцов

Сообщение newsrc »

Знакомая задачка. Керниган & Ритчи?
В Windows столбцы ровные выходят по вашему варианту.
В Linux'e не пробывал.
Мой работает и там и там. Кодировка UTF-8

Код: Выделить всё

#include <stdio.h>
#define IN  0
#define OUT 1
#define COUNT 100

main() {

    int c, nw, nc, flag1, flag2, i, p, count_array, nchar[COUNT], max, nomax;

    nw = nc = p = count_array = max = 0;
    flag1 = flag2 = OUT;

    for(i = 0; i <= COUNT; ++i) {
        nchar[i] = 0;
    }

    i = 0;
    while((c = getchar()) != EOF) {
        if (c == ' ' || c == '\t' || c == '\n') {
            if (flag2 == IN) {
                ++i;
                flag2 = OUT;
            }
        } else {
           ++nchar[i];
           flag2 = IN;
        }
    }

    for(i = 0; i < COUNT; ++i) {
        if (nchar[i] != 0) {
            ++count_array;              // Количество слов в потоке
        }
        if (nchar[i] > max) {
            max = nchar[i];             // Кол-во букв самого длинного слова
        }
    }

    printf("\nГистограмма длин слов во входном потоке.\n\n");

// Вывод гистограммы с вертикальными рядами
    nomax = max;
    for(p = 0; p < max; ++p) {
        for(i = 0; i < count_array; ++i) {
            if (nchar[i] >= nomax) {
                printf("  *");
            } else {
                printf("   ");
            }
        }
        printf("\n");
        --nomax;
    }
    for (i = 0; i < count_array; ++i) {
        printf("%3d", nchar[i]);
    }

    printf("\n\n");
    printf(
        "Количество слов во входном потоке: %d\n"
        "Количество букв самого длинного слова: %d\n\n",
        count_array, max
    );
}
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Выравнивание столбцов

Сообщение eddy »

Попробуйте использовать экранные библиотеки
http://phys.protres.ru/~mlobanov/c_lin/8.htm
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
newsrc
Сообщения: 314
ОС: Slackware

Re: Выравнивание столбцов

Сообщение newsrc »

А если эту задачу вы действительно решаете из Керниган & Ритчи, то идеология книги говорит о том, что бы вы решали задачи только теми методами и средствами языка, которые были описаны ДО этого упражнения, т. е. как бы не зная в языке ничего больше.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Спасибо сказали: