0 / 0 / 0
Регистрация: 06.05.2016
Сообщений: 8
|
|||||||||||
1 | |||||||||||
Выделить преобразование температур в отдельную функцию. (Керниган и Ритчи: Упражнение 1.15)10.05.2016, 14:57. Показов 3018. Ответов 11
Немного сцитирую:
Итак, мы имеем функцию power и главную функцию main, пользующуюся ее услугами, так что вся программа выглядит следующим образом:
тип-результата имя-функции (список параметров, если он есть) { объявления инструкции } Вопросы: 1: Почему Первая часть программы не может отдельно работать от второй (или наоборот)? (ошибка на скриншоте) 2: Почему компилятор не ругается на то, что base не инициализирован (когда программа в исходном виде) и какой тогда должен получаться результат? 3: Почему в power 1 - стоит переменная m, если она нигде не используется? 4: Где здесь функция? Их 2 все-таки или это одно целое? (т.к. по отдельности работать не хочет) 5: Функция power подразумевает x^y (power (x,y) ), тогда почему p=p*base, если base это условно "х"? А вроде бы сказано, что base возводится в n-ую степень. 6: Одно из заданий в конце темы - Упражнение 1.15. Перепишите программу преобразования температур, выделив само преобразование в отдельную функцию. Существует программа:
Заранее спасибо
0
|
10.05.2016, 14:57 | |
Ответы с готовыми решениями:
11
Керниган/Ритчи упражнение 1.20 Керниган Ритчи Упражнение 2.2 Керниган/Ритчи упражнение 1.22 Керниган, Ритчи, указатели и упражнение 5.3 |
10.05.2016, 15:44 | 2 |
Судя по всему, вы не дочитали раздел.
Потому, что в вашем листинге есть две части:
-- объявление прототипа функции (строка 2) -- реализация функции (строка 12 и ниже) Говоря простым языком: -- главная функция main -- power -- printf Вы заметили, что там еще и цикл есть? Восполните пробелы в знаниях, а потом дальше дерзайте.
1
|
0 / 0 / 0
Регистрация: 06.05.2016
Сообщений: 8
|
|
10.05.2016, 16:17 [ТС] | 3 |
1: Что тогда означает строка с 3 по 11?
2: (2: Почему компилятор не ругается на то, что base не инициализирован (когда программа в исходном виде) и какой тогда должен получаться результат? Потому, что это аргумент функции. Он получает значение в момент вызова функции.) - какое же значение он тогда получает? 5: Цикл говорит - пока i не станет меньше n делать то то, но чему тогда равно n? Оно используется только в условии и не имеет начального значения? (Он получает значение в момент вызова функции.) - какое же значение он тогда получает?) Вы уж извините, но не понимаю до сих пор
0
|
10.05.2016, 16:24 | 4 |
Прочитайте, что вы написали:
Теперь посмотрите на указанные вами строки. И подумайте.
Посмотрите, что у вас передано в месте вызова функции power.
Аналогично.
0
|
0 / 0 / 0
Регистрация: 06.05.2016
Сообщений: 8
|
|
10.05.2016, 16:39 [ТС] | 5 |
Хорошо, если это объявления и инструкции (что вроде бы понятно т.к. она так и должна действовать), то
Первая часть - я вызвал функцию, там все вполне понятно что она делает (это получается прототип?), после идет (как вы говорите - реализация). Мне неясен смысл реализации. Одно перемножается на другое и что?
Получается Base =0? Вы имеете в ввиду, что передача в месте вызова функции это return 0;? Просто я только сейчас с ним столкнулся и не очень понимаю, что с этим делать.
У меня в 6: - задание, если бы вы смогли бы решить это, то я лично бы посидел, поразбирал код, ибо чую, что вопросы будут нескончаемыми
0
|
10.05.2016, 16:49 | 6 |
Прочтите еще раз мой пост выше и узрите, в какой строчке я вам показал прототип. Затем найдите в коде места вызова. Убедитесь, что это разные места.
Реализация -- это конкретно то, что функция делает. А прототип -- это формальное ее описание вида:
0
|
0 / 0 / 0
Регистрация: 06.05.2016
Сообщений: 8
|
|
10.05.2016, 17:07 [ТС] | 7 |
Прототип - получается это только строка №2
Имел ввиду не "что такое реализация функции" а как она тут представлена. То есть Перемножение первого на второе и это получается степень второго???. тут 2 места вызова функции power и мне тут ничего не говорит чему равен Base. Собственно о книге. Там сосвсем немного написано, поэтому я даже сюда это выложу Кликните здесь для просмотра всего текста
Функции в Си играют ту же роль, что и подпрограммы и функции в Фортране или процедуры и функции в Паскале. Функция обеспечивает удобный способ отдельно оформить некоторое вычисление и пользоваться им далее, не заботясь о том, как оно реализовано. После того, как функции написаны, можно забыть, как они сделаны, достаточно знать лишь, что они умеют делать. Механизм использования функции в Си удобен, легок и эффективен. Нередко вы будете встречать короткие функции, вызываемые лишь единожды; они оформлены в виде функции с одной-единственной целью — получить более ясную программу.
До сих пор мы пользовались готовыми функциями вроде main, getchar и putchar, теперь настала пора нам самим написать несколько функций. В Си нет оператора возведения в степень вроде ** в Фортране. Поэтому проиллюстрируем механизм определения функции на примере функции power(m, n), которая возводит целое m в целую положительную степень n. Так, power(2, 5) имеет значение 32. На самом деле для практического применения эта функция малопригодна, так как оперирует лишь малыми целыми степенями, однако она вполне может послужить иллюстрацией. (В стандартной библиотеке есть функция pow(x, у), вычисляющая ху.) Итак, мы имеем функцию power и главную функцию main, пользующуюся ее услугами, так что вся программа выглядит следующим образом: #include <stdio.h> int power(int m, int n); /* тест функции power */ main() { int i; for (i = 0; i < 10; ++i) printf("%d %d %d\n", i, power(2,i), power(-3, i)); return 0; } /* возводит base в п-ю степень; n >= 0 */ int power(int base, int n) { int i, p; P = 1; for (i = 1; i <= n; ++i) p = p * base; return p; } Определение любой функции имеет следующий вид: тип-результата имя-функции (список параметров, если он есть) { объявления инструкции } Определения функций могут располагаться в любом порядке в одном или в нескольких исходных файлах, но любая функция должна быть целиком расположена в каком-то одном. Если исходный текст программы распределен по нескольким файлам, то, чтобы ее скомпилировать и загрузить, вам придется сказать несколько больше, чем при использовании одного файла; но это уже относится к операционной системе, а не к языку. Пока мы предполагаем, что обе функции находятся в одном файле, так что будет достаточно тех знаний, которые вы уже получили относительно запуска программ на Си. В следующей строке из функции main к power обращаются дважды. printf("%d %d %d\n", i, power(2,i), power(-3,1)); При каждом вызове функции power передаются два аргумента, и каждый раз главная программа main в ответ получает целое число, которое затем приводится к должному формату и печатается. Внутри выражения power(2,1) представляет собой целое значение точно так же, как 2 или i. (Не все функции в качестве результата выдают целые значения; подробно об этом будет сказано в главе 4.) В первой строке определения power: int power(int base, int n) указываются типы параметров, имя функции и тип результата. Имена параметров локальны внутри power, это значит, что они скрыты для любой другой функции, так что остальные подпрограммы могут свободно пользоваться теми же именами для своих целей. Последнее утверждение справедливо также для переменных i и р: i в power и i в main не имеют между собой ничего общего. Далее параметром мы будем называть переменную из списка параметров, заключенного в круглые скобки и заданного в определении функции, а аргументом — значение, используемое при обращении к функции. Иногда в том же смысле мы будем употреблять термины формальный аргумент и фактический аргумент. Значение, вычисляемое функцией power, возвращается в main с помощью инструкции return. За словом 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. Перепишите программу преобразования температур, выделив само преобразование в отдельную функцию.
0
|
10.05.2016, 17:45 | 8 | |||||
Вы просто думать не хотите. Вот у вас место вызова.
0
|
0 / 0 / 0
Регистрация: 06.05.2016
Сообщений: 8
|
|
10.05.2016, 18:02 [ТС] | 9 |
И чему он равен? 2 или -3? А при следующем цикле он опять примет одно из этих значений?
0
|
10.05.2016, 20:18 | 10 |
0
|
0 / 0 / 0
Регистрация: 06.05.2016
Сообщений: 8
|
|
10.05.2016, 23:40 [ТС] | 11 |
Ну по идее 2м). Но тут же и -3 есть)
0
|
0 / 0 / 1
Регистрация: 21.09.2017
Сообщений: 5
|
||||||
12.10.2017, 06:28 | 12 | |||||
Вот мой вариант, вроде бы работает:
0
|
12.10.2017, 06:28 | |
12.10.2017, 06:28 | |
Помогаю со студенческими работами здесь
12
Упражнение 1-22. Книга Керниган и Ритчи. Просьба помоч. Ритчи и Керниган Керниган/ритчи задачи 1.18 Указатели, Керниган и Ритчи 5.4 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |