Цель работы: ознакомиться с особенностями применения функций в языке Си++, с понятием прототипа и областью его применения, с понятием автоматических внешних, статических и регистровых переменных и их применением при составлении программ с использованием функций. 1. Теоретические сведения Функции Программы на языке СИ обычно состоят из большого числа отдельных функций (подпрограмм). Как правило, они имеют небольшие размеры и могут находиться как в одном, так и в нескольких файлах. Связь между функциями осуществляется через аргументы, возвращаемые значения и внешние переменные. Вызов функции осуществляется следующим образом: (параметр 1, параметр 2 , …); Если функция имеет переменное число параметров, то вместо последнего из них указывается многоточие. Передача одного значения из вызванной функции в вызвавшую происходит с помощью оператора возврата, который записывается в следующем виде: return (выражение); В этом случае значение выражения (в частном случае может быть просто переменная) передается в основную программу и подставляется вместо обращения к функции. Пусть вызывающая программа обращается к функции следующим образом:
a=fun(b,c); Здесь b и c – аргументы, значения которых передаются в вызываемую подпрограмму. Если описание функции начинается так: fun(i,j) , то переменные i и j получат значения a и b соответственно. Пример 1. Оформить получение абсолютной величины числа в виде функции. Сама функция может быть оформлена в виде отдельного файла. В этом случае выполняется его включение процедурой #include. Программа имеет следующий вид: #include main() {int a=10,b=0,c=-20; int d,e,f; d=abs(a); /*обращение к функции abs*/ b=abs(b); f=abs(c); printf("%d %d %d",d,b,f); } #include "abc.c" /*включениефайла abc.c сфункцией abs*/ /*Функция, вычисляющая абсолютную величину числа */ abs(x) int x; /*Описание переменных, работающих в функции */ {int y; y=(x<0)?–x:x; /*Определение абсолютной величины числа*/ return (y); /*Возвращает значение у вызывающей программе*/ }
В приведенной программе описание типа функции было опущено. Это возможно только в том случае, если возвращенное значение имеет целый тип. Во всех остальных случаях описание типа функции обязательно. приведем пример, когда результатом работы функции будет число двойной точности. Пример 2. Оформить в виде функции вычисление f=Öx + y/z. В первом примере функция хранилась в виде отдельного файла и включалась процедурой #include. Функция может быть включена в один файл с вызывающей программой. В этом случае процедура #include не требуется, а сама функция должна быть объявлена в основной программе, если она имеет не целый тип. Приведем программу для примера 2, оформленную таким способом. Программа имеет вид: #include main() { double f,x=5.5,y=10.1,z=20.5, vv() /*объявлены переменные и функция vv*/ f=vv(x,y,z); /*обращение к функции vv*/ printf("lf",f); /*вывод результата */ } /*функция */ double vv(x,y,z) double x,y,z; /*объявление переменных функции */ {double f; f=sqrt(x)+y/z; /*вычисление значения функции */ return(f); /*возврат вычисленного значения функции */ }
В языке СИ аргументы функции передаются по значению, т.е. вызванная функция получает временную копию каждого аргумента, а не его адрес. Это означает, что функция не может изменять оригинальный аргумент в вызвавшей ее программе. Однако это легко сделать, если передавать в функцию не переменные, а их адреса. Пример 3. В приведенной ниже программе вводятся некоторые значения переменных а и b, потом в функции izm они меняются местами. #include main() {int a,b; scanf ("%d %d", &a, &b); izm (&a, &b); /*обращение к функции izm; аргументами являются адреса переменных a и b*/ printf("%d, %d",a, b); /*вывод на экран измененных значений */ } #include "izm.c" /*включение файла izm.c с функцией izm */ /*функция*/ izm(a, d); /*аргументы a и b являются указателями */ int *a, *b; /* *a и *b – значения, на которые указывают указатели */ {int c; c=*a; *a = *b; *b=c; /*обменместами */ } Функция izm получает копию адресов переменных a и b, меняет местами значения, записанные по этим адресам, и передает управление в основную программу. Адреса &a и &b в основной программе не изменялись, а вот значения, на которые они указывают, поменялись местами. Если в качестве аргумента функции используется имя массива, то ей передается адрес начала массива, а сами элементы не копируются. Функция может изменять элементы массива, сдвигаясь (индексированием) от его начала. Пример 4. В массиве S поменять местами элементы: первый со вторым, третий с четвертым и т.д. Оформить этот алгоритм в виде функции reverse. #include main() {int i,j,s[6]; /* описание переменных i,j и массива s целого типа */ for (i=0; i<6; i++) scanf("%d",&s[i]); /*вводэлементовмассива s*/ reverse(s); /*обращениекфункции reverse*/ for (i=0; i<6; i++) printf("%d",s[i]); /*вывод полученного массива */ } include "reverse.c" /*включениефайла reverse.c сфункцией reverse */ /*функция*/ reverse(s) int s[]; /*описание работающего в подпрограмме массива */ { int a,i; for (i=1; i<5; i+=2) {a=s[i]; s[i]=s[i+1]; s[i+1]=a;} /*обменэлементовместами*/ } Рассмотрим особенности работы функции с двумерным массивом. В предыдущем примере в функции массив был описан как int s[]; для двумерного массива а нельзя записать a[][]. В описании двумерного массива во второй квадратной скобке должно быть указано количество столбцов, например: a[][3]. Пример 5. Увеличить все элементы массива а(5,5) в два раза. Оформить этот алгоритм в виде подпрограммы. #include main() {int a[5][5]; /*описаниемассива a*/ int i,j; /*объявление переменных i,j*/ for (i=0;i<5;i++) for (j=0; j<5; j++) scanf("%d",a[i][j]); /*вводмассива*/ mas(a); /*обращение к функции mas*/ for (i=0; i<5; i++) for (j=0; j<5; j++) printf("%d", a[i][j]); /*вывод полученного результата*/ } /*функция*/ mas(a) int a[][5]; /*описание массива а*/ {int i,j; /*описание переменных i,j*/ for (i=0; i<5; i++) for (j=0; j<5; j++) a[i][j] = 2*a[i][j]; /*увеличение элементов массива в 2 раза*/ } Классы памяти В языке СИ различают четыре основных памяти: внешнюю (глобальную), автоматическую (локальную), статическую и регистровую.
Внешние переменные определены вне любой из функций, следовательно, доступны для многих из них. Область внешней переменной простирается от точки во входном файле, где она объявлена, и до конца файла. Если внешняя переменная определена в другом файле, то вступает в силу описание extern (внешний). На рис.1 показано, где объявляются и на что распространяется область действия внешних переменных, если программа main и вызываемая функция находятся в данном файле. На рис. 2 демонстрируются отличия, имеющие место, когда main и вызываемая функция находятся в разных файлах. В файле с вызываемой функцией внешние переменные будут доступны после их описания с помощью ключевого слова extern.
Рефераты по информатикеЦель работы: ознакомиться с особенностями применения функций в языке Си++, с понятием прототипа и областью его применения, с понятием автоматических
Оценок: 348 (Средняя 5 из 5)
Одними из наиболее популярных услуг на рынке IT-технологий являются создание и продвижение лендингов. Они способны положительно влиять на деятельность любого бизнес-проекта в интернете. Судя по многочисленным отзывам, заказавшие создание лендингов люди ни разу не пожалели о потраченных деньгах. Они вложили в будущее, которое неразрывно связано с интернетом. Всё больше и больше предпринимателей обращаются к услугам разных агентств, веб-студий, чтобы заказать создание лендинга у профессионалов.