Упражнение 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;
}
Результат:
вводимых слов. Гистограмму легко рисовать горизонтальными полосами.
#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;
}
Результат:
#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);
}