Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Способы передачи параметров функции ⇐ ПредыдущаяСтр 3 из 3
В 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; просмотров: 345; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.135.185.194 (0.096 с.) |