- •Конспект лекций по дисциплине "Программирование"(іі часть)
- •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 am=2, bm=5, res1,res2,res3;
res1=def(); // 10*3=30
res2=def(am); // 2*3=6
res3=def(am,bm); // 2*5=10
printf("res1=%d res2=%d res3=%d\n",res1,res2,res3); }
В результате работы программы на экран выведется:
res1=30 res2=6 res3=10
Если функция с умалчиваемыми параметрами определена после функции main(), то значения умалчиваемых параметров указываются обязательно в прототипе этой функции, а в определении функции (в списке формальных параметров) эти значения не указываются.
Пример. Функция находит сумму 3-х переменных
#include <stdio.h>
int sum(int,int=5,int=10); //Прототип функции
Void main()
{int am=20, bm=50, cm=100, s1,s2,s3,s4;
s1=sum(am); // 20+5+10=35
s2=sum(am,bm); // 20+50+10=80
s3=sum(am,bm,cm); // 20+50+100=170
printf("s1=%d s2=%d s3=%d\n",s1,s2,s3);}
int sum(int a,int b,int c) // Определение функции
{return a+b+c;}
В результате работы программы на экран выведется:
s1=35 s2=80 s3=170
1.5 Функции с переменным числом параметров
Функции с переменным числом параметров – это функции, в которых количество и типы параметров определяются только во время их вызова. Синтаксис определения прототипа таких функций:
тип имя(спецификация явных параметров,...);
Последняя запятая необязательна. Многоточие сообщает компилятору, что не нужно проводить дальнейший контроль соответствия количества параметров и их типов при обработке вызова. Переход в списке от параметра к параметру осуществляется с помощью указателя, тип которого является типом переменной. При увеличении указателя на единицу осуществляется переход к следующей переменной такого же типа. В ВС31 функции с переменным числом параметров не работают с типами char, unsigned char, float.
В таких функциях существуют два способа определения количества параметров: 1) передача в функцию в списке фактических параметров информации об их количестве; 2) добавление параметра–индикатора в конец списка фактических параметров.
Пример. В функцию передается в списке явных параметров количество элементов, которые суммируются.
#include <stdio.h>
int sumi(int i,...)// Определение функции
{int *num=&i; // 1-й параметр – число переменных в списке
int sum=0;
for(;i;i--) sum+=*(++num);//вычисляем сумму со 2-го элемента
return sum;}
double sumd(int i,double d...)// Определение функции
{double *ptr=&d; //указатель на 2-й параметр типа double
double sum=0.0;
for(;i;i--) // 1-й параметр – число переменных в списке
sum+=*(ptr++);
return sum;}
Void main()
{int a1=10,a2=20,a3=30,s1,s2;
s1=sumi(3,a1,a2,a3); //сумма 3-х чисел a1,a2,a3
s2=sumi(6,1,a1,3,a2,a3,4); //сумма 6-и чисел
double d1=5.7, d2=1.3,s3;
s3=sumd(4,d1,1.25,d2,2.5); //сумма 4-х чисел
printf("s1=%d s2=%d s3=%.2lf\n",s1,s2,s3);}
В результате работы программы на экран выведется:
s1=60 s2=68 s3=10.75
Пример. В функции вычисляется произведение элементов, при этом каждый элемент сравнивается с параметром–индикатором, который находится в конце списка явных параметров.
#include <stdio.h>
#define term 0.0
double mult(double arg...) // Определение функции
{double a=1.0, *ptr=&arg;
if(*ptr==0.0) return 0.0;
for(;*ptr!=term;ptr++)
a*=*ptr;
return a;}
