- •Конспект лекций по дисциплине "Программирование"(іі часть)
- •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()
- •Литература
Int main()
{FILE *out,*in; REC rec;
int flag, sz=sizeof(REC); long len,kol,n;
if((out=fopen("mark.txt","wb"))==NULL)
{perror("Выходной файл не открыт"); return 1;}
do {puts("Введите номер записи, фамилию, оценку");
scanf("%d",&rec.id); gets(rec.name);
scanf("%d",&rec.mark);
fwrite(&rec,sz,1,out);//запись в файл блока данных
puts("Продолжить ввод? Да-1, Нет-0");
scanf("%d",&flag);
}while(flag);
fclose(out);// закрытие файла
if((in=fopen("mark.txt","rb"))==NULL)
{perror("Входной файл не открыт"); return 2;}
//сдвиг указателя чтения-записи на конец файла
fseek(in,0,SEEK_END);
len=ftell(in); //определение текущего зн-ия указателя чтения-записи
kol=len/sz; //количество блоков в файле
printf("В файле %d записей\n", kol);
puts("Введите номер записи для чтения:");
scanf("%ld",&n);
if(n>0&&n<=kol)
{fseek(in,(n-1)*sz,SEEK_SET); // установка указателя
//чтения-записи на заданный блок от начала файла
fread(&rec,sz,1,in); //чтение из файла блока данных
printf("%d %s – %d\n",rec.id_rec,rec.name,rec.mark);
}
else puts("Вне файла!");
fclose(in); //закрытие файла
return 0;}
3 Многофайловая компиляция
Программы – это обычно совокупность функций. Функции, как правило, размещают в разных файлах, группируя их по каким-либо признакам. В результате для создания конечной программы необходимо их объединить в единое целое.
Напомним, что из всей совокупности функций в программе может быть только одна главная функция main(), которая является точкой входа в программу.
Для объединения функций в одну программу существует несколько механизмов.
Самый простой способ: создать программу из нескольких файлов, используя препроссесорную директиву #include.
Пример.
// файл file1.cpp
extern int b; // описание внешней переменной b
int func2(int,int); //прототип функции func2
int a=5; // определение внешней переменной а
int func1(int c) // определение функции func1
{int f=func2(c,a); // f=30
return f*b; } // 30*10=300
// файл file2.cpp
extern int k; // описание внешней переменной k
int func2(int x, int y) // определение функции func2
{return x*y+k;} // 2*5+20=30
// файл file3.cpp
#include<stdio.h> //подключение библиотечных функций
#include "file1.cpp" //подключение файла file1.cpp
#include "file2.cpp" //подключение файла file2.cpp
int b=10; // определение внешней переменной b
int k=20; // определение внешней переменной k
Void main()
{int d=2,res;
res=func1(d);//вызов фукции func1 res=300
printf(“k=%d res=%d”,k,res);//вывод результатов на экран
}
В данном примере препроцессор подставил в файл filе3.cpp тексты файлов filе1.cpp и file2.cpp. Переменная a (определена как внешняя в файле filе1), функции func1(), func2() видны и в файле filе3, благодаря работе препроцессора. В файле filе1 для доступа к функции func2() (определена в файле filе2) прописан прототип этой функции. В файлах filе1, filе2 для доступа к переменным b, k (определены как внешние в файле filе3) эти переменные описаны со словом extern.
Поведем некоторые итоги.
1) Функции по определению являются глобальными, и им по умолчанию присваивается класс памяти extern, поэтому функции доступны во всех файлах. Но перед первым использованием функций необходимо записать прототипы, которые необходимы для компилятора.
2) Другие объекты (переменные, массивы, структуры и т.д.) также могут использоваться в файлах, где они не определены. Но они должны быть глобальными, т.е. определены вне функций, и им необходимо присвоить класс памяти extern, если они используются выше своего определения при данном методе создания многофайловой программы.
Каждый объект может быть определен только один раз, но может быть неоднократно описан.
Если использовать в разных файлах одни и те же функции, переменные, то в начале всех файлов необходимо поместить прототипы нужных функций и объявление переменных. Можно поместить прототипы функций, объявления переменных в отдельный файл с расширением .h, и включать этот файл в начало других файлов с помощью оператора #include.
// файл common.h
exrtern int a;
exrtern int b;
exrtern int k;
int func1(int);// прототип функции func1
int func2(int, int);// прототип функции func2
// файл filе1.cpp
#include "common.h"
int a=5; // определение внешней переменной а
int func1(int c){int f=func2(c,a);return f*b;}
// файл file2.cpp
#include "common.h"
int func2(int x, int y) {return x*y+k;}
// файл file3.cpp
#include<stdio.h> //подключение библиотечных функций
#include "common.h" //подключение заголовочного файла
#include "file1.cpp" //подключение файла file1.cpp
#include "file2.cpp" //подключение файла file2.cpp
int b=10; // определение внешней переменной b
