Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Разделители





Разделители, или знаки пунктуации, входят в число лексем языка:

[] () {},;: … * = # &

Как видно одни и те же лексемы языка в зависимости от места их использования в программе могут выступать в качестве знака операции или в качестве разделителя.

Квадратные скобки [] являются разделителями (а не операцией) при определении размерности определяемого массива

int A[] = { 1,2,3,4,5}; //квадратные скобки выступают в качестве разделителя

int s[2][5]; //квадратные скобки выступают в качестве разделителя

Круглые скобки ():

· входят как обязательный элемент в операторы цикла и условия;

· входят как обязательный элемент в определение, описание (в прототип) и вызов любой функции, где выделяют соответственно список формальных параметров, список спецификаций параметров и список фактических параметров;

· обязательны в определении указателя на функцию;

· группируют выражение, изменяя естественную последовательность выполнения операций;

· являются необходимым элементом при выполнении операции преобразования типа;

· применение круглых скобок настоятельно рекомендуется в макроопределениях.

Фигурные скобки {} обозначают начало и конец составного оператора или блока. Они используются также для выделения списка компонентов в определениях типов структур, объединений, классов и инициализации массивов и структур при их определении.

Запятая, разделяет элементы списков, используется в описаниях и определениях объектов одного типа, участвует в качестве разделителя в заголовке оператора цикла for.

В качестве ещё одной области применения запятой как разделителя нужно отметить описание производного класса, в котором используется список базовых классов и список вызываемых конструкторов. Кроме того, в списке однотипных компонентов класса они отделяются друг от друга запятыми.

Точка запятой; завершает каждый оператор, каждое определение (кроме определения функции) и каждое описание. Любое допустимое выражение, за которым следует ‘;’, воспринимается как оператор. Это справедливо и для пустого выражения, т.е. отдельный символ «точка с запятой» считается пустым оператором.

Двоеточие: служит для отделения метки от помечаемого ею оператора:

метка: оператор;

Метка – это идентификатор. Таким образом, допустимы, например, такие помеченные операторы:

XYZ: a = b+c –d; vv: x*=10; // XYZ и vv метки

Второе применение двоеточия – описание производного класса, где имя класса отделяется от списка базовых классов двоеточием.

Многоточие ‘…’ - это три точки без пробелов между ними. Оно используется для обозначения переменного числа параметров у функции при её описании и определении.

Звездочка * не является операцией при описании и определении указателей, например:

int * point; // звездочка не выполняет роль операции при описании указателя

char ** refer; // аналогично

Знак ‘=’ является разделителем при определении объекта, отделяя определение объекта от списка его инициализации:

int D = 62; //

В списке формальных параметров функции знак ‘=’ указывает на выбираемое по умолчанию значение аргумента (фактического параметра).

Символ # используется для обозначения директив препроцессора. Если этот символ является первым отличным от пробела символом в строке программы, то строка воспринимается как директива препроцессора.

Символ & играет роль разделителя при определении переменных типа ссылки:

int Bl;

int &a = B1;

Отметив использование символа & в качестве разделителя при описании ссылок, отложим подробное рассмотрение ссылок.

 

 

2.7. Первоначальные сведения о функциях языка Си++

До этого момента все приведённые выше программы содержали только одну функцию – main(). Как уже говорилось любая программа, написанная на языке Си++, должна обязательно содержать функцию main(), и эта функция должна быть в программе единственной, так как именно с выполнения операторов этой функции и начинается выполнение программы. Синтаксис определения любой функции, в том числе и функции main(), задаётся следующими правилами:

тип_функции имя_функции (список формальных параметров)

{ тело функции}

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


тип_функции имя_функции (список формальных параметров)

называют ещё сигнатурой функции.

Приведем пример определения функции, которая суммирует два числа:

int sum(int z, int g) {

int s = z+g;

return s;

}

где int – тип функции; sum – имя функции; (int z, int g) – список формальных параметров (в данном случае z - первый формальный параметр типа int, g – второй формальный параметр типа int); в фигурные скобки {} заключено тело функции (состоящее в данном случае из двух операторов); int sum(int z, int g) – сигнатура функции sum().

Само по себе наличие определения функции в программе ничего не даёт, для того чтобы функция начала работать (т.е. начали выполняться операторы тела функции), должен обязательно присутствовать вызов функции в программе. Под вызовом функции понимают выражение

имя_функции(список_фактических_параметров)

где имя_функции – имя вызываемой функции; список_фактических_параметров – список констант, переменных или выражений записанных через запятую. Если фактический параметр представлен выражением, то сначала вычисляется значение выражения, и только потом осуществляется вызов функции. Для примера несколько вызовов функции sum() можно записать следующим образом:

sum(2, 1); sum(3+5,3-7); sum(f+2, d);

в первом вызове первый фактический параметр равен 2, второй – 1; во втором вызове два фактических параметра представлены выражениями, только после нахождения значений которых осуществляется вызов функции; в третьем вызове первый фактический параметр является выражением, в котором используется переменная f, значение которой должно было быть определено выше в теле программы до вызова функции, вторым фактическим параметром является значение переменной d.

Что же происходит при вызове функции? При вызове функции формальным параметрам присваивается значение фактических параметров в строгом соответствии с их положением в списке. Другими словами первому формальному параметру присваивается значение первого фактического параметра, второму формальному параметру – значение второго фактического параметра и т.д. После этого начинают выполняться операторы тела вызванной функции. Таким образом, через аппарат формальных и фактических параметров данные передаются в вызванную функцию. В приведенных выше примерах в первом вызове формальные параметры получают следующие значения z= 2, g = 1; во втором вызове z= 8, g = -5; в третьем вызове (если предположить, например, что f = 1, d = 6) z= 3, g = 6.

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

return выражение;

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

В приведенных выше примерах вызова функции sum() в первом вызове на месте sum(2, 1) после выполнения операторов тела функции появится неименованный объект типа int с значением 3; во втором вызове на месте sum(3+5, 3-7) - появится неименованный объект типа int с значением 4; в третьем вызове на месте sum(f+2, d) - появится неименованный объект типа int с значением 9 (если предположить, например, что f = 1, d = 6). Именно потому, что функция sum() имеет тип int, т.е. возвращает один из арифметических типов данных, можно выполнять вложенные вызовы или использовать эту функцию в составе выражения. Например, выражение:


4+sum(2,1)/3+ sum(sum(1,2), 4);

является правильным и равно 12. Причем приоритет операции вызова функции в соответствии с таблицей рангов операций самый высокий, поэтому в выражении сначала выполнятся вызовы функций (в соответствии с направлением ассоциативности первым выполнится вызов sum(2,1), вторым sum(1,2) так как вызов может быть осуществлен только после вычисления значения фактических параметров и, наконец, sum(3, 4)) и только потом будут выполняться все остальные операции.

Приведем для примера полный текст программы на языке Си++, которая вызывает функцию sum(), и в которой определим ещё одну функцию, возвращающую максимум из двух чисел.

// Программа 2.1

#include "stdafx.h"

#include <iostream>

double max(double c, double k); /*1. Описание функции max()*/

int sum(int z, int g) { /*2. Определение функции sum()*/

int s = z+g; //3.

return s; //4.

} //5.

//-----------------------------------------

void main(){ /*6. Определение функции main()*/

int f = 1, d = 6; //7.

int z = -10, s; //8.

s = sum(3, 4); //9.

std::cout<<"\n s = "<<s; //10.

s = sum(f - d, s) - max(f+s,d); //11.

std::cout<<"\n s = "<<s; //12.

getchar();

} //13.

//-------------------------------------------

double max(double c, double k){ /*14. Определение функции max()*/

return c>k? c: k; //15.

}

Итак, рассмотрим последовательность, в которой будут выполняться строки программы. Первыми будут выполнены строки 6-8, так как выполнение программы всегда начинается с функции main(). В 9-й строке программы присутствует вызов функции sum(), следовательно, будут выполнены строки 2-5, т.е. операторы тела функции sum(), и затем будет закончено выполнение 9-й строки присвоение переменной s значения 7. Далее в 10-й строке значение переменной s будет выведено на экран монитора. При выполнении 11-ой строки вызываются функции sum() и max(), т.е. выполняются строки 2-5 и 14-16, затем переменной s присваивается новое значение. В 12-й строке программы новое значение s выводится на экран монитора. При выполнении 13-ой строки программа завершает своё выполнение.

Таким образом, строки 2-5 выполнялись два раза (так как два раза вызывалась функция sum()), но каждый раз формальные параметры получали разные значения и функция sum() естественно возвращала разные значения. Поэтому можно сказать, что в виде функции удобно оформлять фрагменты повторяющегося кода программы, а с помощью аппарата фактических и формальных параметров обеспечивать разные начальные условия.


Единственная строка программы, которая не выполнялась ни разу, это 1-я строка. Это строка является описанием (прототипом) функции max(). Описание необходимо в программе в том случае, если вызов функции по тексту программы предшествует её определению. В нашем случае вызов функции max() находится в 11-й строке, а определение начинается с 14-й. Синтаксис описания функции приведен ниже:

тип_функции имя_функции(список формальных параметров);

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

Кроме функций определенных программистом есть огромное количество библиотечных функций, которыми постоянно приходится пользоваться. Например, необходимо в программе вычислить sin(x), для этого конечно можно написать свою собственную функцию, но проще воспользоваться готовой библиотечной. Для этого необходимо в справочнике или в помощи среды программирования найти описание функции и имя заголовочного файла, в котором это описание находится. Для функции sin() описание выглядит так double sin(double x) и находится оно в заголовочном файле math.h. В файле помощи к этой функции также сказано, что аргумент задаётся в радианах. Этой информации достаточно, чтобы можно было написать программу, в которой используется вызов библиотечной функции:

//Программа 2.2

#include "stdafx.h"

#include <iostream>

#include <math.h>

void main(){

double z;//Определение переменной z.

std::cout<<"\n Input x for sin(x), x = ";

std::cin>>z; //Ввод с клавиатуры значения в переменную z.

std::cout<<"\n Output sin(x) = "<<3*sin(z); /*Вызов библиотечной функции sin()*/

getchar();

}

Из описания функции sin() видно, что она имеет один формальный параметр типа double и возвращает в точку вызова значение функции в формате типа double. Описание функции находится в файле math.h, поэтому его необходимо с помощью директивы include включить в текст программы. Определение функции находится в виде двоичного кода в одном из файлов с расширением lib, оно будет включено компоновщиком в текст программы во время компоновки программы в среде программирования.

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

 







Date: 2015-05-22; view: 700; Нарушение авторских прав



mydocx.ru - 2015-2024 year. (0.015 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию