- •Введение
- •План лекции
- •Лекция 1.2. Работа в среде Visual Studio План лекции
- •Практические задания
- •Контрольные вопросы
- •Лекция 2.1. Структура простой программы План лекции
- •Лекция 2.2. Использование функций План лекции
- •Практические задания
- •Контрольные вопросы
- •Тема 3: Переменные и константы Лекция 3.1. Встроенные типы данных. План лекции
- •Лекция 3.2. Константы, перечисления, синонимы типа План лекции
- •Практические задания
- •Контрольные вопросы
- •Тема 4: Операции и выражения Лекция 4.1. Математические операторы и выражения План лекции
- •Лекция 4.2. Логические операторы и выражения. План лекции
- •Практические задания
- •Контрольные вопросы
- •Тема 5: Функции. Лекция 5.1. Личные и встроенные функции. План лекции
- •Основные библиотечные функции c для работы с символьными массивами (string.H)
- •Лекция 5.2. Параметры. Значения по умолчанию. Перегрузка. Рекурсия. План лекции
- •Inline-функции
- •Практические задания
- •Контрольные вопросы
- •Тема 6: Структуры. Классы и объекты. Лекция 6.1. Структуры в языке с. План лекции
- •Лекция 6.2. Классы с открытыми данными. План лекции
- •Лекция 6.3. Конструкторы и деструктор.Cкрытие данных. План лекции
- •Лекция 6.4. Введение в библиотеки классов План лекции
- •Практические задания
- •Контрольные вопросы
- •Тема 7: Циклы, выбор вариантов. Лекция 7.1. Циклы. План лекции
- •Лекция 7.2. Выбор из вариантов. План лекции
- •Практические задания
- •Контрольные вопросы
- •Заключение
- •Литература
- •Содержание
Тема 5: Функции. Лекция 5.1. Личные и встроенные функции. План лекции
Определение функции
Назначение функций и их типы
Вызов функций
Правила записи объявления функции
Определение (реализация) функции
Особенности функции main()
Возврат значений
Встроенные функции
Определение функции
Функция – это набор операторов, которые выполняют действия над данными и возвращают значения. В С++ в программе по крайней мере имеется одна функция - main(). При запуске программы функция main() вызывается автоматически. Функция main() может вызывать другие функции, которые в свою очередь могут также вызывать функции.
Назначение функций и их типы
Функции выполняют отдельные, четко поставленные задачи. Сложные, большие задачи должны обязательно разбиваться на функции, что создает предпосылки для коллективной разработки и позволяет повторно использовать программный код. Функции бывают двух типов : библиотечные (встроенные, стандартные) и личные.
Вызов функций
Вызов функции выполняется с помощью ее имени. При этом выполнение программы переходит в функцию. По окончанию функции программа продолжает работу, выполняя следующий после функции оператор.
Обоснование необходимости объявления функций
Нельзя вызвать функцию, если она предварительно не объявлена. Объявление функции называется прототипом. Прототипы встроенных функций находятся в системных заголовочных файлах (header-файлах). Прототипы личных функций можно также разместить в заголовочном файле и подключить его директивой #include или просто написать их выше функции main(). Отказ от прототипов ведет к следующим проблемам:
все функции нужно будет располагать над main() в строго определенном порядке;
возможна логически неразрешимая ситуация, если функция А() должна вызывать В(), а функция В() может вызывать А();
компилятор не сможет выполнить проверку типов при передаче параметров и возврате значения из функции.
Правила записи объявления функции
Прототип (интерфейс) функции – это оператор, оканчивающийся точкой с запятой. Он состоит из типа возвращаемого значения, имени функции и списка параметров функции. Список параметров – это перечень типов параметров и их имен, разделенных запятыми. Имена параметров необязательны и их можно опустить. Параметров может не быть, но круглые скобки после имени обязательны. Пример одинаковых прототипов : long Area(int width, int length); и long Area(int, int );
Определение (реализация) функции
Определение функции – это ее реализация, т.е. операторы выполняющие действия. Реализации встроенных функций хранятся в библиотеках объектных модулей компилятора. Определение личной функции состоит из заголовка (прототип без точки с запятой с обязательными именами параметров) и тела функции – блока операторов между фигурными скобками. Операторы могут быть любые : объявления переменных, присваивания, ветвления и циклы, ввод/вывод, вызов функций, вызов самой себя (рекурсия).
/ Пример 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;
}
Особенности функции 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
Возврат значений
Тип возврата 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";
}
Встроенные функции
Встроенные функции входят в состав библиотек компилятора и разделены на множество категорий :
математические
анализ символов;
случайные числа, 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;
}