Страницы

Translate

пятница, 12 июля 2013 г.

Упражнение 1.15. Перепишите программу преобразования температур, выделив преобразование в отдельную функцию.


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


#include <stdio.h>
#define LOWER 0    //нижняя граница температуры
#define UPPER 300  //верхняя граница температуры
#define STEP 20    //размер изменения температуры

float temp(float cel);
int main()
{
    float cel;
    printf("Таблица перевода градусов\nпо Цельсию в Фаренгейт\n");
    printf("  CEL      FAHR\n");
    for(cel=LOWER; cel<=UPPER; cel+=STEP) //печать таблицы
        printf("%5.1f      %.1f\n", cel, temp(cel));
   return 0;
}
    
float temp(float a)
{
   return (a*(9.0/5.0) + 32.0);
}


Результат:



воскресенье, 7 июля 2013 г.

Упражнение 1.14. Напишите программу, печатающую гистограммы частот встречаемости вводимых символов.

Упражнение 1.14. Напишите программу, печатающую гистограммы
частот встречаемости вводимых символов.

include <stdio.h>

int main()
{
int c, i, j, max;
int symvol[5];
for(i=0; i<5; i++)//заполняем массив нулями
symvol[i]=0;
while((c=getchar()) != EOF)
{
if(c==',')
symvol[0]++;
if(c=='.')
symvol[1]++;
if(c==':')
symvol[2]++;
if(c=='/')
symvol[3]++;
if(c=='?')
symvol[4]++;
}
max=0;
for(i=0; i<5; i++)
{
if(symvol[i] > max) //определяем каких символов больше
max=symvol[i];
}
printf(", . : / ?\n");//печатаем какие символы выбирали
for(i=max; i>0; i--)  //вывод гистограммы символов
{
for(j=0; j<5; j++)
{
if(symvol[j]!=0)
{
printf("* ");
symvol[j]--;
}
else
printf("  ");
}
printf("\n");
}
printf("\n");
return 0;
}

Результат:


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

Упражнение 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;
}


Результат:





Упражнение 1.12. Напишите программу, которая печатает содержимое своего ввода, помещая по одному слову на каждой строке.

Упражнение 1.12. Напишите программу, которая печатает содержимое
своего ввода, помещая по одному слову на каждой строке.

#include <stdio.h>
#define IN 1 //внутри слова
#define OUT 0 //вне слова

int main()
{
int c, state;
state=OUT;
while((c=getchar()) != EOF)
{
if(c==' ' || c=='\t' || c=='\n')
state=OUT;
else if(state==OUT)
{
putchar('\n');
state=IN;
}
putchar(c);
}
return 0;
}

Результат:


Упражнение 1.11. Как протестировать программу подсчета слов?

Упражнение 1.11. Как протестировать программу подсчета слов? Какой
ввод вероятнее всего обнаружит ошибки, если они были допущены?

#include <stdio.h>
#define IN 1 //внутри слова
#define OUT 0 //вне слова

int main()
{
int c, nline, nword, nchar, state;
state=OUT;
nline=nword=nchar=0;
while((c=getchar()) != EOF)
{
++nchar;
if(c=='\n')
nline++;
if(c==' ' || c=='\n' || c=='\t')
state = OUT;
else if(state==OUT)
{
state = IN;
nword++;
}
}
printf("новых символов = %d\n\
новых предложений = %d\n\
новых слов = %d\n", nchar, nline, nword);
return 0;
}

Результат:


Тест: цифры воспринимаются как буквы, слова, предложения.









Упражнение 1.10. Напишите программу, копирующую вводимые символы в выходной поток

Упражнение 1.10. Напишите программу, копирующую вводимые
символы в выходной поток с заменой символа табуляции на \t, символа
возврата на \b и каждой обратной наклонной черты на \\. Это сделает
видимыми все символы табуляции и возврата.

#include <stdio.h>
int main()
{
int c;
while((c=getchar()) != EOF)
{
if(c=='\t')
printf("\\t");
if(c=='\b')
printf("\\b");
if(c=='\\')
{
printf("\\");
printf("\\");
}
if(c!='\t' && c!='\b' && c!='\\')
putchar(c);
}
return 0;
}

Результат:



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

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


#include <stdio.h>
int main()
{
int space, c;
while((c=getchar()) != EOF)
{
if(c==' ')
space++;
else
space=0;
if(space==2)
{
space--;
putchar('\b');
}
putchar(c);
}
return 0;
}

Результат: