Функции типа 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");

}

Функции типа 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));

}

Функции типа 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);

}

 

84. Использование функций. Аргументы функции main(). Строки. Целые числа. Числа с плавающей точкой.

 

Функция — это самостоятельная единица программы, которая спроектирована для реализации конкретной подзадачи.
Функция является подпрограммой, которая может содержаться в основной программе, а может быть создана отдельно (в библиотеке). Каждая функция выполняет в программе определенные действия.

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

Семантика функции определяет способ реализации функции. Обычно представляет собой тело функции.

 

Определение функции

Каждая функция в языке Си должна быть определена, то есть должны быть указаны:

· тип возвращаемого значения;

· имя функции;

· информация о формальных аргументах;

· тело функции.


Определение функции имеет следующий синтаксис:

 

ТипВозвращаемогоЗначения ИмяФункции(СписокФормальныхАргументов)
{
ТелоФункции;
...
return(ВозвращаемоеЗначение);
}

Пример: Функция сложения двух вещественных чисел

float function(float x, float z)
{
float y;
y=x+z;
return(y);
}

Объявление функций: прототипы функций

1 returnDataType functionName( dataType argName1, dataType argName2, ..., dataType argNameN);

где,

returnDataType — возвращаемый тип данных

functionName — имя функции

dataType — тип данных

argName1...N — имена параметров функции (количество параметров неограниченно)

Смотрим пример объявления функции:

 
1 2 3 / / Объявление прототипа функции с двумя целыми параметрами / / функция принимает два аргумента и возвращает их сумму int sum(int num1, int num2);

 

В языках C и C++, функции должны быть объявлены до момента их вызова. Вы можете объявить функцию, при этом функция может возвращать значение или — нет, имя функции присваивает программист, типы данных параметров указываются в соответствии с передаваемыми в функцию значениями. Имена аргументов, при объявления прототипов являются необязательными:

1 int sum(int , int ); // тот же прототип функции

Иногда, объявление функции называют определением функции, хотя это не одно и то же.

 

1 2 3 4 returnDataType functionName( dataType argName1, dataType argName2, ..., dataType argNameN) { // тело функции }

 

Определение функций

 

 
1 2 3 4 5 // определение функции, которая суммирует два целых числа и возвращает их сумму int sum(int num1, int num2) { return (num1 + num2); }

 

Рассмотрим определение функции на примере функции sum.

 

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

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

 

YOURPROGRAM Sneakers, Dumbdog, Shadow, Wonderdog

 

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

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

При создании консольного приложения в языке программирования С++, автоматически создается строка очень похожая на эту:

1 int main(int argc, char* argv[]) // параметры функции main()
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 // argc_argv.cpp: определяет точку входа для консольного приложения.   #include "stdafx.h" #include <iostream> using namespace std;   int main(int argc, char* argv[]) { if (argc > 1)// если передаем аргументы, то argc будет больше 1(в зависимости от кол-ва аргументов) { cout << argv[1]<<endl;// вывод второй строки из массива указателей на строки(нумерация в строках начинается с 0) } else { cout << "Not arguments" << endl; } system("pause"); return 0; }

 

Эта строка — заголовок главной функции main(), в скобочках объявлены параметры argс и argv. Так вот, если программу запускать через командную строку, то существует возможность передать какую-либо информацию этой программе, для этого и существуют параметры argc и argv[]. Параметр argc имеет тип данных int, и содержит количество параметров, передаваемых в функцию main. Причем argc всегда не меньше 1, даже когда мы не передаем никакой информации, так как первым параметром считается имя функции. Параметр argv[] это массив указателей на строки. Через командную строку можно передать только данные строкового типа. Указатели и строки — это две большие темы, под которые созданы отдельные разделы. Так вот именно через параметр argv[] и передается какая-либо информация. Разработаем программу, которую будем запускать через командную строку Windows, и передавать ей некоторую информацию.

 

После того как отладили программу, открываем командную строку Windows и перетаскиваем в окно командной строки экзэшник нашей программы, в командной строке отобразится полный путь к программе(но можно прописать путь к программе в ручную), после этого можно нажимать ENTER и программа запустится (см. Рисунок 1).

Рисунок 1 — Параметры функции main

Так как мы просто запустили программу и не передавали ей никаких аргументов, появилось сообщение Not arguments. На рисунке 2 изображён запуск этой же программы через командную строку, но уже с передачей ей аргумента Open.

Рисунок 2 — Параметры функции main

Аргументом является слово Open, как видно из рисунка, это слово появилось на экране. Передавать можно несколько параметров сразу, отделяя их между собой запятой. Если необходимо передать параметр состоящий из нескольких слов, то их необходимо взять в двойные кавычки, и тогда эти слова будут считаться как один параметр. Например, на рисунке изображен запуск программы, с передачей ей аргумента, состоящего из двух слов — It work.

Рисунок 3 — Параметры функции main

А если убрать кавычки. То увидим только слово It. Если не планируется передавать какую-либо информацию при запуске программы, то можно удалить аргументы в функции main(), также можно менять имена данных аргументов. Иногда встречается модификации параметров argc и argv[], но это все зависит от типа создаваемого приложения или от среды разработки.

Строки.

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

/*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-строки отдельных символов и должны печататься такими как есть.

Целые числа.

Во многих программах желательно иметь возможность ввода из командной строки целых чисел; это может быть, к примеру, программа для вычисления средних оценок студентов. В таких случаях символьная информация в кодах 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;

}

 

 

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

Следующий пример на С позволяет ввести из командной строки значения нескольких углов. Вычисляются косинусы углов и печатаются на экране. Поскольку у значений углов тип 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().

 

85. Использование функций. Важные возможности C++. Встраивание (inline). Перегрузка (overloading). Многоточие (..).

 

Функция — это самостоятельная единица программы, которая спроектирована для реализации конкретной подзадачи.
Функция является подпрограммой, которая может содержаться в основной программе, а может быть создана отдельно (в библиотеке). Каждая функция выполняет в программе определенные действия.

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

Семантика функции определяет способ реализации функции. Обычно представляет собой тело функции.

 

Определение функции

Каждая функция в языке Си должна быть определена, то есть должны быть указаны:

· тип возвращаемого значения;

· имя функции;

· информация о формальных аргументах;

· тело функции.


Определение функции имеет следующий синтаксис:

 

ТипВозвращаемогоЗначения ИмяФункции(СписокФормальныхАргументов)
{
ТелоФункции;
...
return(ВозвращаемоеЗначение);
}

Пример: Функция сложения двух вещественных чисел

float function(float x, float z)
{
float y;
y=x+z;
return(y);
}

Объявление функций: прототипы функций

1 returnDataType functionName( dataType argName1, dataType argName2, ..., dataType argNameN);

где,

returnDataType — возвращаемый тип данных

functionName — имя функции

dataType — тип данных

argName1...N — имена параметров функции (количество параметров неограниченно)

Смотрим пример объявления функции:

 
1 2 3 / / Объявление прототипа функции с двумя целыми параметрами / / функция принимает два аргумента и возвращает их сумму int sum(int num1, int num2);

 

В языках C и C++, функции должны быть объявлены до момента их вызова. Вы можете объявить функцию, при этом функция может возвращать значение или — нет, имя функции присваивает программист, типы данных параметров указываются в соответствии с передаваемыми в функцию значениями. Имена аргументов, при объявления прототипов являются необязательными:

1 int sum(int , int ); // тот же прототип функции

Иногда, объявление функции называют определением функции, хотя это не одно и то же.

 

1 2 3 4 returnDataType functionName( dataType argName1, dataType argName2, ..., dataType argNameN) { // тело функции }

 

Определение функций

 

 
1 2 3 4 5 // определение функции, которая суммирует два целых числа и возвращает их сумму int sum(int num1, int num2) { return (num1 + num2); }

 

Рассмотрим определение функции на примере функции sum.

 

 

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

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

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

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

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

Использовать ключевое слово inline легко, просто поставьте его перед именем функции. Затем, используйте её как обычную функцию.

 

Пример встроенной функции

 
1 2 3 4 5 6 7 8 9 10 11 12 13 #include <iostream>   using namespace std;   inline void hello() { cout<<"hello"; } int main() { hello(); //Call it like a normal function... cin.get(); }

 

Однако, как только программа будет скомпилирована, вызов hello(); будет заменен на код функции.

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

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

 

Ключевое слово 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);

}

 

Перегрузка (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};

float farray[7]={3.3,5.2,0.05,1.49,3.12345,31.0,2.007};

int isum;

float fsum;

isum=adder(iarray);

fsum=adder(farray);

// Сумма целых чисел равна

cout << "The sum of the integer numbers is: "

<< isum << endl;

// Сумма чисел с плавающей точкой равна

cout << "The sum of the float numbers is: "

<< fsum << endl;

 

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

_getch();

return(0);

}

 

int adder(int iarray[])

{

int i;

int ipartial;

ipartial=iarray[0];

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

ipartial+=iarray[i];

return (ipartial);

}

 

float adder(float farray[])

{

int i;

float fpartial;

fpartial=farray[0];

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

fpartial+=farray[i];

return (fpartial);

}

Многоточие (..).

Многоточие используется тогда, когда количество аргументов неизвестно. Неопределенное количество аргументов может быть указано в операторе функции с формальными параметрами. Например:

 

void yourfunction{int t,float u, . ..) ;

 

Такая запись указывает компилятору С, что за обязательными переменными t и u могут следовать, а могут и не следовать другие аргументы. Конечно же, многоточие приостанавливает проверку типов.

 

86. Использование функций. Области видимости. Локальные и глобальные переменные Сложности в правилах области действия (scope rules). Неопределенные символы в программе на С. Использование переменной с файловой областью действия.

 

Функция — это самостоятельная единица программы, которая спроектирована для реализации конкретной подзадачи.
Функция является подпрограммой, которая может содержаться в основной программе, а может быть создана отдельно (в библиотеке). Каждая функция выполняет в программе определенные действия.

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

Семантика функции определяет способ реализации функции. Обычно представляет собой тело функции.

 

Определение функции

Каждая функция в языке Си должна быть определена, то есть должны быть указаны:

· тип возвращаемого значения;

· имя функции;

· информация о формальных аргументах;

· тело функции.


Определение функции имеет следующий синтаксис:

 

ТипВозвращаемогоЗначения ИмяФункции(СписокФормальныхАргументов)
{
ТелоФункции;
...
return(ВозвращаемоеЗначение);
}

Пример: Функция сложения двух вещественных чисел

float function(float x, float z)
{
float y;
y=x+z;
return(y);
}

Объявление функций: прототипы функций

1 returnDataType functionName( dataType argName1, dataType argName2, ..., dataType argNameN);

где,

returnDataType — возвращаемый тип данных

functionName — имя функции

dataType — тип данных

argName1...N — имена параметров функции (количество параметров неограниченно)

Смотрим пример объявления функции:

 
1 2 3 / / Объявление прототипа функции с двумя целыми параметрами / / функция принимает два аргумента и возвращает их сумму int sum(int num1, int num2);

 

В языках C и C++, функции должны быть объявлены до момента их вызова. Вы можете объявить функцию, при этом функция может возвращать значение или — нет, имя функции присваивает программист, типы данных параметров указываются в соответствии с передаваемыми в функцию значениями. Имена аргументов, при объявления прототипов являются необязательными:

1 int sum(int , int ); // тот же прототип функции

Иногда, объявление функции называют определением функции, хотя это не одно и то же.

 

1 2 3 4 returnDataType functionName( dataType argName1, dataType argName2, ..., dataType argNameN) { // тело функции }

 

Определение функций

 

 
1 2 3 4 5 // определение функции, которая суммирует два целых числа и возвращает их сумму int sum(int num1, int num2) { return (num1 + num2); }

 

Рассмотрим определение функции на примере функции sum.