Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Пример. #include <iostream.h>





#include <iostream.h>

void cube(int *n, int length); // n – адрес массива, length – длина его

/* функция возводит в куб элементы массива */

void main()

{ int i, nums[10];

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

nums[i] = i+1;

count << “Исходное содержимое массива:”;

for (i=0; i<10; i++) cout << nums[i] << “ ‘;

cout << ‘\n’;

cube (nums,10); // передаем функции адрес массива nums

cout << “Изменненое содержимое:”;

for (i=0; i<10; i++) cout << nums[i] << “ “;

}

//Возводим в куб элементы массива

void cube(int *n, int length)

{ while (length) {

*n = (*n)*(*n)*(*n);

length--;

n++;

}

} // конец функции

 

Результат:

Исходное содержимое массива: 1 2 3 4 5 6 7 8 9 10

Измененное содержимое: 1 8 27 64 125 216 343 512 729 1000

 

Здесь элементы массива nums были изменены операторами тела функции cube(),поскольку ей передается адрес массива nums.

 

Передача функциям строк

 

Поскольку строка в С++ - это символьный массив, завершающийся нулевым байтом, то при передаче функции строки реально передается только указатель типа char*на начало этой строки.

Пример.

Определим функцию strInvert(), которая инвертирует регистр букв строки, т.е. заменяет строчные символы прописными, а прописные – строчными.

 

#include <iostream.h>

#include <string.h> // копирование strcpy()

#include <ctype.h> // функции над строками

void strInvert(char *str); // параметр – строка

void main()

{ char str[80]; // исходная строка

strcpy(str, “This Is A Test”);

strInvert(str); // преобразуем строку

cout << str; // вывод преобразованной строки

}

void strInvert(char *str)

{

while (*str) // пока не нулевой байт

{ if (isupper(*str)) // возвращает true, если буква верхнего регистра

*str = tolower(*str); // возвращает символ в нижнем регистре

else

if (islower(*str)) // возвращает true, если буква нижнего регистра

*str = toupper(*str); // возвращает символ в верхнем регистре

str++; // переход к следующему символу

} // конец while

} // конец функции

 

Результат:

tHIS iS a tEST

 

Возвращение функциями указателей

 

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

Например:

int *f(); // прототип функции f(), возвращающей указатель на целое число

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

Пример. Определим функциюget_substr(), возвращающую указатель на первую подстроку, которая совпадает с заданной. Если подстрока не найдена, то функция возвращает нулевой указатель.

#include <iostream.h>

char *get_substr(char *sub, char *str); // прототип

void main()

{ char *substr; // указатель на символ

substr = get_substr(“ab”, “cd_ablm”);

if (substr)

cout << “\nЗаданная подстрока найдена: “ << substr;

else

cout << “\nЗаданная подстрока не найдена: “;

}

char *get_substr(char *sub, char *str)

{ int i; // номер символа

char *p, *p2, *start;

for (i=0; str[i]; i++)

{ p = &str[i];

start = p;

p2 = sub;

while (*p2 && *p2 == *p)

{ p++;

p2++;

}

/* если обнаружен конец p2-строки (т.е. подстроки), то искомая подстрока найдена */

if (!*p2)

return start; // указатель на начало подстроки

} // переход к следующему символу

return 0; // совпадение не обнаружено

}

 

Результат:

Заданная подстрока найдена: ablm

 

Рекурсивные функции

 

Функция называется рекурсивной, если в процессе выполнения составляющих ее операторов она обращается к себе.

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

Пример. Написать рекурсивную функцию вычисления к!

long fact (int k)

{ if (k>0) return 0;

If (k = =0) return 1;

return k*fact(k-1);

}

 

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

Например: требуется вычислить fact(3).

 

 

В этом примере простое решение появляется при n4=0.

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

Однако рекурсия требует больше времени и памяти при вычислениях.


Подставляемые функции

 

Обычно при вызове функции компилятор включает в код программы команду передачи управления на тело функции.

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

Такие функции называются подставляемыми.

Синтаксис определения подставляемой функции:

 

inline<тип><имя функции>(<список формальных параметров>)

<тело функции>

Пример:

inline float r (float x, float y)

{ return sqrt (x*x + y*y);}

 

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

- функция не должна быть рекурсивной;

- функция не должна содержать операторы цикла, переключатели и т.д.

Вопросы

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

1.полное определение массива;

2.имя массива;

3.адрес первого элемента массива.

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

1.любой символ строки;

2.имя строки;

3.указатель на символ;

4.адрес первого символа строки.

 

 







Date: 2015-12-12; view: 403; Нарушение авторских прав



mydocx.ru - 2015-2024 year. (0.009 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию