Главная » Просмотр файлов » Керниган и Ритчи - Язык программирования Си

Керниган и Ритчи - Язык программирования Си (793773), страница 20

Файл №793773 Керниган и Ритчи - Язык программирования Си (Керниган и Ритчи - Язык программирования Си) 20 страницаКерниган и Ритчи - Язык программирования Си (793773) страница 202019-04-24СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 20)

Синтаксис определения функции также изменен, так что теперь объявления и определенияфункций соответствуют друг другу. Это позволяет компилятору обнаруживать намного больше ошибок, чемраньше. Кроме того, если типы аргументов соответствующим образом объявлены, то необходимыепреобразования аргументов выполняются автоматически.Стандарт вносит ясность в правила, определяющие области видимости имен; в частности, он требует, чтобыдля каждого внешнего объекта было только одно определение. В нем обобщены средства инициализации:теперь можно инициализировать автоматические массивы и структуры.Улучшен также препроцессор Си.

Он включает более широкий набор директив условной компиляции,предоставляет возможность из макроаргументов генерировать строки в кавычках, а кроме того, содержитболее совершенный механизм управления процессом макрорасширения.4.1. Основные сведения о функцияхНачнем с того, что сконструируем программу, печатающую те строки вводимого текста, в которых содержитсянекоторый "образец", заданный в виде строки символов. (Эта программа представляет собой частный случайфункции grep системы UNIX.) Рассмотрим пример: в результате поиска образца "ould" в строках текстаAh Love! could you and I with Fate conspireTo grasp this sorry Scheme of Things entire,Would not we shatter it to bits — and thenRe-mould it nearer to the Heart's Desire!мы получимAh Love! could you and I with Fate conspireWould not we shatter it to bits — and thenRe-mould it nearer to the Heart's Desire!Работа по поиску образца четко распадается на три этапа:while (существует еще строка)if (строка содержит образец)напечатать ееХотя все три составляющие процесса поиска можно поместить в функцию main, все же лучше сохранитьприведенную структуру и каждую ее часть реализовать в виде отдельной функции.

Легче иметь дело с тремянебольшими частями, чем с одной большой, поскольку, если несущественные особенности реализациискрыты в функциях, вероятность их нежелательного воздействия друг на друга минимальна. Кроме того,оформленные в виде функций соответствующие части могут оказаться полезными и в других программах.Конструкция "while (существует еще строка)" реализована в getline (см. главу 1), а фразу"напечатать ее" можно записать с помощью готовой функции printf.

Таким образом, нам остаетсяперевести на Си только то, что определяет, входит ли заданный образец в строку.Чтобы решить эту задачу, мы напишем функцию strindex(s, t), которая указывает место (индекс) встроке s, где начинается строка t, или -1, если s не содержит t. Так как в Си нумерация элементов в массивахначинается с нуля, отрицательное число -1 подходит в качестве признака неудачного поиска.

Если далее нампотребуется более сложное отождествление по образцу, мы просто заменим strindex на другую функцию,оставив при этом остальную часть программы без изменений. (Библиотечная функция strstr аналогичнафункции strindex и отличается от последней только тем, что возвращает не индекс, а указатель.)После такого проектирования программы ее "деталировка" оказывается очевидной. Мы имеемпредставление о программе в целом и знаем, как взаимодействуют ее части.

В нашей программе образец дляпоиска задается строкой-литералом, что снижает ее универсальность. В главе 5 мы еще вернемся к проблемеинициализации символьных массивов и покажем, как образец сделать параметром, устанавливаемым призапуске программы. Здесь приведена несколько измененная версия функции getline, и было быпоучительно сравнить ее с версией, рассмотренной в главе 1.#include <stdio.h>#define MAXLINE 1000 /* максимальный размер вводимой строки */int getline(char line[], int max);int strindex(char source[], char searchfor[]);char pattern[] = "ould"; /* образец для поиска *//* найти все строки, содержащие образец */main(){char line[MAXLINE];int found = 0;while (getlinedine, MAXLINE) > 0)if (strindex(line, pattern) >= 0) {printf ("%s", line);found++;}return found;}/* getline: читает строку в s, возвращает длину */int getline(char s[], int lim){int c, i;i = 0;while (--lim > 0 && (c = getchar()) != EOF && с != '\n' )s[i++] = с;if (с == '\n')s[i++] = c;s[i] = '\0';return i;}/* strindex: вычисляет место t в s или выдает -1, если t нет в s */int strindex (char s[], char 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 (k > 0 && t[k] == '\0')return i;}return -1;}Определение любой функции имеет следующий вид:тип-результата имя-функции (объявления аргументов){объявления и инструкции}Отдельные части определения могут отсутствовать, как, например, в определении "минимальной" функцииdummy() {}которая ничего не вычисляет и ничего не возвращает.

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

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

Более того, выражение в returnможет отсутствовать, и тогда вообще никакое значение не будет возвращено в вызывающую функцию.Управление возвращается в вызывающую функцию без результирующего значения также и в том случае,когда вычисления достигли "конца" (т. е. последней закрывающей фигурной скобки функции). Не запрещена(но должна вызывать настороженность) ситуация, когда в одной и той же функции одни return имеют присебе выражения, а другие — не имеют. Во всех случаях, когда функция "забыла" передать результат вreturn, она обязательно выдаст "мусор".Функция main в программе поиска по образцу возвращает в качестве результата количество найденныхстрок. Это число доступно той среде, из которой данная программа была вызвана.Механизмы компиляции и загрузки Си-программ, расположенных в нескольких исходных файлах, в разныхсистемах могут различаться.

В системе UNIX, например, эти работы выполняет упомянутая в главе 1 командаcc. Предположим, что три функции нашего последнего примера расположены в трех разных файлах:main.с, getline.с и strindex.с. Тогда командаcc main.с getline.c strindex.cскомпилирует указанные файлы, поместив результат компиляции в файлы объектных модулей main.о,getline.о и strindex.o, и затем загрузит их в исполняемый файл a.out.

Если обнаружилась ошибка,например, в файле main.с, то его можно скомпилировать снова и результат загрузить ранее полученнымиобъектными файлами, выполнив следующую команду:cc main.с getline.o strindex.оКоманда cc использует стандартные расширения файлов ".с" и".о", чтобы отличать исходные файлы отобъектных.Упражнение 4.1.

Напишите функцию strindex(s, t), которая выдает позицию самого правого вхожденияt в s или -1, если вхождения не обнаружено.4.2. Функции, возвращающие нецелые значенияВ предыдущих примерах функции либо вообще не возвращали результирующих значений (void), либовозвращали значения типа int. А как быть, когда результат функции должен иметь другой тип? Многиевычислительные функции, как, например, sqrt, sin и cos, возвращают значения типа double; другиеспециальные функции могут выдавать значения еще каких-то типов. Чтобы проиллюстрировать, какимобразом функция может возвратить нецелое значение, напишем функцию atof(s), которая переводитстроку s в соответствующее число с плавающей точкой двойной точности.

Функция atof представляет собойрасширение функции atoi, две версии которой были рассмотрены в главах 2 и 3. Она имеет дело со знаком(которого может и не быть), с десятичной точкой, а также с целой и дробной частями, одна из которых можетотсутствовать. Наша версия не является высококачественной программой преобразования вводимых чисел;такая программа потребовала бы заметно больше памяти. Функция atof входит в стандартную библиотекупрограмм; ее описание содержится в заголовочном файле <stdlib.h>.Прежде всего отметим, что объявлять тип возвращаемого значения должна сама atof, так как этот тип неесть int.

Указатель типа задается перед именем функции.#include <ctype.h>/* atof: преобразование строки s в double */double atof (char s[]){double val, power;int i, sign;for (i = 0; isspace (s[i]); i++); /* игнорирование левых символов-разделителей */sign = (s[i] == '-') ? -1 : 1;if (s[i] == '+' || s[i] == '-')i++;for (val = 0.0; isdigit (s[i]); i++)val = 10.0 * val + (s[i] - '0');if (s[i] =='.')i++;for (power = 1.0; isdigit(s[i]); i++) {val = 10.0 * val + (s[i] - '0');power *= 10.0;}return sign * val / power;}Кроме того, важно, чтобы вызывающая программа знала, что atof возвращает нецелое значение.

Один изспособов обеспечить это — явно описать atof в вызывающей программе. Подобное описаниедемонстрируется ниже в программе простенького калькулятора (достаточного для проверки баланса чековойкнижки), который каждую вводимую строку воспринимает как число, прибавляет его к текущей сумме ипечатает ее новое значение.#include <stdio.h>#define MAXLINE 100/* примитивный калькулятор */main(){double sum, atof (char[]);char line[MAXLINE];int getline (char line[], int max);sum = 0;while (getline(line, MAXLINE) > 0)printf ("\t%g\n", sum += atof(line));return 0;}В объявленииdouble sum, atof (char[]);говорится, что sum — переменная типа double, a atof — функция, которая принимает один аргумент типаchar[] и возвращает результат типа double.Объявление и определение функции atof должны соответствовать друг другу.

Если в одном исходном файлесама функция atof и обращение к ней в main имеют разные типы, то это несоответствие будетзафиксировано компилятором как ошибка. Но если функция atof была скомпилирована отдельно (что болеевероятно), то несоответствие типов не будет обнаружено, и atof возвратит значение типа double, котороефункция main воспримет как int, что приведет к бессмысленному результату.Это последнее утверждение, вероятно, вызовет у вас удивление, поскольку ранее говорилось онеобходимости соответствия объявлений и определений. Причина несоответствия, возможно, будетследствием того, что вообще отсутствует прототип функции, и функция неявно объявляется при первом своемпоявлении в выражении, как, например, вsum += atof(line)Если в выражении встретилось имя, нигде ранее не объявленное, за которым следует открывающая скобка,то такое имя по контексту считается именем функции, возвращающей результат типа int; при этомотносительно ее аргументов ничего не предполагается.

Характеристики

Тип файла
PDF-файл
Размер
2,25 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
7030
Авторов
на СтудИзбе
260
Средний доход
с одного платного файла
Обучение Подробнее