Приветствую Вас Гость | RSS

Язык программирования С

Суббота, 04.05.2024, 00:22
Главная » 2010 » Март » 11 » 1.6. Массивы. Упражнение 1.13.
20:02
1.6. Массивы. Упражнение 1.13.

Упражнение 1.13. Напишите программу для вывода гистограммы длин слов во входном потоке. Построить гистограмму с горизонтальными рядами довольно легко, а вот с вертикальными столбцами труднее.

Программа для вывода гистограммы с горизонтальными рядами:

/* вывод гистограммы длин слов во входном потоке */

#include "stdafx.h"
#define IN 1 /* внутри слова */
#define OUT 0 /* снаружи слова */

int main()
{

int c, j, i, state;
int wordlength[16]; // массив длин слов


for (i = 0; i < 16; ++i)

wordlength[i] = 0;

i = 0;
while ((c = getchar()) != EOF) {

state = IN;
if (c == ' ' || c == '\n' || c == '\t' || c == '.' || c == ',')

state = OUT;

else if (state == OUT)

state = IN;

/* если находимся внутри слова, считаем количество символов в слове */
if (state == IN)

++i;

/* если слово заканчивается, увеличиваем количество слов с длиной i */
if (state == OUT && i != 0) {

++wordlength[i];
i = 0;

}

}

/* выводим гистограмму длин слов */
for (i = 1; i < 16; ++i) {

printf(" %d\t", i);
for (j = 0; j < wordlength[i]; ++j)

printf("*");

printf("\n");

}

}

Результат выполнения:

Горизонтальная гистограмма длин слов

Вывод гистограммы с вертикальными столбцами будет выглядеть так:

/* вывод вертикальной гистограммы */
for (i = 1; i < 16; ++i) // выводим ряд длин слов

printf(" %d", i);

printf("\n");
for (i = 0; i < 16; ++i)

for (j = 1; j < 16; ++j) {

if (j < 10)

if (i < wordlength[j])

printf(" *");

else printf(" ");

/* если длина слова - двузначное число, добавляем пробелы для выравнивания гистограммы */

if (j > 9)

if (i < wordlength[j])

printf(" * ");

else printf(" ");

if (j == 15)

printf("\n");

}

Результат выполнения:

Вертикальная гистограмма длин слов
Просмотров: 5046 | Добавил: brainfrog | Теги: гистограмма, программа, упражнение, входной поток | Рейтинг: 0.0/0
Всего комментариев: 8
8 lionsay  
0
Вот вариант вертикальный. Результат выполнения(оформление) я подсмотрел <a=http://users.powernet.co.uk/eton/kandr2/krx113.html>тут</a>, а сам код писал сам, для меня было очень трудно.

Код
#include <stdio.h>
#define IN 1
#define OUT 0
#define MAXLEN 12

main()
{
  int c, i, j, state = OUT, wlen=0, words_len[MAXLEN], big = 0;

  for (i = 0; i < MAXLEN; ++i)
      words_len [i]= 0;

  while ((c = getchar())!= EOF)
if (c == ' ' || c == '\n' || c == '\t')
  {
  if (state == IN)
   state = OUT;
  }
  else
  {
  if(wlen > 0 && state == OUT)
  {
  if (wlen > 10)
  wlen = 11;
  ++words_len[wlen];
  wlen = 0;
  }
  state = IN;
  ++wlen;
  }
  if(wlen > 10)
  wlen = 11;
  ++words_len[wlen]; //Добавление единственного или последнего не учтенного слова

  for (i = 1; i < MAXLEN; ++i)
  {
  if (words_len > big)
  big = words_len;
  }

  printf("\n");
  for (big; big > 0; --big){
  for(i = 0; i < 1; ++i){
  printf("%2d  |", big);
  for(j = 1; j < MAXLEN; ++j){
  if (words_len [j]< big)
  {
  printf("   ");
  }
  else
  printf("  *");
  }
  printf("\n");
  }
  }
  printf("    +------------------------------|---\n");
  printf("       1  2  3  4  5  6  7  8  9 10 >10\n");
}

Жаль, что редактор этого сайта просто отрезает все отступы кода.[/j][/i]

7 lionsay  
0
Кстати, у меня не получилось сделать так:
Код
if (c == '\n' || c == '\t' || c == ' ' || c == EOF)

пришлось придумывать способ выкрутиться, так как не принимал единсвенное или последнее введенее слово.

6 lionsay  
0
Вот мой скромный вариант, выглядить костыльно :). У автора код компактный.
Код

#include <stdio.h>
#define IN 1
#define OUT 0
#define MAXLEN 12

main()
{
  int c, i, j, state = OUT, wlen=0, words_len[MAXLEN];

  for (i = 0; i < MAXLEN; ++i)
  words_len[i] = 0;

  while ((c = getchar())!= EOF)
  if (c == ' ' || c == '\n' || c == '\t')
  {
  if (state == IN)
  state = OUT;
  }
  else
  {
  if(wlen > 0 && state == OUT)
  {
  if (wlen > 10)
  wlen = 11;
  ++words_len[wlen];
  wlen = 0;
  }
  state = IN;
  ++wlen;
  }
  if(wlen > 10)
  wlen = 11;
  ++words_len[wlen]; //Добавление единственного или последнего не учтенного слова

  printf("\n");
  for (i = 0; i < MAXLEN; ++i){
  if (i == 11)
  printf(">10  ");
  else
  printf("%3d  ", i);

  for(j = 1; j <= words_len[i]; ++j)
  printf("*");
  printf("\n");
  }

4 RaZR  
0
в решении автора не будет считаться последнее введенное слово, если после него не было символов '\n', ' ', '\t'.
Код
#include <stdio.h>

#define MAXWORDLEN 10
#define IN 1
#define OUT 0

main()
{
         int i, j, c, nc, state;
         int nword[MAXWORDLEN+1];

         for (i = 0; i <= MAXWORDLEN; ++i)
                 nword [i]= 0;

         state = IN;
         nc = 0;
         for(;;)
         {
                 c = getchar();

                 if (c == '\n' || c == '\t' || c == ' ' || c == EOF)
                         state = OUT;
                 else if (state == OUT)
                         state = IN;

                 if (state == IN)
                         ++nc;
                 else if (nc <= MAXWORDLEN && nc !=0)
                 {
                         ++nword[nc];
                         nc = 0;
                 }
/*проверяем не конец ли файла, если да, то выход из цикла*/
                 if (c == EOF)
                         break;
         }

         for (i = 1; i <= MAXWORDLEN; ++i)
         {
                 printf("\n%d:\t", i);
                 for (j = 1; j <= nword; ++j)
                         printf("*");
         }
         printf("\n");
}[/i]

3 Denis_K  
0
Что-то я ничего не понял cry Звёздочки - количество букв в словах? А чё их так много?

2 Frankie  
0
Спасибо очень помогло понять всё правильно. cool

1 IEr  
0
/* вывод гистограммы длин слов во входном потоке */
#include <stdio.h>
int main(){
int i, c, k=0, j;
int DlinSlova [20];
//обнуление массива
for (i=0; i<20; i++)
DlinSlova[i]=0;
i=0;
//подсчет количества длинн слов
while ((c=getchar()) != EOF){
if ((c >= 'a' && c <= 'z' ) || ( c >= 'A' && c <= 'Z')){
i++;
}
else {
++DlinSlova [i];
i=0;
}
}
//выведение номеров столбцов для вертикальной гистограммы
for (i = 1; i < 20; ++i) {
printf ("%2d ", i);
if (k<DlinSlova[i]) /*определение максимального количества слов одной длинны*/
k = DlinSlova[i];
}
printf ("\n");
//вывод вертикальной гистограммы
for (j = 0; j<=k; j++){
for (i = 1; i < 20; ++i){
if (DlinSlova [i]<=j)
printf(" ");
else printf(" * ");
}
printf ("\n");
}
//вывод горизонтальной гистограммы
for (i = 1; i < 20; ++i) {
printf(" %d\t", i);
for (j = 0; j < DlinSlova[i]; ++j)
printf("*");
printf("\n");
}
return 0;
}

получилось немного иначе. укажите на ошибки и критические отличия, которые не допустимы

5 RaZR  
0
чуть-чуть ошибся. вот корректный код:
Код
#include <stdio.h>

#define MAXWORDLEN 10
#define IN 1
#define OUT 0

main()
{
         int i, j, c, nc, state;
         int nword[MAXWORDLEN+1];

         for (i = 0; i <= MAXWORDLEN; ++i)
                 nword [i]= 0;

         state = IN;
         nc = 0;
         for(;;)
         {
                 c = getchar();

                 if (c == '\n' || c == '\t' || c == ' ' || c == EOF)
                         state = OUT;
                 else if (state == OUT)
                         state = IN;

                 if (state == IN)
                         ++nc;
                 else if (nc !=0)
                 {
                         if (nc <= MAXWORDLEN)
                         ++nword[nc];
                         nc = 0;
                 }
/*проверяем не конец ли файла, если да, то выход из цикла*/
                 if (c == EOF)
                         break;
         }

         for (i = 1; i <= MAXWORDLEN; ++i)
         {
                 printf("\n%d:\t", i);
                 for (j = 1; j <= nword; ++j)
                         printf("*");
         }
         printf("\n");
}
         
[/i]

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]