Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Способы передачи параметров функцииСодержание книги
Поиск на нашем сайте В C++ определено несколько способов передачи параметров функции и получения результатов вычисления функции, вызывающей средой. Существует четыре специфики передачи параметров функции: - вызов функции с передачей значений; - вызов функции с передачей адресов переменных; - вызов функции с использованием механизма ссылок при передаче параметров; - посредством глобальных параметров. Вызов функции с передачей значений. Этот способ передачи параметров обеспечивает передачу копий переменных в стек, организуемый при активизации функции. При этом обеспечивается защита самих переменных от их изменения в функции. Пример:
#include<iostream.h> int sum(int,int); // объявление функции void mane(void) {int a,b,c; cin >> a >> b; c=sum(a,b); //передача параметров значений cout << c << endl; } // определение функции int sum(int d, int l) // заголовок { // тело функции int f; f=d+l; return f; // результат передаётся в точку вызова } Вызов функции с передачей адресов. Этот способ передачи параметров обеспечивает передачу в стек адресов передаваемых данных, что позволяет функции работать непосредственно с данными. #include<iostream.h> sum(int,int,int*); // объявление функции void main() {int a,b,c=0; cin>>a>>b; sum(a,b,&c); // вызов функции cout<<c<<endl; } void sum(intd,intl,int*f) // определение функции { *f=d+l // f – указатель на c } Вызов функций с использованием механизма ссылок. Этот способ обеспечивает доступ к передаваемым параметрам посредством определения их альтернативного имени. Например:
#include<iostream.h> sum(int,int,int&); void main() { int a,b,c=0; cin >> a >> b; sum(a,b,c); cout << c << endl; } void sum(int d,int l,int &f) { f=d+l; // f- ссылка на c } Вызов функции с передачей данных посредством глобальных параметров. Этот способ передачи исходных данных в вызываемую функцию и возвращения результата вычислений путём использования глобальных параметров. Например: #include <iostream.h> int a,b,c; sum(); // объявление функции main() { cin >> a >> b; sum(); //вызов функции cout<<c<<endl; } sum() // определение функции {c=a+b; //a,b,c- глобальные переменные }
Вызов функции с передачей аргументов по умолчанию. В языке С++, начиная с версии 3.11 и выше, определена возможность передачи значений аргументов функции по умолчанию. Этот способ передачи значений параметров используется в том случае, когда необходимо обеспечить передачу только части значений параметров, а не всех. Объявление значений функции по умолчанию производится путём указания значений аргументов в прототипе функции посредством оператора присваивания. #include<iostream.h> float ur(float x,float a=0.,float b=0.,float c=0.); int main() {float a=1.,b=2.,c=3.,x=0.5,y; y=ur(x,a,b,c); cout<<"введены все аргументы"<<"\n"; cout<<y<<"\n"; y=ur(x,a,b); cout<<"введены x,a и b"<<"\n"; cout<<y<<"\n"; y=ur(x); cout<<"введен x"<<"\n"; cout<<y<<"\n"; cin>>a; } float ur(float x,float a,float b,float c) { return a*x*x+b*x+c;} На экране дисплея мы получим следующие результаты работы вышеприведенной программы. Введены все аргументы 4.25 введены x,a и b 1.25 введен x 0.
Рекурсивные функции В языке C++ допустима рекурсия. Рекурсия это способ организации вычислительного процесса, при котором процедура или функция может обращаться сама к себе. Покажем рекурсивную реализацию метода быстрой сортировки. В методе используется процедура половинного разделения, применяемая на 1-ом шаге ко всему массиву, а на следующих шагах – к его фрагменту. На каждом шаге образуются две половинки текущего фрагмента, к которым снова применяется процедура разделения. Если массив сортируется по возрастанию, то в левую половинку записываются меньшие значения, а в правую – большие (если по убыванию, то наоборот). Одну из возможных версий программы покажем на примере: #include<iostream.h> void quicksort(float* arr, int left,int right); void main() {const int n = 10; float ar[n]; int i, l, r; // cputs(«введите данные о значениях исходного массива»); for(i=0; i<n; i++){ cout<<”введите а[“<<k<<”] исходного массива \n”; cin>>ar[i]; } l = 0; r = n – 1; // левая и правая границы начального // фрагмента quicksort(ar, l, n); // вызов функции for(i=0; i<n; i++) printf(“ar[ %d ]= %d \n”, i, ar[i]); // cout<<ar[i]<<” “; }
void quicksort(float * arr, int left, int right) {int i = left, j = right; //левая и правая границы фрагмента float middle = arr[(left + right) / 2]; float temp; while (i < j) { while (arr[i] < middle) i++; while (middle < arr[j]) j--; if (i <= j) { // замена значений temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; i++; j--; } } if(i < right)quicksort(arr, i, right); /* вызов функции для сортировки правой половины фрагмента массива */ if(left < j)quicksort(arr, left, j); /* для сортировки левой половины фрагмента */ } Процедура разделения реализована в виде рекурсивно вызываемой функции quicksort(), в теле которой есть два обращения к самой себе: для сортировки левой половинки теккущего фрагмента и сортировки его правой половинки. Однако, у рекурсии есть недостатки: - такую программу труднее отлаживать, поскольку требуется контролировать глубину рекурсивного обращения; - при большой глубине стек может переполниться; - использование рекурсии повышает накладные расходы (в данном случае в стеке сохраняются не два числа, представляющие собой границы фрагмента, а гораздо больше, не говоря уже о затратах, связанных с вызовом функции). Поэтому рекурсию следует применять с осторожностью.
Перегрузка функций Часто бывает удобно, чтобы функции, реализующие один и тот же алгоритм для различных типов данных, имели одно и то же имя. Использование нескольких функций с одним и тем же именем, но с различными типами параметров, называется перегрузкой функций (перегружаемыми функциями). Компилятор определяет, какую именно функцию требуется вызвать, по типу фактических параметров. Этот процесс называется разрешением перегрузки. Тип возвращаемого функцией значения в разрешении не участвует.
int sum(int a, int b) {return (a+b);} double sum(double a, double b) {return(a+b);} double sum(double a, double b, double c) {return(a+b+c);}
Приведенные выше функции отличаются друг от друга следующим образом: первая от второй типом формальных параметров и типом возвращаемого результата; первая от третьей количеством и типом формальных параметров и типом возвращаемого результата; вторая от третьей количеством формальных параметров. Если точного соответствия списков параметров объявления функции и в ее вызове не найдено, выполняются преобразования типов в соответствии с общими правилами, например, bool и char в int, float в double и т.п. Далее выполняются стандартные преобразования типов, например, int в double или указателей в void*. Следующим шагом является выполнение преобразований типа, заданных пользователем, а также поиск соответствий за счет переменного числа аргументов функций. Если соответствие на одном и том же этапе может быть получено более чем одним способом, вызов считается неоднозначным и выдается сообщение об ошибке. Существует ряд правил описания перегруженных функций: - перегруженные функции должны находиться в одной области видимости, иначе произойдет сокрытие аналогично одинаковым именам переменных во вложенных блоках (доступ осущствляется только к одной из них); - перегруженные функции могут иметь параметры по умолчанию, при этом значения одного и того же параметра в разных функциях должны совпадать. В различных вариантах перегруженных функций может быть различное число параметров по умолчанию; - функции не могут быть перегружены, если описание их параметров совпадает или отличается только модификатором const или использованием ссылки (например, int и const int, int и int&).
Шаблоны функций Многие алгоритмы не зависят от типов данных, с которыми они работают (классический пример – сортировка). Естественно желание параметризовать алгоритм таким образом, чтобы его можно было использовать для различных типов данных. В С++ есть мощное средство параметризации – шаблоны. Существуют шаблоны функций и шаблоны классов. С помощью шаблона функции можно определить алгоритм, который будет применяться к данным различных типов, а конкретный тип данных передается функции в виде параметра на этапе компиляции. Компилятор автоматически генерирует правильный код, соответствующий переданному типу. Таким образом, создается функция, которая автоматически перегружает сама себя и при этом не содержит накладных расходов, связанных с параметризацией. Формат простейшей функции – шаблона: template <class Тype> тип имя_функции (type param1, type param2) { // тело функции } Вместо слова Type может использоваться произвольное имя. В общем случае шаблон функции может содержать несколько параметров, каждый из которых может быть не только типом, но и просто переменной, например: template <class A, class B, int i> void f(){...}
Например, функция сортировки методом Шелла в виде шаблона может выглядеть так: // Пример родовой функции или шаблона сортировки методом Шелла #include <iostream.h> #include <stdlib.h> #include <stdio.h> #include <time.h> const int n=10; // Это шаблон функции сортировки методом Шелла template <class T> void chelsort(T arr[],int col) // сортировка методом Шелла {int h[] = {9,5,3,1}; for(int i=0,deapazon=h[0]; i<4; deapazon=h[++i]) { for(int i=deapazon; i < col; i++) for(int j=i-deapazon;j>=0&&arr[j]>arr[j+deapazon]; j-=deapazon) { T temp = arr[j]; arr[j] = arr[j+deapazon]; arr[j+deapazon] = temp; } } }
int main(void) { int arr[n], i,col=n; float arr1[n]; randomize(); // формирование массива целых чисел for(i=0; i<n; i++) arr[i]= rand() % 100; chelsort(arr,col); for(i=0; i<n; i++) cout<<arr[i]<<'\n'; // формирование массива вещественных чисел for(i=0; i<n; i++) arr1[i]= rand()/ 100.; chelsort(arr1,col); for(i=0; i<n; i++) cout<<arr1[i]<<'\n'; getchar(); return 0; } Если шаблонные функции определены в заголовочном файле, то в программе достаточно указать только прототипы этих функций. Компилятор ищет шаблон функции, совпадающий по типу возвращаемого значения, количеству формальных параметров и типу тех формальных параметров, которые определены.
Контрольные вопросы 1. Основные правила составления функций. 2. Объяснить назначение оператора return. 3. Какие типы функций поддерживаются языком C++? 4. Место расположения функции по отношению к основной программе. 5. Какие типы формальных и фактических параметров поддерживаются языком C++?
Перечень лабораторных работ Лабораторные работы проводятся на ПК с использованием средств TurboС V3.0 или BuilderC++ V5.0 (или V6.0). При подготовке к лабораторной работе необходимо ознакомиться с материалами лекций, начитанных по теме лабораторной работы, а также с предложенной литературой. Список предлагаемой литературы представлен в конце данного методического пособия. Тематика лабораторных работ охватывает основные моменты разработки оптимальных алгоритмов решения поставленных задач и программирования средствами языка С++, помогает студентам освоить приемы работы с массивами, структурами, функциями, файлами и строками. Тематика лабораторных работ указана в таблице 4. Таблица 4.
Для успешного выполнения лабораторных работ разработаны методические указания, которые можно взять в библиотеке факультета АИТ. В указаниях даются теоретические сведения по рассматриваемой теме и примеры программ для данного класса задач. Все программы снабжены комментариями и подробными объяснениями. Для выполнения лабораторных работ разработаны тридцать вариантов индивидуальных заданий. Вариант задания выдается преподавателем в начале семестра или перед выполнением каждой лабораторной работы. Для закрепления изученного материала и самопроверки студентами полученных знаний в каждой лабораторной работе дается перечень контрольных вопросов. Общие требования к отчетам по лабораторным работам таков: отчет должен содержать: - титульный лист, - название лабораторной работы, - цель и задание, - текст программы (или несколько текстов программ), снабженный комментариями, - результаты работы программы. Дополнительные требования к отчету по каждой лабораторной работе и варианты индивидуальных заданий приведены в методических указаниях по выполнению лабораторных работ по данному курсу.
Список литературы
Основная: 1. Подбельский, В.В. Язык С++. [Текст]: учеб. пособие/ В.В. Подбельский. - 5-е изд. – М: Финансы и статистика, 1999. - 560с.; 21см. – Библиогр.: с. 538-539. – 3000 экз. – ISBN 5-279-02204-7. 2. Подбельский, В.В. Программирование на языке Си [Текст]: учеб. пособие/ В.В. Подбельский, С.С. Фомин. - 2-е доп. изд. – М: Финансы и статистика, 1998. - 600с.; 21см. - Библиогр.: с. 577. – 7000 экз. – ISBN 5-279-02180-6. 3. Ашарина, И.В. Основы програмирования на языках С и С++ [Текст]/ И.В. Ашарина. - М: Горячая линия – Телеком, 2002. - 207с.: ил.; 21 см. - Библиогр.: с. 202-203. – 5000 экз. – ISBN 5-93517-076-0. 4. Давыдов, В.Г. Программирование и основы алгоритмизации [Текст]: учеб. пособие/ В.Г. Давыдов – М: Высшая школа, 2003. – 447с.: ил.: 22 см. – Библиогр.: с. 442. – 3000 экз. - ISBN 5-060-04432-7. 5. Хусаинов, Б.С. Структуры и алгоритмы обработки данных. Примеры на языке Си (+СД) [Текст]: учеб. пособие/ Б.С. Хусаинов. - Финансы и статистика, 2004. - 464с.: ил.: 21 см. – Библиогр.: с. 462-464. – 3000 экз. – ISBN 5-279-02775-8.
Дополнительная: 1. Страуструп, Б. Язык программирования С++ [Текст]/ Б.Страуструп. - 3-е изд. пер. с англ./ - М: Радио и связь, 1991. - 352 с.: ил.: 21см. – 3000 экз. - ISBN 5-256-00454-9. 2. Аляев, Ю.А. Алгоритмизация и языки програмирования PASCAL, C++, Visial Basic [Текст]: учебно-справочное пособие/ Ю.А. Аляев, О.А. Козлов. - М: Финансы и статистика, 2002. – 320 с: ил.; 21 см. – Библиогр.: с. 318-319. – 4000 экз. – ISBN 5-279-02294-2. 3. Павловская, Т.А. С/С++. Программирование на языке высокого уровня [Текст]/ Т.А. Павловская. – СПб: Питер, 2001. - 464с.: ил.; 24 см. – 7000 экз. – ISBN 5-318-00001-0. 4. Боровский, А.Н. Borland C++ Builder. Самоучитель [Текст]/ А.Н. Боровский. – СПб: Питер, 2005. - 256с.: ил.; 23 см. – 4000 экз. – ISBN 5-469-00551-8. 5. Скляров, В.А. Программирование на языках Си и Си++ [Текст]: практ. пособие/ В.А. Скляров. – М.: Высшая школа, 1996. – 240 с.: ил.; 21 см. – Библиогр.: с. 238-239. – 5000 экз. – ISBN 5-06-002685-x. 6. Шамис, В.А. Borland C++ Builder 6. Для профессионалов [Текст]/ В.А. Шамис – СПб: Питер, 2005. - 798с.: ил.; 24 см. – 3000 экз. – ISBN 5-318-00598-5. Учебное издание
Бритик Владимир Иванович Козырь Ольга Феликсовна
|
||||||||||||||||||||||
|
Последнее изменение этой страницы: 2017-02-17; просмотров: 488; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.196 (0.008 с.) |