bmstu_iu6_Cpp1 (823967), страница 13
Текст из файла (страница 13)
Дайте определение указателя. В чем его физический смысл?Ответ.2. Что такое ссылка и какое ее основное достоинство?Ответ.3. Поясните отличие ссылки от указателя.Ответ.4. Что такое адресная арифметика и основные правила ее выполнения?Ответ.5.
Назовите основные операции по выделению и освобождению динамической памяти.Ответ.6. Что такое массивы и для чего их используют? Как можно создать массивы?Ответ.7. Как в С++ определить символьную строку? Какие существуют способы определениястрок и чем они отличаются?Ответ.8. Какие стандартные функции определены для обработки строк и какую библиотеку дляэтого нужно подключить?Ответ.Оглавление819. Что такое структура в С++ и для каких целей она используется?Ответ.10. Что такое динамические структуры данных?Ответ.11.
Приведите пример описания элемента односвязного списка.Ответ.Оглавление824ФУНКЦИИ. МОДУЛЬНОЕ ПРОГРАММИРОВАНИЕДля улучшения эффективности программ в языках высокого уровня были разработаны средства модульного программирования, предусматривающие использование подпрограмм и модулей.Подпрограмма – это относительно самостоятельный фрагмент программы, соответствующим образом оформленный и снабженный именем.В зависимости от способов описания и вызова различают подпрограммы двух видов:процедуры и функции.Процедуры предназначены для выполнения некоторых действий, например, печатистроки, а функция – позволяют получить задаваемую скалярную величину, которую возвращает в качестве результата.Си и С++ декларированы как языки функционального программирования.
Поэтому вСи и С++ нет понятия процедуры, как средства языка. Однако существует возможность создания функций, которые не возвращают значения и реализуют действия, свойственныепроцедурам.4.1 Функции С++Каждая программа на С++ обязательно должна включать единственную главнуюфункцию с именем main. Кроме нее в программу может входить произвольное количествофункций, выполнение которых прямо или косвенно инициируется функцией main.Функции можно описывать в любом месте программы и даже в другом файле, нотолько не внутри другой функции.Различают объявление и описание функций.
Описание функции состоит из заголовка,при необходимости используемого в качестве прототипа, и собственно тела функции:<Тип результата или void> <Имя функции> ([<Список параметров>]){ [ < Объявление переменных и констант >]<Операторы>}Объявление функций предполагает включение в начало программы прототипов (заголовков) всех используемых функций, тогда описания функций может быть приведены влюбом порядке. Если прототипы функций в начале программы не помещать, то все функции должны быть описаны до своего вызова.Оглавление83Функция может получать данные двумя способами:а) неявно – с использованием видимых в других функциях переменных;б) явно – через параметры.Неявная передача:• приводит к большому количеству ошибок, вызванных возможной «порчей» глобальных данных подпрограммами;• жестко связывает подпрограмму и данные, существенно снижая степень универсальности подпрограмм.При отсутствии параметров список можно заменить служебным словом void илиопустить, например:int print(void); int print();Формальные и фактические параметры.
Формальными называют параметры,определенные в заголовке описания функции. При перечислении для каждого формального параметра помимо имени задают тип, например:float max(float a,char b){…}Фактическими называют параметры, задаваемые при вызове функции. В математикетакие параметры называют аргументами. В качестве аргументов можно использовать литералы, поименованные константы, переменные и выражения.Совокупность формальных параметров определяет сигнатуру функции.
Сигнатурафункции зависит от количества параметров, их типа и порядка размещения в спецификации формальных параметров.При задании аргументов следует помнить, что формальные и фактические параметры, относящиеся к одной функции, должны совпадать: по количеству параметров, по ихтипу и по порядку следования, например:int k,l,n=6; float d=567.5,m=90.45void fun(int a,float c,float b){….}fun(n,d,m);fun(4,8.7,0.1);// описание функции fun// правильный вызов, аргументы – переменные или константы// правильный вызов, аргументы – литералыfun(n%4-3,8.7,0.1); // правильный вызов, один из аргументов – выражениеfun(4,8.7);// ошибка в количестве параметровfun(4.67, 5,7);// ошибка в типах параметровfun(3,m,d);//не обнаруживаемая компилятором ошибка в порядке следования// аргументовОглавление84Оператор возврата значения функции.
Если описывается подпрограмма-функция,которая возвращает в вызывающую программу формируемое значение, то в теле функцииобязательно наличие оператора возврата return, передающего это значение, например:int max(int a,int b){if (a>b) return aelsereturn b}Вызов функции может выглядеть, например, так: k=max(i,j); .В соответствии со стандартом, если функция возвращающая значение, не используетоператора return, то в вызывающую программу возвращается случайное значение (называемое мусором).При необходимости функция может содержать несколько операторов возврата return, как в примере выше.
Встретив любой из них, функция возвращает значение иуправление в вызывающую программу.Если функция не объявлена со спецификацией void, то ее можно использовать в качестве операнда в любом выражении, например:K=max(a,b)/max(c,e); .Пример 4.1. Разработать подпрограмму, определяющую максимальное из двух вещественных чисел.#include <locale.h>#include <stdio.h>#include <conio.h>// прототип функцииfloat max(float a,float b);int main(int argc, char* argv[]){setlocale(0,"russian");printf("Результат = %f\n",max(4.6,5.8));puts("Нажмите любую клавишу для завершения...");_getch();return 0;}Оглавление85float max(float a,float b) // описание функции{return (a>b)?a:b;}Если описывается подпрограмма-процедура, то она, либо не должна возвращать результатов, либо должна возвращать их через параметры (см.
далее). Оператор возврата значений в подпрограммах-процедурах не используется.Возврат результатов через параметры функции (процедуры). Существует дваспособа передачи аргументов в подпрограммы через параметры. Первый из них известенкак «передача параметров по значению». В этом случае в подпрограмму передаются копиифактических параметров, и никакие изменения этих копий не возвращаются в вызывающую программу.Второй способ называют «передачей параметров по ссылке». При использованииэтого метода в подпрограмму передаются адреса фактических параметров, соответственно, все изменения этих параметров в подпрограмме происходят с переменными основнойпрограммы. По умолчанию в языках Си и С++ применяется передача по значению.Если подпрограмма меняет передаваемое значение, и это измененное значение надовернуть в вызывающую программу, то используют один из двух способов:а) в качестве параметра применяют указатель и при вызове передают адрес;б) в качестве параметра применяют ссылку и при вызове просто указывают имя параметра.В обоих вариантах подпрограмма получает копию адреса, по которому надо записатьвозвращаемое значение.
Например:а) возврат значения с использованием параметров-указателей:описание функции: void prog(int a,int *b){*b=a;}вызов функции:prog(c,&d);б) возврат значения с использованием параметров-ссылок:описание функции: void prog(int a, int &b){b=a;}вызов функции:prog(c,d);Если наоборот надо запретить изменение параметра, переданного адресом, то егообъявляют с описателем const, например:int prog2(const int *a) {…}Оглавление864.1.1 Классы памяти переменныхВ С++ переменные могут быть объявлены как вне, так и внутри функций.
При этомкаждой переменной присваивается класс памяти.Класс памяти определяет:• часть памяти программы, в которой размещается переменная (сегмент данныхили сегмент стека);• область действия, т.е. доступность переменной из функций;• время жизни переменной, т.е. как долго она хранится в памяти.Различают пять классов памяти:1. Внешние переменные (описатель extern). Размещение – глобальная памятьпрограммы (сегмент данных), область действия – все файлы все функции программы, в которой она определена, время жизни – с момента вызова программы и до возврата управления операционной системы.По умолчанию, если переменная описана вне функции, то она – внешняя, т.е. внешние переменные вне функций, можно объявлять без описателя extern, например:int a;// внешняя переменная (по умолчанию)int main(){extern int a;…}// внешняя переменная}// внешняя переменнаяabc(){extern int a;…В примере все три объявления относятся к одной и той же переменной, которая объявлена трижды.2.
Автоматические переменные (описатель auto). Размещение – локальная память(сегмент стека программы), область действия – внутри функции или оператора, где онаопределена, время жизни – с момента вызова функции и до момента возврата управления.Если функция, содержащая автоматические переменные, вызывает другую функцию,то вызванная функция имеет доступ к автоматическим переменным вызвавшей ее функции, но не наоборот.Исключением является случай, когда автоматическая переменная вызываемой подпрограммы имеет то же имя, что и внешняя переменная или автоматическая переменнаявызывающей подпрограммы. Если такое происходит, то автоматическая переменная вызываемой подпрограммы «перекрывает» доступ к другим переменным с тем же именем.