Array M. УЭИТ - Язык Си - руководство для начинающих
- Название:Язык Си - руководство для начинающих
- Автор:
- Жанр:
- Издательство:Мир
- Год:1988
- Город:Москва
- ISBN:5-03-001309-1 /русск./
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Array M. УЭИТ - Язык Си - руководство для начинающих краткое содержание
Язык Си — руководство для начинающих
Язык Си - руководство для начинающих - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
printf(" %d\n", barn) печатает значение переменной barn
Мы можем также получить значение переменной, исходя из ее адреса, при помощи операции *:
РИС. 9.6. Имена, адреса и величнны в системе с "байтовой адресацией" тина IBM PC.
Дано pbarn= &bаrn;тогда *pbarn- это величина, помещенная по адресу &bаrn. Хотя мы и можем напечатать адрес переменной для удовлетворения своего любопытства, это не основное применение операции &. Более важным является то, что наличие операций &, *и указателей позволяет обрабатывать адреса и их содержимое в символическом виде, чем мы и занимались в программе обмен3.
ИСПОЛЬЗОВАНИЕ НАШИХ ЗНАНИЙ О ФУНКЦИЯХ
Теперь, когда мы знаем о функциях немного больше, соберем вместе несколько поучительных примеров, но сначала решим, чем мы будет заниматься.
Что вы скажете насчет функции возведения в степень, которая дает возможность возводить 2 в 5-ю степень или 3 в 3-ю и т. д.? Во-первых, необходимо решить, что будет служить входом программы. Это понятно: Cи требуется знать число, возводимое в степень, и показатель степени. Достичь этого можно путем введения двух аргументов:
powеr(base, exp)
int base, exp;
(Мы ограничились здесь целыми числами, а также тем предположением, что результат будет сравнительно невелик.)
Далее требуется решить, что будет выходом функции. Ответ, конечно, тоже очевиден. Выходом должно быть одно число, являющееся значением переменной answer. Мы можем реализовать это с помощью оператора
rеturn(answcr);
Теперь для получения требуемого результата выберем алгоритм:
установим переменную answerравной 1,
умножим answerна baseстолько раз, сколько указывает exp.
Возможно, не совсем ясно, как осуществить второй шаг, поэтому разобьем его дальше на более мелкие шаги:
умножим answerна baseи уменьшим на 1, остановимся, когда expстанет равной 0.
Если значение expравно, скажем 3, тогда использование такого алгоритма приведет к трем умножениям; поэтому данный способ кажется вполне разумным.
Очень хорошо. Выразим теперь этот алгоритм в виде программы на языке Си.
/* возводит основание в степень */
power(base, exp)
int base, exp;
{
int answer;
for (answer = 1; exp > 0; exp--)
answer = answer* base;
return(answer);
}
Теперь проверим ее работу с помощью драйвера.
/* проверка возведения в степень */
main( )
{
int x;
х= power(2,3);
printf(" %d\n", x);
x = power(-3,3);
prinif(" %d\n", x);
x = power(4, -2);
printf(" %d\n", x);
x = power(5, 10);
printf(" %d\n", x);
}
Объединим указанные две функции, проведем компиляцию и выполним данную программу. Результаты оказываются следующими:
8
-27
1
761
Итак, 2 в 3-й степени - это 8, а - 3 в 3-й равно -27. Пока все правильно. Но 4 в степени -2 равно 1/16, а не 1. А 5 в 10-й степени, если память нам не изменяет,- это 9 765 625. В чем дело? Во-первых, программа не предназначалась для обработки отрицательных степеней, поэтому она и не смогла справиться с этой задачей. Во-вторых, в нашей системе величины типа intне могут превосходить 65 535.
Можно расширить программу путем включения в нее обработки отрицательных степеней и использования чисел с плавающей точкой для представления переменных baseи answer. В любом случае показатель степени должен выражаться целым числом, потому что это число выполняемых умножений; нельзя произвести 2,31 умножения.
/* возводит основание в степень*/
double powеr(base, еxp)
double, base;
int exp;
{
double answer;
if(exp > 0)
{
for(answer = 1.0; exp > 0; exp --) answer * = base;
return(answer);
}
else if(base != 0)
{
for(answer = 1.0; exp < 0; exp++ ) answer /= base;
return(answer);
}
else /* base = 0 иеxp <= 0 */
{
printf(" Нельзя возводить 0 в %d стeпень!\n", exp);
return(0);
}
}
Необходимо отметить здесь несколько моментов.
Первый : самым главным является то, что мы должны описать тип функции! Переменная answerимеет тип double, следовательно, сама функция power()тоже должна быть типа double, так как ей присваивается величина, возвращаемая оператором return. Почему, спросите вы, мы не описывали тип функции раньше? Дело в том, что по умолчанию в языке Си функция имеет тип int(для большинства функций это так), если не указано что-то иное.
Второй : мы хотели показать, что не забыли те новые операции присваивания, которые ввели в гл. 8.
Третий : в соответствии с алгебраическими правилами возведение в отрицательную степень было преобразовано в деление. Это внесло опасность деления на нуль, но в данном случае мы предусмотрели выдачу сообщения об ошибке и возврат значения 0, чтобы работа программы не прекращалась.
Мы можем воспользоваться тем же драйвером при условии, что тип функции power( )там тоже описан.
/* проверка возведения в степень*/
main( )
{
double x;
double power( ); /* это пример oписания функции */
x = power(2.0, 3);
printf(" %.0f \n", x);x = power(-3.0, 3);
printf(" %.0f\n" , x);x = power(4.0, -2);
printf(" %.4f\n", x);x = power(5.0, 10);
print f ("%.0f \n", x);
}
На этот раз результаты работы программы выглядят вполне удовлетворительно.
8
-27
0.0625
9765625
Данный пример побуждает нас ввести следующий короткий раздел.
ОПИСАНИЕ ТИПОВ ФУНКЦИЙ
Тип функции определяется типом возвращаемого ею значения, а не типом ее аргументов. Если указание типа отсутствует, то по умолчанию считается, что функция имеет тип int. Если значения функции не принадлежат типу int, то необходимо указать ее тип в двух местах.
1. Описать тип функции в ее определении:
char pun(ch, n) /* функция возвращает символ */
int n;
char ch;
float raft(num) /* функция возвращает величину типа float */
int num;
2. Описать тип функции также в вызывающей программе. Описание функции должно быть приведено наряду с описаниями переменных программы; необходимо только указать скобки (но не аргументы) для идентификации данного объекта как функции.
main( )
{
char rch, pun( );
float raft;
}
Запомните!Если функция возвращает величину не типа int, указывайте тип функции там, где она определяется, и там, где она используется.
Резюме: функции
1. Форма записи
Типичное определение функции имеет следующий вид:
имя (список аргументов)
Читать дальшеИнтервал:
Закладка: