3 / 3 / 1
Регистрация: 14.02.2015
Сообщений: 23
1

Программа, печатающая гистограмму длин вводимых слов

05.03.2015, 19:30. Показов 917. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вообщем ,думаю всем известно это упражнение из книги кернигана и ритчи. Я написал программу,но пошел я через дебри. Как ее можно улучшить ? На строках 60-70 я выхожу за пределы массива? Или мне не стоит париться ,забить(главное что программа работает) , и учить дальше ибо все приходит с опытом?
вот код
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <stdio.h>
char matrix[10][10];
void xy()
{
     ///////x///////////
    matrix[0][0] = '9';
    matrix[1][0] = '8';
    matrix[2][0] = '7';
    matrix[3][0] = '6';
    matrix[4][0] = '5';
    matrix[5][0] = '4';
    matrix[6][0] = '3';
    matrix[7][0] = '2';
    matrix[8][0] = '1';
    matrix[9][0] = '0';
     //////////y////////
    matrix[9][9] = '9';
    matrix[9][8] = '8';
    matrix[9][7] = '7';
    matrix[9][6] = '6';
    matrix[9][5] = '5';
    matrix[9][4] = '4';
    matrix[9][3] = '3';
    matrix[9][2] = '2';
    matrix[9][1] = '1';
    matrix[9][0] = '0';
}
void init_mtx()
{
    int i, j;
    for (i = 0; i < 10; i++)
    {
        for (j = 0; j < 10; j++)
        {
            matrix[i][j] = ' ';
        }
    }
 
}
void prt_mtx()
{
    int i;
    for (i = 0; i < 10; i++)
    {
        printf("%c %c %c %c %c %c %c %c %c %c\n", matrix[i][0], matrix[i][1], matrix[i][2], matrix[i][3], matrix[i][4], matrix[i][5], matrix[i][6], matrix[i][7], matrix[i][8], matrix[i][9]);
    }
}
void inp_str()
{
    int c, dl = 0, i;
    int len[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    while ((c = getchar()) != EOF)
    {
        if (c == ' ' || c == '\n' || c == '\t')
        {
            len[dl]=len[dl]+1;
            dl = 0;
        }
        else
            ++dl;
    }
    for (i = 0; i < 10; i++){
        matrix[9 - len[i]][i] = '*';
        matrix[10 - len[i]][i] = '*';
        matrix[11 - len[i]][i] = '*';
        matrix[12 - len[i]][i] = '*';
        matrix[13 - len[i]][i] = '*';
        matrix[14 - len[i]][i] = '*';
        matrix[15 - len[i]][i] = '*';
        matrix[16 - len[i]][i] = '*';
        matrix[17 - len[i]][i] = '*';
    }
}
int main()
{
    init_mtx();
    inp_str();
    xy();
    printf("\n");
    printf(" chastota dlin slov\n");
    prt_mtx();
 
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.03.2015, 19:30
Ответы с готовыми решениями:

Программа, печатающая гистограммы длин вводимых слов
Программу релизую выводом гистограммы длин вертикальными полосами. Но как обычно это бывает она...

Программа, печатающая гистограммы длин вводимых слов вертикальными полосами
Ребята, корпею над задачкой с вериткальной гистограммой длин вводимых слов. Используя массивы. В...

Напечатать гистограммы длин вводимых слов
Добрый день, незнаю где у меня ошибка, может мне надо почитать какие то книги по правильности...

Напечатать гистограммы длин вводимых слов
Задание: Напишите программу, печатающую гистограммы длин вводимых слов. Решение: #include...

7
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
06.03.2015, 11:19 2
Альт. решение.
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define MAX_HISTOGRAM_COLUMN_LENGTH 50
#define DELIMETER_STRING " .,?!:;"
 
size_t GetMaxWordLengthFromString(const char* const str)
{
  size_t maxLength = 0;
 
  char tempStr[BUFSIZ];
 
  char* pch = NULL;
 
  if (str != NULL)
  {
    strcpy(tempStr, str);
 
    pch = strtok(tempStr, DELIMETER_STRING);
    while (pch != NULL)
    {
      if (strlen(pch) > maxLength) maxLength = strlen(pch);
 
      pch = strtok(NULL, DELIMETER_STRING);
    }
  }
 
  return maxLength;
}
 
void PrintHeader(const size_t maxValue)
{
  char buffer[MAX_HISTOGRAM_COLUMN_LENGTH + 5];
 
  memset(buffer, 0, sizeof(buffer));
 
  sprintf(buffer, "%3d%51lu", 0, maxValue);
  printf("%s\n", buffer);
 
  memset(buffer, '-', sizeof(buffer));
  buffer[sizeof(buffer) - 1] = '\0';
  printf("%s\n", buffer);
}
 
void PrintStringHistogram(const char* const str, const size_t maxWordLength)
{
  char tempStr[BUFSIZ];
  char histogramColumn[MAX_HISTOGRAM_COLUMN_LENGTH + 1];
 
  char* pch = NULL;
 
  size_t wordLength = 0;
  size_t columnLength = 0;
  size_t index = 1;
 
  if ((str != NULL) && (maxWordLength != 0))
  {
    PrintHeader(maxWordLength);
 
    strcpy(tempStr, str);
 
    pch = strtok(tempStr, DELIMETER_STRING);
    while (pch != NULL)
    {
 
      wordLength = strlen(pch);
 
      columnLength = (wordLength * MAX_HISTOGRAM_COLUMN_LENGTH) / maxWordLength;
 
      memset(histogramColumn, 0, sizeof(histogramColumn));
      memset(histogramColumn, '#', columnLength * sizeof(*histogramColumn));
      printf("%3d %s\n", index, histogramColumn);
      index++;
 
      pch = strtok(NULL, DELIMETER_STRING);
    }
  }
 
}
 
int main(void)
{
  char str[BUFSIZ];
 
  size_t maxWordLength = 0;
 
  fgets(str, sizeof(str), stdin);
 
  maxWordLength = GetMaxWordLengthFromString(str);
  PrintStringHistogram(str, maxWordLength);
 
  return 0;
}
1
3 / 3 / 1
Регистрация: 14.02.2015
Сообщений: 23
06.03.2015, 20:19  [ТС] 3
HighPredator, а мой код как? нормальный?
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
10.03.2015, 08:37 4
Вы знаете, лично я не в особом восторге. Не потому, что код не работает. Может быть он работает, как задумано. Но мне не кажется, что это так. По крайней мере неочевидно. Посмотрите на скрин. Если по оси абсцисс отложены номера слов, а по оси ординат длина слова (без нормировки), то налицо какой-то баг. Но могу и ошибаться. Плюс, данный код плохо масштабируется для разных размеров области построения.
Миниатюры
Программа, печатающая гистограмму длин вводимых слов  
1
3 / 3 / 1
Регистрация: 14.02.2015
Сообщений: 23
14.03.2015, 13:17  [ТС] 5
HighPredator, По оси абсцисс откладывается кол-во букв,а по оси ординат сколько раз встретилось.
1
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
16.03.2015, 08:17 6
Цитата Сообщение от hash Посмотреть сообщение
По оси абсцисс откладывается кол-во букв,а по оси ординат сколько раз встретилось.
А, тогда вроде все ок.
1
3 / 3 / 1
Регистрация: 14.02.2015
Сообщений: 23
16.03.2015, 08:44  [ТС] 7
HighPredator, Еще вот есть вопрос.Можно ли как нибудь сделать здесь ,чтобы был цикл,то есть ,как сделать чтобы код символа увеличивался на 1,а не прописывать каждый вручную?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
     ///////x///////////
    matrix[0][0] = '9';
    matrix[1][0] = '8';
    matrix[2][0] = '7';
    matrix[3][0] = '6';
    matrix[4][0] = '5';
    matrix[5][0] = '4';
    matrix[6][0] = '3';
    matrix[7][0] = '2';
    matrix[8][0] = '1';
    matrix[9][0] = '0';
     //////////y////////
    matrix[9][9] = '9';
    matrix[9][8] = '8';
    matrix[9][7] = '7';
    matrix[9][6] = '6';
    matrix[9][5] = '5';
    matrix[9][4] = '4';
    matrix[9][3] = '3';
    matrix[9][2] = '2';
    matrix[9][1] = '1';
    matrix[9][0] = '0';
}
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
16.03.2015, 09:03 8
C
1
2
3
4
5
6
7
8
{
  char i = 0;
  for(i = 0; i < 10; i++)
  {
    matrix[i][0] = 57 - i;
    matrix[9][9 - i] = 57 - i;
  }
}
1
16.03.2015, 09:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.03.2015, 09:03
Помогаю со студенческими работами здесь

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

Написал программу, печатающую гистограммы длин вводимых слов. Но надо было сделать ее используя массивы
Добрый день, занимаюсь по книге. Прохожу тему массивов и там есть задачка: Напишите программу,...

Сформировать гистограмму длин слов, хранящихся в текстовом файле
помогите с этим заданием !!!..... Сформировать гистограмму длин слов, хранящихся в текстовом...

Вывести вертикальную гистограмму длин слов введенного текста
Здравствуйте, дали задачу &quot;вывести вертикальную гистограмму длин слов введенного текста&quot;. не особо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru