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



         

Основные сведения - часть 2


#define maxline 1000 main() /* find all lines matching a pattern */ { char line[maxline];

while (getline(line, maxline) > 0) if (index(line, "the") >= 0) printf("%s", line); } getline(s, lim) /* get line into s, return length * char s[]; int lim; { int c, i;

i = 0; while(--lim>0 && (c=getchar()) != EOF && c != '\n') s[i++] = c; if (c == '\n') s[i++] = c; s[i] = '\0'; return(i); }

index(s,t) /* return index of t in s,-1 if none */ char s[], t[]; { int i, j, k;

for (i = 0; s[i] != '\0'; i++) { for(j=i, k=0; t[k] !='\0' && s[j] == t[k]; j++; k++) ; if (t[k] == '\0') return(i); } return(-1); }

Каждая функция имеет вид имя (список аргументов, если они имеются) описания аргументов, если они имеются

{ описания и операторы , если они имеются }

Как и указывается, некоторые части могут отсутствовать; минимальной функцией является

dummy () { }

которая не совершает никаких действий.

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

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

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

return (выражение)

Вызывающая функция может игнорировать возвращаемое значение, если она этого пожелает. Более того, после return может не быть вообще никакого выражения; в этом случае в вызывающую программу не передается никакого значения. Управление также возвращется в вызывающую программу без передачи какого-либо значения и в том случае, когда при выполнении мы "проваливаемся" на конец функции, достигая закрывающейся правой фигурной скобки. Eсли функция возвращает значение из одного места и не возвращает никакого значения из другого места, это не является незаконным, но может быть признаком каких-то неприятностей. В любом случае "значением" функции, которая не возвращает значения, несомненно будет мусор. Отладочная программа lint проверяет такие ошибки.

Механика компиляции и загрузки "C"-программ, расположенных в нескольких исходных файлах, меняется от системы к системе. В системе "UNIX", например, эту работу выполняет команда 'cc', упомянутая в лекции №1. Предположим, что три функции находятся в трех различных файлах с именами main.с, getline.c и index.с. Тогда команда

cc main.c getline.c index.c

компилирует эти три файла, помещает полученный настраиваемый объектный код в файлы main.o, getline.o и index.o и загружает их всех в выполняемый файл, называемый a.out.

Если имеется какая-то ошибка, скажем в main.c, то этот файл можно перекомпилировать отдельно и загрузить вместе с предыдущими объектными файлами по команде

cc main.c getlin.o index.o

Команда 'cc' использует соглашение о наименовании с ".с" и ".о" для того, чтобы отличить исходные файлы от объектных.

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

Составьте программу для функции rindex(s,t), которая возвращает позицию самого правого вхождения t в s и -1, если s не содержит t.




Содержание  Назад  Вперед