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

Основные библиотечные функции 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(&currentTime);

cout << "It is now " << ctime(&currentTime) << endl;

cin.get();

time(&currentTime);

// tm - структура для работы с датой и временем

struct tm ptm1=*localtime(&currentTime);

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. Параметры. Значения по умолчанию. Перегрузка. Рекурсия. План лекции

  1. Параметры и локальные переменные

  2. Передача параметров по значению

  3. Передача параметров по ссылке

  4. Глобальные переменные

  5. Область видимости и время жизни

  6. Задание параметров по умолчанию

  7. Перегрузка функций

  8. Inline-функции

  9. Рекурсия

  10. Распределение памяти при использовании функций

  1. Параметры и локальные переменные

Параметры функции и переменные, объявленные внутри функции являются локальными переменными, т.е. существуют только в момент работы функции. Когда происходит возврат из функции, локальные переменные становятся недоступными. Локальные переменные функции 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.;

}

  1. Передача параметров по значению

Изменения произведенные над параметрами внутри функции не затрагивают значений в вызывающей функции. Такой вид передачи параметров носит название передачи по значению (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;

}

  1. Передача параметров по ссылке

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

}

  1. Глобальные переменные

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

}

  1. Область видимости и время жизни

Локальные переменные с такими же именами, как и глобальные временно маскируют (скрывают) глобальные. Областью видимости (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;

}

  1. Задание параметров по умолчанию

В прототипе функции всем или нескольким ее последним параметрам можно определить значения по умолчанию (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);

}

  1. Перегрузка функций

Другой особенностью языка С++ является возможность перегрузки функций (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;

}

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