- •Конспект лекций по дисциплине "Программирование"(іі часть)
- •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 f1(stud a)
{strcpy(a.name,"Петров"); //Копируем в a.name "Петров"
a.age+=1;
printf("%s %d\n",a.name,a.age); } // Петров 20
STUD f2(STUD b,STUD с)
{if(b.age>с.age) return b;
//возвращаем ту структуру, в которой age больше
return с;}
Void f3(stud *p)
{strcpy(p->name,"Сидоров");
p->age=21;
printf("%s %d\n", p->name, p->age);} // Сидоров 21
STUD *f4(STUD *r1,STUD *r2)
{if(r1->age>r2->age) return r1;
//возвращаем указатель на ту структуру, в которой age больше
return r2;}
Void main()
{STUD st1={"Иванов",19},st2={"Орлов",22},st3;
f1(st1);
printf("%s %d\n",st1.name,st1.age);//все равно Иванов 19
st3=f2(st1,st2);
printf("%s %d\n",st3.name,st3.age); // Орлов 22
STUD st4={"Сергеев",18},st5={"Алешин",25},*pst;
f3(&st4);
printf("%s %d\n",st4.name,st4.age); // Сидоров 21
pst=f4(&st4,&st5);
printf("%s %d\n",pst->name,pst->age);} // Алешин 25
1.10 Перегрузка функций
Цель перегрузки функций состоит в том, чтобы функция с общим именем возвращала разные значения при обращении к ней с разными по типам и количеству фактическими параметрами.
Перегруженные функции – это функции, которые имеют одинаковое имя, но различаются по типам и по количеству передаваемых в них параметров.
Распознавание перегруженных функций при вызове выполняется только по сигнатурам (списку формальных параметров функции). Для обеспечения перегрузки необходимо для каждого имени определить, сколько разных функций связано с ним.
Пример. Функции различаются по типу передаваемых в них параметров
#include <stdio.h>
int FF(int x,int y) {return x*x+y*y;}
long FF(long x, long y) {return x*x+y*y;}
float FF(float x, float y) {return x*x+y*y;}
Void main()
{int a1=3,a2=4,a3; long b1=20,b2=400,b3;
float d1=5.5,d2=7.5,d3;
a3=FF(a1,a2);
b3=FF(b1,b2);
d3=FF(d1,d2);
printf("a3=%d b3=%ld d3=%.2f\n", a3,b3,d3);}
В результате работы программы на экран выведется:
a3=25 b3=160400 d3=86.50
Пример. Функции различаются по количеству передаваемых в них параметров.
#include <stdio.h>
double mul(double x){return x*x*x;}
double mul(double x,double y){return x*y*y;}
double mul(double x,double y,double z){return x*y*z;}
Void main()
{double M1=mul(0.2);
double M2=mul(0.2,0.4);
double M3=mul(0.2,0.3,0.4);
printf("M1=%.4lf M2=%.4lf M3=%.4lf\n", M1,M2,M3);}
В результате работы программы на экран выведется:
M1=0.0080 M2=0.0322 M3=0.0240
При определении функции с одинаковой сигнатурой, но с другим телом и типом возвращаемого значения, компилятор сообщит об ошибке, т.к. функция с такой сигнатурой уже определена. Например, если в данном примере доопределить следующую функцию, то появится сообщение об ошибке:
Int mul(double X,double y)
{if (x>y)return 1; else return 2;}
При использовании перегруженных функций желательно не пользоваться умалчиваемыми параметрами. Если определить несколько перегруженных функций с умалчиваемыми параметрами, то может выдаваться сообщение о неоднозначности:
Пример.
#include <stdio.h>
Int sum(int X) {return 2*X;}
int sum(int x, int y=5) {return x+y;}
