Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 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; Нарушение авторских прав |