Тема: Побудова гістограми у терміналі.
Вітаю всіх з Новим роком!
Я новачок на форумі. В університеті вивчали С один семестр. Мені сподобалось писати програми і я вирішив надалі вивчати С.
Розпочав читати книгу Кернігана і Рітчі "Мова програмування C" третє видання.
Проблема з завдання на на створення гістограми.
Саме завдання (цитата з книги, книга російською):
"Упражнение 1.13. Напишите программу, печатающую гистограммы длин вводимых слов. Гистограмму легко
рисовать горизонтальными полосами. Рисование вертикальными полосами — более трудная задача."
Проблема полягає в тому, що гістограма створюється горизонтально. Мені потрібно щоб гістограма створювалась вертикально. Як це можна зробити? Підскажіть будь ласка. Без використання gotoxy і йому подібних функцій.
Мій код:
/*
Напишите программу, печатающую гистограммы длин вводимых слов. Гистограмму легко
рисовать горизонтальными полосами. Рисование вертикальными полосами — более трудная задача.
*/
#include <stdio.h>
#include <stdlib.h>
#define SIZE 10
void histogram (int *arr, int N); // виведення гістограми на екран
int main (void){
int word, space = 0; // вводиться слов
int counter = 0; // лічильник слів
int *arr, *psarr; // один масив зберігає значення інший передає значення у випадку перевиділення пам'яті
int N = 10, i = 0, j; // N - розмфр масиву, інші змінні - лічильники
arr = (int*) calloc (N, sizeof (int));
psarr = (int*) calloc (N, sizeof (int));
while ((word = getchar ()) != EOF){ // лічильник слів та інші перевірки
if (word == '\n' || word == ' ' || word == '\t')
if (space == 0){
arr[i] = counter; // елементу масиву присваюється кількість символів у слові
psarr[i] = arr[i]; // допоміжному масиву присваюється це саме знач.
++i; // індекс масиву збільшується
if (i == N){ // якщо була досягнута межа масиву
N += SIZE; // N збільшується на 10
arr = (int*) calloc (N, sizeof (int)); // перевиділяється пам'ять з розміром на 10 більшим за попередній
for(j = 0; j < N - SIZE; j++) // новоствореному масиву присваюються значення
arr[j] = psarr[j];
psarr = (int*) calloc (N, sizeof (int)); // перевиділяється пам'ять допоміжного масиву на 10 більша
for(j = 0; j < N - SIZE; j++) // присваюються знач. новому масиву
psarr[j] = arr[j];
}
counter = 0;
space = 1;
}
if (word != '\n' && word != ' ' && word != '\t'){
++counter;
space = 0;
}
}
printf ("Your words:\n");
for (i = 0; i < N; i++){ // вивід масиву на екран
if(arr[i] == NULL)
break;
printf ("%4d", arr[i]);
}
histogram (arr, N);
free (arr);
free (psarr);
printf ("\n");
system ("pause");
return 0;
}
void histogram (int *arr, int N){
int i, j;
printf("\n");
for (i = 0; i < N; i++){
if (arr[i] == NULL)
break;
for (j = 0; j < arr[i]; j++)
printf("|");
}
}