План
Пример
#include <stdio.h>
struct bal{
char name[80];
float cash;
};
int main(void)
{
register int i;
FILE *fp;
bal balance[100];
// открытие на запись
if((fp=fopen("balance","wb"))==NULL) {
printf("Cannot open file.\n");
return 1;
}
for(i=0;i<100;i++) {
balance[i].name[0]='a'+(i%26);
balance[i].name[1]='a'+(i/26);
balance[i].name[2]='\0';
balance[i].cash=(float)i;
}
// сохранение массива balance
fwrite(balance,sizeof balance,1,fp);
fclose(fp);
//обнуление массива
for(i=0;i<100;i++) {balance[i].cash=0.0;}
if((fp=fopen("balance","rb"))==NULL) {
printf("Cannot open file.\n");
return 1;
}
//чтение массива
fread(balance, sizeof balance,1,fp);
//вывод содержимого массива
for(i=0; i<100; i++) {
printf("%s = ", balance[i].name);
printf("%9f\n",balance[i].cash);
}
printf("\n");
fclose(fp);
return 0;
}
1.Указатели на функции
2.Структуры
3.Доступ к членам структуры
4.Присваивание структур
5.Массивы структур
Хотя функция – это не переменная, она имеет физическое положение в памяти, которое может быть присвоено указателю. Адрес, присвоенный указателю, является входной точкой в функцию. Указатель может использоваться вместо имени функции. Он также позволяет передавать функции как обычные аргументы в другие функции.
|
|
Адрес функции получается при использовании имени функции без скобок и аргументов. Пример:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#define PI 3.1415
double del2(double a, double b, double eps, double (*f)(double));
int main(void)
{
double (*p)(double);
p = sin;
double a = -PI/2, b = PI/2, eps = 0.0001;
printf("Root = %lf\n", del2(a,b,eps,p));
printf("Root = %lf\n", del2(a,b,eps,sin));
return 0;
}
double del2(double a, double b, double eps, double (*f)(double))
{
if(b<a) {
puts("Left bigger than right");
exit(0);
}
if(eps <= 0) {
puts("Eps <= 0");
exit(0);
}
if(f(a) == 0) return a;
if(f(b) == 0) return b;
while(b-a >= eps) {
double x=(a+b)/2;
if(f(a)*f(x) < 0.) a=x;
else if(f(x) == 0.) return x;
else b=x;
}
return (a+b)/2;
}
Когда вызывается del2(), ей передаются числа с плавающей точкой двойной точности и один указатель на функцию. Скобки вокруг *f необходимы для правильной интерпретации компилятором данного выражения.
При объявлении указателя на функцию можно использовать прототип, оставив имена параметров пустыми.
Рассмотрим работу функции sin() в функции del2(). Оператор
if(f(a) == 0) return a;
осуществляет вызов функции, в данном случае sin(), с помощью f, который указывает на данную функцию. Вызов происходит с аргументом a.
Бывают моменты, когда выгодно передавать функции в процедуры или хранить массивы функций. Пример:
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
void enter(void), del(void); void review(void), quit(void);
int menu(void);
void (*options[])(void) = {
enter,
del,
review,
quit
};
int main(void)
{
int i;
i = menu();
(*options[i])();
getchar();
return 0;
}
int menu(void)
{
char ch;
do {
printf("1. Enter\n");
printf("2. Delete\n");
printf("3. Review\n");
printf("4. Quit\n");
printf("Select a number:");
ch = getche();
printf("\n");
|
|
}while(!strchr("1234", ch));
return ch-49;
}
void enter(void)
{ printf("In enter.");}
void del(void)
{ printf("In del.");}
void review(void)
{ printf("In review.");}
void quit(void)
{
printf("In quit.");
exit(0);
}