Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Аргументы и параметры функции





Оглавление

Занятие 6. Функции. 3

Прототип функции. 3

Определение функции. 4

Аргументы и параметры функции. 5

Функции с переменным числом параметров. 5

Рекурсивные функции. 6

Математические функции. 6

Передача массивов как параметров. 9

Передача многомерных массивов как параметров. 11

Использование указателей при работе с функциями. 12

Перегрузка функций. 14

Занятие 7. Коллоквиум. 15

Занятие 8. Строки. 16

Указатели и строки. 16

Функции ввода, вывода строк. 17

Стандартные функции обработки строк. 18

Занятие 9. Директивы препроцессора. 23

Директива #include. 23

Директива #define. 23

Директивы условной компиляции #if, #elif, #else и #endif. 24

Директива #undef. 26

Макроопределения с параметрами. 26

Занятие 10. 29

Занятие 11. 29

Занятие 12. 29

 


Занятие 6. Функции.

В отличии от других языков, где есть различие между подпрограммами, процедурами и функциями, в С++ и его предшественнике – языке С – используются только функции.

Функция – это блок программы, который выполняет одно или несколько действий. Каждая программа С++ имеет по крайней мере одну функцию - main(), которая при запуске программы вызывается автоматически. Функция main() может вызывать другие функции, те, в свою очередь, могут вызывать следующие, и т.д. Функция может принимать параметры и возвращать значение. Функция начинает выполняться в момент вызова. Поэтому до момента вызова функция должна быть сначала объявлена, а потом определена. Различают два вида функций: стандартные и программируемые пользователем.

Прототип функции

Объявление или прототип функции задает ее имя, тип возвращаемого значения и список формальных параметров (наличие параметров необязятельно):

тип_функции имя_функции(список_формальных_параметров);

Здесь, тип_функции – тип возвращаемого функцией значения, в том числе void, если функция никакого значения не возвращает. Если он явно не указан, то по умолчанию устанавливается тип возврата int.

Список формальных параметров представляет собой список имен всех параметров и их типов, разделенных запятыми. Однако в прототипе функции указывать имена формальных параметров не обязательно, достаточно указать тип.

Прототипы стандартных функций уже записаны в файлы заголовков (*.h), включаемых в программу с помощью директивы #include. Строка прототипа всегда оканчивается точкой с запятой.

Примеры прототипов функций.

double Summer(double a, double b, double c);

//возвращает значение типа double, имеет три параметра типа double

 

int Max(int, int);

// возвращает значение типа int, имеет два параметра

 

void printm(int a);

// возвращает значение типа void, имеет один параметр

 

int run();

// возвращает значение типа int, не имеет параметров

 

jump();

// возвращает значение типа int, не имеет параметров

Определение функции

Определение функции состоит из заголовка функции и ее тела. Заголовок подобен прототипу за исключением того, что параметры в данном случае именованные и в конце заголовка отсутствует точка с запятой, а тело функции представляет собой последовательность операторов и описаний в фигурных скобках:

тип_функции имя_функции(список_формальных_параметров)

{

тело_функции;

}

Определение функции должно соответствовать своему прототипу по типу возвращаемого значения и списку параметров. Все выражения внутри тела функции должны оканчиваться точкой с запятой. Имена параметров в прототипе не обязательно должны совпадать с именами параметров в определении. Возврат из функции в вызвавшую ее функцию реализуется оператором

return выражение;

Функция может содержать несколько операторов return или не содержать ни одного (это определяется потребностями алгоритма). Если функция описана как void, а наличие оператора return диктуется потребностями алгоритма, то выражение не указывается. После выполнения оператора return программа немедленно переходит к строке, следующей после вызова функции, и любые операторы, стоящие в теле функции после ключевого слова return, не выполняются.

Примеры определений функций.

double Summer(double a1, double a2, double a3)

{

return a1+a2+a3;

}

 

void printm(int a)

{

if (a==1) puts(“Hello!”);

else puts(“I’m confused.\n”);

}

Аргументы и параметры функции

Механизм параметров является основным способом обмена информацией между вызываемой и вызывающей функциями. Параметр описывает тип значения, которое будет передано функции при ее вызове. Фактические значения, передаваемые в функцию, называются аргументами. Аргументом функции может быть любое выражение C++, включающее константы, математические и логические выражения и другие функции, которые возвращают некоторое значение. При вызове функции первым делом вычисляются значения аргументов, затем выделяется память под параметры в соответствии с их описанием, и каждому из них присваивается значение соответствующего аргумента. При этом проверяется соответствие типов и при необходимости выполняются их преобразования. При несоответствии типов выдается диагностическое сообщение.

Примеры вызова функций

double a; a=Summer(3.5, 1.8, -6.95);

printm(0);

Функции с переменным числом параметров

В языке С++ допустимы функции, количество параметров у которых при компиляции не определено. Функция с переменным числом параметров имеет следующий формат прототипа:

тип имя_функции (список_параметров, …);

К сожалению, волшебство в программировании мало распространено, и поэтому каждая функция с переменным списком параметров должна иметь механизм определения итогового их количества. Для этого, обычно, один из явных параметров функции служит значением числа реальных фактических параметров. Приведем пример функции, вычисляющей сумму переданных ей параметров.

# include <stdio.h>

int summ(int k,...);

 

void main()

{

printf("1+2+3+4+5 = %d\n", summ(5, 1, 2, 3, 4, 5));

printf("6+5 = %d\n", summ(2, 6, 5));

printf("4+3+9 = %d\n", summ(3, 4, 3, 9));

}

int summ(int k,...)

{

int *p = &k;

int s = 0;

for (int i = 0; i<k; i++)

s += *(++p);

return s;

}

Фактические параметры хранятся в памяти в соседних ячейках, поэтому объявлен

Рекурсивные функции

В С++ имеется возможность вызова функции из самой себя. Классический пример: функция вычисления факториала.

int fact(int k)

{

if (k == 0)

return 1;

else

return k*fact(k-1);

}

Математические функции

С++ унаследовал из С стандартные математические функции, описание которых находится в заголовочном файле <math.h>. Они позволяют получить абсолютное значение (abs, fabs), квадратный корень (sqrt), степень (pow), значения тригонометрических функций (sin, cos, tan). Их прототипы:

int abs(int x); double fabs(double x);

double sqrt(double x);

double pow(double x, double y); (вычисляет значение x в степени y)

double sin(doublex); double cos(double x); double tan(double x);

Пример 1. Ввести с клавиатуры два целых числа, вычислить их произведение, вывести на экран результат. Вычисление произведения оформить в виде функции.

#include <stdio.h>

int main()

{

int x, y, z;

int Product(int a, int b); // Прототип функции Product

printf(“Введите через пробел два целых числа: “);

scanf(“ %d %d”,&x, &y);

z= Product(x,y); // Вызов функции Product

printf(“%d*%d=%d\n”,x,y,z);

return 0;

}

int Product(int a, int b) // Определение функции Product

{

return a*b;

}

Пример 2. Ввести с клавиатуры размерность одномерного массива. С помощью датчика случайных чисел задать значения его элементов. Написать функцию, меняющую порядок следования элементов на противоположный (первый элемент становится последним).

#include <stdio.h>

#include <stdlib.h> // В stdlib.h содержится описание датчика случайных чисел

// int random(int n) – возвращает целое число между 0 и n-1

int main()

{

int n, i; // Размерность массива задается именованной константой n

float *pa;

void move(int, float*); // Прототип функции

printf(“n=”);

scanf(“%d”, &n);

pa = new float[n];

randomize(); // Подготовка к работе датчика случайных чисел:

// randomize() инициализирует датчик случайных чисел

for (i=0; i<n; i++)

{

*(pa+i)=(random(500)-1000)/500.0; // Число в диапозоне от –1 до 1

printf(“ *(pa+%d)=%f”, i, *(pa+i));

}

printf(“\n”);

move(n, pa);

for (i=0; i<n; i++)

printf(“ *(pa+%d)=%f”, i, *(pa+i));

return 0;

}

void move(int n, float*pa)

{

int i; float s[1000];

for (i=0; i<n; i++) s[i]= *(pa+n-1-i);

for (i=0; i<n; i++) *(pa+i)=s[i];

}

Пример 3. Описать структуру типа PRICE, содержащую следующие поля:

tovar – название товара;

mag - название магазина;

stoim – стоимость товара в рублях.

Ввести с клавиатуры данные в структуру типа Price_List. Вывести на экран содержимое полей структуры. Вывод информации оформить в виде функции.

#include <stdio.h>

struct Price_List{

char mag[50];

char tovar[50];

float stoim;

} price;

int main()

{

void print_struct(Price_List);

puts(“Введите название магазина (<50 символов)”);

gets(price.mag);

puts(“Введите название товара (<50 символов)”);

gets(price.tovar);

puts(“Введите стоимость товара”);

scanf(“%f”,&price.stoim);

print_struct(price);

return 0;

}

void print_struct(Price_List p)

{

puts(“Печать элементов структуры типа Price_List”);

puts(p.mag);

puts(p.tovar);

printf(“Стоимость %f рублей\n”,p.stoim);

}

Пример 4. Ввести с клавиатуры числа типа int и float, найти их абсолютные величины. Вычисление абсолютной величины оформить в виде функции. Использовать перегрузку функций.

#include <stdio.h>

int ABS(int); // Прототипы функций ABS

float ABS(float);

int main()

{

int i; float a;

printf(“Введите целое число: “); scanf(“ %d”,&i);

printf(“Введите вещественное число: “); scanf(“ %f”,&a);

printf(“abs(%d)=%d; abs(%f)=%f \n”,i,ABS(i),a,ABS(a));

return 0;

}

int ABS(int a) // Определение функции int ABS()

{

if (a>=0) return a;

else return –a;

}

float ABS(float a) // Определение функции float ABS()

{

if (a>=0.) return a;

else return –a;

}

Перегрузка функций

В языке С++ предусмотрена возможность создания нескольких функций с одинаковым именем. Это называется перегрузкой функций. Перегруженные функции должны отличаться друг от друга списками параметров, либо различным количеством параметров, либо и тем и другим одновременно.

Пример перегрузки функции.

int myFunction(int,int);

int myFunction(long,long);

int myFunction(long);

Функция myFunction() перегружена с тремя разными списками параметров. Первая и вторая версии отличаются типами параметров, а третья – их количеством. Типы возвращаемых значений перегруженных функций могут быть одинаковыми или разными. При создании двух функций с одинаковым именем и одинаковым списком параметров, но с различными типами возвращаемых значений, будет диагностирована ошибка компиляции. При этом никакой путаницы при вызове функции не будет, поскольку нужная функция определяется по совпадению используемых параметров. Это позволяет создать функцию, которая сможет, например, усреднять целочисленные значения, значения типа double, или значения других типов без необходимости создавать отдельные имена для каждой функции. При вызове перегруженной функции компилятор автоматически определит, какой именно вариант функции следует использовать.


Занятие 7. Коллоквиум.

Готовьтесь к коллоквиуму! Удачи!


Занятие 8. Строки

Указатели и строки

При работе со строками часто используются указатели. Cтрока представляет собой массив символов, заканчивающийся нуль-символом (‘\0’). По положению нуль-символа определяется фактическая длина строки.

Пример, иллюстрирующий применение указателей в работе со строками.

Инициализировать строку, объявить два указателя на строки, инициализировать один из них адресом заданной строки, присвоить значение первого указателя второму. Напечатать строку, на которую указывают оба указателя, и их значения. Напечатать первый и седьмой символ строки.

#include <stdio.h>

#define PRNT(X) printf(“X=%s; &X=%p\n”, X, &X)

int main()

{

char *text=”Не делай глупостей”, *copy;

copy=text; /* Указатель copy теперь указывает на ту же строку */

printf(“%s\n”, copy);

/* Cтрока – это массив символов, copy – указатель на первый символ массива */

/* Печать первого символа строки (форматная спецификация %с) */

printf(“Первый символ строки: %c \n”, * copy);

/* Печать седьмого символа строки, copy+6 – указатель на седьмой символ */

printf(“Седьмой символ строки: %c \n”, *(copy+6));

PRNT(text);

PRNT(copy);

}

Пояснения.

В программе строка text инициализируется строковой константой ”Не делай глупостей”. Так как любая строка – это массив символов с замыкающим нуль-символом, то можно было бы инициализировать ее и как символьный массив с нуль-символом (‘\0’) в конце:

сhar *text={‘Н’,’е’,’ ‘,’д’,’е’,’л’,’а’,’й’,’,’г’,’л’,’у’,’п’,’о’,’с’,’т’,’е’,’й’,’\0’};

Правда, такой метод инициализации утомителен и чреват ошибками. Без замыкающего нуль-символа мы получаем массив символов, а не строку, и не можем использовать функции работы со строками.

Функции ввода, вывода строк

1. Функции ввода строки gets() и scanf()

Чтобы ввести строку символов, необходимо сначала в программе зарезервировать память под вводимую строку. Это проще всего сделать, явно задав размер символьного массива (например, char array[81]). Функция gets(char *) читает вводимые с клавиатуры символы до тех пор, пока не встретит символ новой строки (‘\n’), который создается при нажатии клавиши [ввод]. Функция берет все символы до (но не включая) символа новой строки, присоединяет к ним нуль-символ (‘\0’) и возвращает указатель на введенную строку вызывающей программе.

Пример использования функции gets() для ввода строки.

Ввести строку символов, вывести ее на экран, вывести пятый символ строки. Для доступа к символам строки использовать указатели.

#include <stdio.h>

int main()

{

char text[81], *ptext;

printf(“Введите строку символов (<=10)”);

ptext=gets(text);

printf(“%s \n %s \n”, text, ptext);

printf(“%c \n %c \n”, text[5],*(ptext+5));

}

Для функции scanf() строка начинается с первого непустого введенного символа. Если строка вводится по формату %s, то строка продолжается до (но не включая) следующего пустого символа (пробел, табуляция, новая строка). Функция scanf() возвращает целое значение, равное числу считанных по форматной спецификации %s строк, если ввод прошел успешно.

Пример использования функции scanf() для ввода строки.

Ввести 2 строки символов, вывести их на экран.

#include <stdio.h>

int main()

{

char text1[81], text2[81];

int number;

printf(“Введите 2 строки символов (<=10) через пробел ”);

number=scanf(“%s %s”,text1, text2);

printf(“Функция scanf() считала %d строки: “ %s” и “%s” \n”,

number, text1, text2);

}

2. Функции вывода строк puts() и printf().

Функция puts(char *) очень простая, у нее только один аргумент – указатель на строку. Функция выводит на экран все символы строки, пока ей не встретится нуль-символ. Если с помощью этой функции попытаться вывести на экран массив символов без завершающего нуль-символа, то функция станет перебирать все ячейки памяти, чтобы найти его и остановить свою работу. Хорошо, если найдет. Иначе ей придется работать вечно. Любая строка, выводимая с помощью функции puts(), печатается с новой строки. В вызывающую программу puts() возвращает неотрицательное число.

Пример использования функции puts() для вывода строки.

#include <stdio.h>

int main()

{

char text1[]=”Массив инициализирован этой строкой.”;

char *ptext2=”Указатель инициализирован этой строкой.”;

puts(“Любая строка легко печатается с помощью puts().”);

puts(text1); puts(ptext2);

puts(ptext2+3); // Печать строки начнется не с первого символа, а с четвертого

puts(&text1[4]); // Печать строки начнется с пятого символа

}

Функция printf() менее удобна, чем puts(), но более гибка. Она тоже использует указатель строки в качестве аргумента, но не выводит автоматически каждую строку текста с новой строки. Зато printf() легко объединяет строки для печати в одну строку. В вызывающую программу printf() возвращает число байт выводимой на экран информации.

Директива #include

Директива

#include <имя_файла>

вставляет содержимое указанного файла в ту точку исходного файла, где она записана. Если имя файла указано в угловых скобках, то поиск указанного файла осуществляется в стандартных каталогах для включаемых файлов, если вместо угловых скобок используются кавычки (“ “), то в этом случае поиск файла ведется в каталоге, содержащем исходный файл, а затем уже в стандартных каталогах. Заголовочные файлы обычно имеют расширение.h и содержат объявления и определения типов, констант, встроенных функций, шаблонов, комментарии и директивы препроцессора.

Директива #define

Команда #define определяет подстановку в текст программы

#define текстовое_имя текст_подстановки

В тексте исходного файла, следующем за директивой #define, все вхождения текстового_имени заменяются на текст_подстановки. Если текст_подстановки занимает больше, чем одну строку, то его можно продолжить на следующей строке, помещая символ обратной дробной черты перед символом “новая строка”. Текст_подстановки может быть опущен. В этом случае удаляются все вхождения текстового_имени из текста программы. Тем не менее, текстовое_имя считается определенным и принимает значение 1, если проверяется директивой препроцессора #if. Текстовое_имя рекомендуется записывать прописными буквами, чтобы зрительно отличать их от имен переменных и функций. Определение символических констант с помощью директив #define полезно, когда нужно ввести короткое имя для длинной константы, или определить константы, которые могут поменяться в процессе эксплуатации программы.

Примеры.

1) #define PI 3.1415926

#define BIG 512 // лексема BIG в любом месте программы будет заменена строкой 512 int myArray[BIG];

#define VASIA “Василий Иванович”

#define MAX // Текст МАX удаляется из исходного текста программы

Директива #undef

Директива

#undef текстовое_имя

удаляет самое последнее определение текстового имени. Следовательно, все последующие вхождения текстового имени будут игнорироваться препроцессором. Используется редко, например, для управления условной компиляцией исходной программы совместно с директивой #if или совместно с директивой #define.

Примеры использования директивы #undef

#define SIZE 200 // Определение SIZE

int array1[SIZE];

текст программы

#undef SIZE // Отмена определения SIZE

#define SIZE 20 // Новое определение SIZE

int array2[SIZE];

#define BIG 3

#define HUGE 10

#undef BIG // BIG теперь не определен

#define HUGE 20 // HUGE теперь переопределен как 20

#undef HUGE // HUGE снова равен 10

#undef HUGE // HUGE не определен

Занятие 10.

Вопросы к экзамену будут выданы преподавателем на занятии.

Занятие 11.

Готовьтесь к экзамену! Удачи!

Занятие 12.

Постарайтесь сдать экзамен с первого раза!

Оглавление

Занятие 6. Функции. 3

Прототип функции. 3

Определение функции. 4

Аргументы и параметры функции. 5

Функции с переменным числом параметров. 5

Рекурсивные функции. 6

Математические функции. 6

Передача массивов как параметров. 9

Передача многомерных массивов как параметров. 11

Использование указателей при работе с функциями. 12

Перегрузка функций. 14

Занятие 7. Коллоквиум. 15

Занятие 8. Строки. 16

Указатели и строки. 16

Функции ввода, вывода строк. 17

Стандартные функции обработки строк. 18

Занятие 9. Директивы препроцессора. 23

Директива #include. 23

Директива #define. 23

Директивы условной компиляции #if, #elif, #else и #endif. 24

Директива #undef. 26

Макроопределения с параметрами. 26

Занятие 10. 29

Занятие 11. 29

Занятие 12. 29

 


Занятие 6. Функции.

В отличии от других языков, где есть различие между подпрограммами, процедурами и функциями, в С++ и его предшественнике – языке С – используются только функции.

Функция – это блок программы, который выполняет одно или несколько действий. Каждая программа С++ имеет по крайней мере одну функцию - main(), которая при запуске программы вызывается автоматически. Функция main() может вызывать другие функции, те, в свою очередь, могут вызывать следующие, и т.д. Функция может принимать параметры и возвращать значение. Функция начинает выполняться в момент вызова. Поэтому до момента вызова функция должна быть сначала объявлена, а потом определена. Различают два вида функций: стандартные и программируемые пользователем.

Прототип функции

Объявление или прототип функции задает ее имя, тип возвращаемого значения и список формальных параметров (наличие параметров необязятельно):

тип_функции имя_функции(список_формальных_параметров);

Здесь, тип_функции – тип возвращаемого функцией значения, в том числе void, если функция никакого значения не возвращает. Если он явно не указан, то по умолчанию устанавливается тип возврата int.

Список формальных параметров представляет собой список имен всех параметров и их типов, разделенных запятыми. Однако в прототипе функции указывать имена формальных параметров не обязательно, достаточно указать тип.

Прототипы стандартных функций уже записаны в файлы заголовков (*.h), включаемых в программу с помощью директивы #include. Строка прототипа всегда оканчивается точкой с запятой.

Примеры прототипов функций.

double Summer(double a, double b, double c);

//возвращает значение типа double, имеет три параметра типа double

 

int Max(int, int);

// возвращает значение типа int, имеет два параметра

 

void printm(int a);

// возвращает значение типа void, имеет один параметр

 

int run();

// возвращает значение типа int, не имеет параметров

 

jump();

// возвращает значение типа int, не имеет параметров

Определение функции

Определение функции состоит из заголовка функции и ее тела. Заголовок подобен прототипу за исключением того, что параметры в данном случае именованные и в конце заголовка отсутствует точка с запятой, а тело функции представляет собой последовательность операторов и описаний в фигурных скобках:

тип_функции имя_функции(список_формальных_параметров)

{

тело_функции;

}

Определение функции должно соответствовать своему прототипу по типу возвращаемого значения и списку параметров. Все выражения внутри тела функции должны оканчиваться точкой с запятой. Имена параметров в прототипе не обязательно должны совпадать с именами параметров в определении. Возврат из функции в вызвавшую ее функцию реализуется оператором

return выражение;

Функция может содержать несколько операторов return или не содержать ни одного (это определяется потребностями алгоритма). Если функция описана как void, а наличие оператора return диктуется потребностями алгоритма, то выражение не указывается. После выполнения оператора return программа немедленно переходит к строке, следующей после вызова функции, и любые операторы, стоящие в теле функции после ключевого слова return, не выполняются.

Примеры определений функций.

double Summer(double a1, double a2, double a3)

{

return a1+a2+a3;

}

 

void printm(int a)

{

if (a==1) puts(“Hello!”);

else puts(“I’m confused.\n”);

}

Аргументы и параметры функции

Механизм параметров является основным способом обмена информацией между вызываемой и вызывающей функциями. Параметр описывает тип значения, которое будет передано функции при ее вызове. Фактические значения, передаваемые в функцию, называются аргументами. Аргументом функции может быть любое выражение C++, включающее константы, математические и логические выражения и другие функции, которые возвращают некоторое значение. При вызове функции первым делом вычисляются значения аргументов, затем выделяется память под параметры в соответствии с их описанием, и каждому из них присваивается значение соответствующего аргумента. При этом проверяется соответствие типов и при необходимости выполняются их преобразования. При несоответствии типов выдается диагностическое сообщение.

Примеры вызова функций

double a; a=Summer(3.5, 1.8, -6.95);

printm(0);







Конфликты в семейной жизни. Как это изменить? Редкий брак и взаимоотношения существуют без конфликтов и напряженности. Через это проходят все...

Что будет с Землей, если ось ее сместится на 6666 км? Что будет с Землей? - задался я вопросом...

Система охраняемых территорий в США Изучение особо охраняемых природных территорий(ООПТ) США представляет особый интерес по многим причинам...

Живите по правилу: МАЛО ЛИ ЧТО НА СВЕТЕ СУЩЕСТВУЕТ? Я неслучайно подчеркиваю, что место в голове ограничено, а информации вокруг много, и что ваше право...





Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2024 zdamsam.ru Размещенные материалы защищены законодательством РФ.