- •Конспект лекций по дисциплине "Программирование"(іі часть)
- •123 "Компьютерная инженерия"
- •1 Функции 6
- •1 Функции
- •1.1 Определение, описание, вызов функции
- •Void prn1(int X)
- •Void prn2()
- •Void main()
- •Void main()
- •Void main()
- •1.2 Передача параметров в функции по значению и по указателю
- •Void func(int intg,float fltp)
- •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 a=10,res1,res2; float f=55.9;
res1=max(a,20); // res1=20
res2=max(int(f),a+30);} // res2=55
Пример.
int func1(int a, int b) //Определение функции
{return a+b;}
float sqr(float f, float g) //Определение функции
{return f*g;}
Void main()
{int am=2,bm=3,res1;
res1=func1(am,bm); // Вызов функции
float em=2.5,gm=3.0,fm=4.2,res2,res3;
res2=sqr(fm,gm); // Вызов функции
res3=sqr(fm+0.5,sqr(em,gm)); // Вызов функции
int res4=(int)sqr(em,float(am)); } // Вызов функции
Если функция определена после функции main() или в другом файле, то до первого обращения к функции она должна быть описана. Описание функции называется прототипом. Это необходимо для проверки компилятором соответствия типов передаваемых в функцию параметров и возвращаемых значений. В прототипе можно не указывать имена формальных параметров. В конце прототипа обязательна точка с запятой. Примеры прототипов:
float sum(float a, float b, float c);
int max(int, int y);
float sqr(float, float g);
Пример . Функция определена ниже своего первого вызова, перед вызовом помещен прототип.
#include <stdio.h>
int sum(int, int);//Прототип функции – описание функции
Void main()
{int a, b=3, g=4;
a=sum(b, g); // Вызов функции
printf("Сумма=%d\n", a); }
int sum(int arg1, int arg2) //Определение функции
{return arg1+arg2;}
1.2 Передача параметров в функции по значению и по указателю
В языке С++ передача параметров (кроме указателей и массивов) в функции при их вызове осуществляется по значению. Это означает, что для передаваемых (фактических) параметров в функции создаются копии этих параметров. Для формальных параметров выделяется память, в которую заносятся значения фактических параметров. Действия, производимые с этими параметрами (копиями) в функции не влияют на переменные вне функции, т.е. на фактические переменные. Формальные параметры недоступны вне тела функции. При выходе из функции выделенная для них память освобождается.
Пример.
#include <stdio.h>
Void func(int intg,float fltp)
{printf("intg=%d &intg=%p ",intg, &intg);
printf("fltp=%f &fltp=%p\n",fltp, &fltp);
intg+=10; fltp*=2;
printf("intg_n=%d fltp_n=%f\n",intg,fltp);}
Void main()
{int i=200; float f=100.25;
func(i,f);
printf("i=%d &i=%p f=%f &f=%p\n",i,&i,f,&f);}
В результате работы программы на экран выведется:
intg=200 &intg=8FD8:0FF2 fltp=100.25 &fltp=8FD8:0FF4
intg_n=210 fltp_n=200.5
i=200 &i=8FD8:0FFC f=100.25 &f=8FD8:0FF8
При передаче в функцию указателей (адресов фактических параметров) в функции создаются копии этих адресов, и в теле функции становится известно, где располагаются фактические параметры, и, следовательно, их значения можно изменить.
Пример. В функцию передаются указатели на переменные и значения этих переменных меняются местами:
#include <stdio.h>
void swap(int *a, int *b) //Определение функции
{printf("&a=%p a=%p *a=%d\n",&a,a,*a);
printf("&b=%p b=%p *b=%d\n",&b,b,*b);
int tmp=*a; *a=*b; *b=tmp;
printf("*a_n=%d *b_n=%d\n",*a,*b);}
Void main()
{int i=5,j=60;
printf("&i=%p i=%d &j=%p j=%d\n",&i,i,&j,j);
swap(&i,&j); // Вызов функции
printf("i=%d j=%d\n",i,j);}
В результате работы программы на экран выведется:
&i=8FD8:0FFE i=5 &j=8FD8:0FFC j=60
&a=8FD8:0FF4 a=8FD8:0FFE *a=5
&b=8FD8:0FF8 b=8FD8:0FFC *b=60
*a_n=60 *b_n=5
i=60 j=5
