- •Конспект лекций по дисциплине "Программирование"(іі часть)
- •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()
- •Литература
1.3 Функции и массивы
При передаче массива в функцию в качестве параметра указывается имя массива. Поскольку имя массива – это указатель-константа, то в функцию передается адрес начала массива и все действия внутри функции производятся именно с элементами массива оригинала. При этом список формальных параметров в заголовке функции имеет две равноправные формы: (покажчик-константа
Int func1(int arr[]) {...}
или int func2(int *mass) {...}
В обоих случаях в функции создается копия указателя соответствующего типа, который действует внутри функции как обычный указатель-переменная и может изменять свое значение. Например, arr++. Доступ к элементам массива внутри функции может осуществляться как с помощью индексов (arr[1], arr[i]), так и применяя операцию разыменования указателя ( *(arr+1), *(arr+i)).
Для работы со всеми элементами массива необходимо знать количество элементов в массиве. При этом в самой функции узнать размер массива невозможно, т.к. в функцию передается указатель на первый элемент массива и размер этого указателя равен 4 байта.
Есть два способа определения конца массива: 1) в качестве одного из параметров в функцию передается размер массива; 2) последний элемент массива задается каким-либо уникальным значением, которое анализируют в функции.
Пример. Функция вычисляет сумму элементов массива, в качестве одного из параметров в функцию передается размер массива.
#include <stdio.h>
int sum(int N,int x[]) // Определение функции
{int S=0;
for(int i=0;i<N;i++) S+=x[i];
return S;}
Void main()
{int a[5]={1,3,5,10,2},c[3]={2,1,6},res1,res2;
res1=sum(5,a); // Вызов функции
printf("сумма элементов массива a=%d\n",res1); // 21
res2=sum(3,c); // Вызов функции
printf("сумма элементов массива c=%d\n",res2);} // 9
Пример. Функция вычисляет количество символов в слове, в качестве признака конца массива используется '\0'.
#include <stdio.h>
int len(char *); // Прототип функции
Void main()
{char *name="TERMINATOR";
printf("Длина 1-ой строки=%d",len(name)); // 10
char *str="Высшая математика";
printf("Длина 2-ой строки=%d",len(str)); } // 17
int len(char *c) // Определение функции
{int i=0;
while(c[i++]);
return i-1; } //длина строки без учета символа '\0'
Пример. Функция изменяет значения элементов массива, поменяв их на квадраты этих значений, тип функции void
#include <stdio.h>
void exch(int, int []); //Прототип функции
Void main()
{int a[5]={1,3,5,8,2};
printf("Массив до изменения: ");
for(int i=0;i<5;i++) printf(" %d",a[i]);
exch(5,a); // Вызов функции
printf("\nМассив после изменения: ");
for(int i=0;i<5;i++) printf(" %d",a[i]);
}
void exch(int N,int x[]) // Определение функции
{for(int i=0;i<N;i++) x[i]*=x[i];}
В результате на экран выведется:
Массив до изменения: 1 3 5 8 2.
Массив после изменения: 1 9 25 64 4.
1.4 Функции с умалчиваемыми значениями параметров
Функции с умалчиваемыми значениями параметров – это функции, которые имеют спецификацию формальных параметров со значениями по умолчанию. При вызове такой функции умалчиваемый параметр может быть опущен. Спецификация формальных параметров функций значениями по умолчанию имеет вид:
тип имя_параметра=умалчиваемое_значение
В функциях с умалчиваемыми значениями параметров действует правило: если параметр имеет умалчиваемое значение, то все параметры справа от него должны быть так же с умалчиваемыми значениями.
Пример. Функция находит произведение 2-х переменных
#include <stdio.h>
int def(int a=10, int b=3){return a*b;}
