- •Конспект лекций по дисциплине "Программирование"(іі часть)
- •123 "Компьютерная инженерия"
- •1 Функции 6
- •1 Функции
- •1.1 Определение, описание, вызов функции
- •Void prn1(int X)
- •Void prn2()
- •Void main()
- •1.2 Передача параметров в функции по значению и по указателю
- •Void func(int intg,float fltp)
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •1.3 Функции и массивы
- •Int func1(int arr[]) {...}
- •Void main()
- •Void main()
- •Void main()
- •1.4 Функции с умалчиваемыми значениями параметров
- •Void main()
- •Void main()
- •1.5 Функции с переменным числом параметров
- •Void main()
- •Void main()
- •1.6 Передача параметров в функцию main()
- •Int main(int argc,char**argv,char**envp)
- •Int main(int argc,char **argv)
- •1.7 Рекурсивные и подставляемые функции
- •Void main()
- •Void main()
- •1.8 Функции, возвращающие указатель
- •Void main()
- •1.9 Функции и структуры
- •Void f1(stud a)
- •Void f3(stud *p)
- •Void main()
- •1.10 Перегрузка функций
- •Void main()
- •Void main()
- •Int mul(double X,double y)
- •Int sum(int X) {return 2*X;}
- •Void main()
- •1.11 Шаблоны функций
- •Int main()
- •Void func(a);
- •Int main()
- •1.12 Указатели на функции
- •Void main()
- •Int f2(int X){return X*X;};
- •Void main()
- •Void main()
- •2 Работа с файлами
- •2.1 Потоковый ввод-вывод
- •2.2 Открытие и закрытие потока
- •Int fclose(file *имя);
- •Int main()
- •Void perror(const char *str);
- •2.3 Посимвольный ввод-вывод
- •Int fputc(int ch, file *fp);
- •Int fgetc(file *fp);
- •2.4 Построчный ввод-вывод
- •Int fputs(char*string, file *fp);
- •2.5 Форматированный ввод-вывод
- •Int fprintf(file *fp, char *format [,аргумент]…);
- •Int fscanf(file *fp, char *format [,указатель]…);
- •2.6 Форматированные вывод в строку и ввод из строки
- •Int a2; long b2;
- •2.7 Блоковый ввод-вывод
- •Int fwrite(void *ptr, int size, int n, file *fp);
- •Int fread(void *ptr,int size,int n,file *fp);
- •2.8 Произвольный доступ к файлу
- •Int fseek(file *fp, long offset, int from_where);
- •Int main()
- •3 Многофайловая компиляция
- •Void main()
- •Void main()
- •4 Объекты и их атрибуты
- •Void main()
- •5 Ссылки
- •Int &хref; // ошибка!!
- •Int f2_ptr(int *a, int *b) {return *a-*b;}
- •Int f4_ref(const int&a, int &b)
- •Void main()
- •Литература
Void main()
{int S1=sum(10); // 20 или 15
… }
1.11 Шаблоны функций
Для автоматизации создания функций различного вида (в т.ч. и перегруженных) в С++ введены шаблоны функций. Определяется шаблон семейства функций следующим образом
template <class type1,class type2, class type3 …>
где type1, type2, type3. – формальные параметры шаблона, которыми можно обозначать тип возвращаемого значения, типы формальных и локальных параметров внутри функции.
Пример.
template <class Tip>
Tip max(Tip x, Tip y )
{if(x>y)return x;
return y;}
Int main()
{int a1=-7,a2=40,res1; float f1=-3.6,f2=-10.5,res2;
res1=max(a1,a2);
res2=max(f1,f2);
printf("res1=%d res2=%.1f\n",res1,res2);
//res1=40 res2=-3.6
return 0;}
При компиляции программы с шаблоном функции, компилятор при вызове функции доопределяет ее. В данном примере при вызове res1=max(a1,a2); сформируется определение int max(int x,int y) и вызовется именно эта функция. При вызове функции res2=max(f1,f2); сформируется определение float max(float x,float y) и теперь вызываться будет данная функция.
Свойства параметров шаблонов:
Имена параметров шаблона должны быть уникальными во всем определении шаблона;
Список параметров шаблона не может быть пустым;
Объявление каждого параметра должно начинаться со слова class;
Имя параметра шаблона имеет свойства и права типа, т.е. его именем можно называть типы формальных параметров, тип функции, типы локальных переменные функции. Область видимости параметра шаблона во всем определении функции;
Все параметры шаблона, используемыев определении функции, должны быть обязательно использованы в сигнатуре функции. Т.е. недопустимо, например, определение
template <class A,class B>
B func(A x){…} // Ошибка, параметр В не использован
// в спецификации формальных параметров
Шаблон функции может быть использован и при описании прототипа функции.
template <class A>
Void func(a);
Пример. Функция меняет местами значение объектов
#include <stdio.h>
template <class A>
void swp(A *x,A *y) // указатель типа А
{A z=*x; // Шаблон использован в теле функции
*x=*y; *y=z;}
Int main()
{double d1=3.3, d2=2.2; swp(&d1,&d2);
printf("d1_n=%.2lf d2_n=%.2lf\n",d1,d2);
//d1_n=2.20 d1_n=3.30
char c1='M', c2='Z'; swp(&c1,&c2);
printf("c1_n=%c c2_n=%c\n",c1,c2);//c1_n=Z c2_n=M
char *st1="Весна", *st2="Лето"; swp(&st1,&st2);
printf("st1_n=%s st2_n=%s\n",st1,st2);
//st1_n=Лето st1_n=Весна
swp(st1,st2);
printf("st1_nn=%s st2_nn=%s\n",st1,st2);
// st1_nn=Вето st1_nn=Лесна
return 0;}
В этом примере компилятор сформирует следующие определения к функциям:
void swp(double *x,double*y), void swp(char*x,char*y),
void swp(char**x,char**y), void swp(char*x,char*y).
Функция, содержащая параметры, определяемые в шаблоне, может содержать любое количество не параметризованных формальных параметров и возвращать не параметризованное значение.
Пример. Функция определяет индекс максимального элемента
template <class T>
int func_max(T x[], int n)
{T m=x[0]; int k=0;
for(int i=0; i<n; i++)
if(x[i]>max){max=x[i]; k=i;}
return k;}
void main()
{int arr[5]={5,12,40,23,4}, in1, in2;
in1=func_max(arr,5); //in1=2
printf("max1=arr[%d]=%d\n",in1,arr[in1]);
float mas[4]={5.3,1.2,4.0,20.3};
in2=func_max(mas,4); //in2=3
printf("max2=mas[%d]=%.2f\n",in2,arr[in2]);}
В результате работы программы на экран выведется:
max1=arr[2]=40 max2=mas[3]=20.30
