- •Введение
- •План лекции
- •Лекция 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. Выбор из вариантов. План лекции
- •Практические задания
- •Контрольные вопросы
- •Заключение
- •Литература
- •Содержание
Основные библиотечные функции c для работы с символьными массивами (string.H)
Функция |
Назначение |
Аргументы |
Результат |
strlen(s) |
Длина строки |
d–destination [] s–source [] n– number |
int |
strcpy(d,s) strncpy(d,s,n) |
Копирование (присваивание) строк |
- | |
strcat(d,s), strncat(d,s,n) |
Соединение (конкатенация) строк |
-
| |
strcmp(s1,s2) strncmp(s1,s2,n) |
Сравнение строк |
|
int <0 – s1<s2 =0 – s1=s2 >0 – s1>s2 |
// Пример 5.1.10
// Строки С-стиля -> массивы символов.
// strlen() - длина строки
// strcpy(), strncpy() - присваивание строк
// strcat(), strncat() - соединение строк
// strcmp(), strncmp() - сравнение строк
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string.h>
using namespace std;
int main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
char F[10]="Ivanov", I[10]="Ivan", O[10]="Ivanovich", FIO[35]="";
// Как получить ФИО
strcat(FIO,F);
cout << FIO << '\t' << strlen(FIO) <<endl;
strcat(FIO," ");
cout << FIO << '\t' << strlen(FIO) <<endl;
strcat(FIO,I);
cout << FIO << '\t' << strlen(FIO) <<endl;
strcat(FIO," ");
cout << FIO << '\t' << strlen(FIO) <<endl;
strcat(FIO,O);
cout << FIO << '\t' << strlen(FIO) <<endl;
cin.get();
// Очистить ФИО
//FIO=""; // error
strcpy(FIO,"");
cout << FIO << '\t' << strlen(FIO) <<endl;
cin.get();
// Как получить ФИО с инициалами
strcat(FIO,F);
strcat(FIO," ");
strncat(FIO, I,1);
strcat(FIO,".");
strncat(FIO, O,1);
strcat(FIO,".");
cout << FIO << '\t' << strlen(FIO) << endl << endl;
cin.get();
// Как сравнить две строки
//if (I > O) // так нельзя - ошибка
if (strcmp(I,O)==0)
cout << "строки равны!";
else
cout << "строки не равны!";
strcpy(I,O);
if (!strcmp(I,O))
cout << "строки равны!";
else
cout << " строки не равны!";
cin.get();
return 0;
}
// Пример 5.1.11
// Дата и время
#include <iostream>
#include <time.h>
using namespace std;
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
time_t currentTime;
time(¤tTime);
cout << "It is now " << ctime(¤tTime) << endl;
cin.get();
time(¤tTime);
// tm - структура для работы с датой и временем
struct tm ptm1=*localtime(¤tTime);
cout << "Сегодня - " << ((ptm1.tm_mon)+1) << "/"
<< ptm1.tm_mday << "/" << ptm1.tm_year+1900 << endl;
cout << "Текущеее время - " << ((ptm1.tm_hour)) << ":"
<< ptm1.tm_min << ":" << ptm1.tm_sec << endl;
cin.get();
}
Лекция 5.2. Параметры. Значения по умолчанию. Перегрузка. Рекурсия. План лекции
Параметры и локальные переменные
Передача параметров по значению
Передача параметров по ссылке
Глобальные переменные
Область видимости и время жизни
Задание параметров по умолчанию
Перегрузка функций
Inline-функции
Рекурсия
Распределение памяти при использовании функций
Параметры и локальные переменные
Параметры функции и переменные, объявленные внутри функции являются локальными переменными, т.е. существуют только в момент работы функции. Когда происходит возврат из функции, локальные переменные становятся недоступными. Локальные переменные функции main() существуют все время работы приложения.
// Пример 5.2.1
// Использование локальных переменных и параметров
#include <iostream>
using namespace std;
// заголовок личной функции
float Convert(float);
// главная функция
int main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
// локальные переменные функции main()
float TempFer=0;
float TempCel=0;
cout << "main() : адрес TempFer = " << TempFer << '\t'
<< " адрес TempCel = " << &TempCel << endl;
cin.get();
cout << "Температура по шкале Фаренгейта: ";
cin >> TempFer;
cin.get();
TempCel=Convert(TempFer); // вызов функции
cout << "Полученная температура по шкале Цельсия: "
<< TempCel << endl;
cin.get();
return 0 ;
}
// реализация личной функции
float Convert(float TempFer) {
// локальные переменные функции Convert()
float TempCel;
cout << "Convert() : адрес TempFer = " << &TempFer << '\t'
<< "адрес TempCel = " << &TempCel << endl;
cin.get();
TempCel=((TempFer - 32.)*5.)/9.;
return TempCel;
//return ((TempFer - 32.)*5.)/9.;
}
Передача параметров по значению
Изменения произведенные над параметрами внутри функции не затрагивают значений в вызывающей функции. Такой вид передачи параметров носит название передачи по значению (passing by value) и применяется в С++ по умолчанию.
// Пример 5.2.2
// Передача параметров по значению
#include <iostream>
using namespace std;
// Заголовок функции для вычисления площади квадрата и объема куба
void calcSV(int, int,int);
// главная функция
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
int a=5, s=0, v=0;
cout << "main() : a: " << a << " s:" << s << " v:" << v << endl;
// Вызов функции для вычисления площади квадрата и объема куба
calcSV (a,s,v);
cout << "main() : a: " << a << " s:" << s << " v:" << v << endl;
cin.get();
}
// Реализация функции для вычисления площади квадрата и объема куба
void calcSV (int a, int s, int v) {
cout << "Начало calcSV: a: " << a << " s:" << s << " v:" << v << endl;
s=a*a;
v=a*a*a;
cout << "Конец calcSV: a: " << a << " s:" << s << " v:" << v << endl;
}
Передача параметров по ссылке
Если необходимо, чтобы значения параметров изменились в вызывающей функции, то нужно применить способ передачи параметров по ссылке (passing by reference). Этот способ реализуется с помощью адресов, указателей (С, С++) или ссылок (С++) и механизм его работы подробно будет рассмотрен позже.
// Пример 5.2.3
// Передача параметров по ссылке с помощью указателей - С,С++
#include <iostream>
using namespace std;
// Заголовок функции для вычисления площади квадрата и объема куба
void calcSV(int, int*,int*); // параметры-результаты -> указатели
// главная функция
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
int a=5, s=0, v=0;
cout << "main() : a: " << a << " s:" << s << " v:" << v << endl;
// Вызов функции
calcSV (a, &s,&v); // для параметров-результатов передаем адреса
cout << "main() : a: " << a << " s:" << s << " v:" << v << endl;
cin.get();
}
// Реализация функции. Параметры-результаты объявлены как указатели
void calcSV (int a, int *s, int *v) {
cout << "Начало calcSV: a: " << a << " s:" << *s << " v:" << *v << endl;
*s=a*a;
*v=a*a*a;
cout << "Конец calcSV: a: " << a << " s:" << *s << " v:" << *v << endl;
}
// Пример 5.2.4
// Передача параметров по ссылке с помощью ссылок -- только С++
#include <iostream>
using namespace std;
// Заголовок функции для вычисления площади квадрата и объема куба
void calcSV(int, int&,int&); // параметры-результаты -> ссылки
// главная функция
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
int a=5, s=0, v=0;
cout << "main() : a: " << a << " s:" << s << " v:" << v << endl;
// Вызов функции
calcSV (a, s,v);
cout << "main() : a: " << a << " s:" << s << " v:" << v << endl;
cin.get();
}
// Реализация функции. Параметры-результаты объявлены как ссылки
void calcSV (int a, int &s, int &v) {
cout << "Начало calcSV: a: " << a << " s:" << s << " v:" << v << endl;
s=a*a;
v=a*a*a;
cout << "Конец calcSV: a: " << a << " s:" << s << " v:" << v << endl;
}
Глобальные переменные
Переменные, объявленные вне любой из функций называются глобальными. Глобальные переменные видны в любой функции программы, включая и main(). Глобальные переменные – источник возможных ошибок, особенно при коллективной разработке больших программ. В этом случае их лучше не использовать вообще.
// Пример 5.2.5
// Использование глобальных и локальных переменных
#include <iostream>
#include <conio.h>
using namespace std;
void myFunction(); // Заголовок личной функции
int x=5,y=7; //глобальные переменные
// главная функция
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
cout << "x из main(): " << &x << '\t' << x << "\n";
cout << "y из main(): " << &y << '\t' << y << "\n";
cin.get();
myFunction(); // Вызов личной функции
cin.get();
cout << "x из main(): " << &x << '\t' << x << "\n";
cout << "y из main(): " << &y << '\t' << y << "\n";
//cout << "z from main: " << z << "\n\n";// ошибка – z еще не объявлена
cin.get();
}
int z=9; //глобальная переменная
// Реализация личной функции
void myFunction() {
x=15; // изменение глобального x
int y=10; // локальный y временно закрыл глобальный у
cout << "x из myFunction(): " << &x << '\t' << x << "\n";
cout << "y из myFunction(): " << &y << '\t' << y << "\n";
cout << "z из myFunction(): " << &z << '\t' << z << "\n";
}
Область видимости и время жизни
Локальные переменные с такими же именами, как и глобальные временно маскируют (скрывают) глобальные. Областью видимости (scope) и временем жизни локальной переменной в С++ является блок.
// Пример 5.2.6
// Переменные видимые внутри блока
#include <iostream>
using namespace std;
// Заголовок личной функции
void myFunc();
// главная функция
void main() {
int x=5;
cout << "\nInmain x = " << x << " Address = " << &x << endl;
{
// блок
int x=9; // локальная в блоке
cout << "\nIn block x = " << x << " Address = " << &x << endl;
}
cout << "\nIn main x = " << x << " Address = " << &x << endl;
myFunc();
cout << "\nBack in main, x = " << x << " Address = " << &x << endl;
cin.get();
}
// Реализация личной функции
void myFunc() {
int x=8; // локальный в функции
cout << "\nIn myFunc,local x = " << x << " Address = " << &x << endl;
{
// блок
cout << "\nIn block, in myFunc, x = " << x << " Address = " << &x << endl;;
int x=9; // локальная в блоке
cout << "\nVery local x = " << x << " Address = " << &x << endl;;
}
cout << "\nOut of block in myFunc,x = " << x << " Address = " << &x << endl;
}
Задание параметров по умолчанию
В прототипе функции всем или нескольким ее последним параметрам можно определить значения по умолчанию (default). Если в вызове функции будут отсутствовать параметры, то компилятор подставит значения по умолчанию, т.е. в этом случае возможен вызов функции с разным числом параметров. Эта возможность отсутствовала в языке С.
// Пример 5.2.7
// Значения параметров по умолчанию
#include <iostream>
using namespace std;
// Стандартное объявление личной функции
//int Volume(int l, int w, int h);
// Объявление личной функции с параметрами по умолчанию
int Volume(int length=2, int width=6, int height=7);
//int Volume(int=2, int=6, int=8);// имена параметров можно не писать
//int Volume(int=2, int, int=8); // это ошибка!
// главная функция
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
int length=10, width=50, height=2, area=0;
// Вызов личной функции возможен с разным числом параметров
area=Volume(length, width, height);
cout << "Объем: " << area << "\n";
area=Volume(length,width);
cout << "Объем: " << area << "\n";
area=Volume(length);
cout << "Объем: " << area << "\n";
area=Volume();
cout << "Объем: " << area << "\n";
cin.get();
}
// Реализация личной функции
int Volume(int length, int width, int height) {
return (length * width * height);
}
Перегрузка функций
Другой особенностью языка С++ является возможность перегрузки функций (function overloading), т.е. возможно существование нескольких функций с одним именем. Подобные функции должны отличаться списком параметров, типами параметров, числом параметров либо всеми этими характеристиками. Тип возврата роли не играет. Две одноименные функции с одинаковым списком параметров, но разными типами возврата приведут к ошибке компиляции. Перегрузку функций часто называют полиморфизмом функций.
// Пример 5.2.8
// Перегрузка функций
#include <iostream>
#include <conio.h>
using namespace std;
// перегруженные функции для куба числа (прототипы)
int CubeOfNumber(int);
long CubeOfNumber(long);
float CubeOfNumber(float);
double CubeOfNumber(double);
// long double CubeOf Number(double); //ошибка - тип возврата в перегрузке // не используется!
// главная функция
void main() {
setlocale( LC_ALL, "Russian"); // для вывода на экран русского текста
int myInt=6500, cubedInt=0;
long myLong=65000, cubedLong=0;
float myFloat=6.5, cubedFloat=0;
double myDouble=6.5e20, cubedDouble=0;
// вызов перегруженных функций
cubedInt=CubeOfNumber(myInt);
cubedLong=CubeOfNumber(myLong);
cubedFloat=CubeOfNumber(myFloat);
cubedDouble=CubeOfNumber(myDouble);
cout << "myInt: " << myInt << "\tcubedInt: " << cubedInt << "\n";
cout << "myLong: " << myLong << "\t cubedLong: " << cubedLong << "\n";
cout << "myFloat: " << myFloat << "\t cubedFloat: " << cubedFloat << "\n";
cout << "myDouble: " << myDouble << "\t cubedDouble: "<<cubedDouble<< "\n";
cin.get();
}
// перегруженные функции для удвоения значения (реализации)
int CubeOfNumber(int original) {
cout << "CubeOfNumber(int)\n";
return 3*original;
}
long CubeOfNumber(long original) {
cout << "CubeOfNumber(long)\n";
return 3*original;
}
float CubeOfNumber(float original) {
cout << "CubeOfNumber(float)\n";
return 3*original;
}
double CubeOfNumber(double original) {
cout << "CubeOfNumber(double)\n";
return 3*original;
}