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

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

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

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

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

Поскольку main есть функция, как илюбая другая, она может вернуть результирующее значение тому, кто ее вызвал, — фактически в ту среду, изкоторой была запущена программа. Обычно возвращается нулевое значение, что говорит о нормальномзавершении выполнения. Ненулевое значение сигнализирует о необычном или ошибочном завершении. Досих пор ради простоты мы опускали return в main, но с этого момента будем задавать return какнапоминание о том, что программы должны сообщать о состоянии своего завершения в операционнуюсистему.Объявлениеint power(int m, int n);стоящее непосредственно перед main, сообщает, что функция power ожидает двух аргументов типа int ивозвращает результат типа int. Это объявление, называемое прототипом функции, должно бытьсогласовано с определением и всеми вызовами power.

Если определение функции или вызов несоответствует своему прототипу, это ошибка.Имена параметров не требуют согласования. Фактически в прототипе они могут быть произвольными иливообще отсутствовать, т.е. прототип можно было бы записать и так:int power(int, int);Однако удачно подобранные имена поясняют программу, и мы будем часто этим пользоваться.Историческая справка. Самые большие отличия ANSI-Си от более ранних версий языка как раз и заключаютсяв способах объявления и определения функций. В первой версии Си функцию power требовалось задавать вследующем виде:/* power: возводит base в n-ю степень; n >= 0 *//* (версия в старом стиле языка Си) */power(base, n)int base, n;(int i, p;P = 1;for (i = 1; i <= n; ++i)p = p * base;return p;}Здесь имена параметров перечислены в круглых скобках, а их типы заданы перед первой открывающейфигурной скобкой. В случае отсутствия указания о типе параметра, считается, что он имеет тип int.

(Телофункции не претерпело изменений.)Описание power в начале программы согласно первой версии Си должно было бы выглядеть следующимобразом:int power();Нельзя было задавать список параметров, и поэтому компилятор не имел возможности проверитьправильность обращений к power. Так как при отсутствии объявления power предполагалось, что функциявозвращает значение типа int, то в данном случае объявление целиком можно было бы опустить.Новый синтаксис для прототипов функций облегчает компилятору обнаружение ошибок в количествеаргументов и их типах. Старый синтаксис объявления и определения функции все еще допускаетсястандартом ANSI, по крайней мере, на переходный период, но если ваш компилятор поддерживает новыйсинтаксис, мы настоятельно рекомендуем пользоваться только им.Упражнение 1.15. Перепишите программу преобразования температур, выделив само преобразование вотдельную функцию.1.8.

Аргументы. Вызов по значениюОдно свойство функций в Си, вероятно, будет в новинку для программистов, которые уже пользовалисьдругими языками, в частности Фортраном. В Си все аргументы функции передаются "по значению". Этоследует понимать так, что вызываемой функции посылаются значения ее аргументов во временныхпеременных, а не сами аргументы. Такой способ передачи аргументов несколько отличается от "вызова поссылке" в Фортране и спецификации var при параметре в Паскале, которые позволяют подпрограмме иметьдоступ к самим аргументам, а не к их локальным копиям.Главное отличие заключается в том, что в Си вызываемая функция не может непосредственно изменитьпеременную вызывающей функции: она может изменить только ее частную, временную копию.Однако вызов по значению следует отнести к достоинствам языка, а не к его недостаткам. Благодаря этомусвойству обычно удается написать более компактную программу, содержащую меньшее число постороннихпеременных, поскольку параметры можно рассматривать как должным образом инициализированныелокальные переменные вызванной подпрограммы.

В качестве примера приведем еще одну версию функцииpower, в которой как раз использовано это свойство./* power: возводит base в n-ю степень: n >= 0; версия 2 */int power(int base, int n){int p;for (p = 1; n > 0; --n)p = p * base;return p;}Параметр n выступает здесь в роли временной переменной, в которой циклом for в убывающем порядкеведется счет числа шагов до тех пор, пока ее значение не станет нулем. При этом отпадает надобность вдополнительной переменной i для счетчика цикла.

Что бы мы ни делали с n внутри power, это не окажетникакого влияния на сам аргумент, копия которого была передана функции power при ее вызове.При желании можно сделать так, чтобы функция смогла изменить переменную в вызывающей программе.Для этого последняя должна передать адрес подлежащей изменению переменной (указатель напеременную), а в вызываемой функции следует объявить соответствующий параметр как указатель иорганизовать через него косвенный доступ к этой переменной.

Все, что касается указателей, мы рассмотрим вглаве 5.Механизм передачи массива в качестве аргумента несколько иной. Когда аргументом является имя массива,то функции передается значение, которое является адресом начала этого массива; никакие элементы массиване копируются. С помощью индексирования относительно полученного значения функция имеет доступ клюбому элементу массива. Разговор об этом пойдет в следующем параграфе.1.9. Символьные массивыСамый распространенный вид массива в Си — массив символов. Чтобы проиллюстрировать использованиесимвольных массивов и работающих с ними функций, напишем программу, которая читает набор текстовыхстрок и печатает самую длинную из них. Ее схема достаточно проста:while (есть ли еще строка?)if (данная строка длиннее самой длинной из предыдущих)запомнить еезапомнить ее длинунапечатать самую длинную строкуИз схемы видно, что программа естественным образом распадается на части.

Одна из них получает новуюстроку, другая проверяет ее, третья запоминает, а остальные управляют процессом вычислений.Поскольку процесс четко распадается на части, хорошо бы так и перевести его на Си. Поэтому сначаланапишем отдельную функцию getline для получения очередной строки. Мы попытаемся сделать этуфункцию полезной и для других применений. Как минимум getline должна сигнализировать о возможномконце файла, а еще лучше, если она будет выдавать длину строки — или нуль в случае исчерпания файла.Нуль годится для признака конца файла, поскольку не бывает строк нулевой длины; даже строка, содержащаятолько один символ новой строки, имеет длину 1.Когда мы обнаружили строку более длинную, чем самая длинная из всех предыдущих, то нам надо будет гдето ее запомнить. Здесь напрашивается вторая функция, сору, которая умеет копировать новую строку внадежное место.Наконец, нам необходима главная программа, которая бы управляла функциями getline и copy.

Вот каквыглядит наша программа в целом:#include <stdio.h>#define MAXLINE 1000 /* максимальный размер вводимой строки */int getline(char linef], int MAXLINE);void copy(char to[], char fromf]);/* печать самой длинной строки */main(){int len; /* длина текущей строки */int max; /* длина максимальной из просмотренных строк */char line[MAXLINE]; /* текущая строка */char longest[MAXLINE]; /* самая длинная строка */max = 0;while ((len = getline(line, MAXLINE)) > 0)if (len > max) {max = len;copy(longest, line);}if (max > 0) /* была ли хоть одна строка? */printf("%s", longest);return 0;}/* getline: читает строку в s, возвращает длину */int getline(char s[], int lim){int c, i;for (i = 0; i < lim-1 && (c = getchar()) != EOF && с != '\n'; ++i)s[i] = c;if (c == 'n'; {s[i] = c;++i;}s[i] = '\0';return i;}/* copy: копирует из 'from' в 'to'; to достаточно большой */void copy(char to[], char from[]){int i;i = 0;while ((to[i] = from[i]) != '\0')++i;}Мы предполагаем, что функции getline и copy, описанные в начале программы, находятся в том жефайле, что и main.Функции main и getline взаимодействуют между собой через пару аргументов и возвращаемое значение.В getline аргументы определяются строкойint getline(char s[], int lim)Как мы видим, ее первый аргумент s есть массив, а второй, lim, имеет тип int.

Задание размера массива вопределении имеет целью резервирование памяти. В самой getline задавать длину массива s нетнеобходимости, так как его размер указан в main. Чтобы вернуть значение вызывающей программе,getline использует return точно так же, как это делает функция power. В приведенной строке такжесообщается, что getIine возвращает значение типа int, но так как при отсутствии указания о типеподразумевается int, то перед getline слово int можно опустить.Одни функции возвращают результирующее значение, другие (такие как copy) нужны только для того, чтобыпроизвести какие-то действия, не выдавая никакого значения.

На месте типа результата в copy стоит void.Это явное указание на то, что никакого значения данная функция не возвращает.Функция getline в конец создаваемого ею массива помещает символ '\0' (null-символ, кодируемыйнулевым байтом), чтобы пометить конец строки символов. То же соглашение относительно окончания нулемсоблюдается и в случае строковой константы вроде"hello\n"В данном случае для него формируется массив из символов этой строки с '\0' в конце.hello\n\0Спецификация %s в формате printf предполагает, что соответствующий ей аргумент — строка символов,оформленная указанным выше образом.

Функция сору в своей работе также опирается на тот факт, чточитаемый ею аргумент заканчивается символом '\0', который она копирует наряду с остальнымисимволами. (Все сказанное предполагает, что '\0' не встречается внутри обычного текста.)Попутно стоит заметить, что при работе даже с такой маленькой программой мы сталкиваемся с некоторымиконструктивными трудностями. Например, что должна делать main, если встретится строка, превышающаядопустимый размер? Функция getline работает надежно: если массив полон, она прекращает пересылку,даже если символа новой строки не обнаружила. Получив от getline длину строки и увидев, что онасовпадает с MAXLINE, главная программа main могла бы "отловить" этот особый случай и справиться с ним.В интересах краткости описание этого случая мы здесь опускаем.Пользователи getline не могут заранее узнать, сколь длинными будут вводимые строки, поэтому getlineделает проверки на переполнение.

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

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

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

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