Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб9 программирование.doc
Скачиваний:
2
Добавлен:
19.08.2019
Размер:
110.59 Кб
Скачать

Инициализация структур.

Статические структуры могут быть проинициализированы подобно массивам:

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);

}