Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Приоритет переменных с файловой и локальной областями действия. 2 страница




 

7.32.6. Параметры в формате чисел двойной длины.

Тип чисел двойной длины double обеспечивает очень большую точность чисел с плавающей точкой. Все функции, описанные в заголовочном файле math.h, получают и возвращают значения типа double. В своих программах вы можете использовать и другие математические функции, перечисленные в табл. 8.1. Для получения более подробной информации вы можете также просмотреть содержимое файла math.h.

 

Таблица. Математические функции, описанные в заголовочном файле Microsoft math.h

 

acos, acosl Арккосинус
asin, asinl Арксинус
atan, atanl Арктангенс
atan2,atan2l Арктангенс
bessel Функции Бесселя
_cabs, _cabsl Абсолютное значение комплексного числа
ceil, ceill Целочисленное максимальное значение
_chgsign Инвертирование знака
_clear87, clearfp Чтение и сброс слова состояния числа с плавающей точкой
_control87, _controlfp Чтение старого управляющего слова числа с плавающей точкой и установка нового
_copysign Возвращает число x со знаком числа y
cos,cosl Косинус
cosh, coshl Гиперболический косинус
_dieeetomsbin Преобразование IEEE-числа двойной точности в двоичный формат Microsoft
Div Деление одного целого на другое, возвращается частное и остаток
_dmsbintoieee Преобразование Microsoft-числа двойной точности в формат IEEE
exp, expl Степенная функция
fabs, fabsl Абсолютное значение
_fieeetomsbin Преобразование IEEE-числа одинарной точности в двоичный формат Microsoft
_finite Проверка числа с плавающей точкой на бесконечность
floor, floorl Нахождение наибольшего целого, меньшего или равного аргументу
fmod, fmodl Нахождение остатка
_fmsbintoieee Преобразование Microsoft-числа одинарной точности в формат IEEE
_fpclass Возвращает слово состояния с информацией о классе чисел с плавающей точкой
_ fpieee_flt Вызов описанного пользователем обработчика исключительных ситуаций для чисел с плавающей точкой IEEE-стандарта
_fpreset Повторная инициализация пакета математических функций
frexp, frexpl Вычисление экспоненциального значения
_hypot, _hypotl Вычисление гипотенузы правильного треугольника
_isnan Проверка числа с плавающей точкой на значение “не число” (NAN)
ldexp, ldexpl Произведение от аргумента
Ldiv Деление одного целого long на другое, возвращается частное и остаток
log, logl Натуральный логарифм
log10, log10l Десятичный логарифм
_logb Выделение показателя числа с плавающей точкой
_irotl, _irotr Сдвиг числа unsigned long int влево или вправо
_matherr, _matherrl Обработка математических ошибок
_max, _min Определение большего или меньшего из двух значение
modf, modfl Деление аргумента на целую и дробную части
_nextafter Определение следующего значения
pow, powl Вычисление значения, возведенного в степень
Rand Получение псевдослучайного числа
_rotl, _rotr Сдвиг числа unsigned int влево или вправо
_scalb Степень числа 2, определяемая аргументом
sin, sinl Синус
sinh, sinhl Гиперболический синус
sqrt, sqrtl Квадратный корень
Srand Инициализация датчика псевдослучайных чисел
_status87, _statusfp Получение слов состояния числа с плавающей точкой
tan, tanl Тангенс
tanh, tanhl Гиперболический тангенс

 

7.32.7. Массивы в качестве параметров.

В следующем примере содержимое некоторого массива передается в функцию в качестве параметра, вызываемого по ссылке. В этом случае адрес первого элемента массива передается через указатель.

//08FPNTR.C

/*Программа на С передает функции массив в качестве параметра.

Для передачи информации о массиве используется указатель*/

#include "stdafx.h"

#include <iostream>

#include <conio.h>

#include <stdio.h>

#include <process.h>

#include <ctype.h>

#include <stdlib.h>

#include <math.h>

using namespace std;

 

void voutput(int *pinums);

 

main()

{

int iyourarray[7]={2,7,15,32,45,3,1};

/* Передать информацию о массиве в функцию */

printf("Send array information to function. \n");

voutput(iyourarray);

 

printf ("\n\nPress any key to finish\n");

_getch();

return(0);

}

 

void voutput(int *pinums)

{

int t;

/* Результат равен */

printf("The result is:\n");

for(t=0;t<7;t++)

printf(" #%d %d\n",t,pinums[t]);

}

 

Обратите внимание на то, что при вызове функции указывается только имя iyourarray.

Также допустимо передать информацию по адресу и для безразмерного массива. В следующем примере показано, как это можно сделать на C++. (Такой же подход возможен и в С.) Информация, содержащаяся в массиве iyourarray, передается путем указания адреса его первого элемента.

 

 

7.33. Возвращение значения функцией: оператор return.

Приведем наш драйвер и функцию, вычисляющую абсолютную величину числа:

 

/* abs.драйвер */

#include<stdio.h>

int abs(int);

void main()

{

int a= 10, b= 0, c= -22;

int d, e, f;

 

d = abs(a);

e = abs(b);

f = abs(c);

printf(" %d %d %d\n", d, e, f);

}

 

/* функция, вычисляющая величину числа */

int abs(int x)

{

int y;

y = (x < 0)? - x: x; /*вспомните операцию?: */

return (y); /* возвращает значение у вызывающей программе */

}

Результат работы программы выглядит так:

 

10 0 22

 

Ключевое слово return указывает на то, что значение выражения, заключенного в круглые скобки, будет присвоено функции, содержащей это ключевое слово. Поэтому, когда функция abs() впервые вызывается нашим драйвером, значением abs(a) будет число 10, которое затем присваивается переменной d.

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

 

d = abs(a);

 

по-другому можно выразить так:

 

abs(a);

d = у;

 

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

 

/* функция, вычисляющая абсолютную величину числа, вторая версия */

abs(x)

int x;

{

if (x < 0)

return(-x);

else

return(x);

}

 

Наличие оператора return препятствует тому, чтобы оператор печати printf() когда-нибудь выполнился в программе. Вы можете также использовать просто оператор

 

return;

 

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

 

7.34. Типы функций.

Тип функции определяется типом возвращаемого ею значения, а не типом ее аргументов. Если указание типа отсутствует, то по умолчанию считается, что функция имеет тип 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, указывайте тип функции там, где она определяется, и там, где она используется.

 

7.34.1. Функции типа void.

//08VOIDF.C

/*Программа на С иллюстрирует использование функции типа void.

Программа печатает двоичное представление числа*/

 

#include <iostream>

#include <conio.h>

#include <stdio.h>

using namespace std;

 

void vbinary(int ivalue);

 

main()

{

int ivalue;

/* Введите число с основанием 10 для преобразования в двоичное */

printf("Enter a decimal number to conversion to binary.\n");

scanf("%d",&ivalue);

vbinary(ivalue);

 

printf ("\n\nPress any key to finish\n");

_getch();

return(0);

}

 

void vbinary(int idata)

{

int t=0;

int iyourarray[50];

while(idata!= 0)

{

iyourarray[t]=(idata %2);

idata/=2;

t++;

}

t--;

printf("The binary value is:\n");

for(;t>=0;t--)

printf("%1d",iyourarray[t]);

printf("\n");

}

 

7.34.2. Функции типа char.

Функция С clowercase() имеет символьный параметр и возвращает также символьное значение. В данном примере некоторая заглавная буква вводится с клавиатуры и передается в функцию, в которой для преобразования символа в строчную букву используется библиотечная функция tolower() (из стандартной библиотеки с прототипом в файле ctype.h). Близкие tolower() функции: toascii() и toupper().

//08CHARF.C

/*Программа на С иллюстрирует использование функции типа char.

Функция получает символ в верхнем регистре и преобразует его

в нижний регистр*/

 

#include <iostream>

#include <conio.h>

#include <stdio.h>

using namespace std;

 

char clowercase(char c);

 

main()

{

char clowchar,chichar;

/* Введите символ в верхнем регистре */

printf("Enter an uppercase character.\n");

chichar=getchar();

clowchar=clowercase(chichar);

printf("Entering character is %c\nConverting character is %c\n",chichar,clowchar);

 

printf ("\n\nPress any key to finish\n");

_getch();

return(0);

}

 

char clowercase(char c)

{

return(tolower(c));

}

 

7.34.3. Функции типа int.

Следующая функция имеет целочисленные параметры и возвращает целые значения. Функция icube() получает из main() некоторое число (0, 2, 4, 6, 8, 10 и так далее), возводит его в куб и возвращает целое значение в main(). Исходное число и его куб выводятся на экран.

 

//08INTF.C

/*Программа на С иллюстрирует использование функции типа int.

Функция считывает по очереди целые числа и возвращает

их значения, возведенные в куб*/

#include <iostream>

#include <conio.h>

#include <stdio.h>

using namespace std;

 

int icube(int ivalue);

 

main()

{

int k,inumbercube;

for(k=0;k<20;k+=2)

{

inumbercube=icube(k);

/* Куб числа... равен... */

printf("The cube of the number %2d is %d\n",k,inumbercube);

}

 

printf ("\n\nPress any key to finish\n");

_getch();

return(0);

}

 

int icube(int ivalue)

{

return(ivalue*ivalue*ivalue);

}

 

 

7.34.4. Функции типа long.

Следующий пример представляет собой программу на C++, получающую в качестве параметра целочисленную переменную и возвращающую значение типа long.

// 08LONGF.CPP

// Программа на C++, иллюстрирующая использование функции типа long.

// Эта функция получает целые числа и возвращает значения,

// равные заданной степени числа 2

 

#include <iostream>

#include <conio.h>

#include <stdio.h>

using namespace std;

 

long lpower(int ivalue);

 

main()

{

int k;

long lanswer;

for(k=0;k<21;k++)

{

lanswer=lpower(k);

// 2 в степени... равно...

cout << "2 raised to the " << k

<< " power is " << lanswer << endl;

}

 

printf ("\n\nPress any key to finish\n");

_getch();

return(0);

}

 

long lpower(int ivalue)

{

int t;

long lseed=1;

for(t=0;t<ivalue;t++)

lseed*=2;

return(lseed);

}

Эта функция умножает исходное число само на себя столько раз, сколько нужно для возведения в заданную степень.

 

7.34.5. Функции типа float.

В следующем примере массив типа float передается в качестве параметра в функцию, которая возвращает значение типа float. В этом примере на C++ определяется произведение всех элементов массива.

 

// 08FLOATF.CPP

// Программа на C++ иллюстрирует использование функции типа float.

// Функция получает массив чисел типа float и возвращает их

// произведение в виде числа с плавающей точкой

#include <iostream>

#include <conio.h>

#include <stdio.h>

using namespace std;

 

float fproduct(float farray[]);

 

main()

{

float fmyarray[7]={(float) 4.3,(float) 1.8,(float) 6.12,(float) 3.19,

(float) 0.01,(float) 0.1,(float) 9876.2};

float fmultiplied;

fmultiplied=fproduct(fmyarray);

// Произведение всех введенных чисел равно

cout << "The product of all array enteris is: "

<< fmultiplied << endl;

 

printf ("\n\nPress any key to finish\n");

_getch();

return(0);

}

 

float fproduct(float farray[])

{

int i;

float fpartial;

fpartial=farray[0];

for(i=1;i<7;i++)

fpartial*=farray[i];

return(fpartial);

}

 

7.34.6. Функции типа double.

В следующем примере на С передаются и возвращаются значения типа double. Функция dtrigcosine() преобразует значение угла, выраженное в градусах, в косинус этого угла.

 

//08DOUBLE.C

/*Программа на С иллюстрирует использование функции типа double.

Функция считывает целые числа от 0 до 90 и возвращает значение

косинуса каждого числа*/

#include <iostream>

#include <conio.h>

#include <stdio.h>

#include <math.h>

using namespace std;

 

const double dPi=3.14159265359;

double dtrigcosine(double dangle);

 

main()

{

int j;

double dcosine;

for(j=0;j<91;j++)

{

dcosine=dtrigcosine((double) j);

/* Косинус... градусов равен */

printf("The cosine of %d degrees is %19.18lf \n",j,dcosine);

}

 

printf ("\n\nPress any key to finish\n");

_getch();

return(0);

}

 

double dtrigcosine(double dangle)

{

double dpartial;

dpartial=cos((dPi/180.0)*dangle);

return(dpartial);

}

 

7.35. Аргументы функции main().

В обоих языках, С и C++, имеется возможность обработки аргументов командной строки, которые представляют собой параметры, вводимые вместе с именем программы при ее вызове из командной строки операционной системы. Эта возможность позволяет передавать аргументы непосредственно вашей программе без дополнительных запросов из этой программы. Например, пусть некоторая программа получает из командной строки четыре аргумента:

 

YOURPROGRAM Sneakers, Dumbdog, Shadow, Wonderdog

 

Здесь четыре значения передаются из командной строки программе YOURPROGRAM. На самом деле эта информация передается функции main(). Один аргумент, получаемый main(), argc, представляет собой целое число, определяющее количество элементов командной строки плюс 1.

Начиная с DOS 3.0, название программы считается первым элементом, передаваемым из командной строки. Второй аргумент — это указатель на массив указателей на строки, называемый argv. Так как все элементы являются символьными строками, argv имеет тип char *[argc]. Поскольку все программы имеют название, argc всегда на единицу больше числа аргументов командной строки. В дальнейшем вы познакомитесь с различными способами извлечения разных типов данных из командной строки. Названия аргументов argc и argv являются общепринятыми именами переменных, используемых во всех программах на С и C++.

 

7.35.1. Строки.

Аргументы командной строки передаются как символьные строки, что облегчает работу с ними.

/*08SARGV.C

Программа на С иллюстрирует ввод в программу строковых данных

с аргументом командной строки

C:\> 08SARGV.EXE 07 Nik Helen*/

 

#include "stdafx.h"

#include <iostream>

#include <conio.h>

#include <stdio.h>

#include <process.h>

#include <ctype.h>

#include <stdlib.h>

#include <math.h>

using namespace std;

 

int main(int argc,char *argv[])

{

int t;

if(argc<2)

{

/* Введите несколько имен в командной строке */

/* при запуске этой программы! */

printf("Enter several names on the commond line\n");

printf("when executing this program!\n");

/* Попробуйте еще раз. */

printf("Please try again.\n");

exit(0);

}

for(t=1;t<argc;t++)

printf("Entry #%d is %s\n",t,argv[t]);

 

printf ("\n\nPress any key to finish\n");

_getch();

return(0);

}

 

Эта программа целиком находится в функции main() и не требует дополнительных функций. Имена, введенные с командной строки, печатаются на экране в том же порядке. Если из командной строки вводятся цифровые значения, то они интерпретируются как ASCII-строки отдельных символов и должны печататься такими как есть.

 

7.35.2. Целые числа.

Во многих программах желательно иметь возможность ввода из командной строки целых чисел; это может быть, к примеру, программа для вычисления средних оценок студентов. В таких случаях символьная информация в кодах ASCII должна быть преобразована в целые значения. В приведенном ниже примере на C++ из командной строки вводится одно целое число. Поскольку на самом деле это число является символьной строкой, оно преобразуется в целое при помощи библиотечной функции atoi(). Значение из командной строки ivalue передается в использованную в предыдущем примере функцию vbinary(), которая преобразует значение ivalue в строку двоичных цифр и печатает ее на экране. Когда управление возвращается функции main(), значение ivalue печатается в восьмеричном и шестнадцатеричном форматах.

// 08IARGV.CPP

// Программа на C++ иллюстрирует ввод в программу целых чисел

// из командной строки

// C:\> 08IARGV.EXE 97

 

#include <iostream>

#include <conio.h>

#include <stdio.h>

#include <process.h>

#include <ctype.h>

#include <stdlib.h>

#include <math.h>

using namespace std;

 

void vbinary(int idigits);

 

main(int argc, char *argv[])

{

int ivalue;

if(argc!=2)

{

// Введите десятичное число в командной строке.

// Оно будет преобразовано в двоичное, восьмеричное и

// шестнадцатеричное.

cout<<"Enter a decimal number on the command line.\n";

cout<<"It will be converted to binary, octal and hexadecimal.\n";

exit(1);

}

ivalue=atoi(argv[1]);

// Десятичное значение равно

cout << "The decimal value is: " << ivalue << endl;

vbinary(ivalue);

// Восьмеричное значение равно

cout << "The octal value is: " << oct << ivalue << endl;

// Шестнадцатеричное значение равно

cout << "The hexadecimal value is: " << hex << ivalue << endl;

 

printf ("\n\nPress any key to finish\n");

_getch();

return(0);

}

 

void vbinary(int idigits)

{

int t=0;

int iyourarray[50];

while(idigits!= 0)

{

iyourarray[t]=(idigits %2);

idigits/=2;

t++;

}

t--;

// Двоичное значение равно

cout << "The binary value is: ";

for(;t>=0;t--)

cout << dec << iyourarray[t];

cout << endl;

}

 

7.35.3. Числа с плавающей точкой.

Следующий пример на С позволяет ввести из командной строки значения нескольких углов. Вычисляются косинусы углов и печатаются на экране. Поскольку у значений углов тип float, они могут выглядеть по-разному, например: 12.0, 45.78, 0.12345 или 15.

 

/*08FARGV.C

Программа на С иллюстрирует ввод в программу чисел

с плавающей точкой из командной строки

C:\> 08FARGV.EXE 90 45.78 0.12345 45*/

 

#include "stdafx.h"

#include <iostream>

#include <conio.h>

#include <stdio.h>

#include <process.h>

#include <ctype.h>

#include <stdlib.h>

#include <math.h>

using namespace std;

 

const double dPi=3.14159265359;

 

main(int argc, char *argv[])

{

int t;

double ddegree;

if(argc < 2)

{

/* Введите несколько углов в командной строке. */

/* Программа вычислит и напечатает */

/* косинусы введенных углов. */

printf("Type several angels on the command line.\n");

printf("Programm will colculate and print\n");

printf("the cosine af the angles entered.\n");

exit(1);

}

for(t=1;t<argc;t++)

{

ddegree=(double) atof(argv[t]);

printf("The cosine of %f is %15.14lf\n",

ddegree, cos((dPi/180)*ddegree));

}

 

printf ("\n\nPress any key to finish\n");

_getch();

return(0);

}

Функция atof() используется для преобразования строковых аргументов командной строки в тип float. В программе для вычисления косинуса в функции printf() используется функция cos().

 

7.36. Важные возможности C++.

Для создания функций на C++ можно использовать некоторые специфические возможности языка. Одним из его достоинств является возможность написания встроенных функций. Код некоторой встроенной функции воспроизводится в том месте программы, в котором она вызывается. Поскольку компилятор располагает этот код в точке вызова функции, то при использовании коротких, часто вызываемых функций, сокращается время выполнения программы.

 

7.36.1. Встраивание (inline).

Ключевое слово inline можно рассматривать как директиву или, лучше сказать, как указание компилятору C++ на встраивание этой функции. По разным причинам компилятор может проигнорировать это указание. Например, функция может быть слишком длинной. Встраиваемые функции используются в первую очередь для сокращения времени выполнения программы при частом вызове коротких функций.

 

// Программа на C++ иллюстрирует использование встроенных функций.

// Встроенные функции работают лучше всего в тех случаях, когда часто

// повторяются короткие функции. В этом примере некоторое сообщение

// выводится на экран несколько раз

#include "stdafx.h"

#include <iostream>

#include <conio.h>

#include <stdio.h>

#include <process.h>

#include <ctype.h>

#include <stdlib.h>

#include <math.h>

using namespace std;

 

// Это - встроенная функция

inline void voutput(void)

{

cout << "This is an inline function!" << endl;

}

 

main()

{

int t;

// Программа печатает сообщение несколько раз

cout << "This program prints a message several times." << endl;

for(t=0;t<3;t++)

voutput();

 

printf ("\n\nPress any key to finish\n");

_getch();

return(0);

}

 

7.36.2. Перегрузка (overloading).

Следующий пример иллюстрирует перегрузку функции. Обратите внимание на то, как описаны прототипы двух функций с одинаковым именем и областью действия. Конкретная функция будет выбираться в зависимости от передаваемых аргументов. Функцию adder() можно вызывать с параметрами целого типа или типа float.

 

 

// Программа на C++ иллюстрирует перегрузку функций.

// Перегружаемая функция получает массив целых чисел или чисел с

// плавающей точкой и возвращает их сумму в виде числа int или float

#include "stdafx.h"

#include <iostream>

#include <conio.h>

#include <stdio.h>

#include <process.h>

#include <ctype.h>

#include <stdlib.h>

#include <math.h>

using namespace std;

 

int adder(int iarray[]);

float adder(float farray[]);

 

main()

{

int iarray[7]={5,1,6,20,15,0,12};




Поделиться с друзьями:


Дата добавления: 2015-01-03; Просмотров: 868; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.311 сек.