Главная | Обратная связь
МегаЛекции

Массивы передаются в функции по ссылке.





 

· При этом записывать перед формальным параметров знак ссылки & не следует:

int example (short a[3]);

 

· При описании в качестве формального параметра одномерного массива, его размер указывать необязательно:

int example(short a[ ]);

 

· При описании в качестве формального параметра многомерного массива, его размер по левому измерению указывать необязательно:

int example(short y[ ][4][3]);

 

Массив не может быть непосредственно возвращаемым значением


Передача указателей на функции

 

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

 

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

 

 

Объявление указателей на функцию:

 

Тип_возврата (*Имя_указателя)(список_типов_параметров);

 

Скобки, в которые взято *Имя_указателя позволяет отличить описание указателя на функцию

double (*pfun)(char*, int);

 

от описания прототипа функции, возвращающей указатель на double:

double *pfun (char*, int);


Инициализация параметров

 

· Параметры функции, передаваемые по значению, можно инициализировать в ее прототипе

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

· Инициализировать можно произвольное число параметров функции

· Так как аргументы сопоставляются формальным параметрам по порядку следования, то, чтобы опустить при вызове какой-либо аргумент придется опустить и все следующие за ним.

 

Возвращаемые значения

 

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



· Количество аргументов у функции может быть произвольным, но возвращаемое значение только одно (или ни одного).

· Если функция не возвращает значения, в качестве типа возвращаемого значения следует указать void (по умолчанию считается, что функция возвращает целочисленное значение).

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

 

Возврат ссылок: функция в левой части оператора присваивания

 

· Функция может возвращать ссылку на объект

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

· Для этого вызов функции должен осуществляться из левой части оператора присваивания.


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

 

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

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

· Сопоставив количество и типы аргументов при вызове, компилятор сгенерирует обращение к требуемой перегруженной функции.

 

шаблон функций

 

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

 

Шаблон семейства функций состоит из двух частей:

· заголовок шаблона (template <список параметров шаблона>)

· обычного определения функции (заголовок и тело функции), в котором тип возвращаемого значения и/или типы параметров обозначаются именами параметров шаблона, введенных в его заголовке.

 

Имена параметров шаблона могут использоваться и в теле определения функции для обозначения типов локальных объектов.

 

Формат простейшей функции-шаблона:

 

template <classtype>

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

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

}

 

где вместо слова type может использоваться произвольное имя.


Рекурсия

 

Рекурсивным называется объект, который частично определяется через самого себя.

Вызов рекурсивной процедуры должен выполняться по условию, которое на каком-то уровне рекурсии станет ложным.

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

 

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

 

Число рекурсивных вызовов в каждый конкретный момент времени, называется текущим уровнем рекурсии.

 

 


Структура рекурсивной процедуры может принимать три разных формы:

1. Форма с выполнением действий до рекурсивного вызова (с выполнением действий на рекурсивном спуске).

Void Rec()

{

… S … ;

if (условие) Rec ();

return;

}

 

2. Форма с выполнением действий после рекурсивного вызова (с выполнением действий на рекурсивном возврате).

Void Rec()

{

if условие Rec ();

… S … ;

return;

}

3. Форма с выполнением действий как до, так и после рекурсивного вызова (с выполнением действий как на рекурсивном спуске, так и на рекурсивном возврате).

Void Rec ()

{

… S1 …;

if (условие) Rec();

… S2 … ;

return;

};


 

ПРИМЕР 1. Область видимости переменной

 

Пример вывода на экран значений переменной а, которая объявляется в разных областях видимости программы.

 

#include <iostream> // for cin cout

 

using namespace std;

 

int a = 11; // глобальная переменная

 

void main ()

{

cout<<" 1 a="<<a<<endl; // а =11

 

int a = 22;

cout<<" 2 a="<<a<<endl; // а=22

 

{

int a = 33;

cout<<" 3 a="<<a<<endl; // а=33

}

 

cout<<" 4 a="<<a<<endl; // а=22

// при возврате в предыдущий блок программы

}

 


ПРИМЕР 2. Оператор расширения области видимости

 

Пример тот же. Оператор расширения видимости (::)

 

#include <iostream> // for cin cout

 

using namespace std;

 

int a = 11; // глобальная переменная

 

void main ()

{

cout<<" 1 a="<<a<<endl; // а =11

 

int a = 22;

cout<<" 2 a="<<a<<" "<< ::a <<endl; // а=22 11

 

{

int a = 33;

cout<<" 3 a="<<a<<" "<< ::a <<endl; // а=33 11

}

 

cout<<" 4 a="<<a<<" "<< ::a <<endl; // а=22 11

}


 

ПРИМЕР 3. Область видимости переменной

 

Пример вывода на экран значения переменной а, которая объявляется в разных разных областях видимости программы. Пример аналогичен 1, добавлен цикл с параметром а.

 

#include <iostream> // for cin cout

 

using namespace std;

 

int a = 11; // глобальная переменная

 

void main ()

{

cout<<" 1 a= "<<a<<endl; // а=11

 

int a = 22;

cout<<" 2 a= "<<a<<endl; // а=22

{

int a = 33;

cout<<" 3 a= "<<a<<endl; // а=33

{

for(int a = 0; a < 5; a++)

cout<<" 4 a= "<<a; // а=0 1 2 3 4

cout<<endl;

}

cout<<" 5 a= "<<a<<endl; // а=33

}

cout<<" 6 a= "<<a<<endl; // а=22

}


ПРИМЕР 4. Глобальные и локальные переменные

 

Пример вывода на экран значения переменной а через функции. Функция f1 - без формального параметра, функция f2 выводит на экран значение переданного параметра.

 

 

#include <iostream> // for cin cout

 

using namespace std;

 

int a = 11; // глобальная переменная

 

void f1(); //объявление функции f1 (прототип) без параметров

void f2(int);//объявление функции f2 (прототип)один параметр

 

void main ()

{

cout<<" 1 "<<endl;

f1(); // вызов функции f1 a=11

f2(a); // вызов функции f2 a=11

 

cout<<endl<<" 2 "<<endl;

a = 22;

f1(); // вызов функции f1 a=22

f2(a); // вызов функции f2 a=22

 

cout<<endl<<" 3 "<<endl;

f1(); // вызов функции f1 a=22

f2(33); // вызов функции f2 a=33

}

 

// определение функции f1

void f1()

{

cout<<" 1 a= "<<a<<endl;

}

 

// определение функции f2

void f2(int a)

{

cout<<" 2 a= "<<a<<endl;

}

 

ПРИМЕР 5. Глобальные и локальные переменные

 

Пример вывода на экран значения переменной а через функции. Определение функций до вызова. Функция f1 - без параметра имеет локальную переменную а, функция f2 выводит на экран значение переданного параметра и значение глобальной переменной а.

#include <iostream> // for cin cout

 

using namespace std;

 

int a = 11; // глобальная переменная

 

// определение функции f1

void f1()

{

int a = 55;

cout<<" 1 a= "<<a<<endl;

}

// определение функции f2

void f2(int b)

{

cout<<" 2 a= "<<a<<" b="<<b<<endl;

}

 

 

void main ()

{

cout<<" 1 "<<endl;

f1(); // вызов функции f1 a = 55

f2(a); // вызов функции f2 a =11 b =11

 

cout<<endl<<" 2 "<<endl;

a = 22;

f1(); // вызов функции f1 a = 55

f2(a); // вызов функции f2 a = 22 b = 22

 

cout<<endl<<" 3 "<<endl;

f1(); // вызов функции f1 a = 55

f2(33); // вызов функции f2 a = 22 b = 33

}

 


ПРИМЕР 6. Глобальные и локальные переменные

 

Пример вывода на экран значения переменной а через функции. Функция f1 - без параметра, функция f2 выводит на экран значение переданного параметра.

 

#include <iostream> // for cin cout

using namespace std;

 

int a = 11; // глобальная переменная

 

void f1(); // объявление функции f1 без параметров

void f2(int); //объявление функции f2 c одним параметром

 

void main ()

{ cout<<" 1 "<<endl;

f1(); // вызов функции f1 a = 11

f2(a); // вызов функции f2 a = 11

 

cout<<endl<<" 2 "<<endl;

{ int a = 22;

f1(); // вызов функции f1 a=11

f2(a); // вызов функции f2 a=22

cout<<endl<<" 3 "<<endl;

{ int a = 33;

f1(); // вызов функции f1 a=11

f2(a); // вызов функции f2 a=33

}

cout<<endl<<" 4 "<<endl;

f1(); // вызов функции f1 a=11

f2(a); // вызов функции f2 a=22

}

cout<<endl<<" 5 "<<endl;

f1(); // вызов функции f1 a=11

f2(a); // вызов функции f2 a=11

cout<<endl;

}

// определение функции f1

void f1()

{

cout<<" 1 a= "<<a<<endl;

}

// определение функции f2

void f2(int a)

{

cout<<" 2 a= "<<a<<endl;

}

ПРИМЕР 7. Передача параметров по значению. Возврат результата.

 

Вычислить минимальное из расстояний между заданными точками плоскости А(х1; у1), В(х2; у2) и С(1;2).

 

#include <math.h>

#include <iostream> // for cin cout

 

using namespace std;

 

// объявление функции (прототип)

// идентификатор формального параметра можно опустить

double dd(double, double, double, double);

 

void main ()

{

double xl, yl, x2, y2, d1, d2, d3, m;

 

cout <<"Input koordinaty: ”;

cin >> xl >> yl >> x2 >> y2;

 

d1 = dd(xl, yl, x2, y2) ; // d1 - расстояние от А до В

cout<<" d1= "<<d1<<endl;

 

d2 = dd(xl, yl, 1, 2); // d2 - расстояние от А до С

cout<<" d2= "<<d2<<endl;

 

d3 = dd(x2, y2, 1, 2); // d3 - расстояние от В до С

cout<<" d3= "<<d3<<endl;

 

m = (d1< d2) ?d1 : d2;

if (d3 < m)

m = d3; // минимальное расстояние

cout << "min: " << m <<endl;

}

 

 

//определение функции

double dd(double a1, double b1, double a2, double b2)

{ // возвращаем результат

return

(sqrt ((a1 - a2) * (a1 - a2) + (b1 - b2) * (b1 - b2)));

}


ПРИМЕР 8. Передача параметров по значению. Возврат результата.

 

Вычислить факториал N!

 

#include <iostream> // for cin cout

using namespace std;

 

long Iter_Fact (int n); //объявление функции (прототип)

// идентификатор формального параметра можно опустить

void main()

{

int i;

long Fact1, Fact2, Fact3;

 

Fact1= Iter_Fact (10); //вызов функции можно так

i = 10;

Fact2 = Iter_Fact (i); //вызов функции или так

Fact3 = Iter_Fact (5 + 5); //вызов функции или так

 

cout << Fact1<<" "<< Fact2 <<" "<< Fact3 << endl;

}

 

//определение функции

long Iter_Fact (int n)

{

long f = 1;

for (int i = 2; i <= n; i++)

f = f * i;

return (f); // возвращаем результат

}

 

 

ПРИМЕР 9. Передача параметров по значению. Инициализация параметров по умолчанию

 

Вычислить целую степень числа хn (через умножение).

 

#include <iostream> // for cin cout

using namespace std;

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

double stepen (double x=1, unsigned n=1);

 

void main ()

{

double a = 7.1, b;

unsigned k = 5;

 

b = stepen(2.7, k) +1 / stepen(a + 1, k);

// 2.7 k + 1/ (a+1)k

cout << b << endl;

 

b = stepen(2., k) + stepen(3, k); // 2k + 3k

cout << b << endl;

 

b = stepen(); // 11

cout << b << endl;

 

b = stepen(5); // 51

cout << b << endl;

}

 

double stepen (double x, unsigned n) //определение функции

// x – число n - степень

{

double y;

y = 1;

for (unsigned i = 1; i <= n; i++)

y = y * x;

return y; // возвращаем результат

}


ПРИМЕР 10. Передача параметров по значению, по ссылке.

 

Обмен значениями двух переменных

 

#include <iostream> // for cin cout

using namespace std;

// определение функции без прототипа

// передача параметров по значению

void change (double x, double y)

{

double z = x;

x = y;

y = z;

}

//определение функции без прототипа

// передача параметров по ссылке

void changeRef (double &x, double &y)

{

double z = x;

x = y;

y = z;

}

//определение функции без прототипа

// передача параметров через указатель

void changePtr (double* x, double* y)

{

double z = *x;

*x = *y;

*y = z;

}

 

void main()

{ double d = 1.23;

double e = 4.56;

 

change(d, e) ;

cout << " d= " << d <<" e = " << e <<endl;

// значения не изменились

changePtr(&d, &e) ;

cout << " d= " << d <<" e = " << e <<endl;

// значения изменились

changeRef(d, e) ;

cout << " d= " << d <<" e = " << e <<endl;

// значения изменились

 

}


 

ПРИМЕР 11. Передача параметров по ссылке

 

Перераспределение значений вещественных переменных а, b, c так, чтобы стало a >= b >= c. Функция maxmin(x,y) присваивает параметру х большее из двух вещественных чисел, а параметру y – меньшее.

 

#include <iostream> // for cin cout

using namespace std;

 

void maxmin (double &, double &); //объявление функции

void max_min (double *, double *); //объявление функции

 

void main ()

{

double a, b, c;

cin >> a >> b >> c;

maxmin (a ,b);

cout << a <<" "<< b << " "<< c << endl;

maxmin (a, c); //a получит максимальное значение

cout << a <<" "<< b << " "<< c << endl;

maxmin (b, c); //c получит минимальное значение

cout << a <<" "<< b << " "<< c << endl;

cin >> a >> b >> c;

max_min (&a , &b);

cout << a <<" " << b << " "<< c << endl;

max_min (&a, &c); //a получит максимальное значение

cout << a <<" " << b << " " << c << endl;

max_min (&b, &c); //c получит минимальное значение

cout << a <<" " << b << " " << c << endl;

}

 

void maxmin (double & x, double &y) // определение функции

{ if (x < y)

{ double r = x;

x = y;

y = r ;

}

}

void max_min (double *x, double *y) //определение функции

{

if (*x < *y)

{ double r =*x;

*x = *y;

*y = r ;

}

}

ПРИМЕР 12. Передача параметров по ссылке.

 

Выделение целой и дробной частей вещественного числа.

 

#include <iostream> // for cin cout

using namespace std;

 

 

void intfrac(float, float&, float&); //прототип функции

 

void main()

{

float number, intpart, fracpart;

 

cout << "Enter a real number: \n ";

cin >> number;

do

{

//вызов функции, неинициализированные переменные

// intpart, fracpart передаются для возврата результата

intfrac(number, intpart, fracpart);

 

cout << " integer part is " << intpart << endl;

cout << " fraction part is " << fracpart << endl;

cout << "\nEnter a real number: \n ";

cin >> number;

}

while(number != 0); //завершение работы, если введен 0

}

 

// определение функции

void intfrac(float n, float& intp, float& fracp)

{

//конвертирование в long int для выделения целой части

long temp = static_cast<long>(n);

intp = static_cast<float>(temp);

//конвертирование назад в тип float

fracp = n - intp; //нахождение дробной части

}


ПРИМЕР 13. Передача одномерного массива по ссылке

 

Вычисление суммы элементов массива.

 

#include <iostream> // for cin cout

using namespace std;

 

 

//размерность массива – глобальная константа, видима везде

const int n = 7;

//прототип функции

int adder (int iarray[n]);

 

void main()

{

int iarray1[n]={5, 1, 6, 20, 15, 0, 12};

//описание и инициализация массива

int iarray2[n]={ 1, 2, 3, 4, 5, 6, 7};

//описание и инициализация массива

int isum;

 

//вызов функции adder, ей передается только адрес массива

isum = adder(iarray1);

cout << "isum=" << isum << endl;

 

//вызов функции adder, ей передается только адрес массива

isum = adder(iarray2);

cout << "isum=" << isum << endl;

}

 

//определение функции

int adder (int iarray[n])

{

int i, ipartial = 0;

//n – глобальная константа, видима здесь

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

//накопление суммы элементов в переменной ipartial

ipartial += iarray[i];

return (ipartial);

//полученная сумма в качестве возвращаемого значения

}


ПРИМЕР 14. Передача одномерного массива и количества обрабатываемых значений массива

 

Вычисление суммы элементов массива.

 

#include <iostream> // for cin cout

using namespace std;

 

//прототип функции, появился второй параметр

// идентификатор формального параметра можно опустить

int adder (int [], int);

//размер массива – глобальная константа, видима везде

 

void main()

{

const int n = 7;

int isum;

// описание и инициализация массива

int iarray[n] = {5, 1, 6, 20, 15, 0, 12};

// вызов функции, ей передается адрес массива и

// количество элементов для обработки

// 2-ой параметр должен быть меньше

// количества элементов массива n

isum = adder(iarray, 3);

cout << "isum=" << isum << endl;

 

}

 

 

int adder (int array[], int k) //определение функции

{

int ipartial = 0;

// k – формальный параметр функции, его значение равно 3

for (int i = 0; i < k; i++)

ipartial += array[i]; //накопление суммы

return (ipartial);

//накопленная сумма возвращается в функцию

}

ПРИМЕР 15. Передача одномерного массива и количества обрабатываемых значений массива

 

Вычисление суммы элементов массива.

 

#include <iostream> // for cin cout

using namespace std;

 

int adder (int [], int);

 

void main()

{

const int n = 7;

int iarray[n] = {5, 1, 6, 20, 15, 0, 12};

int isum;

int i = 3;

 

// вычисление суммы i элементов

isum= adder(iarray, i);

cout << "isum=" << isum << endl;

 

// функции adder передается адрес 4-го элемента и

// предполагается вычисление суммы n-i элементов,

// начиная с 4-го и до конца массива

isum= adder(iarray + i, n - i);

cout << "isum=" << isum << endl;

}

 

// другое идентичное описание заголовка функции

int adder (int *piarray, int k)

{

int i , ipartial = 0;

// k – формальный параметр, его значение равно

// значению переданному из main

for ( i = 0; i < k; i++)

ipartial += piarray[i];

// piarray[i] есть *(piarray + i);

return (ipartial);

}


ПРИМЕР 16. Передача в функцию строки символов.

 

#include <ctype.h>

#include <iostream> // for cin cout

 

using namespace std;

 

void convertToUppercase (char *); //прототип функции

 

void main()

{

char string [ ] = "aaaaaaa";

 

cout<<string<<endl;

 

convertToUppercase(string);

cout<<string<<endl;

 

// ошибка выполнения: строка-константа

/*

char *s1= "pointer_of_simvol";

convertToUppercase(s1);

cout << s1 <<endl; */

 

}

 

//определение функции

void convertToUppercase (char *Ptr)

{

while (*Ptr != '\0')

{

*Ptr = toupper(*Ptr);

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

++Ptr;

}

}

ПРИМЕР 17. Выделение подстроки из строки

 

#include <string.h>

#include <iostream> // for cin cout

using namespace std;

 

// Выделение подстроки st из строки str

// c позиции номер poz количество символов kol

char *strsubstr

( char *str,char *st,unsigned poz, unsigned kol);

 

void main()

{

const int MAX = 80;

char s[MAX], subs[MAX];

char* str;

unsigned poz,kol;

 

cout << " s= \n";

cin.getline(s, MAX); // ввод строки

 

cout<<" N pozicii = "<<endl;

cin>>poz;

 

cout<<" Number char = "<<endl;

cin>>kol;

 

// Выделение подстроки subs из строки s

// c позиции номер poz количество символов kol

str = strsubstr(s,subs,poz,kol);

cout<<" str = "<<str<<endl; // результат

cout<<" subs = "<<subs<<endl; // результат

}

 

// Выделение подстроки st из строки str

// c позиции номер poz количество символов kol

char *strsubstr

( char *str, char *st,unsigned poz, unsigned kol)

{ unsigned i,j;

for ( i = poz, j = 0;

i < (poz + kol) && i < strlen (str); i++, j++)

st[j] = str[i];

st[j] = '\0';

return st;

}

ПРИМЕР 18. Удаление подстроки из строки

 

#include <string.h>

#include <iostream> // for cin cout

using namespace std;

// Удаление подстроки st из строки str

char * strdelsub( char *str,char *st);

 

void main()

{

const int MAX = 80;

char s[MAX], subs[MAX];

char* str;

 

cout << " s= \n";

cin.getline(s, MAX); // ввод строки

cout << " subs = \n";

cin.getline(subs, MAX); // ввод подстроки

// Удаление подстроки subs из строки s

str = strdelsub( s,subs);

 

cout<<" str = "<<str<<endl; // результат

cout<<" s = "<<s<<endl; // результат

}

 

// Удаление подстроки st из строки str

char * strdelsub( char *str,char *st)

{

// Используем функцию для определения

// вхождения подстроки в строку

// функция

char *strstr( const char *string, const char *strCharSet );

// = NULL, если подстрока не найдена

char *s = strstr(str,st);

if (s != NULL)

{ // номер позиции вхождения подстроки в строку

unsigned n = s - str;

unsigned j = strlen(st);

unsigned k = strlen(str) - j;

// удаление j символов строки str

for (unsigned i = n; i <= k; i++)

str[i] = str[i + j];

}

return str;

}

ПРИМЕР 19. Вставка подстроки в строку

 

#include <string.h>

#include <iostream> // for cin cout

using namespace std;

// Вставка подстроки st в строку str с позиции poz

// MAX_ - максимальное количество символов строки

char* strinssub

( char *str, char *st, unsigned poz, unsigned MAX_);

void main()

{ const unsigned MAX = 80;

char s[MAX], subs[MAX];

char* str;

unsigned poz;

 

cout << " s= \n";

cin.getline(s, MAX); // ввод строки

cout << " subs = \n";

cin.getline(subs, MAX); // ввод подстроки

cout<<"c pozicii nomer "<<endl;

cin>>poz;

// Вставка подстроки subs в строку s

str = strinssub( s,subs,poz,MAX);

cout<<" s = "<<str<<endl; // результат

cout<<" s = "<<s<<endl; // результат

}

 

// Вставка подстроки st в строку str с позиции poz

char* strinssub

( char *str, char *st, unsigned poz, unsigned MAX_)

{

unsigned i, j, l = strlen(st), k = strlen(str);

 

if (l + k <= MAX_ && poz <= k)

{

// сдвиг на l символов

for (i = k; i >= poz && i >= 0; i--)

str[i + l] = str[i];

str[l + k + 1] = '\0';

// вставка l символов с позиции номер poz

for(i = poz, j = 0; i < poz + l; i++, j++)

str[i] = st[j];

}

return str;

}

ПРИМЕР 20. Замена подстроки на подстроку

 

#include <string.h>

#include <iostream> // for cin cout

using namespace std;

// Замена подстроки st1 на подстроку st2 в строке str

// MAX_ - максимальное количество символов строки

char * strchangsub

( char *str,char *st1,char *st2,unsigned MAX_);

// Удаление подстроки st из строки str

char * strdelsub( char *str,char *st);

// Вставка подстроки st в строку str с позиции poz

char * strinssub

( char *str,char *st, unsigned poz,unsigned MAX_);

void main()

{ const unsigned MAX = 80;

char s[MAX], s1[MAX], s2[MAX];

char* str;

cout << " s= \n";

cin.getline(s, MAX); // ввод строки

cout << " s1 = \n";

cin.getline(s1, MAX); // ввод подстроки 1

cout << " s2 = \n";

cin.getline(s2, MAX); // ввод подстроки 2

// Замена подстроки s1 на s2 в строке s

str = strchangsub( s,s1,s2,MAX);

cout<<" s = "<<str<<endl; // результат

cout<<" s = "<<s<<endl; // результат

}

// Замена подстроки st1 на подстроку st2 в строке str

char * strchangsub

( char *str,char *st1,char *st2,unsigned MAX_)

{ if (strlen(st2) + strlen(str) <= MAX_)

{ // определениевхождения подстроки в строку

char *s = strstr(str, st1);

if (s != NULL)

{ // номер позиции вхождения подстроки в строку

int n = s - str;

strdelsub(str,st1); // удаление подстроки st1

// вставка подстроки s2 в строку str c номера n

strinssub(str,st2,n,MAX_);

}

}

return str;

}

ПРИМЕР 21. Удаление ведущих пробелов (пробелы в начале строки)

 

#include <string.h>

#include <iostream> // for cin cout

using namespace std;

 

// Удаление ведущих пробелов (пробелы в начале строки)

// из строки str

char * strdel_( char *str);

 

void main()

{

const unsigned MAX = 80;

char s[MAX];

char* str;

 

cout << " s= \n";

cin.getline(s, MAX); // ввод строки

cout<<" dlina = "<<strlen(s)<<endl; // длина строки

 

// Удаление ведущих пробелов из строки s

str = strdel_(s);

// результат

cout<<" str = "<<str<<" dlina = "<<strlen(str)<<endl;

cout<<" s = "<<s<<" dlina = "<<strlen(s)<<endl;

}

 

 

// Удаление ведущих пробелов (пробелы в начале строки)

// из строки str

char * strdel_( char *str)

{ unsigned i;

for ( i = 0; i < strlen(str) && str[i] ==' '; i++);

// количество ведущих пробелов

unsigned k = strlen(str) - i;

// удаление i пробелов строки str

for (unsigned j = 0; j <= k; j++)

str[j] = str[i + j];

return str;

}

 

 


ПРИМЕР 22. Удаление ведомых пробелов (пробелы в конце строки)

 

#include <string.h>

#include <iostream> // for cin cout

using namespace std;

 

// Удаление ведомых пробелов (пробелы в конце строки)

// из строки str

char * str_del( char *str);

 

void main()

{

const unsigned MAX = 80;

char s[MAX];

char* str;

 

cout << " s= \n";

cin.getline(s, MAX); // ввод строки

cout<<" dlina = "<<strlen(s)<<endl; // длина строки

 

// Удаление ведомых пробелов из строки s

str = str_del(s);

// результат

cout<<" str = "<<str<<" dlina = "<<strlen(str)<<endl;

cout<<" s = "<<s<<" dlina = "<<strlen(s)<<endl;

}

 

 

// Удаление ведомых пробелов (пробелы в конце строки)

// из строки str

char * str_del( char *str)

{

for(int i = strlen(str) - 1; i >= 0 && str[i] == ' '; i--)

str[i] = '\0';

return str;

}

 


 

ПРИМЕР 23. Передача массива строк

 

#include <iostream> // for cin cout

 

using namespace std;

 

void print (char *m[ ]); // прототип функции

void main ()

{

char *s[] = {"odin", "dwa", "try", 0};

print (s);

}

 

//определение функции

void print (char *m[ ])

{

for (int i = 0; m[i]; ++i)

cout << m[i] <<endl;

}

 

 


ПРИМЕР 24. Передача двумерного массива

 

Вычисление суммы элементов матрицы.

 

#include <iostream> // for cin cout

 

using namespace std;

 

const int n = 2; //глобальные переменные – размеры матрицы

const int m = 3;

 

int adder (int [n][m]); //прототип функции

 

void main()

{

int isum;

int iarray[n][m] = {5, 1, 6, 20, 15, 0};

int iarray1[n][m]= {1, 2, 3, 4, 5, 6};

 

isum= adder(iarray);

cout << "isum=" << isum << endl;

 

cout << "isum=" << adder(iarray1) << endl;

}

 

 

//определение функции сумма элементов матрицы

int adder (int iarray[n][m])

{

int ipartial = 0;

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

for (int j = 0; j < m; j++)

ipartial += iarray[i][j];

return (ipartial);

}


ПРИМЕР 25. Передача двумерного массива. Можно опустить первую размерность матрицы

 

Вычисление суммы элементов матрицы.

 

#include <iostream> // for cin cout

 

using namespace std;

 

const int n = 2; //глобальные параметры – размеры матрицы

const int m = 3;

 

// можно опустить первую размерность массива

int adder (int [][m]);

 

int main()

{

int isum;

int iarray[n][m] = {5, 1, 6, 20, 15, 0};

int iarray1[n][m] = { 1, 2, 3, 4, 5, 6};

 

isum= adder(iarray);

cout << "isum=" << isum << endl;

 

cout << "isum=" << adder(iarray1) << endl;

return 0;

}

 

//определение функции сумма элементов матрицы

int adder (int iarray[][3])

{

int ipartial = 0;

 

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

for (int j = 0; j < m; j++)

ipartial += iarray[i][j];

return (ipartial);

}

ПРИМЕР 26. Передача двумерного массива. Другой способ передачи адреса матрицы в функцию

 

Вычисление суммы элементов матрицы.

 

#include <iostream> // for cin cout

 

using namespace std;

 

const int n = 2; //глобальные переменные – размеры матрицы

const int m = 3;

//функция не возвращает значения,

void adder (int [ ][m], int *);

// для возврата значения– второй параметр

void main()

{

int isum;

int iarray[n][m] = {5, 1, 6, 20, 15, 0};

 

//вызов функции,

// передача второго параметра для возврата суммы

adder(iarray, &isum);

cout << "isum=" << isum << endl;

}

 

//определение функции

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

void adder (int (*piarray)[m], int *pipartial)

{

*pipartial = 0;

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

for (int j = 0; j < m; j++)

*pipartial += piarray[i][j];

}

// return не нужен - результат в pipartial

ПРИМЕР 27. Передача двумерного массива. Передача первой размерности матрицы через параметр

 

Вычисление суммы элементов матрицы.

 

#include <iostream> // for cin cout

 

using namespace std;

 

const int n = 2; // глобальные переменные – размеры массива

const int m = 3;

 

void adder (int (*)[m], int *, int);

 

int main()

{

int iarray[n][m] = {5, 1, 6, 20, 15, 0};

int isum, i = 1;

 

adder(iarray, &isum, i);

cout << "isum=" << isum << endl;

return 0;

}

 

//определение функции

void adder (int (*piarray)[m], int *pipartial, int k)

{

*pipartial = 0;

// параметр k получил значение, равное значению

// переменной i из main()

for (int i = 0; i < k; i++)

for (int j = 0; j < m; j++)

*pipartial += piarray[i][j];

}

ПРИМЕР 28. Передача двумерного массива. Передача размерностей матрицы через параметры

 

Вычисление суммы элементов матрицы.

 

#include <iostream> // for cin cout

 

using namespace std;

 

void main()

{

int isum;

//прототип функции с параметром

// «указатель на указатель на целое»

int adder (int **, int, int);

 

int iarray[2][3]={ 5, 1, 6, //элементы матрицы

20, 15, 0};

 

// определение и инициализация вспомогательного массива

// указателей имя которого –

// «указатель на указатель на целое»

int *par[ ]={&iarray[0][0], &iarray[1][0]};

 

//вызов функции и передача ей адреса массива указателей

// т.е. адреса нулевой строки

isum = adder(par, 2, 3);

 

cout << "isum=" << isum << endl;

}

 

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

int adder (int **mas, int n, int m)

{

int ipartial = 0;

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

for (int j = 0; j < m; j++)

ipartial += mas[i][j];

return (ipartial);

}

 


 

ПРИМЕР 29. Передача двумерного массива. Передача размерностей матрицы через параметры

 

Вычисление суммы элементов матрицы.

 

#include <iostream> // for cin cout

 

using namespace std;

 

void main()

{

int isum;

//прототип функции с параметром

// «указатель на указатель на целое»

int adder (int **, int, int);

 

int iarray[2][3]={5,1,6,20,15,0}; //элементы матрицы

 

//определение и инициализация вспомогательного

// массива указателей

// имя которого – «указатель на указатель на целое»

int *par[ ]={iarray[0], iarray[1]};

 

// вызов функции и передача ей адреса массива указателей

// т.е. адреса нулевой строки

isum = adder(par, 2, 3);

 

cout << "isum=" << isum << endl;

}

 

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

int adder (int **mas, int n, int m)

{

int ipartial = 0;

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

for (int j = 0; j < m; j++)

ipartial += mas[i][j];

return (ipartial);

}

ПРИМЕР 30. Передача двумерного массива. Передача размерностей матрицы через параметры

 

Вычисление суммы элементов матрицы.

 

#include <iostream> // for cin cout

 

using namespace std;

 

//прототип функции с параметром «массив указателей на целое»

int adder (int* [ ], int, int);

 

void main()

{

int isum;

int iarray[2][3]={5,1,6,20,15,0};

 

// определение и инициализация

// вспомогательного массива указателей

int *par[]={&iarray[0][0], &iarray[1][0]};

 

//вызов функции и передача ей адреса нулевой строки

isum = adder(par, 2, 3);

 

cout << "isum=" << isum << endl;

// или cout << "isum=" << adder(par, 2, 3) << endl;

 

}

 

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

int adder (int *mas[ ], int n, int m)

{

int ipartial = 0;

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

for (int j = 0; j < m; j++)

ipartial += mas[i][j];

return (ipartial); //возврат значения в функцию

}

ПРИМЕР 31. Передача двумерного массива. Передача размерностей матрицы через параметры

 

Вычисление суммы элементов матрицы.

 

#include <iostream> // for cin cout

 

using namespace std;

 

//прототип функции с параметром «массив указателей на целое»

int adder (int* [ ], int, int);

 

void main()

{

int isum;

int iarray[2][3]={5,1,6,20,15,0};

 

//определение и инициализация

// вспомогательного массива указателей

int *par[]={iarray[0], iarray[1]};

 

//вызов функции и передача ей адреса нулевой строки

isum = adder(par, 2, 3);

cout << "isum=" << isum << endl;

// или cout << "isum=" << adder(par, 2, 3) << endl;

 

}

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

int adder (int *mas[ ], int n, int m)

{

int ipartial = 0;

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

for (int j = 0; j < m; j++)

ipartial += mas[i][j];

return (ipartial); //возврат значения в функцию

}

ПРИМЕР 32. Инициализация параметра-ссылки

 

Функция с инициализацией параметра-ссылки

#include <iostream> // for cin cout

 

using namespace std;

 

int n = -55; // глобальная переменная

 

//определение функции с инициализацией параметра-ссылки

void invert(int& k=n)

{

cout << " --- k= "<< k<<endl;

k = -k;

}

 

void main()

{

int a = 22, b = 66;

double d = 3.33;

// вызов без параметра

invert();

cout << " n= " << n<<endl;

 

// вызов с параметром

invert(a);

cout << <<" a = " << a<<endl;

cout << " n = " << n<<endl;

 

// invert(a+b);

// ошибка компиляции: выражение не имеет адреса

// invert (d);

// ошибка компиляции разный тип

}

ПРИМЕР 33. Возврат ссылки

 

 

#include <iostream> // for cin cout

 

using namespace std;

 

int x=0; // глобальная переменная

 

int& setx(); // прототип функции

 

int main()

{

// функция вызывается из левой части оператора присваивания

setx() = 92;

 

// вывод нового значения глобальной переменной

cout << "x=" << x << endl;

return 0;

}

 

 

int& setx()

{

return x; // возвращает ссылку на х

}

 


 

ПРИМЕР 34. Возврат ссылки на элемент массива

 

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

 

#include <iostream> // for cin cout

 

using namespace std;

 

// прототип функции возвращающей ссылку на элемент,

// имеющий





Рекомендуемые страницы:

Воспользуйтесь поиском по сайту:
©2015- 2019 megalektsii.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.