Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 12 лет назад пользователемwww.intuit.ru
1 1 ©Павловская Т.А. Язык С++ Курс «С++. Программирование на языке высокого уровня» Павловская Т.А.
2 2 ©Павловская Т.А. Язык С++ Лекция 4. Функции Описание и использование функций. Параметры функции. Функции стандартной библиотеки С. Директивы препроцессора. Создание программ, состоящих из нескольких модулей. Области действия имен. Именованные области.
3 ©Павловская Т.А. (СПбГУ ИТМО) 3 [ класс ] тип имя ([ список_параметров ]) [throw ( исключения )] { тело функции } Функции Класс: extern глобальная видимость во всех модулях программы (по умолчанию); static видимость только в пределах модуля, в котором определена функция. inline
4 ©Павловская Т.А. (СПбГУ ИТМО) 4 #include int sum(int a, int b);// объявление int main(){ int a = 2, b = 3, c, d; c = sum(a, b);// вызов cin >> d; cout
5 ©Павловская Т.А. (СПбГУ ИТМО) 5 #include void f(int a){ cout
6 ©Павловская Т.А. (СПбГУ ИТМО) 6 #include void f(int i, int* j, int& k); int main(){ int i = 1, j = 2, k = 3; cout
7 ©Павловская Т.А. (СПбГУ ИТМО) 7 #include int sum(const int* mas, const int n); int const n = 10; void main(){ int marks[n] = {3, 4, 5, 4, 4}; cout
8 ©Павловская Т.А. (СПбГУ ИТМО) 8... int sum(const int *a, const int nstr, const int nstb); void main(){ int b[2][2] = {{2, 2}, {4, 3}}; printf(" %d\n", sum(&b[0][0], 2, 2)); int i, j, nstr, nstb, *a; printf("Введите кол. строк и столбцов: \n"); scanf("%d%d", &nstr, &nstb); a = (int *)malloc( nstr * nstb * sizeof(int) ); for (i = 0; i
9 ©Павловская Т.А. (СПбГУ ИТМО) 9 int sum(const int *a, const int nstr, const int nstb){ int i, j, s = 0; for (i = 0; i
10 ©Павловская Т.А. (СПбГУ ИТМО) int sum(const int **a, const int nstr, const int nstb); void main(){ int nstr, nstb; cin >> nstr >> nstb; int **a; a = new int* [nstr]; for (int i = 0; i
11 ©Павловская Т.А. (СПбГУ ИТМО) 11 int sum(const int **a, const int nstr, const int nstb){ int i, j, s = 0; for (i = 0; i
12 ©Павловская Т.А. (СПбГУ ИТМО) 12 Передача имен функций в качестве параметров void f( int a ){ /*... */ } void (*pf)( int );// указатель на функцию pf = &f;// или pf = f; pf(10);// или (*pf)(10) void fun(PF pf){... pf(10);... } typedef void (*PF)(int); PF menu[]={&new, &open, &save}; menu[1](10);
13 ©Павловская Т.А. (СПбГУ ИТМО) 13 Параметры со значениями по умолчанию int f(int a, int b = 0); void f1(int, int = 100, char* = 0); void err(int errValue = errno);... f(100); f(a, 1); f1(a); f1(a, 10); f1(a, 10, "Vasia"); f1(a,,"Vasia")// неверно!
14 ©Павловская Т.А. (СПбГУ ИТМО) 14 Функции с переменным числом параметров int printf(const char*...); printf("Введите исходные данные"); printf("Сумма: %5.2f рублей", sum); printf("%d %d %d %d", a, b, c, d); Для доступа к необязательным параметрам внутри функции используются макросы библиотеки va_start, va_arg и va_end, находящиеся в заголовочном файле.
15 ©Павловская Т.А. (СПбГУ ИТМО) 15 Рекурсивные функции long fact(long n){ if (n==0 || n==1) return 1; return (n * fact(n - 1)); } Или: long fact(long n){ return (n > 1) ? n * fact(n - 1) : 1; }
16 ©Павловская Т.А. (СПбГУ ИТМО) 16 Перегрузка функций int max(int, int); char* max(char*, char*); int max (int, char*); int max (char*, int); void f(int a, int b, char* c, char* d){ cout
17 ©Павловская Т.А. (СПбГУ ИТМО) 17 Неоднозначность может появиться при: преобразовании типа; использовании параметров-ссылок; использовании аргументов по умолчанию. #include float f(float i){...} double f(double i){...} int main(){ float x = 10.09; double y = 10.09; cout
18 ©Павловская Т.А. (СПбГУ ИТМО) 18 int f(int a, int b) {…} int f(int a, int &b) {…} #include int f(int a){return a;} int f(int a, int b = 1){return a * b;} int main(){ cout
19 ©Павловская Т.А. (СПбГУ ИТМО) 19 Правила описания перегруженных функций Перегруженные функции должны находиться в одной области видимости Перегруженные функции могут иметь параметры по умолчанию, при этом значения одного и того же параметра в разных функциях должны совпадать. В различных вариантах перегруженных функций может быть различное количество параметров по умолчанию. Функции не могут быть перегружены, если описание их параметров отличается только модификатором const или использованием ссылки (например, int и const int или int и int&).
20 ©Павловская Т.А. (СПбГУ ИТМО) 20 Шаблоны функций template заголовок { /* тело функции */ } Параметры: 1.class имя 2.typename имя 3.template class имя 4.описание параметра template f(...){...}
21 ©Павловская Т.А. (СПбГУ ИТМО) 21 template void sort_vybor(Type *b, int n){ Type a; for (int i = 0; i
22 ©Павловская Т.А. (СПбГУ ИТМО) 22 #include template void sort_vybor(Type *b, int n); int main(){ const int n = 20; int b[n]; for (int i = 0; i > b[i]; sort_vybor(b, n); for (int i=0; i
23 ©Павловская Т.А. (СПбГУ ИТМО) 23 Явное задание аргументов шаблона template void f(Y, Z); void g(){ f ("Vasia", 3.0); // Z определяется как double f ("Vasia", 3.0); // Y определяется как char*, а Z определяется как double // f("Vasia", 3.0); ошибка: X определить невозможно }
24 ©Павловская Т.А. (СПбГУ ИТМО) 24 class T { /*... */ }; int i; template void f(T t) { T t1 = i; // template-parameters T and i ::T t2 = ::i; //global namespace members T and i } integral or enumeration type, pointer to object or pointer to function, reference to object or reference to function Описание параметра может быть: Шаблоны функций - описание параметра (4) template void f(){... }
25 ©Павловская Т.А. (СПбГУ ИТМО) 25 template void f1(int a[10][i]); template void f2(int a[i][20]); template void f3(int (&a)[i][20]); void g() { int v[10][20]; f1(v); // OK: i deduced to be 20 f1 (v); // OK f2 (v); // OK f3(v); // OK: i deduced to be 10 } Примеры параметра
26 ©Павловская Т.А. (СПбГУ ИТМО) 26 Специализация шаблона функции void sort_vibor (int *b, int n) { тело специализированного метода }
27 ©Павловская Т.А. (СПбГУ ИТМО) 27 Функция main() // без параметров: тип main(){... } // с двумя параметрами: тип main(int argc, char* argv[]){... } #include void main(int argc, char* argv[]){ for (int i = 0; i
28 ©Павловская Т.А. (СПбГУ ИТМО) 28 Функции стандартной библиотеки Функции ввода/вывода или. mode: (b/t) и "r" файл открывается для чтения; "w" открывается пустой файл для записи (если файл существует, он стирается); "a" файл открывается для добавления информации в его конец; "r+" файл открывается для чтения и записи (файл должен существовать); "w+" открывается пустой файл для чтения и записи (если файл существует, он стирается); "a+" файл открывается для чтения и добавления информации в его конец FILE* fopen(const char* filename, const char* mode); FILE *f = fopen("d:\\cpp\\data.txt", "rb+");
29 ©Павловская Т.А. (СПбГУ ИТМО) 29 стандартный ввод stdin стандартный вывод stdout стандартный вывод сообщений об ошибках stderr стандартный дополнительный поток stdaux стандартная печать stdprn Предопределенные потоки
30 ©Павловская Т.А. (СПбГУ ИТМО) 30 Чтение и запись потока байтов fread, fwrite. Чтение символа из потока getc, fgetc, из стандартного потока stdin getchar. Запись символа в поток putc, fputc, в стандартный поток stdout putchar. Чтение строки из потока fgets, из стандартного потока stdin gets. Запись строки в поток fputs, в стандартный поток stdout puts. Форматированный ввод из потока fscanf, из стандартного потока stdin scanf, из строки sscanf. Форматированный вывод в поток fprintf, в стандартный поток stdout printf, в строку sprintf. int fclose(FILE*); int feof(FILE*); int ferror(FILE*); Функции ввода/вывода
31 ©Павловская Т.А. (СПбГУ ИТМО) 31 #include int main(){ FILE *fi, *fo; if((fi = fopen("d:\\c\\file.txt", "r")) == 0){ cout
32 ©Павловская Т.А. (СПбГУ ИТМО) 32 struct{ chartype[20]; intopt, rozn; charcomm[40]; }mon; while (fgets(s, dl, fi)){ // Преобразование строки в структуру: strncpy(mon.type, s, 19); mon.opt = atoi(&s[20]); mon.rozn = atoi(&s[25]); strncpy(mon.comm, &s[30], 40); fwrite(&mon, sizeof mon, 1, fo); } fclose(fi); Работа с файлами - пример 1
33 ©Павловская Т.А. (СПбГУ ИТМО) 33 int i; cin >> i;// Номер записи fseek(fo, (sizeof mon)*i, SEEK_SET); fread(&mon, sizeof mon, 1, fo); cout
34 ©Павловская Т.А. (СПбГУ ИТМО) 34 isalnum isalfa iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit double atof(const char* p) int atoi(const char* p) long atol(const char* p) копирование строк ( strcpy, strncpy ) сравнение ( strcmp, strncmp ), объединение строк ( strcat, strncat ) поиск подстроки ( strstr ) поиск вхождения символа ( strchr, strrchr, strpbrk ) определение длины строки ( strlen ) и другие. Другие функции библиотеки Математические
35 ©Павловская Т.А. (СПбГУ ИТМО) 35 #include int main(){ char s[] = "2, 38.5, 70, 0, 0, 1", *p = s; float m[10]; int i = 0; do{ m[i++] = atof(p); if (i>9) break; }while(p = strchr(p, ','), p++); for( int k = 0; k 9) break; }while(p = strchr(p, ','), p++); for( int k = 0; k">
36 ©Павловская Т.А. (СПбГУ ИТМО) 36 Директивы препроцессора Директива #include: #include Заголовочные файлы могут содержать: определения типов, констант, встроенных функций, шаблонов, перечислений; объявления функций, данных, имен, шаблонов; пространства имен; директивы препроцессора; комментарии. В заголовочном файле не должно быть определений функций и данных.
37 ©Павловская Т.А. (СПбГУ ИТМО) 37 // my_header.h extern int a; extern double b; // // one.cpp #include "my_header.h" int a; // // two.cpp #include "my_header.h" double b; Внешние объявления Чтобы сделать доступной в нескольких модулях переменную или константу, необходимо: - определить ее ровно в одном модуле как глобальную; - объявить ее как внешнюю с помощью модификатора extern. Поместить это объявление либо в нужные модули, либо в заголовочный файл, который включить в нужные модули. Все объявления одной переменной должны быть согласованы
38 ©Павловская Т.А. (СПбГУ ИТМО) 38 используется для определения: символических констант : #define имя текст_подстановки макросов: #define имя( параметры ) текст_подстановки символов, управляющих условной компиляцией: #define имя Директива #define #define M 1000 #define Vasia Василий Иванович #define MAX(x,y) ((x)>(y)?(x):(y)) Практически каждый макрос свидетельствует о недостатке в языке, программе или программисте
39 ©Павловская Т.А. (СПбГУ ИТМО) 39 #define N(a,b) a##b/*склеить */ … int N(bam,buk)(); /* => int bambuk(); */ Альтернативы макросам в С++: const, inline, template, namespace #undef имя
40 ©Павловская Т.А. (СПбГУ ИТМО) 40 Директивы условной компиляции: #if -- #endif Назначение: - исключить компиляцию отдельных частей программы - временно закомментировать фрагменты кода #if конст_выражение... [ #elif конст_выражение...] [ #elif конст_выражение...] [ #else ] #endif #if OPT == 2 #include hdr2.h #elif OPT == 1 #include hdr1.h #elif #include #endif
41 ©Павловская Т.А. (СПбГУ ИТМО) 41 #if defined(__BORLANDC__) && __BORLANDC__ == 0x530 // Tested with BC5.3: typedef istream_iterator, ptrdiff_t> istream_iter; #elif defined(__BORLAND__) // Tested with BC5.2: typedef istream_iterator istream_iter; #else // Tested with VC5.0: typedef istream_iterator istream_iter; #endif #if 0 int i, j; double x, y; #endif Директивы условной компиляции: пример
42 ©Павловская Т.А. (СПбГУ ИТМО) 42 #ifdef символ // Расположенный ниже код компилируется, если символ определен #ifndef символ // Расположенный ниже код компилируется, если символ не определен #ifndef HEADER_INCLUDED #include "myheader.h" #define HEADER_INCLUDED #endif Директивы #ifdеf и #ifndеf
43 ©Павловская Т.А. (СПбГУ ИТМО) 43 Стражи включения Содержимое каждого заголовочного файла: #ifndef FNAME_H #define FNAME_H … #endif /* FNAME_H */
44 ©Павловская Т.А. (СПбГУ ИТМО) 44 #define x 3 #define f(a) f(x * (a)) #undef x #define x 2 #define g f #define z z[0] #define h g(~ #define m(a) a(w) #define w 0,1 #define t(a) a f(y+1) + f(f(z)) % t(t(g)(0) + t)(1); g(x+(3,4)-w) | h 5) & m (f)^m(m); f(2 * (y+1)) + f(2 * (f(2 * (z[0])))) % f(2 * (0)) + t(1); f(2 * (2+(3,4)-0,1)) | f(2 * (~ 5)) & f(2 * (0,1))^m(0,1); Директива #dеfine - антипример
45 ©Павловская Т.А. (СПбГУ ИТМО) 45 Предопределенные макросы #ifdef __cplusplus // Действия, специфические для С++ #endif printf(" Дата компиляции %s \n", __DATE__); printf("Ошибка в файле %s\nВремя комп: %s\n", __FILE__, __TIME__); __LINE__
46 ©Павловская Т.А. (СПбГУ ИТМО) 46 Поименованные области namespace [ имя_области ]{ /* Объявления */} namespace demo{ int i = 1; int k = 0; void func1(int); void func2(int) {... } } namespace demo{// Расширение // int i = 2; Неверно двойное определение void func1(double);// Перегрузка void func2(int);//Верно (повторное объявление) } void demo::func1(int) {... } определение
47 ©Павловская Т.А. (СПбГУ ИТМО) 47 Обращение к элементам поименованной области demo::i = 100; demo::func2(10); using demo::i; using namespace demo; namespace DAM = Department_of_Applied_Mathematics; Пространства имен стандартной библиотеки // stdio.h namespace std{ int feof(FILE *f);... } using namespace std; // cstdio namespace std{ int feof(FILE *f);... }
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.