Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
new_Лекции_1-7.docx
Скачиваний:
117
Добавлен:
05.03.2016
Размер:
1.49 Mб
Скачать

Тема 5: Функции. Лекция 5.1. Личные и встроенные функции. План лекции

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

  2. Назначение функций и их типы

  3. Вызов функций

  4. Правила записи объявления функции

  5. Определение (реализация) функции

  6. Особенности функции main()

  7. Возврат значений

  8. Встроенные функции

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

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

  1. Назначение функций и их типы

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

  1. Вызов функций

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

  1. Обоснование необходимости объявления функций

Нельзя вызвать функцию, если она предварительно не объявлена. Объявление функции называется прототипом. Прототипы встроенных функций находятся в системных заголовочных файлах (header-файлах). Прототипы личных функций можно также разместить в заголовочном файле и подключить его директивой #include или просто написать их выше функции main(). Отказ от прототипов ведет к следующим проблемам:

  • все функции нужно будет располагать над main() в строго определенном порядке;

  • возможна логически неразрешимая ситуация, если функция А() должна вызывать В(), а функция В() может вызывать А();

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

  1. Правила записи объявления функции

Прототип (интерфейс) функции – это оператор, оканчивающийся точкой с запятой. Он состоит из типа возвращаемого значения, имени функции и списка параметров функции. Список параметров – это перечень типов параметров и их имен, разделенных запятыми. Имена параметров необязательны и их можно опустить. Параметров может не быть, но круглые скобки после имени обязательны. Пример одинаковых прототипов : long Area(int width, int length); и long Area(int, int );

  1. Определение (реализация) функции

Определение функции – это ее реализация, т.е. операторы выполняющие действия. Реализации встроенных функций хранятся в библиотеках объектных модулей компилятора. Определение личной функции состоит из заголовка (прототип без точки с запятой с обязательными именами параметров) и тела функции – блока операторов между фигурными скобками. Операторы могут быть любые : объявления переменных, присваивания, ветвления и циклы, ввод/вывод, вызов функций, вызов самой себя (рекурсия).

/ Пример 5.1.1

// Использование прототипов функций

#include <iostream>

using namespace std;

// прототип функции для вычисления площади прямоугольника

// прототип с именами праметров

// unsigned short int fArea(unsigned short int length,unsigned short int width);

// прототип без имен праметров

// unsigned short int fArea(unsigned short int, unsigned short int);

//прототип функции при использование typedef

typedef unsigned long int USHORT;

USHORT fArea(USHORT length, USHORT width);

// главная функция

int main() {

setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста

USHORT length=0, width=0, area=0;

cout << "Ширина?\n";

cin >> width;

cout << "Длина?\n";

cin >> length;

area=fArea(length , width); // Вызов функции

cout << "Площадь = " << area << "\n";

cin.get();

area=fArea(5*2 , 3); // Вызов функции

cout << "Площадь = " << area << "\n";

cin.get();

return 0 ;

}

// функция для вычисления площади прямоугольника

//unsigned short int fArea(unsigned short int l, unsigned short int w)

USHORT fArea(USHORT l, USHORT w) {

return l * w;

}

  1. Особенности функции main()

Объявление int main() с последующим { return 1;} говорит о том, что функция main() возвращает в операционную среду целое число, называемое кодом возврата функции (return code) и оно может быть проанализировано в командном файле, выполняющем запуск приложений.

// Пример 5.1.2

// Первое приложение

#include <iostream>

using namespace std;

typedef unsigned short int USHORT;

// главная функция

int main() {

setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста

USHORT Length=0, Width=0, Area=0;

cout << "Работает первое приложение...\n" << "Длина (50-100) ? ";

cin >> Length;

if (Length<50 || Length>100) {

cout << "Длина введена неправильно!!!\n";

cout << "Первое приложение завершено с ошибкой...\n";

cin.get();cin.get();

return 1; //Приложение возвращает в ОС код возврата 1

}

cout << "Ширина (20-40) ? ";

cin >> Width;

if (Width<20 || Width>40){

cout << "Ширина введена неправильно!!!\n";

cout << "Первое приложение завершено с ошибкой...\n";

cin.get();cin.get();

return 1; //Приложение возвращает в ОС код возврата 1

}

//Первое приложение выполняет вычисления

Area=Width*Length;

cout << "Площадь = " << Area << "\n";

cout << " Первое приложение завершено без ошибок...\n";

cin.get();cin.get();

return 0; // Приложение возвращает в ОС код возврата 0

}

//Второе приложение

#include <iostream>

using namespace std;

// главная функция

int main() {

setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста

cout << " Работает второе приложение...\n";

cin.get();

return 0;

}

rem командный файл для запуска приложений

echo off

rem запуск первого приложения

first.exe

rem проверка кода возврата первого приложения

if errorlevel=1 goto end

rem запуск второго приложения

second.exe

:end

pause

  1. Возврат значений

Тип возврата void говорит о том, что функция ничего возвращает. Если тип возвращаемого значения не указан, то по умолчанию принимается int, а не void. Функции с типом возврата не равным void должны завершаться оператором return результат ; , где результатимя, константа или выражение, являющееся объектом любого типа. В функции может быть несколько операторов return. В качестве результата фунция может возвращать и код возврата.

// Пример 5.1.3

// Пример с несколькими операторами return и кодом возврата

#include <iostream>

using namespace std;

// прототип

int Doubler(int); // функция для удвоение значения числа <= 10000

// главная функция

int main() {

setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста

int input=0, result=0;

cout << "Введите число между 0 и 10000 : ";

cin >> input;

cout << "\nПеред вызовом Doubler...";

cout << "\ninput: " << input << " doubled: " << result << "\n";

result=Doubler(input); // вызов функции

cout << "\nВозврат из Doubler ...\n";

// анализ кода возврата функции и завершение приложения

if (result == -1) {

cout << "Ошибка!!!\n";

cout << "\ninput: " << input << " doubled: " << result << "\n";

cin.get();cin.get();

return -1;

}

cout << "Продолжение...";

cout << "\ninput: " << input << " doubled: " << result << "\n";

cin.get(); cin.get();

return 0;

}

// реализация

int Doubler(int number) {

if (number <=10000)

return number*2; // вернуть удвоенное значение

else

return -1; // вернуть код возврата -1 (return code)

// Предупреждение (warning) -- никогда невыполняемый код

// (unreachable code)

// Это логическая ошибка программиста

cout << "Эта часть программы никогда не выполнится!!!\n";

}

// Пример 5.1.4

// Пример с несколькими операторами return и кодом возврата-перечислением

#include <iostream>

using namespace std;

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

enum Errors {SUCCESS,BAD=-1};

// прототип

int Doubler(int); // функция для удвоение значения числа <= 10000

// главная функция

int main() {

setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста

int input=0, result=0;

cout << "Введите число между 0 и 10000 : ";

cin >> input;

cout << "\nПеред вызовом Doubler...";

cout << "\ninput: " << input << " doubled: " << result << "\n";

result=Doubler(input); // вызов функции

cout << "\nВозврат из Doubler ...\n";

// анализ кода возврата функции и завершение приложения

if (result == BAD){

cout << "Ошибка!!!\n";

cout << "\ninput: " << input << " doubled: " << result << "\n";

cin.get();

return BAD;

}

cout << "Продолжение...";

cout << "\ninput: " << input << " doubled: " << result << "\n";

cin.get();

return SUCCESS;

}

// реализация

int Doubler(int number) {

if (number <=10000)

return number*2; // вернуть удвоенное значение

else

return BAD; // вернуть код возврата BAD (return code)

// Предупреждение (warning) -- никогда невыполняемый код

// (unreachable code)

// Это логическая ошибка программиста

cout << "Эта часть программы никогда не выполнится!!!\n";

}

  1. Встроенные функции

Встроенные функции входят в состав библиотек компилятора и разделены на множество категорий :

  • математические

  • анализ символов;

  • случайные числа, min, max, exit, функции преобразования, и т.д.;

  • работа со строками (символьными массивами);

  • получение даты и времени;

  • стандартный и консольный ввод/вывод;

  • графические, системные и т.д.

Основные библиотечные математические функции C

Функ­ция

Библио-тека

Назначение и пример

Аргу­менты

Резуль-тат

abs(x)

<stdlib.h>

Возвращает абсолютную величину целого аргумента:

если x=-5, abs(x)=5

int

int

ceil(x)

<math.h>

Возвращает наименьшее целое число, не меньшее x :

если x=45.23, ceil(x)=46.0

float

float

cos(x)

<math.h>

Возвращает косинус угла x :

если x=0.0, cos(x)=1.0

double

(рад)

double

exp(x)

<math.h>

Возвращает ex , где e=2.71828… :

ecли x=1.0 , exp(x)=2.71828

double

double

fabs(x)

<math.h>

Возвращает абсолютную величину аргу­мента типа double:

если x=-8.432, fabs(x)=8.432

double

double

floor(x)

<math.h>

Возвращает наибольшее целое число, не большее x :

если x=45.23, floor(x)=45.0

double

double

log(x)

<math.h>

Возвращает натуральный логарифм х для х >0.0 :

если х=2.71828, log(x)=1.0

double

double

log10(x)

<math.h>

Возвращает десятичный логарифм х для х >0.0 :

если х=100.0 , log(x)=2.0

double

double

pow(x,y)

<math.h>

Возвращает xy . Если х < 0 , y должно быть целым:

если x=0.16, y=0.5 , pow(x,y)=0.4

double

double

double

sin(x)

<math.h>

Возвращает синус угла x :

если x=1.5708, sin(x)=1.0

double

(рад)

double

sqrt(x)

<math.h>

Возвращает неотрицательный квадратный корень из х для х>=0 :если x=2.25, sqrt(x)=1.5

double

double

tan(x)

<math.h>

Возвращает тангенс угла x (радиан) :

если x=0.0, tan(x)=0.0

double

(рад)

double

// Пример 5.1.5

// Использование математических функций

#include <iostream>

// VC++ - для использования математических констант

#define _USE_MATH_DEFINES

// Библиотека математических функций

#include <math.h>

using namespace std;

// прототипы личных функций

double DegToRad(double); // перевод из градусов в радианы

double RadToDeg(double); // перевод из радиан в градусы

// главная функция

void main() {

setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста

double DegVal, RadVal, SinVal, ArcSinVal, NewDegVal;

double SqrtVal, LogVal, PowVal;

cout << "Значение угла в градусах : ";

cin >> DegVal;

// Вычисление синуса

//SinVal=sin(DegVal); // неправильно – угол задан в градусах

SinVal=sin(DegToRad(DegVal)); //правильно – угол переведен в радианы

cout << "SinVal : " << SinVal << endl;

сin.get();

// Вычисление арксинуса

ArcSinVal=asin(SinVal);

cout << "ArcSinVal : " << ArcSinVal << endl;

NewDegVal=RadToDeg(ArcSinVal);

cout << "NewDegVal : " << NewDegVal << endl;

cin.get();

// Вычисление других функций

if (DegVal>=0) {

SqrtVal=sqrt(DegVal);

cout << "Квадратный корень – sqrt(): " << SqrtVal << endl;

}

else {

cout << "Неверный аргумент для sqrt()" << endl;

return;

}

if (DegVal>0) {

LogVal=log(DegVal);

cout << "Натуральный логарифм - ln: " << LogVal << endl;

}

else

cout << " Неверный аргумент для log()" << endl;

// возведение в степень

SinVal=3;//-3;

PowVal=pow(SinVal,3);

cout << "PowVal : " << PowVal << endl;

cin.get();

}

// Радианы в градусы

double RadToDeg(double Radian) {

const double PI=3.141592653589793;

return Radian*180./PI;

}

// Градусы в радианы

double DegToRad(double Degree) {

return Degree*M_PI/180.; // использования константы M_PI из Math.h

}

Основные библиотечные функции C для работы с символами

Функ­ция

Библио-тека

Назначение

Аргу­менты

Резуль­тат

getchar()

stdio.h

Ввод символа с клавиатуры (с эхом)

-

int

getch()

conio.h

Ввод символа с клавиатуры (без эха)

-

int

tolower(ch)

ctype.h

Преобразовать англ. букву в малую

int

int

toupper (ch)

ctype.h

Преобразовать англ. букву в большую

int

int

isdigit(ch)

ctype.h

Определить цифра или нет

int

int

isalpha(ch)

ctype.h

Определить англ. буква или нет

int

int

islower(ch)

ctype.h

Определить малая англ. буква или нет

int

int

isupper(ch)

ctype.h

Определить большая англ. буква или нет

int

int

isalnum(ch)

ctype.h

Определить англ. буква, цифра или нет

int

int

isspace(ch)

ctype.h

Определить пустой ли символ

int

int

// Пример 5.1.6

// Функции преобразования и классификации символов

#include <iostream>

#include <ctype.h>

using namespace std;

int main() {

setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста

unsigned char c = '\n';

c=tolower(c); // преобразовать в малую; toupper() - в большую

if (isdigit(c))// цифра?

cout << c << " Цифра\n";

else

cout << c << "Не цифра\n";

if (isalpha(c)) // англ. буква?

cout << c << " Буква\n";

else

cout << c << " Не буква\n";

if (islower(c)) // малая?

cout << c << " Прописная буква\n";

else

cout << c << " Заглавная буква\n";

if (isupper(c)) // большая ?

cout << c << " Заглавная буква \n";

else

cout << c << " Прописная буква \n";

if (isspace(c)) // пробел, табулятор('\t'), возврат каретки('\n')

cout << c << " Пустой символ\n";

else

cout << c << " Не пустой символ \n";

cin.get();

return 0;

}

Основные стандартные функции и макросы C (из библиотеки stdlib.h)

Функ­ция

Библио-тека

Назначение

Аргу­менты

Резуль­тат

min(a,b)

stdlib.h

Определяет минимум из двух чисел

числа

число

max(a,b)

stdlib.h

Определяет максимум из двух чисел

числа

число

rand()

stdlib.h

Возвращает случайное целое

void

int

atoi(str)

stdlib.h

Преобразует строку С-стиля в целое

строка С

int

atol(str)

stdlib.h

Преобразует строку С-стиля в длинное целое

строка С

long

atof(str)

stdlib.h

Преобразует строку С-стиля в вещественное

строка С

double

exit()

stdlib.h

Завершает выполнение программы

int

void

abort()

stdlib.h

Завершает выполнение программы аварийно

void

void

// Пример 5.1.7

// Функции из библиотеки stdlib.h

#include <iostream>

#include <stdlib.h>

using namespace std;

// заголовок личной функции

void F();

int main() {

setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста

int i1=1, i2=2, i;

double d1=1.5, d2=3.6, d;

int rn1,rn2;

i=max(i1,i2); // определение минимального из двух чисел

d=min(d1,d2); // определение максимального из двух чисел

cout << "i=" << i << '\t' << "d=" << d << endl;

F(); // вызов личной функции

cin.get();

return 0; // завершение функции main()-завершение приложения

}

// реализация личной функции

void F() {

cout << "F" << endl;

return; // завершение функции

//exit(0); // завершение приложения с нужным кодом возврата

//abort(); // аварийное завершение приложения

}

// Пример 5.1.8

// Случайные числа (stdlib.h)

#include <iostream>

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

using namespace std;

// заголовки личных функций

// Печать случайных чисел

void SimpleRandDemo( int n );

// Печать случайных чисел из нужного диапазона

void RangedRandDemo( int range_min, int range_max, int n );

int main( void ){

setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста

// начальная установка генератора случайных чисел с помощью текущего // времени - числа будут различными при разных запусках приложения

srand( (unsigned)time( NULL ) );

// Печать случайных чисел

SimpleRandDemo(10);

cin.get();

// Печать случайных чисел из нужного диапазона

RangedRandDemo( -100, 100, 10 );

cin.get();

return 0;

}

// Печать случайных чисел

void SimpleRandDemo( int n ) {

// Печать случайных чисел

for( int i = 0; i < n; i++ ) cout << rand() << endl;

}

// Печать случайных чисел из нужного диапазона

void RangedRandDemo( int range_min, int range_max, int n ) {

// Генерирует случайные числа из диапазона [range_min, range_max).

// Другими словами range_min <= random number < range_max

for (int i = 0; i < n; i++ ) {

int u = (double)rand() / (RAND_MAX + 1) * (range_max - range_min)

+ range_min;

cout << u << endl;

}

}

// Пример 5.1.9

//Функции преобразования(stdlib.h) - atoi(), atol(), atof()

#include <iostream>

#include <stdlib.h>

#include <ctype.h>

using namespace std;

int main() {

setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста

char buffer[80]; // буфер приложения - строка С-стиля

// Ввод данных с клавиатуры в буфер и проверка данных на нецифру

cout << "Введите целое число без знака: ";

cin >> buffer;

for (int i=0; i<strlen(buffer); i++) {

if (!isdigit(buffer[i])) {

cout << "Ошибка в позиции : " << i+1 << endl;

cout << "Нецифровой символ : " << buffer[i] << '\t' << (int)buffer[i] << endl;

cin.get(); return 1;

}

}

// преобразование символов в числа и выполнение вычислений

int inumber;

//inumber=buffer; // ошибка!

inumber=atoi(buffer); // из текста получить целое число

cout << "Теперь это целое число - number: " << inumber << endl;

//int sum=buffer+5; // ошибка!

int sum=atoi(buffer)+5;

cout << "Можно что-то считать - sum: " << sum << endl;

long lnumber;

double dnumber;

lnumber=atol(buffer); // из текста получить длинное целое число

dnumber=atof(buffer); // из текста получить вещественное число

cout << "Теперь это длинное целое число - number: " << lnumber << endl;

cout << "Теперь это вещественное число - number: " << dnumber << endl;

cin.get();

return 0;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]