Инициализация структур.
Статические структуры могут быть проинициализированы подобно массивам:
GOODS a = { "Телевизор", 14000.0, 20};
Необходимо строго следить за соответствием порядка констант порядку элементов структуры.
Структуры и функции.
Структура целиком может быть передана функции как параметр. Кроме того, структура может быть полностью возвращена как значение функции.
typedef struct { double r, f;} POLAR;
typedef struct { double x, y;} DECART;
DECART ptod(POLAR pcoord)
{
DECART dcoord;
dcoord.x = pcoord.r*cos(pcoord.f);
dcoord.y = pcoord.r*sin(pcoord.f);
return dcoord;
}
void main(void)
{
DECART a; POLAR b = { 15.2, 0.18};
a = ptod(b);
.
.
.
}
Для больших структур такой способ передачи параметров и возврата значений неэффективен, так как компилятору приходится создавать копии параметров и результатов работы функции в специальной области памяти.
Значительно эффективнее передавать адреса параметров:
void prot (DECART*dc, POLAR*pc)
{
(*dc).x = (*pc).r*cos((*pc).f);
(*dc).y = (*pc).r*cos((*pc).f);
}
(*dc) в скобках потому, что "." имеет более высший приоритет.
Головная программа при этом выглядит так:
void main(void)
{
DECART a; POLAR b = { 15.2, 0.18};
ptod(&a, &b);
.
.
.
}
Запись вида (*dc).x громоздка и плохо понятна. Поэтому разработчики языка C предусмотрели более понятную эквивалентную запись:
(*dc).x эквивалентно dc->x.
Используя ее:
void ptod(DECART *dc, POLAR *pc)
{
dc->x = pc->r*cos(pc->f);
dc->y = pc->r*sin(pc->f);
}
Пример решения задания (используя массив структур)
Ввести следующую информацию для N испытаний: скорость выстрела и угол наклона. Написать функцию, вычисляющую дальность полета объекта (мяча) (сопротивлением воздуха пренебречь). Используя эту функцию определить максимальную длину полета.
#include<conio.h>
#include<stdio.h>
#include<math.h>
#include<alloc.h>
typedef struct
{
double speed;
int angle;
}TDataTest;
double CalcRange( TDataTest *test )
{
return pow(test->speed,2)*sin(2*(test->angle*M_PI/180))/9.81;
}
void main(void)
{
TDataTest *Tests;
int i, N;
double maxRange = -1, range;
clrscr();
printf("Введите количество испытаний ");
scanf("%d", &N );
Tests = (TDataTest*)malloc( sizeof(TDataTest)*N );
if ( !Tests )
{
printf("Нет памяти");
return;
}
for( i=0; i<N; i++ )
{
printf("Введите скорость для %d-го испытания ", i+1);
scanf("%lf", &Tests[i].speed );
printf("Введите угол броска для %d-го испытания ", i+1);
scanf("%d", &Tests[i].angle );
if ( Tests[i].speed<=0 ||
Tests[i].angle<0 ||
Tests[i].angle>90 )
{
printf("Ошибка при вводе информации об
%d-ом испытании\n", i+1);
i--;
}
}
for( i=0; i<N; i++ )
{
range = CalcRange(&Tests[i]);
if ( range>maxRange )
maxRange = range;
}
printf("Максимальная дальность полета %lf", maxRange);
getch();
free(Tests);
}