Опубликован: 05.07.2006 | Уровень: для всех | Доступ: платный
Лекция 2:

Учебное введение

1.6. Массивы

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

Мы разбили вводимые символы на двенадцать категорий, и нам удобнее использовать массив для хранения числа появлений каждой цифры, а не десять отдельных переменных. Вот один из вариантов программы:

main()  /* count digits, white space, others */
{
    int  c, i, nwhite, nother;
    int  ndigit[10];

    nwhite = nother = 0;
    for (i = 0; i < 10; ++i)
 ndigit[i] = 0;

    while ((c = getchar()) != EOF)
 if (c >= '0' && c <= '9')
     ++ndigit[c-'0'];
 else if(c== ' ' || c== '\n' || c== '\t')
     ++nwhite;
 else
     ++nother;

    printf("digits =");
    for (i = 0; i < 10; ++i)
    printf(" %d", ndigit[i]);
    printf("\nwhite space = %d, other = %d\n",
     nwhite, nother);
}

описание

int ndigit[10];

объявляет, что ndigit является массивом из десяти целых. В языке "C" индексы массива всегда начинаются с нуля, а не с 1, как в фортране или PL/1, так что элементами массива являются ndigit[0], ndigit[1],..., ndigit[9]. эта особенность отражена в циклах for, которые инициализируют и печатают массив.

Индекс может быть любым целым выражением, которое, конечно, может включать целые переменные, такие как i, и целые константы.

Эта конкретная программа сильно опирается на свойства символьного представления цифр. Так, например, в программе проверка

if( c >= '0' && c <= '9')...

определяет, является ли символ в 'c' цифрой, и если это так, то численное значение этой цифры определяется по формуле / c - '0'/. Такой способ работает только в том случае, если значения символьных констант '0', '1' и т.д. Положительны, расположены в порядке возрастания и нет ничего, кроме цифр, между константами '0' и '9'. К счастью, это верно для всех общепринятых наборов символов.

По определению перед проведением арифметических операций, вовлекающих переменные типа char и int, все они преобразуются к типу int, так что в арифметических выражениях переменные типа char по существу идентичны переменным типа int. Это вполне естественно и удобно; например, c -'0' - это целое выражение со значением между 0 и 9 в соответствии с тем, какой символ от '0' до '9' хранится в 'c', и, следовательно, оно является подходящим индексом для массива ndigit.

Выяснение вопроса, является ли данный символ цифрой, символом пустого промежутка или чем-либо еще, осуществляется последовательностью операторов

if (c >= '0' && c <= '9')
++ndigit[c-'0'];
else if(c == ' ' || c == '\n' || c == '\t')
++nwhite;
else
++nother;

конструкция

if  (условие)
        оператор
else if  (условие)
        оператор
else
         оператор

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

Программа просто движется сверху вниз до тех пор, пока не удовлетворится какое-нибудь условие; тогда выполняется соответствующий ' оператор ', и вся конструкция завершается. /Конечно, ' оператор ' может состоять из нескольких операторов, заключенных в фигурные скобки /. Если ни одно из условий не удовлетворяется, то выполняется ' оператор ', стоящий после заключительного else, если оно присутствует. Если последнее else и соответствующий ' оператор ' опущены (как в программе подсчета слов), то никаких действий не производится. Между начальным if и конечным else может помещаться произвольное количество групп

else if (условие) 
    оператор

С точки зрения стиля целесообразно записывать эту конструкцию так, как мы показали, с тем чтобы длинные выражения не залезали за правый край страницы.

Оператор switch (переключатель), который рассматривается в "лекции № 3" , представляет другую возможность для записи разветвления на несколько вариантов. этот оператор особенно удобен, когда проверяемое выражение является либо просто некоторым целым, либо символьным выражением, совпадающим с одной из некоторого набора констант. Версия этой программы, использующая оператор switch, будет для сравнения приведена в "лекции № 3" .

Упражнение 1-12

Напишите программу, печатающую гистограмму длин слов из файла ввода. Самое легкое - начертить гистограмму горизонтально; вертикальная ориентация требует больших усилий.

Ярослав Воробей
Ярослав Воробей
Россия
Дмитрий Левин
Дмитрий Левин
Россия